import {
GameState,
ResourceType,
} from "../data/GameState";
import { INTMAX32, squirrel3 } from "../lib/util/random";
import { UpdaterGeneratorType2 } from "../lib/util/updaterGenerator";
export function createQuest(
updaters: UpdaterGeneratorType2<GameState>,
// gameState: GameState,
// config: QuestFactoryConfig = {}
) {
updaters.playerSave.questsCompleted.enqueueUpdate((prev, prevGameState) => {
let next = [...prev];
prevGameState.playerSave.activeQuest && next.push(prevGameState.playerSave.activeQuest);
return next;
});
updaters.playerSave.activeQuest.enqueueUpdate((prev, prevGameState) => {
const numQuestsCompleted = prevGameState.playerSave.questsCompleted.length;
const totalAllocatedNodes = prevGameState.computed.playerResourceNodesAggregated?.size() || 5;
// const r = Math.floor(Math.random() * 3) as 0 | 1 | 2;
// const resource = Object.values(ResourceNontrivialType)[r];
const resourceType = ResourceType.Mana0;
const currentResourceAmount = prevGameState.computed.playerResourceAmounts?.[resourceType] || 50;
const historicalAmountPerNode = currentResourceAmount / totalAllocatedNodes; // how much benefit, on average, each node gave
// we want # of nodes to be quadratic with the # of quests completed
const targetNumAllocatedNodes = totalAllocatedNodes + Math.round(Math.sqrt(totalAllocatedNodes) * 3 - 2);
const randomScale = (squirrel3(prevGameState.worldGen.seed + numQuestsCompleted) / INTMAX32) * 0.4 + 0.8; // 0.8 - 1.2
const resourceAmount = Math.round(targetNumAllocatedNodes * historicalAmountPerNode * randomScale);
return {
resourceType,
resourceAmount,
description: ""
};
});
updaters.playerSave.spSpentThisQuest.enqueueUpdate((prev) => {
return 0;
});
updaters.playerSave.questProgressHistory.enqueueUpdate((prev) => {
return [];
});
updaters.playerSave.questInitialAmount.enqueueUpdate((prev, prevGameState) => {
let resourceType = prevGameState.playerSave.activeQuest?.resourceType
if (resourceType) {
let newAmount = prevGameState.computed.playerResourceAmounts?.[resourceType];
return newAmount || prev;
}
return prev;
});
}
// type QuestFactoryConfig = {};
// export class QuestFactory {
// public config: QuestFactoryConfig;
//
// constructor(config: QuestFactoryConfig) {
// this.config = config;
// }
//
// public create(
// resourceType: ResourceType,
// resourceAmount: number,
// description: string = ""
// ): Quest {
// // console.log(resourceAmount);
// return {
// index,
// description,
// resourceType,
// resourceAmount,
// };
// }
// }
//