mirror of
https://github.com/bitburner-official/bitburner-src.git
synced 2024-11-26 17:43:48 +01:00
Hotfix 30 May 2023 (#555)
This commit is contained in:
parent
469c70ed4b
commit
1aa53739cc
@ -420,31 +420,34 @@ export function MakeProduct(
|
|||||||
division.products.set(product.name, product);
|
division.products.set(product.name, product);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Research(division: Division, researchName: CorpResearchName): void {
|
export function Research(researchingDivision: Division, researchName: CorpResearchName): void {
|
||||||
const corp = Player.corporation;
|
const corp = Player.corporation;
|
||||||
if (!corp) return;
|
if (!corp) return;
|
||||||
const researchTree = IndustryResearchTrees[division.type];
|
const researchTree = IndustryResearchTrees[researchingDivision.type];
|
||||||
if (researchTree === undefined) throw new Error(`No research tree for industry '${division.type}'`);
|
if (researchTree === undefined) throw new Error(`No research tree for industry '${researchingDivision.type}'`);
|
||||||
const research = ResearchMap[researchName];
|
const research = ResearchMap[researchName];
|
||||||
|
|
||||||
if (division.researched.has(researchName)) return;
|
if (researchingDivision.researched.has(researchName)) return;
|
||||||
if (division.researchPoints < research.cost)
|
if (researchingDivision.researchPoints < research.cost) {
|
||||||
throw new Error(`You do not have enough Scientific Research for ${research.name}`);
|
throw new Error(`You do not have enough Scientific Research for ${research.name}`);
|
||||||
division.researchPoints -= research.cost;
|
}
|
||||||
|
researchingDivision.researchPoints -= research.cost;
|
||||||
|
|
||||||
// Get the Node from the Research Tree and set its 'researched' property
|
// Get the Node from the Research Tree and set its 'researched' property
|
||||||
researchTree.research(researchName);
|
researchTree.research(researchName);
|
||||||
|
// All divisions of the same type as the researching division get the new research.
|
||||||
|
for (const division of corp.divisions.values()) {
|
||||||
|
if (division.type !== researchingDivision.type) continue;
|
||||||
division.researched.add(researchName);
|
division.researched.add(researchName);
|
||||||
|
// Handle researches that need to have their effects manually applied here.
|
||||||
// I couldn't figure out where else to put this so that warehouse size would get updated instantly
|
// Warehouse size needs to be updated here because it is not recalculated during normal processing.
|
||||||
// whether research is done by script or UI. All other stats gets calculated in every cycle
|
|
||||||
// Warehouse size gets updated only when something increases it.
|
|
||||||
if (researchName == "Drones - Transport") {
|
if (researchName == "Drones - Transport") {
|
||||||
for (const warehouse of getRecordValues(division.warehouses)) {
|
for (const warehouse of getRecordValues(division.warehouses)) {
|
||||||
warehouse.updateSize(corp, division);
|
warehouse.updateSize(corp, division);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function ExportMaterial(
|
export function ExportMaterial(
|
||||||
divisionName: string,
|
divisionName: string,
|
||||||
|
@ -16,6 +16,7 @@ import { CorpMaterialName, CorpResearchName, CorpStateName } from "@nsdefs";
|
|||||||
import { JSONMap, JSONSet } from "../Types/Jsonable";
|
import { JSONMap, JSONSet } from "../Types/Jsonable";
|
||||||
import { PartialRecord, getRecordEntries, getRecordKeys, getRecordValues } from "../Types/Record";
|
import { PartialRecord, getRecordEntries, getRecordKeys, getRecordValues } from "../Types/Record";
|
||||||
import { Material } from "./Material";
|
import { Material } from "./Material";
|
||||||
|
import { getKeyList } from "../utils/helpers/getKeyList";
|
||||||
|
|
||||||
interface DivisionParams {
|
interface DivisionParams {
|
||||||
name: string;
|
name: string;
|
||||||
@ -30,6 +31,9 @@ export class Division {
|
|||||||
researched = new JSONSet<CorpResearchName>();
|
researched = new JSONSet<CorpResearchName>();
|
||||||
requiredMaterials: PartialRecord<CorpMaterialName, number> = {};
|
requiredMaterials: PartialRecord<CorpMaterialName, number> = {};
|
||||||
|
|
||||||
|
// Not included in save file. Just used for tracking whether research tree has been updated since game load.
|
||||||
|
treeInitialized = false;
|
||||||
|
|
||||||
//An array of the name of materials being produced
|
//An array of the name of materials being produced
|
||||||
producedMaterials: CorpMaterialName[] = [];
|
producedMaterials: CorpMaterialName[] = [];
|
||||||
|
|
||||||
@ -1031,8 +1035,13 @@ export class Division {
|
|||||||
}
|
}
|
||||||
|
|
||||||
updateResearchTree(): void {
|
updateResearchTree(): void {
|
||||||
|
if (this.treeInitialized) return;
|
||||||
const researchTree = IndustryResearchTrees[this.type];
|
const researchTree = IndustryResearchTrees[this.type];
|
||||||
|
// Need to populate the tree in case we are loading a game.
|
||||||
for (const research of this.researched) researchTree.research(research);
|
for (const research of this.researched) researchTree.research(research);
|
||||||
|
// Also need to load researches from the tree in case we are making a new division.
|
||||||
|
for (const research of researchTree.researched) this.researched.add(research);
|
||||||
|
this.treeInitialized = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get multipliers from Research
|
// Get multipliers from Research
|
||||||
@ -1098,13 +1107,15 @@ export class Division {
|
|||||||
|
|
||||||
/** Serialize the current object to a JSON save state. */
|
/** Serialize the current object to a JSON save state. */
|
||||||
toJSON(): IReviverValue {
|
toJSON(): IReviverValue {
|
||||||
return Generic_toJSON("Division", this);
|
return Generic_toJSON("Division", this, Division.includedKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Initializes a Industry object from a JSON save state. */
|
/** Initializes a Industry object from a JSON save state. */
|
||||||
static fromJSON(value: IReviverValue): Division {
|
static fromJSON(value: IReviverValue): Division {
|
||||||
return Generic_fromJSON(Division, value.data);
|
return Generic_fromJSON(Division, value.data, Division.includedKeys);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static includedKeys = getKeyList(Division, { removedKeys: ["treeInitialized"] });
|
||||||
}
|
}
|
||||||
|
|
||||||
constructorsForReviver.Division = Division;
|
constructorsForReviver.Division = Division;
|
||||||
|
@ -217,9 +217,7 @@ export class ResearchTree {
|
|||||||
|
|
||||||
// Marks a Node as researched
|
// Marks a Node as researched
|
||||||
research(name: CorpResearchName): void {
|
research(name: CorpResearchName): void {
|
||||||
if (this.root == null) {
|
if (!this.root || this.researched.has(name)) return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const queue: Node[] = [];
|
const queue: Node[] = [];
|
||||||
queue.push(this.root);
|
queue.push(this.root);
|
||||||
@ -233,9 +231,7 @@ export class ResearchTree {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (let i = 0; i < node.children.length; ++i) {
|
queue.push(...node.children);
|
||||||
queue.push(node.children[i]);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
console.warn(`ResearchTree.research() did not find the specified Research node for: ${name}`);
|
console.warn(`ResearchTree.research() did not find the specified Research node for: ${name}`);
|
||||||
|
@ -652,6 +652,7 @@ function evaluateVersionCompatibility(ver: string | number): void {
|
|||||||
// Prior to v2.2.0, sleeve shock was 0 to 100 internally but displayed as 100 to 0. This unifies them as 100 to 0.
|
// Prior to v2.2.0, sleeve shock was 0 to 100 internally but displayed as 100 to 0. This unifies them as 100 to 0.
|
||||||
for (const sleeve of Player.sleeves) sleeve.shock = 100 - sleeve.shock;
|
for (const sleeve of Player.sleeves) sleeve.shock = 100 - sleeve.shock;
|
||||||
}
|
}
|
||||||
|
// Some 2.3 changes are actually in BaseServer.js fromJSONBase function
|
||||||
if (ver < 31) {
|
if (ver < 31) {
|
||||||
Terminal.warn("Migrating to 2.3.0, loading with no scripts.");
|
Terminal.warn("Migrating to 2.3.0, loading with no scripts.");
|
||||||
for (const server of GetAllServers()) {
|
for (const server of GetAllServers()) {
|
||||||
@ -680,6 +681,20 @@ function evaluateVersionCompatibility(ver: string | number): void {
|
|||||||
}
|
}
|
||||||
// End 2.3 changes
|
// End 2.3 changes
|
||||||
}
|
}
|
||||||
|
//2.3 hotfix changes and 2.3.1 changes
|
||||||
|
if (ver < 32) {
|
||||||
|
// Due to a bug from before 2.3, some scripts have the wrong server listed. In 2.3 this caused issues.
|
||||||
|
for (const server of GetAllServers()) {
|
||||||
|
for (const script of server.scripts.values()) {
|
||||||
|
if (script.server !== server.hostname) {
|
||||||
|
console.warn(
|
||||||
|
`Detected script ${script.filename} on ${server.hostname} with incorrect server property: ${script.server}. Repairing.`,
|
||||||
|
);
|
||||||
|
script.server = server.hostname;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadGame(saveString: string): boolean {
|
function loadGame(saveString: string): boolean {
|
||||||
|
Loading…
Reference in New Issue
Block a user