Merge branch 'danielyxie:dev' into dev

This commit is contained in:
CalvinTrop 2021-10-18 17:00:38 -07:00 committed by GitHub
commit 010d3bfaef
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 80 additions and 25 deletions

@ -106,6 +106,21 @@ Fork and clone the repo
# Makes sure you always start from `danielyxie/dev` to avoid merge conflicts. # Makes sure you always start from `danielyxie/dev` to avoid merge conflicts.
``` ```
### Running locally.
Install
- `npm` (maybe via `nvm`)
- Github Desktop (windows only)
- Visual Studio code (optional)
Inside the root of the repo run
`npm install` to install all the dependencies
`npm run start:dev` to launch the game in dev mode.
After that you can open any browser and naviguate to `localhost:8000` and play the game.
Saving a file will reload the game automatically.
#### Submitting a Pull Request #### Submitting a Pull Request
When submitting a pull request with your code contributions, please abide by When submitting a pull request with your code contributions, please abide by

24
dist/vendor.bundle.js vendored

File diff suppressed because one or more lines are too long

@ -0,0 +1,35 @@
Injecting HTML in the game
==========================
Bitburner uses React and Material-UI to render everything. Modifying the UI is possible but
not officially supported.
To automatically enter commands in the terminal (only works if looking at the terminal):
.. code-block:: javascript
// Acquire a reference to the terminal text field
const terminalInput = document.getElementById("terminal-input");
// Set the value to the command you want to run.
terminalInput.value="home;connect n00dles;home;connect n00dles;home;";
// Get a reference to the React event handler.
const handler = Object.keys(terminalInput)[1];
// Perform an onChange event to set some internal values.
terminalInput[handler].onChange({target:terminalInput});
// Simulate an enter press
terminalInput[handler].onKeyDown({keyCode:13,preventDefault:()=>null});
To add lines to the terminal (only works if looking at the terminal):
.. code-block:: javascript
// Acquire a reference to the terminal list of lines.
const list = document.getElementById("generic-react-container").querySelector("ul");
// Inject some HTML.
list.insertAdjacentHTML('beforeend',`<li><p color=lime>whatever custom html</p></li>`)

@ -11,3 +11,5 @@ they contain spoilers for the game.
getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers> getBitNodeMultipliers() <advancedfunctions/getBitNodeMultipliers>
getServer() <advancedfunctions/getServer> getServer() <advancedfunctions/getServer>
autocomplete() <advancedfunctions/autocomplete> autocomplete() <advancedfunctions/autocomplete>
atExit() <advancedfunctions/atExit>
Injecting HTML <advancedfunctions/inject_html.rst>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -153,7 +153,7 @@ function WarehouseRoot(props: IProps): React.ReactElement {
<Typography>This industry uses the following equation for it's production: </Typography> <Typography>This industry uses the following equation for it's production: </Typography>
<br /> <br />
<Typography> <Typography>
<IndustryProductEquation division={division} /> <IndustryProductEquation key={division.name} division={division} />
</Typography> </Typography>
<br /> <br />
<Typography> <Typography>

@ -143,8 +143,8 @@ export class Sleeve extends Person {
* Commit crimes * Commit crimes
*/ */
commitCrime(p: IPlayer, crimeKey: string): boolean { commitCrime(p: IPlayer, crimeKey: string): boolean {
const crime: Crime | null = Crimes[crimeKey]; const crime: Crime | null = Crimes[crimeKey] || Object.values(Crimes).find((crime) => crime.name === crimeKey);
if (!(crime instanceof Crime)) { if (!crime) {
return false; return false;
} }
@ -164,7 +164,7 @@ export class Sleeve extends Person {
this.currentTaskLocation = String(this.gainRatesForTask.money); this.currentTaskLocation = String(this.gainRatesForTask.money);
this.crimeType = crimeKey; this.crimeType = crime.name;
this.currentTaskMaxTime = crime.time; this.currentTaskMaxTime = crime.time;
this.currentTask = SleeveTaskType.Crime; this.currentTask = SleeveTaskType.Crime;
return true; return true;
@ -179,8 +179,8 @@ export class Sleeve extends Person {
if (this.currentTask === SleeveTaskType.Crime) { if (this.currentTask === SleeveTaskType.Crime) {
// For crimes, all experience and money is gained at the end // For crimes, all experience and money is gained at the end
if (this.currentTaskTime >= this.currentTaskMaxTime) { if (this.currentTaskTime >= this.currentTaskMaxTime) {
const crime: Crime | null = Crimes[this.crimeType]; const crime: Crime | undefined = Object.values(Crimes).find((crime) => crime.name === this.crimeType);
if (!(crime instanceof Crime)) { if (!crime) {
console.error(`Invalid data stored in sleeve.crimeType: ${this.crimeType}`); console.error(`Invalid data stored in sleeve.crimeType: ${this.crimeType}`);
this.resetTaskStatus(); this.resetTaskStatus();
return retValue; return retValue;

@ -104,14 +104,17 @@ export function SleeveElem(props: IProps): React.ReactElement {
); );
break; break;
} }
case SleeveTaskType.Crime: case SleeveTaskType.Crime: {
const crime = Object.values(Crimes).find((crime) => crime.name === props.sleeve.crimeType);
if (!crime) throw new Error("crime should not be undefined");
desc = ( desc = (
<> <>
This sleeve is currently attempting to {Crimes[props.sleeve.crimeType].type} (Success Rate:{" "} This sleeve is currently attempting to {crime.type} (Success Rate:{" "}
{numeralWrapper.formatPercentage(Crimes[props.sleeve.crimeType].successRate(props.sleeve))}). {numeralWrapper.formatPercentage(crime.successRate(props.sleeve))}).
</> </>
); );
break; break;
}
case SleeveTaskType.Class: case SleeveTaskType.Class:
desc = <>This sleeve is currently studying/taking a course at {props.sleeve.currentTaskLocation}.</>; desc = <>This sleeve is currently studying/taking a course at {props.sleeve.currentTaskLocation}.</>;
break; break;

@ -122,7 +122,7 @@ const tasks: {
}; };
}, },
"Commit Crime": (): ITaskDetails => { "Commit Crime": (): ITaskDetails => {
return { first: Object.keys(Crimes), second: () => ["------"] }; return { first: Object.values(Crimes).map((crime) => crime.name), second: () => ["------"] };
}, },
"Take University Course": (player: IPlayer, sleeve: Sleeve): ITaskDetails => { "Take University Course": (player: IPlayer, sleeve: Sleeve): ITaskDetails => {
let universities: string[] = []; let universities: string[] = [];