仙途 XianTu 静态分析:模块设计与工作原理
对象:qianye60/XianTu · 方法:纯静态分析
1. 总体架构
XianTu 是纯前端的 AI 驱动修仙文字冒险游戏(Vue 3 + TypeScript + Pinia + Webpack),无内置后端也可运行;可选 Python/FastAPI 后端仅用于账号/存档云同步。核心思想:AI 作为「天道」GM 实时生成叙事,并以结构化 JSON 指令(tavern_commands)反向驱动游戏状态,前端负责状态机、判定、存档与渲染。
┌──────────────────────────── 浏览器 ─────────────────────────────┐
│ Vue 3 组件层 (dashboard/*.vue, character-creation/*.vue) │
│ │ 渲染/事件 │
│ Pinia Store 层 │
│ ├ gameStateStore.ts (游戏状态 / toSaveData / loadFromSaveData)│
│ ├ characterStore.ts (角色+多存档 / IndexedDB 持久化) │
│ ├ actionQueueStore.ts (动作队列) apiManagementStore.ts(多API) │
│ └ uiStore.ts (UI/流式) characterCreationStore.ts (创角) │
│ │ 编排 │
│ AIBidirectionalSystem.ts (核心双向系统:拼Prompt→调AI→解析→执行) │
│ │ 组装 │
│ promptAssembler.ts + prompts/definitions/* (规则/数据定义提示词) │
│ │ 检索(可选) │
│ vectorMemoryService.ts(长期记忆向量) narrativeRagService.ts(叙事) │
│ │ 调用 │
│ aiService.ts (统一AI层:TavernHelper 或 自定义API axios) │
│ ▼ │
│ SillyTavern 内嵌 / OpenAI 兼容(OpenAI/Claude/Gemini/DeepSeek...) │
└──────────────────────────────────────────────────────────────────┘
▼ 持久化(IndexedDB via idb) ▼ 可选云端
indexedDBManager.ts (乾坤宝库) services/api/* (FastAPI/JWT)
技术栈见 package.json:25-73(vue/pinia/idb/axios/pixi.js/chart.js 等);入口 src/main.ts,路由 src/router/index.ts。
2. 核心工作流(最重要链路)
链路 A:玩家选择 → 剧情节点解析 → LLM 生成/检索 → 状态更新 → 渲染
- 玩家输入:
MainGamePanel.vue:1433 sendMessage()读取输入框 + 动作队列文本,包成<行动趋向>标签,调用bidirectionalSystem.processPlayerAction()(MainGamePanel.vue:1571)。 - 取档与快照:
AIBidirectionalSystem.ts:434 processPlayerAction先gameStateStore.toSaveData()拿 V3 存档(gameStateStore.ts:469),并做「上次对话」快照用于回滚(AIBidirectionalSystem.ts:467-474)。 - 检索(可选):向量检索长期记忆
vectorMemoryService(AIBidirectionalSystem.ts:509-538)与叙事 RAGnarrativeRagService(:540-559),把 TopK 相关片段注入提示词,替代全量长期记忆以省 token。 - 前端判定数据:计算「幸运点/气运值/环境修正」等,写入
coreStatusSummary(AIBidirectionalSystem.ts:582-657),要求 AI 直接使用而不自行计算。 - 拼 Prompt:
assembleSystemPrompt(promptAssembler.ts:17)按模块拼接核心规则/业务规则/数据结构定义/世界观等,再叠加完整存档 JSON(stateJsonString)。 - 调 LLM:
aiService.generate()(aiService.ts:536),酒馆走 TavernHelper,网页走自定义 API;支持「分步生成」(先正文后指令,AIBidirectionalSystem.ts:944-1126)。 - 解析响应:
parseAIResponse(AIBidirectionalSystem.ts:3447)把 AI 返回 JSON 解析为GM_Response{ text, mid_term_memory, tavern_commands[], action_options[] },含多层容错(:1154-1230)。 - 执行指令:
processGmResponse(:1768)→_preprocessCommands纠错(:2541)→ 校验(commandValidator/commandValueValidator)→executeCommand执行set/add/push/delete/pull(:3009)→ 事后validateSaveDataV3结构校验、必要时回滚(:2139-2187)。 - 回写与渲染:
gameStateStore.loadFromSaveData()刷新 Pinia(:2250-2253),saveAfterConversation()落盘(gameStateStore.ts:740),UI 响应式重渲染;流式文本通过onStreamChunk实时显示。
链路 B:记忆三级沉降(短期→隐式中期→中期→长期):processGmResponse 把 text 写入短期记忆并超限转移(AIBidirectionalSystem.ts:1836-1914);中期达阈值时异步 triggerMemorySummary(:2276)调 AI 总结压入长期记忆,并同步向量索引。
3. 模块逐一分析
3.1 状态 Store
src/stores/gameStateStore.ts:游戏核心状态。GameState接口(:111-168)持有 character/attributes/location/inventory/relationships/worldInfo/memory/gameTime 等。关键函数:loadFromSaveData(:276,深拷贝 + 字段容错 + 关系矩阵归一化)、toSaveData(:469,反序列化为 V3 五域)、updateState(:845,lodash set +$patch保响应式)、addToShortTermMemory(:897)、advanceGameTime(:654,分钟/小时/日/月/年进位)。src/stores/characterStore.ts:角色列表与多存档槽。saveCurrentGame(:1358)、saveToSlot(:1747)、loadSaveData(:2678),均委托indexedDBManager。src/stores/apiManagementStore.ts:多 API 配置。APIUsageType(:25-34)含 main/memory_summary/embedding/text_optimization/instruction_generation/world_generation/event_generation/sect_generation/crafting,按功能分配不同 API。src/stores/actionQueueStore.ts/uiStore.ts/characterCreationStore.ts:动作队列、UI/流式状态、创角流程。
3.2 LLM 调用层
src/services/aiService.ts:统一 AI 服务,双模式(tavern/custom)。APIProvider(:17)与API_PROVIDER_PRESETS(:38-53)预置 OpenAI/Claude/Gemini/DeepSeek/智谱/火山(豆包)/硅基流动(embedding)/custom。generate(:536)/generateRaw(:606)按usageType路由到酒馆或独立 API;callAPI(:1071)分 provider 走 Claude/Gemini/OpenAI 兼容端点;callOpenAICompatibleAPI(:1260)支持流式、失败降级非流式、response_format: json_object强 JSON、clampMaxTokensForContext(:1213)按模型上下文估算裁剪 max_tokens;含取消(AbortController)与指数退避重试(:796-875)。src/services/embeddingService.ts:createEmbeddings(:64)区分 DashScope/SiliconFlow/OpenAI 兼容三类 embedding 端点,normalizeToUnitVector(:58)归一化向量。
3.3 剧情/提示词组织
- 剧情是 AI 实时生成 + 预设数据混合,无预设剧本树。预设部分:世界观
LOCAL_WORLDS(data/creationData.ts:7,10 个世界)、天资/出身/灵根/天赋表、SPECIAL_NPCS(data/specialNpcs.ts)、功法/事件/文本格式等提示词模板。 src/utils/prompts/promptAssembler.ts:assembleSystemPrompt(:17)拼接核心输出规则、业务规则、主角性格、数据结构定义、文本格式、世界标准,并按开关注入 actionOptions/eventSystem/NSFW/联机规则。src/utils/prompts/definitions/*.ts:dataDefinitions(存档结构定义)、businessRules、coreRules、textFormats、worldStandards、eventSystemRules、npcRelationRules 等,是可被用户自定义的提示词模块(经getPrompt/defaultPrompts.ts:750)。
3.4 存档
- 存档结构 V3:五域
元数据/角色/社交/世界/系统(docs/save-schema.md:7-15,完整树:28+)。SaveData为宽接口(game.d.ts:1093),实际由toSaveData组装、loadFromSaveData解析,含isSaveDataV3/migrateSaveDataToLatest迁移(utils/saveMigration.ts)。 - 持久化:
src/utils/indexedDBManager.ts,saveSaveData(:323)/loadSaveData(:345)按${prefix}${charId}_${slotId}存 IndexedDB,含「云端修行/存档」别名兼容(:364-393)。 - 校验与修复:
utils/saveValidationV3.ts(validateSaveDataV3)、utils/dataRepair.ts(repairSaveData)、utils/dataValidation.ts(NPC 档案校验修复)。
3.5 记忆系统
- 三层记忆
Memory{短期/中期/长期/隐式中期}(game.d.ts:1061)。短期→隐式中期→中期自动沉降(AIBidirectionalSystem.ts:1836-1914、gameStateStore.ts:897)。 src/services/vectorMemoryService.ts:长期记忆向量化检索(syncFromLongTermMemories:460、searchMemories:531),IndexedDB 存储向量。src/services/narrativeRagService.ts:只索引 GM 叙事正文(getNarrativeItems:72),ensureIndexed(:222)批量 embedding,search(:269)余弦相似度 TopK,buildSectionForPrompt(:291)注入提示词。
3.6 世界/事件/地图
- 世界生成:
utils/worldGeneration/enhancedWorldGenerator.ts(generateValidatedWorld:78)用 AI(usageType=world_generation)生成WorldInfo。 - 事件系统:
EventSystem{配置/下次事件时间/事件记录}(game.d.ts:886);maybeTriggerScheduledWorldEvent(AIBidirectionalSystem.ts:170)按游戏时间触发随机世界事件/特殊 NPC 登场,由utils/generators/eventGenerators.ts用 AI 生成。 - 地图:
worldInfo.地点信息/势力信息/大陆信息(game.d.ts:793);区域地图RegionMap(types/gameMap.ts)按需生成,gameStateStore.enterRegion/leaveRegion(:987-1003);境界地图集realmMapCollection;渲染dashboard/GameMapPanel.vue、RegionMapPanel.vue。
3.7 宗门 / 炼器 / 三千大道 / 联机
- 宗门系统:
SectSystemV2(game.d.ts:401)含 当前宗门/宗门档案/藏经阁/贡献商店/任务/经营/战争;sectSystemFactory.ts初始化、sectWarSimulation.ts分阶段推演宗门大战、sectLeadershipUtils.ts识别玩家领导职位。 - 炼器/炼丹:
craftingSystem.ts与CraftingResult(game.d.ts:1315),用 AI(usageType=crafting)生成炼制过程与成品,品质废品/残次品/成品/精品/极品/神品。 - 三千大道:
ThousandDaoSystem(game.d.ts:566)大道列表: Record<道名, DaoData>,每条大道含阶段列表 + 是否解锁/当前阶段/当前经验/总经验;add指令同步累计总经验(AIBidirectionalSystem.ts:3191-3200)。 - 联机/在线旅行:
services/api/onlineTravel.ts、services/onlineTravel.ts、services/presence.ts,通过可选 FastAPI 后端(JWT/WebSocket)实现「穿越到他人世界」、离线玩家 AI 代理、系统.联机.服务器日志指令上报(AIBidirectionalSystem.ts:2057-2113)。
4. 数据模型(关键结构)
- 境界/修炼:
Realm{名称,阶段,当前进度,下一级所需,突破描述}(game.d.ts:620);RealmDefinition(:641)含 level/name/title/lifespan/stages。data/realms.ts:65定义 凡人→渡劫 9 级,每级 5 子阶段(初期/中期/后期/圆满/极境,createStandardStages:4),含 resource_multiplier/lifespan_bonus/特殊能力。 - 属性:先天/后天「六司」
InnateAttributes{根骨,灵性,悟性,气运,魅力,心性}(game.d.ts:156);PlayerAttributes是PlayerStatus的 Pick(境界/声望/气血/灵气/神识/寿命,:677);ValuePair{当前,上限}(:135)。 - 角色:
CharacterBaseInfo(:1124,名字/性别/世界/天资/出生/灵根/天赋/先天六司/后天六司)。 - NPC:
NpcProfile(:986)含 名字/性格特征/境界/灵根/先天六司/属性/与玩家关系/好感度/当前位置/人格底线/记忆/当前内心想法/当前外貌状态/背包/私密信息(NSFW)/实时关注。 - 物品:
BaseItem{物品ID,名称,类型,品质,数量,描述},EquipmentItem/TechniqueItem/ConsumableItem联合Item(:209-245);Inventory{灵石{下/中/上/极品}, 货币?, 物品: Record<ID,Item>}(:266);品质QualityType{神/仙/天/地/玄/黄/凡}+GradeType 0-10(data/itemQuality.ts)。 - 时间:
GameTime{年,月,日,小时,分钟}(:1070)。 - 事件:
EventSystem{配置,下次事件时间,事件记录}(:886),GameEvent{事件ID,事件名称,事件类型,事件描述,影响等级,相关人物/势力,事件来源,发生时间}(:839)。 - 状态效果:
StatusEffect{状态名称,类型(buff/debuff),生成时间,持续时间分钟,强度,来源}(:600),由statusEffectManager.ts计算过期移除。 - 存档元数据:
元数据{版本号(=3),存档ID,存档名,游戏版本,创建/更新时间,游戏时长秒,时间}(docs/save-schema.md:29-42)。 - AI 协议:
TavernCommand{action,key,value}(AIGameMaster.d.ts:14);GM_Response{text,mid_term_memory,tavern_commands[],action_options[]}(:189)。
5. 修仙数值体系建模(重点)
境界为离散层级 × 子阶段的数值框架:境界.名称(9 级) + 境界.阶段(5 档) + 当前进度/下一级所需。突破进度由 AI 通过 add 角色.属性.境界.当前进度 指令推进(executeCommand 的 add 分支,AIBidirectionalSystem.ts:3176),前端不做硬性等级约束,主要靠提示词约束 + 事后校验。
修炼速度有纯前端公式:cultivationSpeedCalculator.ts:338 最终速度 = 基础速度 × 灵气系数 × 六司综合系数 × 状态系数 × (1+功法加成+环境加成);六司系数=先天×0.7+(1+后天)×0.3(:176);REALM_BREAKTHROUGH_STANDARDS(:68)给出各境界阶段最短/标准/最长突破月数,用于预估突破时间与进度合理性校验。
判定(战斗/修炼/探索)由前端算好「判定数据」交给 AI:AIBidirectionalSystem.ts:620-657 基于气运算幸运点、基于位置灵气浓度算环境修正,AI 只需按给定值写叙事结论;另有 diceRoller.ts(d20/多骰/calculateFinalValue)与 attributeCalculation.ts(装备/天赋加成合成后天六司)。
6. 与 Z.R.I.C 的功能对照表
| 维度 | XianTu 实现情况 | 依据 |
|---|---|---|
| 剧本解析 | 无预设剧本树;用 parseAIResponse 解析 AI 结构化 JSON(正文+指令),视为「动态剧本」 |
AIBidirectionalSystem.ts:3447 |
| 推演分支 | 无固定分支树;分支=玩家输入+AI 自由叙事+随机事件+action_options 引导 |
AIBidirectionalSystem.ts:1180-1228 |
| 自动判定 | ✅ 前端计算幸运点/环境修正等判定数据交 AI 使用;d20 骰子、修炼速度公式 | AIBidirectionalSystem.ts:636-657、diceRoller.ts:10 |
| 世界状态 | ✅ WorldInfo(大陆/势力/地点/经济/区域地图),AI 生成 + 存档持久 |
game.d.ts:793、enhancedWorldGenerator.ts:78 |
| NPC情绪记忆 | ✅ NPC 有 当前内心想法/当前外貌状态/记忆/好感度/人格底线;buildFocusedNpcPrompt 每回合更新「实时关注」NPC |
game.d.ts:986-1056、AIBidirectionalSystem.ts:143 |
| 地图 | ✅ 世界坐标 + 区域地图(regionId/buildingId) + 境界地图集,gameMapManager |
gameStateStore.ts:957-1003 |
| 触发器 | ✅ 事件系统按游戏时间触发随机事件/特殊 NPC;状态效果(StatusEffect) | AIBidirectionalSystem.ts:170、game.d.ts:600 |
| 时间线 | ✅ GameTime 年月日时分 + advanceGameTime + 事件按年推进 |
gameStateStore.ts:654、game.d.ts:1070 |
| 记忆系统 | ✅ 短期/中期/长期三层 + 自动总结 + 向量检索 + 叙事 RAG | game.d.ts:1061、vectorMemoryService.ts、narrativeRagService.ts |
| 本地模型 | ⚠️ 无显式 Ollama/LM Studio 支持;custom(OpenAI 兼容) provider 可指向本地端点;embedding 仍需云端 API |
aiService.ts:52、grep 未见 ollama/llama |
| 许可 | ⚠️ LICENSE 为自定义「个人/非商用免费,商用联系作者」,与 package.json 声明 Apache-2.0、文件头 CC BY-NC-SA 4.0 不一致 | LICENSE:1-18、package.json:7、gameStateStore.ts:4 |
7. 设计评价
优点
- 「AI 出指令、前端执行+校验」的架构边界清晰:AI 只输出 JSON 指令,前端
executeCommand有严格动作集、路径白名单、只读保护、事后结构校验与回滚,把 AI 的不可靠性隔离在可控沙箱内(AIBidirectionalSystem.ts:1945-2187)。 - 成熟的容错/纠错体系:指令预处理把旧格式/整体覆盖/数组 push 等 AI 常见错误自动改写(
:2541-3007),响应解析多层降级(:1154-1230),数据修复(dataRepair.ts)+ 存档迁移(saveMigration.ts)保证旧档兼容。 - 可扩展的多 API + 可插拔提示词:按功能类型分配不同 API(
apiManagementStore.ts:25),提示词模块化且支持用户自定义(promptAssembler.ts、promptStorage.ts),能针对不同任务(正文/指令/记忆/事件/embedding)用不同模型。 - 记忆分层 + 向量/RAG 检索:三层记忆沉降 + 长期记忆向量检索 + 叙事 RAG,缓解长上下文 token 压力(
AIBidirectionalSystem.ts:509-559)。 - 数值体系相对自洽:境界/六司/修炼速度/突破时间/判定数据有明确公式与标准表(
cultivationSpeedCalculator.ts、realms.ts)。
缺陷
- 大量
any与中文 key 直接访问:核心状态大量as any/(saveData as any)?.角色?.属性...(如gameStateStore.ts:277-428、AIBidirectionalSystem.ts:565-690),类型安全形同虚设,重构/迁移易出错。 - 核心类职责过重:
AIBidirectionalSystem.ts达 3510 行,混合了 prompt 构建、世界事件调度、响应解析、指令执行、记忆总结、联机逻辑,可维护性差。 - 冗余/重复文件:如
services/与services/prompts/、services/initialization/存在疑似重复(defaultPrompts.ts、promptConfig.ts、promptStorage.ts、characterInitialization.ts各两份),存在死代码/迁移残留风险(见 glob 列表)。 - 本地模型支持缺失:embedding 仅支持 DashScope/SiliconFlow/OpenAI 兼容云端,未提供本地 embedding/推理的完整方案;对纯离线玩家门槛高。
- 许可与声明冲突:LICENSE(个人/非商用)、package.json(Apache-2.0)、文件头(CC BY-NC-SA 4.0)三处不一致,商用边界不清晰(
LICENSE:5-18)。
8. 结论
XianTu 是一款架构思路较成熟的「AI 作为动态 GM」的修仙文字冒险:用提示词 + 完整 JSON 状态注入驱动 AI 生成叙事,再用受控的 tavern_commands 指令沙箱把 AI 输出回流为确定性状态变更,辅以三层记忆、向量/RAG 检索、世界事件、宗门/炼器/三千大道等丰富子系统,形成了「实时生成 + 预设数据」混合的剧情体系。其修仙数值(境界/六司/修炼速度/判定)以前端公式 + 标准表 + AI 叙事包装实现,而非硬性战斗引擎。主要短板在工程层面:类型安全弱、核心类过重、文件冗余、许可声明不一致,以及缺少显式本地模型方案(仅能经 OpenAI 兼容 custom 端点间接使用)。总体看,它是一个「玩法广度优先、AI 容错工程化程度高」的完整实现,适合作为 AI 文字游戏的状态管理与指令沙箱参考。
9. 附注:未读到项
- 后端实现:仓库仅含
pyproject.toml(引用server.database/server/migrations,Tortoise ORM + Aerich),但server/目录未随克隆提供,后端 FastAPI/SQLite/WebSocket 具体逻辑未读到(READMEREADME.md:125-135有部署说明)。 - 样式/CSS 细节:按要求忽略,未分析双主题样式实现。
apiService的剩余流式实现(aiService.ts:1360+之后):仅抽样到callOpenAICompatibleAPI的非流式与降级分支,Claude/Gemini 流式细节未逐行展开,不影响结论。- 执行边界:全程仅 read/grep/glob 静态阅读,未运行、未
npm install、未启动任何服务。