/**
 * @typedef {{ kind: "egg", eggType: string, tokenId: number, hatchAt: number, seed: number }} EggCell
 * @typedef {{ kind: "animal", id: string, mutation: string, level: number, placedAt: number, lastVisitedAt?: number, lastFedAt?: number, originKey?: string, cellsWide?: number, cellsHigh?: number, fromOtherZoo?: boolean }} AnimalCell
 * @typedef {{ kind: "school", level: number }} SchoolCell
 * @typedef {{ kind: "nursery", tokenId?: number, level?: number }} NurseryCell
 * @typedef {{ kind: "souvenirShop", level: number }} SouvenirShopCell
 * @typedef {{ kind: "research", level: number }} ResearchCell
 * @typedef {{ kind: "billeterie", level: number }} BilleterieCell
 * @typedef {{ kind: "food", level: number }} FoodCell
 * @typedef {{ kind: "reception", level: number }} ReceptionCell
 * @typedef {{ kind: "biomeChangeColor", level: number }} BiomeChangeColorCell
 * @typedef {{ kind: "biomeChangeTemp", level: number }} BiomeChangeTempCell
 * @typedef {EggCell | AnimalCell | SchoolCell | NurseryCell | SouvenirShopCell | ResearchCell | BilleterieCell | FoodCell | ReceptionCell | BiomeChangeColorCell | BiomeChangeTempCell} Cell
 *
 * @typedef {{ id: string, animalId: string, nurseryCellKey: string, readyAt: number, fromOtherZoo?: boolean }} PendingBaby
 * @typedef {{ id: string, animalId: string, receptionCellKey: string, readyAt: number, originZooId?: string, reproductionScoreAtSale?: number }} ReceptionAnimal
 * @typedef {{ id: string, zooId: string, babyId?: string, animalId?: string, isBaby: boolean, price: number, endAt: number, reproductionScoreAtSale?: number, serverId?: string, bestBidAmount?: number, bestBidderZooId?: string, status?: "active"|"sold"|"expired"|"rejected"|"validated", validatedAt?: number | null }} SaleListing
 *
 * @typedef {{ arrivedAt: number, incidentType?: "thirst"|"bin"|"bench"|"animalFar"|"photo", incidentSince?: number }} VisitorEntry
 *
 * @typedef {{ id: string, descriptionKey: string, target: number, current: number, reward: number, done: boolean }} Quest
 *
 * @typedef {{ coins: number, plotLevel: number, conveyorLevel: number, truckLevel: number, profile: "fast"|"slow"|"balanced", lastTickAt: number }} BotState
 * @typedef {{ id: string, name: string, x: number, y: number, animalWeights: Record<string, number>, botState?: BotState }} WorldZooEntry
 *
 * @typedef {{
 *   version: number,
 *   specVersion?: number,
 *   coins: number,
 *   conveyorLevel: number,
 *   plotLevel: number,
 *   truckLevel?: number,
 *   grid: { width: number, height: number, cells: Record<string, Cell> },
 *   pendingEggTokens: Array<{ tokenId: number, eggType: string, boughtAt: number }>,
 *   nextTokenId: number,
 *   conveyorOffers: Array<{ eggType: string, price: number, zooId?: string }>,
 *   lastOfferRefreshAt: number,
 *   worldZoos?: Array<WorldZooEntry>,
 *   truckSale?: { toZooId: string, startAt: number },
 *   eggPurchaseTruck?: { eggType: string, fromZooId: string, toZooId: string, startAt: number },
 *   worldTruckSales?: Array<{ fromZooId: string, toZooId: string, startAt: number }>,
 *   lastEvolutionAt?: number,
 *   laboratoryOffer?: { eggType: string, price: number, endAt: number } | null,
 *   prestigeLevel?: number,
 *   timeOfDay?: number,
 *   gameDayTotal?: number,
 *   lastSeason?: string,
 *   seasonChangeMessage?: string,
 *   weather?: string,
 *   lastWeatherChangeAt?: number,
 *   quests?: Quest[],
 *   lastQuestDay?: string,
 *   stats?: { eggsPlaced: number, animalsSold: number, conveyorUpgrades: number, plotUpgrades: number, truckUpgrades?: number },
 *   mapZoom?: number,
 *   mapPanX?: number,
 *   mapPanY?: number,
 *   worldMapLevel?: number,
 *   autoMode?: boolean,
 *   autoModeProfile?: "fast"|"slow"|"balanced",
 *   autoModeProfileId?: number,
 *   autoProfilePickerOpen?: boolean,
 *   autoProfilePickerFamily?: number,
 *   lastPlayerAutoTickAt?: number,
 *   myZooId?: string,
 *   playerName?: string,
 *   playerX?: number,
 *   playerY?: number,
 *   researchPoints?: number,
 *   pendingBabies?: PendingBaby[],
 *   receptionAnimals?: ReceptionAnimal[],
 *   saleListings?: SaleListing[],
 *   salesFromApi?: { asSeller: Array<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: string, status: string, best_bid_amount?: number, best_bidder_zoo_id?: string, sold_at?: string, validated_at?: string | null, reproduction_score_at_sale?: number }>, asBuyerUndelivered: Array<{ id: string, animal_id: string, is_baby: boolean, initial_price: number, status?: string, validated_at?: string | null, reproduction_score_at_sale?: number }>, active: Array<{ id: string, seller_zoo_id: string, animal_id: string, is_baby: boolean, initial_price: number, end_at: string, best_bid_amount?: number }> },
 *   deathCountRecent?: number,
 *   birthCount?: number,
 *   feedingRate?: number,
 *   reproductionScore?: number,
 *   attractivityScore?: number,
 *   reproductionTimers?: Array<{ keyA: string, keyB: string, animalId: string, dueAt: number }>,
 *   visitorArrivals?: VisitorEntry[],
 *   attractivityBonusFromIncidents?: number,
 * }} GameState
 */

export default {};
