Hotfix 30 May 2023 (#555)

This commit is contained in:
Snarling 2023-05-30 18:47:48 -04:00 committed by omuretsu
parent 469c70ed4b
commit 1aa53739cc
4 changed files with 47 additions and 22 deletions

@ -420,30 +420,33 @@ 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(

@ -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 {