mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-12-23 14:42:28 +01:00
Implement basic crafting functionality
This commit is contained in:
parent
78f962318c
commit
4789455b9c
@ -71,6 +71,7 @@ export const CONSTANTS: {
|
|||||||
WorkTypeCreateProgram: string;
|
WorkTypeCreateProgram: string;
|
||||||
WorkTypeStudyClass: string;
|
WorkTypeStudyClass: string;
|
||||||
WorkTypeCrime: string;
|
WorkTypeCrime: string;
|
||||||
|
WorkTypeCraftAugmentation: string;
|
||||||
ClassStudyComputerScience: string;
|
ClassStudyComputerScience: string;
|
||||||
ClassDataStructures: string;
|
ClassDataStructures: string;
|
||||||
ClassNetworks: string;
|
ClassNetworks: string;
|
||||||
@ -224,6 +225,7 @@ export const CONSTANTS: {
|
|||||||
WorkTypeCreateProgram: "Working on Create a Program",
|
WorkTypeCreateProgram: "Working on Create a Program",
|
||||||
WorkTypeStudyClass: "Studying or Taking a class at university",
|
WorkTypeStudyClass: "Studying or Taking a class at university",
|
||||||
WorkTypeCrime: "Committing a crime",
|
WorkTypeCrime: "Committing a crime",
|
||||||
|
WorkTypeCraftAugmentation: "Crafting an Augmentation",
|
||||||
|
|
||||||
ClassStudyComputerScience: "studying Computer Science",
|
ClassStudyComputerScience: "studying Computer Science",
|
||||||
ClassDataStructures: "taking a Data Structures course",
|
ClassDataStructures: "taking a Data Structures course",
|
||||||
|
@ -17,6 +17,7 @@ import { use } from "../../../ui/Context";
|
|||||||
import { Augmentations } from "../../../Augmentation/Augmentations";
|
import { Augmentations } from "../../../Augmentation/Augmentations";
|
||||||
import { AugmentationNames } from "../../../Augmentation/data/AugmentationNames"
|
import { AugmentationNames } from "../../../Augmentation/data/AugmentationNames"
|
||||||
import { Settings } from "../../../Settings/Settings";
|
import { Settings } from "../../../Settings/Settings";
|
||||||
|
import { CONSTANTS } from "../../../Constants";
|
||||||
|
|
||||||
import { IPlayer } from "../../IPlayer";
|
import { IPlayer } from "../../IPlayer";
|
||||||
|
|
||||||
@ -74,7 +75,15 @@ export const GraftingRoot = (): React.ReactElement => {
|
|||||||
<Typography variant="h6" sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>
|
<Typography variant="h6" sx={{ display: 'flex', alignItems: 'center', flexWrap: 'wrap' }}>
|
||||||
<Construction sx={{ mr: 1 }} /> {selectedAug}
|
<Construction sx={{ mr: 1 }} /> {selectedAug}
|
||||||
</Typography>
|
</Typography>
|
||||||
<Button sx={{ width: '100%' }}>
|
<Button
|
||||||
|
onClick={event => {
|
||||||
|
if (!event.isTrusted) return;
|
||||||
|
player.startCraftAugmentationWork(selectedAug, 15000);
|
||||||
|
player.startFocusing();
|
||||||
|
router.toWork();
|
||||||
|
}}
|
||||||
|
sx={{ width: '100%' }}
|
||||||
|
>
|
||||||
Craft Augmentation (<Typography color={Settings.theme.money}>$foo</Typography>)
|
Craft Augmentation (<Typography color={Settings.theme.money}>$foo</Typography>)
|
||||||
</Button>
|
</Button>
|
||||||
<Typography color={Settings.theme.info}>
|
<Typography color={Settings.theme.info}>
|
||||||
|
@ -130,6 +130,8 @@ export interface IPlayer {
|
|||||||
factionWorkType: string;
|
factionWorkType: string;
|
||||||
createProgramName: string;
|
createProgramName: string;
|
||||||
timeWorkedCreateProgram: number;
|
timeWorkedCreateProgram: number;
|
||||||
|
craftAugmentationName: string;
|
||||||
|
timeWorkedCraftAugmentation: number;
|
||||||
crimeType: string;
|
crimeType: string;
|
||||||
committingCrimeThruSingFn: boolean;
|
committingCrimeThruSingFn: boolean;
|
||||||
singFnCrimeWorkerScript: WorkerScript | null;
|
singFnCrimeWorkerScript: WorkerScript | null;
|
||||||
@ -286,4 +288,7 @@ export interface IPlayer {
|
|||||||
setMult(name: string, mult: number): void;
|
setMult(name: string, mult: number): void;
|
||||||
canAccessCotMG(): boolean;
|
canAccessCotMG(): boolean;
|
||||||
sourceFileLvl(n: number): number;
|
sourceFileLvl(n: number): number;
|
||||||
|
startCraftAugmentationWork(augmentationName: string, time: number): void;
|
||||||
|
craftAugmentationWork(numCycles: number): boolean;
|
||||||
|
finishCraftAugmentationWork(cancelled: boolean): string;
|
||||||
}
|
}
|
||||||
|
@ -139,6 +139,8 @@ export class PlayerObject implements IPlayer {
|
|||||||
factionWorkType: string;
|
factionWorkType: string;
|
||||||
createProgramName: string;
|
createProgramName: string;
|
||||||
timeWorkedCreateProgram: number;
|
timeWorkedCreateProgram: number;
|
||||||
|
craftAugmentationName: string;
|
||||||
|
timeWorkedCraftAugmentation: number;
|
||||||
crimeType: string;
|
crimeType: string;
|
||||||
committingCrimeThruSingFn: boolean;
|
committingCrimeThruSingFn: boolean;
|
||||||
singFnCrimeWorkerScript: WorkerScript | null;
|
singFnCrimeWorkerScript: WorkerScript | null;
|
||||||
@ -296,6 +298,9 @@ export class PlayerObject implements IPlayer {
|
|||||||
setMult: (name: string, mult: number) => void;
|
setMult: (name: string, mult: number) => void;
|
||||||
canAccessCotMG: () => boolean;
|
canAccessCotMG: () => boolean;
|
||||||
sourceFileLvl: (n: number) => number;
|
sourceFileLvl: (n: number) => number;
|
||||||
|
startCraftAugmentationWork: (augmentationName: string, time: number) => void;
|
||||||
|
craftAugmentationWork: (numCycles: number) => boolean;
|
||||||
|
finishCraftAugmentationWork: (cancelled: boolean) => string;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
//Skills and stats
|
//Skills and stats
|
||||||
@ -419,6 +424,9 @@ export class PlayerObject implements IPlayer {
|
|||||||
this.createProgramName = "";
|
this.createProgramName = "";
|
||||||
this.createProgramReqLvl = 0;
|
this.createProgramReqLvl = 0;
|
||||||
|
|
||||||
|
this.craftAugmentationName = "";
|
||||||
|
this.timeWorkedCraftAugmentation = 0;
|
||||||
|
|
||||||
this.className = "";
|
this.className = "";
|
||||||
|
|
||||||
this.crimeType = "";
|
this.crimeType = "";
|
||||||
@ -541,6 +549,9 @@ export class PlayerObject implements IPlayer {
|
|||||||
this.startCreateProgramWork = generalMethods.startCreateProgramWork;
|
this.startCreateProgramWork = generalMethods.startCreateProgramWork;
|
||||||
this.createProgramWork = generalMethods.createProgramWork;
|
this.createProgramWork = generalMethods.createProgramWork;
|
||||||
this.finishCreateProgramWork = generalMethods.finishCreateProgramWork;
|
this.finishCreateProgramWork = generalMethods.finishCreateProgramWork;
|
||||||
|
this.startCraftAugmentationWork = generalMethods.startCraftAugmentationWork;
|
||||||
|
this.craftAugmentationWork = generalMethods.craftAugmentationWork;
|
||||||
|
this.finishCraftAugmentationWork = generalMethods.finishCraftAugmentationWork;
|
||||||
this.startClass = generalMethods.startClass;
|
this.startClass = generalMethods.startClass;
|
||||||
this.takeClass = generalMethods.takeClass;
|
this.takeClass = generalMethods.takeClass;
|
||||||
this.finishClass = generalMethods.finishClass;
|
this.finishClass = generalMethods.finishClass;
|
||||||
|
@ -528,10 +528,12 @@ export function resetWorkStatus(this: IPlayer, generalType?: string, group?: str
|
|||||||
|
|
||||||
this.timeWorked = 0;
|
this.timeWorked = 0;
|
||||||
this.timeWorkedCreateProgram = 0;
|
this.timeWorkedCreateProgram = 0;
|
||||||
|
this.timeWorkedCraftAugmentation = 0;
|
||||||
|
|
||||||
this.currentWorkFactionName = "";
|
this.currentWorkFactionName = "";
|
||||||
this.currentWorkFactionDescription = "";
|
this.currentWorkFactionDescription = "";
|
||||||
this.createProgramName = "";
|
this.createProgramName = "";
|
||||||
|
this.craftAugmentationName = "";
|
||||||
this.className = "";
|
this.className = "";
|
||||||
this.workType = "";
|
this.workType = "";
|
||||||
}
|
}
|
||||||
@ -608,6 +610,10 @@ export function process(this: IPlayer, router: IRouter, numCycles = 1): void {
|
|||||||
if (this.workPartTime(numCycles)) {
|
if (this.workPartTime(numCycles)) {
|
||||||
router.toCity();
|
router.toCity();
|
||||||
}
|
}
|
||||||
|
} else if (this.workType === CONSTANTS.WorkTypeCraftAugmentation) {
|
||||||
|
if (this.craftAugmentationWork(numCycles)) {
|
||||||
|
router.toGrafting();
|
||||||
|
}
|
||||||
} else if (this.work(numCycles)) {
|
} else if (this.work(numCycles)) {
|
||||||
router.toCity();
|
router.toCity();
|
||||||
}
|
}
|
||||||
@ -1331,6 +1337,56 @@ export function finishCreateProgramWork(this: IPlayer, cancelled: boolean): stri
|
|||||||
this.resetWorkStatus();
|
this.resetWorkStatus();
|
||||||
return "You've finished creating " + programName + "! The new program can be found on your home computer.";
|
return "You've finished creating " + programName + "! The new program can be found on your home computer.";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function startCraftAugmentationWork(
|
||||||
|
this: IPlayer,
|
||||||
|
augmentationName: string,
|
||||||
|
time: number,
|
||||||
|
): void {
|
||||||
|
this.resetWorkStatus()
|
||||||
|
this.isWorking = true;
|
||||||
|
this.workType = CONSTANTS.WorkTypeCraftAugmentation;
|
||||||
|
|
||||||
|
this.timeNeededToCompleteWork = time;
|
||||||
|
this.craftAugmentationName = augmentationName;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function craftAugmentationWork(this: IPlayer, numCycles: number): boolean {
|
||||||
|
let focusBonus = 1;
|
||||||
|
if (!this.hasAugmentation(AugmentationNames.NeuroreceptorManager)) {
|
||||||
|
focusBonus = this.focus ? 1 : CONSTANTS.BaseFocusBonus;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: formula logic here (focus bonus and stuff)
|
||||||
|
let skillMult = 1;
|
||||||
|
skillMult *= focusBonus;
|
||||||
|
|
||||||
|
this.timeWorked += CONSTANTS._idleSpeed * numCycles;
|
||||||
|
this.timeWorkedCraftAugmentation += CONSTANTS._idleSpeed * numCycles * skillMult;
|
||||||
|
|
||||||
|
if (this.timeWorkedCraftAugmentation >= this.timeNeededToCompleteWork) {
|
||||||
|
this.finishCraftAugmentationWork(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function finishCraftAugmentationWork(this: IPlayer, cancelled: boolean): string {
|
||||||
|
const augName = this.craftAugmentationName;
|
||||||
|
if (cancelled === false) {
|
||||||
|
dialogBoxCreate(`You've finished crafting ${augName}.<br>The augmentation has been grafted to you, but you feel slightly lightheaded.`)
|
||||||
|
|
||||||
|
applyAugmentation(Augmentations[augName]);
|
||||||
|
} else {
|
||||||
|
dialogBoxCreate(`You cancelled the crafting of ${augName}.<br>Your money was not returned to you.`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: intelligence EXP stuff here later
|
||||||
|
this.isWorking = false;
|
||||||
|
this.resetWorkStatus();
|
||||||
|
return `Crafting of ${augName} has ended.`
|
||||||
|
}
|
||||||
|
|
||||||
/* Studying/Taking Classes */
|
/* Studying/Taking Classes */
|
||||||
export function startClass(this: IPlayer, costMult: number, expMult: number, className: string): void {
|
export function startClass(this: IPlayer, costMult: number, expMult: number, className: string): void {
|
||||||
this.resetWorkStatus();
|
this.resetWorkStatus();
|
||||||
|
@ -298,6 +298,8 @@ const Engine: {
|
|||||||
Player.commitCrime(numCyclesOffline);
|
Player.commitCrime(numCyclesOffline);
|
||||||
} else if (Player.workType == CONSTANTS.WorkTypeCompanyPartTime) {
|
} else if (Player.workType == CONSTANTS.WorkTypeCompanyPartTime) {
|
||||||
Player.workPartTime(numCyclesOffline);
|
Player.workPartTime(numCyclesOffline);
|
||||||
|
} else if (Player.workType === CONSTANTS.WorkTypeCraftAugmentation) {
|
||||||
|
Player.craftAugmentationWork(numCyclesOffline);
|
||||||
} else {
|
} else {
|
||||||
Player.work(numCyclesOffline);
|
Player.work(numCyclesOffline);
|
||||||
}
|
}
|
||||||
|
@ -494,6 +494,38 @@ export function WorkInProgressRoot(): React.ReactElement {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (player.craftAugmentationName !== "") {
|
||||||
|
function cancel(): void {
|
||||||
|
player.finishCraftAugmentationWork(true);
|
||||||
|
router.toTerminal();
|
||||||
|
}
|
||||||
|
function unfocus(): void {
|
||||||
|
router.toTerminal();
|
||||||
|
player.stopFocusing();
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<Grid container direction="column" justifyContent="center" alignItems="center" style={{ minHeight: "100vh" }}>
|
||||||
|
<Grid item>
|
||||||
|
<Typography>
|
||||||
|
You are currently working on crafting {player.craftAugmentationName}.
|
||||||
|
<br /><br />
|
||||||
|
You have been working for {convertTimeMsToTimeElapsedString(player.timeWorked)}
|
||||||
|
<br /><br />
|
||||||
|
The augumentation if {((player.timeWorkedCraftAugmentation / player.timeNeededToCompleteWork) * 100).toFixed(2)}
|
||||||
|
% complete. <br />
|
||||||
|
If you cancel, your work will <b>not</b> be saved, and the money you spent will <b>not</b> be returned.
|
||||||
|
</Typography>
|
||||||
|
</Grid>
|
||||||
|
<Grid item>
|
||||||
|
<Button sx={{ mx: 2 }} onClick={cancel}>
|
||||||
|
Cancel work on creating program
|
||||||
|
</Button>
|
||||||
|
<Button onClick={unfocus}>Do something else simultaneously</Button>
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
if (!player.workType) router.toTerminal();
|
if (!player.workType) router.toTerminal();
|
||||||
|
|
||||||
return <></>;
|
return <></>;
|
||||||
|
Loading…
Reference in New Issue
Block a user