@@ -0,0 +1,62 @@
|
||||
import { AnimationState, type StoryOption } from '../../../types';
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
|
||||
/**
|
||||
* camp_travel_home_scene
|
||||
*
|
||||
* 从营地与同伴对话结束后,正式前往角色主线场景的控制 function。
|
||||
* 这里除了元信息,也直接收口了它的按钮构造与判定 helper。
|
||||
*/
|
||||
export const CAMP_TRAVEL_HOME_OPTION_VISUALS: StoryOption['visuals'] = {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: 1.1,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterChanges: [],
|
||||
};
|
||||
|
||||
export function buildCampTravelHomeOption(sceneName: string): StoryOption {
|
||||
return {
|
||||
functionId: CAMP_TRAVEL_HOME_FUNCTION.id,
|
||||
actionText: `前往 ${sceneName}`,
|
||||
text: `前往 ${sceneName}`,
|
||||
detailText: `离开营地,前往 ${sceneName}。`,
|
||||
visuals: CAMP_TRAVEL_HOME_OPTION_VISUALS,
|
||||
};
|
||||
}
|
||||
|
||||
export function isCampTravelHomeFunctionId(functionId: string) {
|
||||
return functionId === CAMP_TRAVEL_HOME_FUNCTION.id;
|
||||
}
|
||||
|
||||
export function isCampTravelHomeOption(option: StoryOption) {
|
||||
return isCampTravelHomeFunctionId(option.functionId);
|
||||
}
|
||||
|
||||
export const CAMP_TRAVEL_HOME_FUNCTION: FunctionDocumentationEntry = {
|
||||
id: 'camp_travel_home_scene',
|
||||
domain: 'flow',
|
||||
title: '前往角色主场景',
|
||||
source: 'src/data/functionCatalog/flow/campTravelHomeScene.ts',
|
||||
summary: '营地开场后的专用旅行控制项。',
|
||||
detailedDescription:
|
||||
'它负责把开局同伴营地流程平稳切到角色真正的起始场景,并清理当前营地 encounter、战斗态和镜头残留状态。',
|
||||
trigger: '常见于开局同伴营地对话后的跟进选项。',
|
||||
execution:
|
||||
'点击后不会走普通 state function 结算,而是执行一次定制的场景迁移和历史写入。',
|
||||
result: '玩家会离开营地进入角色主场景,正式开始该角色的冒险线。',
|
||||
active: true,
|
||||
runtime: {
|
||||
storyMode: 'special_travel',
|
||||
uiMode: 'none',
|
||||
visuals: CAMP_TRAVEL_HOME_OPTION_VISUALS,
|
||||
executor:
|
||||
'src/hooks/rpg-runtime-story/choiceActions.ts -> handleCampTravelHome',
|
||||
animationNote:
|
||||
'先播放营地离场的 run 演出,再切到正式场景并生成 encounter preview。',
|
||||
storyNote:
|
||||
'通过 commitGeneratedStateWithEncounterEntry 写入离营结果,并在新场景继续后续剧情。',
|
||||
uiNote: '这是专用旅行流程,不会打开 modal。',
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,10 @@
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
import { CAMP_TRAVEL_HOME_FUNCTION } from './campTravelHomeScene';
|
||||
import { CONTINUE_ADVENTURE_FUNCTION } from './storyContinueAdventure';
|
||||
import { STORY_OPENING_CAMP_DIALOGUE_FUNCTION } from './storyOpeningCampDialogue';
|
||||
|
||||
export const FLOW_FUNCTION_DOCUMENTATION: FunctionDocumentationEntry[] = [
|
||||
CONTINUE_ADVENTURE_FUNCTION,
|
||||
CAMP_TRAVEL_HOME_FUNCTION,
|
||||
STORY_OPENING_CAMP_DIALOGUE_FUNCTION,
|
||||
];
|
||||
@@ -0,0 +1,61 @@
|
||||
import { AnimationState, type StoryOption } from '../../../types';
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
|
||||
/**
|
||||
* story_continue_adventure
|
||||
*
|
||||
* 聊天或特殊流程已经提前完成推理后,用于“把延后展示的 options 放出来”的控制 function。
|
||||
* 这里除了说明文本外,也直接收口了这个 function 的按钮视觉和判定 helper。
|
||||
*/
|
||||
export const CONTINUE_ADVENTURE_OPTION_VISUALS: StoryOption['visuals'] = {
|
||||
playerAnimation: AnimationState.RUN,
|
||||
playerMoveMeters: 1.1,
|
||||
playerOffsetY: 0,
|
||||
playerFacing: 'right',
|
||||
scrollWorld: false,
|
||||
monsterChanges: [],
|
||||
};
|
||||
|
||||
export function buildContinueAdventureOption(): StoryOption {
|
||||
return {
|
||||
functionId: CONTINUE_ADVENTURE_FUNCTION.id,
|
||||
actionText: CONTINUE_ADVENTURE_FUNCTION.title,
|
||||
text: CONTINUE_ADVENTURE_FUNCTION.title,
|
||||
priority: 99,
|
||||
visuals: CONTINUE_ADVENTURE_OPTION_VISUALS,
|
||||
};
|
||||
}
|
||||
|
||||
export function isContinueAdventureFunctionId(functionId: string) {
|
||||
return functionId === CONTINUE_ADVENTURE_FUNCTION.id;
|
||||
}
|
||||
|
||||
export function isContinueAdventureOption(option: StoryOption) {
|
||||
return isContinueAdventureFunctionId(option.functionId);
|
||||
}
|
||||
|
||||
export const CONTINUE_ADVENTURE_FUNCTION: FunctionDocumentationEntry = {
|
||||
id: 'story_continue_adventure',
|
||||
domain: 'flow',
|
||||
title: '继续冒险',
|
||||
source: 'src/data/functionCatalog/flow/storyContinueAdventure.ts',
|
||||
summary: '承接 deferredOptions 的延迟展示控制项。',
|
||||
detailedDescription:
|
||||
'它不是重新推理剧情,而是在某些流程已经先算好后续 options 时,给玩家一个清晰的继续按钮,再把 deferredOptions 真正放回界面。',
|
||||
trigger: '常见于 npc_chat 等先生成正文、后延迟显示选项的链路。',
|
||||
execution:
|
||||
'点击后主要走本地 UI / state 还原逻辑,而不是再请求一次新的故事推理。',
|
||||
result:
|
||||
'玩家会看到之前已经准备好的后续冒险选项,误以为“没继续生成”的风险也会降低。',
|
||||
active: true,
|
||||
runtime: {
|
||||
storyMode: 'reveal_deferred_options',
|
||||
uiMode: 'none',
|
||||
visuals: CONTINUE_ADVENTURE_OPTION_VISUALS,
|
||||
executor: 'src/hooks/rpg-runtime-story/choiceActions.ts -> handleChoice',
|
||||
animationNote: '按钮本身沿用轻量前进动画,但不驱动新的战斗或场景演出。',
|
||||
storyNote:
|
||||
'点击时直接把 deferredOptions 放回 currentStory.options,不再请求新的 generateNextStep。',
|
||||
uiNote: '这是一个流程确认按钮,不会弹 modal。',
|
||||
},
|
||||
};
|
||||
@@ -0,0 +1,38 @@
|
||||
import type { FunctionDocumentationEntry } from '../types';
|
||||
|
||||
/**
|
||||
* story_opening_camp_dialogue
|
||||
*
|
||||
* 开局营地场景的特殊对话控制 function。
|
||||
* 这里同时提供判定 helper,供 prompt 和故事流程判断是否进入营地开场对白模式。
|
||||
*/
|
||||
export function isOpeningCampDialogueFunctionId(
|
||||
functionId: string | null | undefined,
|
||||
) {
|
||||
return functionId === STORY_OPENING_CAMP_DIALOGUE_FUNCTION.id;
|
||||
}
|
||||
|
||||
export const STORY_OPENING_CAMP_DIALOGUE_FUNCTION: FunctionDocumentationEntry =
|
||||
{
|
||||
id: 'story_opening_camp_dialogue',
|
||||
domain: 'flow',
|
||||
title: '营地开场对话',
|
||||
source: 'src/data/functionCatalog/flow/storyOpeningCampDialogue.ts',
|
||||
summary: '驱动开局营地 4 到 6 行开场对白的流程项。',
|
||||
detailedDescription:
|
||||
'它告诉 prompt 与运行时:当前不是普通探索推进,而是要围绕营地背景、初始同伴态度和刚进入世界的紧张感生成一段结构化开场对白。',
|
||||
trigger: '开局同伴营地场景进入正式对话时出现。',
|
||||
execution:
|
||||
'点击后会进入 opening adventure 的特殊对话生成链,而不是普通 function option 链路。',
|
||||
result: '玩家会先看到一段营地对白,再衔接后续 npc_chat 或离营流程。',
|
||||
active: true,
|
||||
runtime: {
|
||||
storyMode: 'special_sequence',
|
||||
uiMode: 'none',
|
||||
executor:
|
||||
'server-rs/crates/api-server/src/runtime_story/compat.rs -> resolve_runtime_story_choice_action',
|
||||
animationNote: '重点在对白本身,不额外驱动独立战斗/位移动画。',
|
||||
storyNote: '会把 prompt 切到营地开场对白模式,并要求输出结构化对话行。',
|
||||
uiNote: '不弹 modal,直接进入对白流。',
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user