Files
Genarrative/src/types/game.ts

145 lines
4.0 KiB
TypeScript

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<string, CharacterChatRecord>;
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<string, number>;
activeBuildBuffs?: TimedBuildBuff[];
activeCombatEffects: CombatVisualEffect[];
playerCurrency: number;
playerInventory: InventoryItem[];
playerEquipment: EquipmentLoadout;
npcStates: Record<string, NpcPersistentState>;
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;
}