/** * @file Initial game state data. * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { defaultAchievements } from "./achievements.js"; import { defaultAdventurers } from "./adventurers.js"; import { defaultBosses } from "./bosses.js"; import { defaultEquipment } from "./equipment.js"; import { defaultExplorations } from "./explorations.js"; import { defaultQuests } from "./quests.js"; import { currentSchemaVersion } from "./schemaVersion.js"; import { defaultUpgrades } from "./upgrades.js"; import { defaultZones } from "./zones.js"; import type { ApotheosisData, ExplorationState, GameState, Player, PrestigeData, TranscendenceData, } from "@elysium/types"; const initialPrestige: PrestigeData = { count: 0, productionMultiplier: 1, purchasedUpgradeIds: [], runestones: 0, }; const initialTranscendence: TranscendenceData = { count: 0, echoCombatMultiplier: 1, echoIncomeMultiplier: 1, echoMetaMultiplier: 1, echoPrestigeRunestoneMultiplier: 1, echoPrestigeThresholdMultiplier: 1, echoes: 0, purchasedUpgradeIds: [], }; const initialApotheosis: ApotheosisData = { count: 0, }; const initialExploration: ExplorationState = { areas: defaultExplorations.map((area) => { return { id: area.id, status: area.zoneId === "verdant_vale" ? ("available" as const) : ("locked" as const), }; }), craftedClickMultiplier: 1, craftedCombatMultiplier: 1, craftedEssenceMultiplier: 1, craftedGoldMultiplier: 1, craftedRecipeIds: [], materials: [], }; /** * Builds an initial game state for a new player. * @param player - The player data from Discord OAuth. * @param characterName - The character name chosen by the player. * @returns A fresh GameState object. */ const initialGameState = ( player: Player, characterName: string, ): GameState => { return { achievements: structuredClone(defaultAchievements), adventurers: structuredClone(defaultAdventurers), apotheosis: { ...initialApotheosis }, autoBoss: false, autoQuest: false, baseClickPower: 1, bosses: structuredClone(defaultBosses), companions: { activeCompanionId: null, unlockedCompanionIds: [] }, equipment: structuredClone(defaultEquipment), exploration: structuredClone(initialExploration), lastTickAt: Date.now(), player: { ...player, characterName: characterName, totalClicks: 0, totalGoldEarned: 0, }, prestige: initialPrestige, quests: structuredClone(defaultQuests), resources: { crystals: 0, essence: 0, gold: 0, runestones: 0, }, schemaVersion: currentSchemaVersion, transcendence: { ...initialTranscendence }, upgrades: structuredClone(defaultUpgrades), zones: structuredClone(defaultZones), }; }; export { initialExploration, initialGameState };