init with react+axum+spacetimedb
CI / verify (push) Has been cancelled

This commit is contained in:
2026-04-26 18:06:23 +08:00
commit cbc27bad4a
20199 changed files with 883714 additions and 0 deletions
@@ -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。',
},
};
+10
View File
@@ -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,直接进入对白流。',
},
};