import type {TimedBuildBuff} from './build'; import type {Character} from './characters'; import { AnimationState, type CombatActionMode, type NpcBattleMode, type NpcBattleOutcome, WorldType, } from './core'; import type {CustomWorldProfile} from './customWorld'; import type {EquipmentLoadout, InventoryItem} from './items'; import type { CombatVisualEffect, CompanionState, Encounter, NpcPersistentState, SceneEncounterResult, SceneHostileNpc, ScenePresetInfo, } from './scene'; import type {CharacterChatRecord, QuestLogEntry, StoryMoment} from './story'; export interface GameRuntimeStats { playTimeMs: number; lastPlayTickAt: string | null; hostileNpcsDefeated: number; questsAccepted: number; itemsUsed: number; scenesTraveled: number; } export interface GameState { worldType: WorldType | null; customWorldProfile: CustomWorldProfile | null; playerCharacter: Character | null; runtimeStats: GameRuntimeStats; currentScene: string; storyHistory: StoryMoment[]; characterChats: Record; ambientIdleMode?: 'observe_signs'; lastObserveSignsSceneId?: string | null; lastObserveSignsReport?: string | null; animationState: AnimationState; currentEncounter: Encounter | null; npcInteractionActive: boolean; currentScenePreset: ScenePresetInfo | null; sceneMonsters: SceneHostileNpc[]; sceneHostileNpcs?: SceneHostileNpc[]; playerX: number; playerOffsetY: number; playerFacing: 'left' | 'right'; playerActionMode: CombatActionMode; scrollWorld: boolean; inBattle: boolean; playerHp: number; playerMaxHp: number; playerMana: number; playerMaxMana: number; playerSkillCooldowns: Record; activeBuildBuffs?: TimedBuildBuff[]; activeCombatEffects: CombatVisualEffect[]; playerCurrency: number; playerInventory: InventoryItem[]; playerEquipment: EquipmentLoadout; npcStates: Record; quests: QuestLogEntry[]; roster: CompanionState[]; companions: CompanionState[]; currentBattleNpcId: string | null; currentNpcBattleMode: NpcBattleMode | null; currentNpcBattleOutcome: NpcBattleOutcome | null; sparReturnEncounter: Encounter | null; sparPlayerHpBefore: number | null; sparPlayerMaxHpBefore: number | null; sparStoryHistoryBefore: StoryMoment[] | null; } export interface AIResponse { storyText: string; options: StoryMoment['options']; encounter?: SceneEncounterResult; }