mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2026-05-24 00:16:34 +02:00
commit1
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { applySleeveGains, Work, WorkType } from "./Work";
|
||||
@@ -25,45 +25,45 @@ export class SleeveBladeburnerWork extends Work {
|
||||
this.actionName = params?.name ?? "Field analysis";
|
||||
}
|
||||
|
||||
cyclesNeeded(player: IPlayer, sleeve: Sleeve): number {
|
||||
const ret = player.bladeburner?.getActionTimeNetscriptFn(sleeve, this.actionType, this.actionName);
|
||||
cyclesNeeded(sleeve: Sleeve): number {
|
||||
const ret = Player.bladeburner?.getActionTimeNetscriptFn(sleeve, this.actionType, this.actionName);
|
||||
if (!ret || typeof ret === "string") throw new Error(`Error querying ${this.actionName} time`);
|
||||
return ret / CONSTANTS._idleSpeed;
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
if (!player.bladeburner) throw new Error("sleeve doing blade work without being a member");
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
if (!Player.bladeburner) throw new Error("sleeve doing blade work without being a member");
|
||||
this.cyclesWorked += cycles;
|
||||
const actionIdent = player.bladeburner.getActionIdFromTypeAndName(this.actionType, this.actionName);
|
||||
const actionIdent = Player.bladeburner.getActionIdFromTypeAndName(this.actionType, this.actionName);
|
||||
if (!actionIdent) throw new Error(`Error getting ${this.actionName} action`);
|
||||
if (this.actionType === "Contracts") {
|
||||
const action = player.bladeburner.getActionObject(actionIdent);
|
||||
const action = Player.bladeburner.getActionObject(actionIdent);
|
||||
if (!action) throw new Error(`Error getting ${this.actionName} action object`);
|
||||
if (action.count <= 0) {
|
||||
sleeve.stopWork(player);
|
||||
sleeve.stopWork();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
while (this.cyclesWorked > this.cyclesNeeded(player, sleeve)) {
|
||||
while (this.cyclesWorked > this.cyclesNeeded(sleeve)) {
|
||||
if (this.actionType === "Contracts") {
|
||||
const action = player.bladeburner.getActionObject(actionIdent);
|
||||
const action = Player.bladeburner.getActionObject(actionIdent);
|
||||
if (!action) throw new Error(`Error getting ${this.actionName} action object`);
|
||||
if (action.count <= 0) {
|
||||
sleeve.stopWork(player);
|
||||
sleeve.stopWork();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
const retValue = player.bladeburner.completeAction(player, sleeve, actionIdent, false);
|
||||
const retValue = Player.bladeburner.completeAction(sleeve, actionIdent, false);
|
||||
let exp: WorkStats | undefined;
|
||||
if (this.actionType === "General") {
|
||||
exp = GeneralActions[this.actionName]?.exp;
|
||||
if (!exp) throw new Error(`Somehow there was no exp for action ${this.actionType} ${this.actionName}`);
|
||||
applySleeveGains(player, sleeve, exp, 1);
|
||||
applySleeveGains(sleeve, exp, 1);
|
||||
}
|
||||
player.gainMoney(retValue.money, "sleeves");
|
||||
player.gainStats(retValue);
|
||||
this.cyclesWorked -= this.cyclesNeeded(player, sleeve);
|
||||
Player.gainMoney(retValue.money, "sleeves");
|
||||
Player.gainStats(retValue);
|
||||
this.cyclesWorked -= this.cyclesNeeded(sleeve);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -24,9 +24,9 @@ export class SleeveClassWork extends Work {
|
||||
this.location = params?.location ?? LocationName.Sector12RothmanUniversity;
|
||||
}
|
||||
|
||||
calculateRates(player: IPlayer, sleeve: Sleeve): WorkStats {
|
||||
calculateRates(sleeve: Sleeve): WorkStats {
|
||||
return scaleWorkStats(
|
||||
calculateClassEarnings(player, sleeve, this.classType, this.location),
|
||||
calculateClassEarnings(sleeve, this.classType, this.location),
|
||||
sleeve.shockBonus(),
|
||||
false,
|
||||
);
|
||||
@@ -38,9 +38,9 @@ export class SleeveClassWork extends Work {
|
||||
);
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
const rate = this.calculateRates(player, sleeve);
|
||||
applySleeveGains(player, sleeve, rate, cycles);
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
const rate = this.calculateRates(sleeve);
|
||||
applySleeveGains(sleeve, rate, cycles);
|
||||
return 0;
|
||||
}
|
||||
APICopy(): Record<string, unknown> {
|
||||
|
||||
@@ -30,14 +30,14 @@ export class SleeveCompanyWork extends Work {
|
||||
return c;
|
||||
}
|
||||
|
||||
getGainRates(player: IPlayer, sleeve: Sleeve): WorkStats {
|
||||
return calculateCompanyWorkStats(player, sleeve, this.getCompany());
|
||||
getGainRates(sleeve: Sleeve): WorkStats {
|
||||
return calculateCompanyWorkStats(sleeve, this.getCompany());
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
const company = this.getCompany();
|
||||
const gains = this.getGainRates(player, sleeve);
|
||||
applySleeveGains(player, sleeve, gains, cycles);
|
||||
const gains = this.getGainRates(sleeve);
|
||||
applySleeveGains(sleeve, gains, cycles);
|
||||
company.playerReputation += gains.reputation * cycles;
|
||||
influenceStockThroughCompanyWork(company, gains.reputation, cycles);
|
||||
return 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { applySleeveGains, Work, WorkType } from "./Work";
|
||||
@@ -43,19 +43,19 @@ export class SleeveCrimeWork extends Work {
|
||||
return this.getCrime().time / CONSTANTS._idleSpeed;
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
this.cyclesWorked += cycles;
|
||||
|
||||
const crime = this.getCrime();
|
||||
let gains = this.getExp();
|
||||
if (this.cyclesWorked >= this.cyclesNeeded()) {
|
||||
if (Math.random() < crime.successRate(sleeve)) {
|
||||
player.karma -= crime.karma * sleeve.syncBonus();
|
||||
Player.karma -= crime.karma * sleeve.syncBonus();
|
||||
} else {
|
||||
gains.money = 0;
|
||||
gains = scaleWorkStats(gains, 0.25);
|
||||
}
|
||||
applySleeveGains(player, sleeve, gains, cycles);
|
||||
applySleeveGains(sleeve, gains, cycles);
|
||||
this.cyclesWorked -= this.cyclesNeeded();
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { applySleeveGains, Work, WorkType } from "./Work";
|
||||
@@ -57,16 +57,14 @@ export class SleeveFactionWork extends Work {
|
||||
return f;
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
if (player.gang) {
|
||||
if (this.factionName === player.gang.facName) {
|
||||
sleeve.stopWork(player);
|
||||
return 0;
|
||||
}
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
if (this.factionName === Player.gang?.facName) {
|
||||
sleeve.stopWork();
|
||||
return 0;
|
||||
}
|
||||
|
||||
const exp = this.getExpRates(sleeve);
|
||||
applySleeveGains(player, sleeve, exp, cycles);
|
||||
applySleeveGains(sleeve, exp, cycles);
|
||||
const rep = this.getReputationRate(sleeve);
|
||||
this.getFaction().playerReputation += rep;
|
||||
return 0;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { Work, WorkType } from "./Work";
|
||||
@@ -20,12 +20,12 @@ export class SleeveInfiltrateWork extends Work {
|
||||
return infiltrateCycles;
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
if (!player.bladeburner) throw new Error("sleeve doing blade work without being a member");
|
||||
process(_sleeve: Sleeve, cycles: number): number {
|
||||
if (!Player.bladeburner) throw new Error("sleeve doing blade work without being a member");
|
||||
this.cyclesWorked += cycles;
|
||||
if (this.cyclesWorked > this.cyclesNeeded()) {
|
||||
this.cyclesWorked -= this.cyclesNeeded();
|
||||
player.bladeburner.infiltrateSynthoidCommunities(player);
|
||||
Player.bladeburner.infiltrateSynthoidCommunities();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { Work, WorkType } from "./Work";
|
||||
@@ -11,9 +10,9 @@ export class SleeveRecoveryWork extends Work {
|
||||
super(WorkType.RECOVERY);
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
sleeve.shock = Math.min(100, sleeve.shock + 0.0002 * cycles);
|
||||
if (sleeve.shock >= 100) sleeve.stopWork(player);
|
||||
if (sleeve.shock >= 100) sleeve.stopWork();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../../PersonObjects/IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Work, WorkType } from "./Work";
|
||||
|
||||
@@ -6,17 +6,17 @@ export const isSleeveSupportWork = (w: Work | null): w is SleeveSupportWork =>
|
||||
w !== null && w.type === WorkType.SUPPORT;
|
||||
|
||||
export class SleeveSupportWork extends Work {
|
||||
constructor(player?: IPlayer) {
|
||||
constructor() {
|
||||
super(WorkType.SUPPORT);
|
||||
if (player) player.bladeburner?.sleeveSupport(true);
|
||||
Player.bladeburner?.sleeveSupport(true);
|
||||
}
|
||||
|
||||
process(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
finish(player: IPlayer): void {
|
||||
player.bladeburner?.sleeveSupport(false);
|
||||
finish(): void {
|
||||
Player.bladeburner?.sleeveSupport(false);
|
||||
}
|
||||
|
||||
APICopy(): Record<string, unknown> {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { Generic_fromJSON, Generic_toJSON, IReviverValue, Reviver } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { Work, WorkType } from "./Work";
|
||||
@@ -11,9 +11,9 @@ export class SleeveSynchroWork extends Work {
|
||||
super(WorkType.SYNCHRO);
|
||||
}
|
||||
|
||||
process(player: IPlayer, sleeve: Sleeve, cycles: number): number {
|
||||
sleeve.sync = Math.min(100, sleeve.sync + player.getIntelligenceBonus(0.5) * 0.0002 * cycles);
|
||||
if (sleeve.sync >= 100) sleeve.stopWork(player);
|
||||
process(sleeve: Sleeve, cycles: number): number {
|
||||
sleeve.sync = Math.min(100, sleeve.sync + Player.getIntelligenceBonus(0.5) * 0.0002 * cycles);
|
||||
if (sleeve.sync >= 100) sleeve.stopWork();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
import { IPlayer } from "../../IPlayer";
|
||||
import { Player } from "../../../Player";
|
||||
import { IReviverValue } from "../../../utils/JSONReviver";
|
||||
import { Sleeve } from "../Sleeve";
|
||||
import { applyWorkStats, applyWorkStatsExp, scaleWorkStats, WorkStats } from "../../../Work/WorkStats";
|
||||
|
||||
export const applySleeveGains = (player: IPlayer, sleeve: Sleeve, rawStats: WorkStats, cycles = 1): void => {
|
||||
export const applySleeveGains = (sleeve: Sleeve, rawStats: WorkStats, cycles = 1): void => {
|
||||
const shockedStats = scaleWorkStats(rawStats, sleeve.shockBonus(), rawStats.money > 0);
|
||||
applyWorkStatsExp(sleeve, shockedStats, cycles);
|
||||
const syncStats = scaleWorkStats(shockedStats, sleeve.syncBonus(), rawStats.money > 0);
|
||||
applyWorkStats(player, player, syncStats, cycles, "sleeves");
|
||||
player.sleeves.filter((s) => s != sleeve).forEach((s) => applyWorkStatsExp(s, syncStats, cycles));
|
||||
applyWorkStats(Player, syncStats, cycles, "sleeves");
|
||||
Player.sleeves.filter((s) => s !== sleeve).forEach((s) => applyWorkStatsExp(s, syncStats, cycles));
|
||||
};
|
||||
|
||||
export abstract class Work {
|
||||
@@ -18,10 +18,10 @@ export abstract class Work {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
abstract process(player: IPlayer, sleeve: Sleeve, cycles: number): number;
|
||||
abstract process(sleeve: Sleeve, cycles: number): number;
|
||||
abstract APICopy(): Record<string, unknown>;
|
||||
abstract toJSON(): IReviverValue;
|
||||
finish(__player: IPlayer): void {
|
||||
finish(): void {
|
||||
/* left for children to implement */
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user