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'; import type { CampaignState, ChapterState, StoryEngineMemoryState, } from './storyEngine'; export interface GameRuntimeStats { playTimeMs: number; lastPlayTickAt: string | null; hostileNpcsDefeated: number; questsAccepted: number; itemsUsed: number; scenesTraveled: number; } export type PlayerProgressionGrantSource = 'quest' | 'hostile_npc'; export type GameRuntimeMode = 'play' | 'preview' | 'test'; export interface PlayerProgressionState { level: number; currentLevelXp: number; totalXp: number; xpToNextLevel: number; pendingLevelUps?: number; lastGrantedSource?: PlayerProgressionGrantSource | null; } export type RuntimeNpcTradeMode = 'buy' | 'sell'; export interface RuntimeNpcTradeItemView { itemId: string; item: InventoryItem; mode: RuntimeNpcTradeMode; unitPrice: number; maxQuantity: number; canSubmit: boolean; reason?: string | null; } export interface RuntimeNpcGiftItemView { itemId: string; item: InventoryItem; affinityGain: number; canSubmit: boolean; reason?: string | null; } export interface RuntimeNpcInteractionView { npcId: string; npcName: string; playerCurrency: number; currencyName: string; trade: { buyItems: RuntimeNpcTradeItemView[]; sellItems: RuntimeNpcTradeItemView[]; }; gift: { items: RuntimeNpcGiftItemView[]; }; } export interface GameState { worldType: WorldType | null; customWorldProfile: CustomWorldProfile | null; playerCharacter: Character | null; runtimeSessionId?: string | null; storySessionId?: string | null; runtimeActionVersion?: number; runtimeMode?: GameRuntimeMode; runtimePersistenceDisabled?: boolean; runtimeStats: GameRuntimeStats; playerProgression?: PlayerProgressionState | null; currentScene: string; storyHistory: StoryMoment[]; storyEngineMemory?: StoryEngineMemoryState; chapterState?: ChapterState | null; campaignState?: CampaignState | null; activeScenarioPackId?: string | null; activeCampaignPackId?: string | null; characterChats: Record; ambientIdleMode?: 'observe_signs'; lastObserveSignsSceneId?: string | null; lastObserveSignsReport?: string | null; animationState: AnimationState; currentEncounter: Encounter | null; npcInteractionActive: boolean; runtimeNpcInteraction?: RuntimeNpcInteractionView | null; currentScenePreset: ScenePresetInfo | null; 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; }