Merge pull request #1874 from theit8514/script-focus

Reimplement setFocus
This commit is contained in:
hydroflame 2021-12-16 12:00:34 -05:00 committed by GitHub
commit f9499d3259
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 108 additions and 38 deletions

@ -82,16 +82,24 @@ function MainPage({ faction, rerender, onAugmentations }: IMainProps): React.Rea
setGangOpen(true); setGangOpen(true);
} }
function startWork(): void {
player.startFocusing();
router.toWork();
}
function startFieldWork(faction: Faction): void { function startFieldWork(faction: Faction): void {
player.startFactionFieldWork(router, faction); player.startFactionFieldWork(faction);
startWork();
} }
function startHackingContracts(faction: Faction): void { function startHackingContracts(faction: Faction): void {
player.startFactionHackWork(router, faction); player.startFactionHackWork(faction);
startWork();
} }
function startSecurityWork(faction: Faction): void { function startSecurityWork(faction: Faction): void {
player.startFactionSecurityWork(router, faction); player.startFactionSecurityWork(faction);
startWork();
} }
// We have a special flag for whether the player this faction is the player's // We have a special flag for whether the player this faction is the player's

@ -171,10 +171,11 @@ export function CompanyLocation(props: IProps): React.ReactElement {
const pos = companyPosition; const pos = companyPosition;
if (pos instanceof CompanyPosition) { if (pos instanceof CompanyPosition) {
if (pos.isPartTimeJob() || pos.isSoftwareConsultantJob() || pos.isBusinessConsultantJob()) { if (pos.isPartTimeJob() || pos.isSoftwareConsultantJob() || pos.isBusinessConsultantJob()) {
p.startWorkPartTime(router, props.locName); p.startWorkPartTime(props.locName);
} else { } else {
p.startWork(router, props.locName); p.startWork(props.locName);
} }
p.startFocusing();
router.toWork(); router.toWork();
} }
} }

@ -622,6 +622,31 @@ export function NetscriptSingularity(
return Promise.resolve(); return Promise.resolve();
}); });
}, },
isFocused: function(): boolean {
helper.updateDynamicRam("isFocused", getRamCost("isFocused"));
helper.checkSingularityAccess("isFocused", 2);
return player.focus;
},
setFocus: function(focus: boolean): boolean {
helper.updateDynamicRam("setFocus", getRamCost("setFocus"));
helper.checkSingularityAccess("setFocus", 2);
if (!player.isWorking) {
throw helper.makeRuntimeErrorMsg("setFocus", "Not currently working");
}
if (!(player.workType == CONSTANTS.WorkTypeFaction || player.workType == CONSTANTS.WorkTypeCompany || player.workType == CONSTANTS.WorkTypeCompanyPartTime)) {
throw helper.makeRuntimeErrorMsg("setFocus", "Cannot change focus for current job");
}
if (!player.focus && focus) {
player.startFocusing();
Router.toWork();
return true;
} else if (player.focus && !focus) {
player.stopFocusing();
Router.toTerminal();
return true;
}
return false;
},
getStats: function (): any { getStats: function (): any {
helper.updateDynamicRam("getStats", getRamCost("getStats")); helper.updateDynamicRam("getStats", getRamCost("getStats"));
helper.checkSingularityAccess("getStats", 1); helper.checkSingularityAccess("getStats", 1);
@ -703,7 +728,9 @@ export function NetscriptSingularity(
helper.updateDynamicRam("stopAction", getRamCost("stopAction")); helper.updateDynamicRam("stopAction", getRamCost("stopAction"));
helper.checkSingularityAccess("stopAction", 1); helper.checkSingularityAccess("stopAction", 1);
if (player.isWorking) { if (player.isWorking) {
if (player.focus) {
Router.toTerminal(); Router.toTerminal();
}
const txt = player.singularityStopWork(); const txt = player.singularityStopWork();
workerScript.log("stopAction", () => txt); workerScript.log("stopAction", () => txt);
return true; return true;
@ -814,16 +841,23 @@ export function NetscriptSingularity(
return false; return false;
} }
const wasWorking = player.isWorking;
const wasFocused = player.focus;
if (player.isWorking) { if (player.isWorking) {
const txt = player.singularityStopWork(); const txt = player.singularityStopWork();
workerScript.log("workForCompany", () => txt); workerScript.log("workForCompany", () => txt);
} }
if (companyPosition.isPartTimeJob()) { if (companyPosition.isPartTimeJob()) {
player.startWorkPartTime(Router, companyName); player.startWorkPartTime(companyName);
} else { } else {
player.startWork(Router, companyName); player.startWork(companyName);
} }
if (!wasWorking || (wasWorking && !wasFocused))
player.stopFocusing();
else if (wasWorking && wasFocused)
player.startFocusing();
workerScript.log( workerScript.log(
"workForCompany", "workForCompany",
() => `Began working at '${player.companyName}' as a '${companyPositionName}'`, () => `Began working at '${player.companyName}' as a '${companyPositionName}'`,
@ -963,6 +997,8 @@ export function NetscriptSingularity(
return false; return false;
} }
const wasWorking = player.isWorking;
const wasFocused = player.focus;
if (player.isWorking) { if (player.isWorking) {
const txt = player.singularityStopWork(); const txt = player.singularityStopWork();
workerScript.log("workForFaction", () => txt); workerScript.log("workForFaction", () => txt);
@ -1060,7 +1096,11 @@ export function NetscriptSingularity(
workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with hacking contracts.`); workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with hacking contracts.`);
return false; return false;
} }
player.startFactionHackWork(Router, fac); player.startFactionHackWork(fac);
if (!wasWorking || (wasWorking && !wasFocused))
player.stopFocusing();
else if (wasWorking && wasFocused)
player.startFocusing();
workerScript.log("workForFaction", () => `Started carrying out hacking contracts for '${fac.name}'`); workerScript.log("workForFaction", () => `Started carrying out hacking contracts for '${fac.name}'`);
return true; return true;
case "field": case "field":
@ -1070,7 +1110,11 @@ export function NetscriptSingularity(
workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with field missions.`); workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with field missions.`);
return false; return false;
} }
player.startFactionFieldWork(Router, fac); player.startFactionFieldWork(fac);
if (!wasWorking || (wasWorking && !wasFocused))
player.stopFocusing();
else if (wasWorking && wasFocused)
player.startFocusing();
workerScript.log("workForFaction", () => `Started carrying out field missions for '${fac.name}'`); workerScript.log("workForFaction", () => `Started carrying out field missions for '${fac.name}'`);
return true; return true;
case "security": case "security":
@ -1080,7 +1124,11 @@ export function NetscriptSingularity(
workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with security work.`); workerScript.log("workForFaction", () => `Faction '${fac.name}' do not need help with security work.`);
return false; return false;
} }
player.startFactionSecurityWork(Router, fac); player.startFactionSecurityWork(fac);
if (!wasWorking || (wasWorking && !wasFocused))
player.stopFocusing();
else if (wasWorking && wasFocused)
player.startFocusing();
workerScript.log("workForFaction", () => `Started carrying out security work for '${fac.name}'`); workerScript.log("workForFaction", () => `Started carrying out security work for '${fac.name}'`);
return true; return true;
default: default:

@ -211,7 +211,7 @@ export interface IPlayer {
setMoney(amt: number): void; setMoney(amt: number): void;
singularityStopWork(): string; singularityStopWork(): string;
startBladeburner(p: any): void; startBladeburner(p: any): void;
startFactionWork(router: IRouter, faction: Faction): void; startFactionWork(faction: Faction): void;
startClass(router: IRouter, costMult: number, expMult: number, className: string): void; startClass(router: IRouter, costMult: number, expMult: number, className: string): void;
startCorporation(corpName: string, additionalShares?: number): void; startCorporation(corpName: string, additionalShares?: number): void;
startCrime( startCrime(
@ -227,13 +227,13 @@ export interface IPlayer {
time: number, time: number,
singParams: any, singParams: any,
): void; ): void;
startFactionFieldWork(router: IRouter, faction: Faction): void; startFactionFieldWork(faction: Faction): void;
startFactionHackWork(router: IRouter, faction: Faction): void; startFactionHackWork(faction: Faction): void;
startFactionSecurityWork(router: IRouter, faction: Faction): void; startFactionSecurityWork(faction: Faction): void;
startFocusing(): void; startFocusing(): void;
startGang(facName: string, isHacking: boolean): void; startGang(facName: string, isHacking: boolean): void;
startWork(router: IRouter, companyName: string): void; startWork(companyName: string): void;
startWorkPartTime(router: IRouter, companyName: string): void; startWorkPartTime(companyName: string): void;
takeDamage(amt: number): boolean; takeDamage(amt: number): boolean;
travel(to: CityName): boolean; travel(to: CityName): boolean;
giveExploit(exploit: Exploit): void; giveExploit(exploit: Exploit): void;

@ -216,7 +216,7 @@ export class PlayerObject implements IPlayer {
setMoney: (amt: number) => void; setMoney: (amt: number) => void;
singularityStopWork: () => string; singularityStopWork: () => string;
startBladeburner: (p: any) => void; startBladeburner: (p: any) => void;
startFactionWork: (router: IRouter, faction: Faction) => void; startFactionWork: (faction: Faction) => void;
startClass: (router: IRouter, costMult: number, expMult: number, className: string) => void; startClass: (router: IRouter, costMult: number, expMult: number, className: string) => void;
startCorporation: (corpName: string, additionalShares?: number) => void; startCorporation: (corpName: string, additionalShares?: number) => void;
startCrime: ( startCrime: (
@ -232,13 +232,13 @@ export class PlayerObject implements IPlayer {
time: number, time: number,
singParams: any, singParams: any,
) => void; ) => void;
startFactionFieldWork: (router: IRouter, faction: Faction) => void; startFactionFieldWork: (faction: Faction) => void;
startFactionHackWork: (router: IRouter, faction: Faction) => void; startFactionHackWork: (faction: Faction) => void;
startFactionSecurityWork: (router: IRouter, faction: Faction) => void; startFactionSecurityWork: (faction: Faction) => void;
startFocusing: () => void; startFocusing: () => void;
startGang: (facName: string, isHacking: boolean) => void; startGang: (facName: string, isHacking: boolean) => void;
startWork: (router: IRouter, companyName: string) => void; startWork: (companyName: string) => void;
startWorkPartTime: (router: IRouter, companyName: string) => void; startWorkPartTime: (companyName: string) => void;
takeDamage: (amt: number) => boolean; takeDamage: (amt: number) => boolean;
travel: (to: CityName) => boolean; travel: (to: CityName) => boolean;
giveExploit: (exploit: Exploit) => void; giveExploit: (exploit: Exploit) => void;

@ -554,10 +554,9 @@ export function processWorkEarnings(this: IPlayer, numCycles = 1): void {
} }
/* Working for Company */ /* Working for Company */
export function startWork(this: IPlayer, router: IRouter, companyName: string): void { export function startWork(this: IPlayer, companyName: string): void {
this.resetWorkStatus(CONSTANTS.WorkTypeCompany, companyName); this.resetWorkStatus(CONSTANTS.WorkTypeCompany, companyName);
this.isWorking = true; this.isWorking = true;
this.focus = true;
this.companyName = companyName; this.companyName = companyName;
this.workType = CONSTANTS.WorkTypeCompany; this.workType = CONSTANTS.WorkTypeCompany;
@ -571,7 +570,6 @@ export function startWork(this: IPlayer, router: IRouter, companyName: string):
this.workMoneyGainRate = this.getWorkMoneyGain(); this.workMoneyGainRate = this.getWorkMoneyGain();
this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours; this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours;
router.toWork();
} }
export function process(this: IPlayer, router: IRouter, numCycles = 1): void { export function process(this: IPlayer, router: IRouter, numCycles = 1): void {
@ -723,10 +721,9 @@ export function finishWork(this: IPlayer, cancelled: boolean, sing = false): str
return ""; return "";
} }
export function startWorkPartTime(this: IPlayer, router: IRouter, companyName: string): void { export function startWorkPartTime(this: IPlayer, companyName: string): void {
this.resetWorkStatus(CONSTANTS.WorkTypeCompanyPartTime, companyName); this.resetWorkStatus(CONSTANTS.WorkTypeCompanyPartTime, companyName);
this.isWorking = true; this.isWorking = true;
this.focus = true;
this.companyName = companyName; this.companyName = companyName;
this.workType = CONSTANTS.WorkTypeCompanyPartTime; this.workType = CONSTANTS.WorkTypeCompanyPartTime;
@ -740,7 +737,6 @@ export function startWorkPartTime(this: IPlayer, router: IRouter, companyName: s
this.workMoneyGainRate = this.getWorkMoneyGain(); this.workMoneyGainRate = this.getWorkMoneyGain();
this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours; this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer8Hours;
router.toWork();
} }
export function workPartTime(this: IPlayer, numCycles: number): boolean { export function workPartTime(this: IPlayer, numCycles: number): boolean {
@ -832,7 +828,7 @@ export function stopFocusing(this: IPlayer): void {
} }
/* Working for Faction */ /* Working for Faction */
export function startFactionWork(this: IPlayer, router: IRouter, faction: Faction): void { export function startFactionWork(this: IPlayer, faction: Faction): void {
//Update reputation gain rate to account for faction favor //Update reputation gain rate to account for faction favor
let favorMult = 1 + faction.favor / 100; let favorMult = 1 + faction.favor / 100;
if (isNaN(favorMult)) { if (isNaN(favorMult)) {
@ -842,15 +838,13 @@ export function startFactionWork(this: IPlayer, router: IRouter, faction: Factio
this.workRepGainRate *= BitNodeMultipliers.FactionWorkRepGain; this.workRepGainRate *= BitNodeMultipliers.FactionWorkRepGain;
this.isWorking = true; this.isWorking = true;
this.focus = true;
this.workType = CONSTANTS.WorkTypeFaction; this.workType = CONSTANTS.WorkTypeFaction;
this.currentWorkFactionName = faction.name; this.currentWorkFactionName = faction.name;
this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer20Hours; this.timeNeededToCompleteWork = CONSTANTS.MillisecondsPer20Hours;
router.toWork();
} }
export function startFactionHackWork(this: IPlayer, router: IRouter, faction: Faction): void { export function startFactionHackWork(this: IPlayer, faction: Faction): void {
this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkHacking); this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkHacking);
this.workHackExpGainRate = 0.15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain; this.workHackExpGainRate = 0.15 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain;
@ -859,10 +853,10 @@ export function startFactionHackWork(this: IPlayer, router: IRouter, faction: Fa
this.factionWorkType = CONSTANTS.FactionWorkHacking; this.factionWorkType = CONSTANTS.FactionWorkHacking;
this.currentWorkFactionDescription = "carrying out hacking contracts"; this.currentWorkFactionDescription = "carrying out hacking contracts";
this.startFactionWork(router, faction); this.startFactionWork(faction);
} }
export function startFactionFieldWork(this: IPlayer, router: IRouter, faction: Faction): void { export function startFactionFieldWork(this: IPlayer, faction: Faction): void {
this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkField); this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkField);
this.workHackExpGainRate = 0.1 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain; this.workHackExpGainRate = 0.1 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain;
@ -876,10 +870,10 @@ export function startFactionFieldWork(this: IPlayer, router: IRouter, faction: F
this.factionWorkType = CONSTANTS.FactionWorkField; this.factionWorkType = CONSTANTS.FactionWorkField;
this.currentWorkFactionDescription = "carrying out field missions"; this.currentWorkFactionDescription = "carrying out field missions";
this.startFactionWork(router, faction); this.startFactionWork(faction);
} }
export function startFactionSecurityWork(this: IPlayer, router: IRouter, faction: Faction): void { export function startFactionSecurityWork(this: IPlayer, faction: Faction): void {
this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkSecurity); this.resetWorkStatus(CONSTANTS.WorkTypeFaction, faction.name, CONSTANTS.FactionWorkSecurity);
this.workHackExpGainRate = 0.05 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain; this.workHackExpGainRate = 0.05 * this.hacking_exp_mult * BitNodeMultipliers.FactionWorkExpGain;
@ -893,7 +887,7 @@ export function startFactionSecurityWork(this: IPlayer, router: IRouter, faction
this.factionWorkType = CONSTANTS.FactionWorkSecurity; this.factionWorkType = CONSTANTS.FactionWorkSecurity;
this.currentWorkFactionDescription = "performing security detail"; this.currentWorkFactionDescription = "performing security detail";
this.startFactionWork(router, faction); this.startFactionWork(faction);
} }
export function workForFaction(this: IPlayer, numCycles: number): boolean { export function workForFaction(this: IPlayer, numCycles: number): boolean {

@ -1985,6 +1985,25 @@ export interface Singularity {
* @returns True if the installation was successful. * @returns True if the installation was successful.
*/ */
installBackdoor(): Promise<void>; installBackdoor(): Promise<void>;
/**
* SF4.2 - Check if the player is focused.
* @remarks
* RAM cost: 0.1 GB
*
*
* @returns True if the player is focused.
*/
isFocused(): boolean;
/**
* SF4.2 - Set the players focus.
* @remarks
* RAM cost: 0.1 GB
*
* @returns True if the focus was changed.
*/
setFocus(focus: boolean): boolean;
} }
/** /**