import { ComputedState, GameState, ResourceModifier, ResourceNontrivialType, ResourceType, ResourceTypeAndModifier } from "../data/GameState";
import { HashMap } from "../lib/util/data_structures/hash";
import { enumKeys } from "../lib/util/misc";
export function computePlayerResourceAmounts(gameState: GameState): ComputedState {
let amounts: { [k in ResourceType]?: number } = {};
let playerResourceNodesAggregated = new HashMap<ResourceTypeAndModifier, number>();
for (let pointNodeRef of gameState.playerSave.allocatedPointNodeHistory) {
let pointNodeGen = gameState.worldGen.zLevels[pointNodeRef.z]!.chunks.get(pointNodeRef.chunkCoord)!.pointNodes.get(pointNodeRef.pointNodeCoord)!
if (pointNodeGen.resourceType === "Nothing") {
continue;
}
let resourceTypeAndModifier = new ResourceTypeAndModifier({
type: pointNodeGen.resourceType, modifier: pointNodeGen.resourceModifier
});
playerResourceNodesAggregated.put(resourceTypeAndModifier,
(playerResourceNodesAggregated.get(resourceTypeAndModifier) || 0) + pointNodeGen.resourceAmount);
}
// Do the +flat, %increased, etc. calculations here
for (let key of enumKeys(ResourceNontrivialType)) {
// iterate throu
let amount = playerResourceNodesAggregated.get(new ResourceTypeAndModifier({
type: key,
modifier: ResourceModifier.Flat
})) || 0;
amount *= (1 + .01 * (playerResourceNodesAggregated.get(new ResourceTypeAndModifier({
type: key,
modifier: ResourceModifier.Increased0,
})) || 0));
amount = Math.floor(amount);
amount += playerResourceNodesAggregated.get(new ResourceTypeAndModifier({
type: key,
modifier: ResourceModifier.AfterIncreased0
})) || 0;
amount *= (1 + .01 * (playerResourceNodesAggregated.get(new ResourceTypeAndModifier({
type: key,
modifier: ResourceModifier.Increased1,
})) || 0));
amount = Math.floor(amount);
amount += playerResourceNodesAggregated.get(new ResourceTypeAndModifier({
type: key,
modifier: ResourceModifier.AfterIncreased1
})) || 0;
amounts[key] = amount;
}
return {
playerResourceAmounts: amounts as { [k in ResourceType]: number },
playerResourceNodesAggregated
};
}