/** * RPG runtime story 动作层共享契约。 * 将 function id、动作请求与交互元数据从旧 story.ts 中单独收口。 */ import type { JsonObject } from './common'; export type RuntimeAction< TType extends string = string, TPayload = JsonObject, > = { type: TType; functionId?: string; targetId?: string; payload?: TPayload; }; export type RuntimeActionRequest< TAction extends RuntimeAction = RuntimeAction, > = { sessionId: string; clientVersion?: number; action: TAction; }; export type RuntimeActionResponse< TViewModel = JsonObject, TPresentation = JsonObject, TPatch = JsonObject, > = { sessionId: string; serverVersion: number; viewModel: TViewModel; presentation: TPresentation; patches: TPatch[]; }; export const TASK5_RUNTIME_FUNCTION_IDS = [ 'story_continue_adventure', 'story_opening_camp_dialogue', 'camp_travel_home_scene', 'idle_call_out', 'idle_explore_forward', 'idle_observe_signs', 'idle_rest_focus', 'idle_travel_next_scene', 'battle_attack_basic', 'battle_use_skill', 'battle_all_in_crush', 'battle_escape_breakout', 'battle_feint_step', 'battle_finisher_window', 'battle_guard_break', 'battle_probe_pressure', 'battle_recover_breath', 'npc_chat', 'npc_fight', 'npc_help', 'npc_leave', 'npc_preview_talk', 'npc_recruit', 'npc_spar', ] as const; export type Task5RuntimeFunctionId = (typeof TASK5_RUNTIME_FUNCTION_IDS)[number]; export const TASK6_RUNTIME_FUNCTION_IDS = [ 'equipment_equip', 'equipment_unequip', 'forge_craft', 'forge_dismantle', 'forge_reforge', 'inventory_use', 'npc_gift', 'npc_chat_quest_offer_abandon', 'npc_chat_quest_offer_replace', 'npc_chat_quest_offer_view', 'npc_quest_accept', 'npc_quest_turn_in', 'npc_trade', ] as const; export type Task6RuntimeFunctionId = (typeof TASK6_RUNTIME_FUNCTION_IDS)[number]; export const SERVER_RUNTIME_FUNCTION_IDS = [ ...TASK5_RUNTIME_FUNCTION_IDS, ...TASK6_RUNTIME_FUNCTION_IDS, ] as const; export type ServerRuntimeFunctionId = (typeof SERVER_RUNTIME_FUNCTION_IDS)[number]; export const TASK5_RUNTIME_OPTION_SCOPES = ['story', 'combat', 'npc'] as const; export type Task5RuntimeOptionScope = (typeof TASK5_RUNTIME_OPTION_SCOPES)[number]; export type RuntimeStoryChoicePayload = JsonObject & { optionText?: string; note?: string; releaseNpcId?: string; preludeText?: string; }; export type RuntimeStoryOptionInteraction = | { kind: 'npc'; npcId: string; action: | 'chat' | 'help' | 'fight' | 'leave' | 'quest_offer_abandon' | 'quest_offer_replace' | 'quest_offer_view' | 'recruit' | 'spar' | 'trade' | 'gift' | 'quest_accept' | 'quest_turn_in'; questId?: string; }; export type RuntimeStoryChoiceAction = RuntimeAction< 'story_choice', RuntimeStoryChoicePayload > & { functionId: string; targetId?: string; };