【Westworld Simulation Diary 3.1】项目深度解读
本项目是一个完整的、功能丰富的叙事模拟系统。现代前端技术栈(React + TypeScript)AI 驱动的交互(Google Gemini)桌面应用框架(Electron)复杂的状态管理丰富的可视化展示理解整个项目的架构和设计知道每个文件的作用和职责理解数据流和状态管理知道如何扩展和修改功能解决常见问题希望这份文档能帮助你更好地理解和开发这个项目!
DELOS Narrative Engine 项目深度解读
本文详细讲解项目的文件组织架构、相互调用逻辑,以及每个文件的功能。

第一部分:项目架构概览
项目类型:基于 React + TypeScript + Electron 的桌面应用
核心功能:西部世界主题的叙事控制与模拟系统
技术栈:
- 前端框架:React 19.2.0
- 类型系统:TypeScript 5.8.2
- 构建工具:Vite 6.2.0
- 桌面应用:Electron 28.0.0
- AI 服务:Google Gemini AI
- 数据可视化:Recharts 3.4.1
- 样式框架:Tailwind CSS
第二部分:文件组织架构
项目采用分层架构设计,主要分为以下几个层次:
-
【入口层】
- index.html # HTML 入口模板
- index.tsx # React 应用入口
- electron/main.cjs # Electron 主进程入口
-
【核心层】
- App.tsx # 主应用组件(包含所有业务逻辑)
- types.ts # TypeScript 类型定义
- constants.ts # 常量数据(Host、对话树、地图位置等)
-
【组件层】
- components/RadarChart.tsx # 属性雷达图可视化组件
- components/SweetwaterMap.tsx # 地图可视化组件
-
【服务层】
- services/geminiService.ts # Gemini AI 服务封装
-
【配置层】
- vite.config.ts # Vite 构建配置
- tsconfig.json # TypeScript 编译配置
- package.json # 项目依赖和脚本配置
-
【资源层】
- public/ # 静态资源(图片、音频)
- dist/ # 构建输出目录
- dist-electron/ # Electron 打包输出目录
-
【脚本层】
- scripts/ # 工具脚本
- build-with-fix.ps1 # 构建修复脚本
第三部分:核心调用关系图
【启动流程】
┌─────────────────┐
│ electron/main │ ← Electron 启动
└────────┬────────┘
│ 创建 BrowserWindow
↓
┌─────────────────┐
│ index.html │ ← 加载 HTML 模板
└────────┬────────┘
│ 加载脚本
↓
┌─────────────────┐
│ index.tsx │ ← React 应用挂载
└────────┬────────┘
│ render(<App />)
↓
┌─────────────────┐
│ App.tsx │ ← 主应用组件(核心)
└────────┬────────┘
│
├─→ components/RadarChart.tsx (属性可视化)
├─→ components/SweetwaterMap.tsx (地图可视化)
├─→ services/geminiService.ts (AI 服务调用)
├─→ constants.ts (数据源)
└─→ types.ts (类型定义)
【数据流向】
constants.ts (数据源)
↓
App.tsx (状态管理)
↓
components/ (视图渲染)
↓
services/geminiService.ts (AI 处理)
↓
App.tsx (状态更新)
第四部分:文件功能详解
1. 入口文件
【index.html】
位置:根目录
功能:
- 提供 HTML 模板结构
- 引入 Tailwind CSS 和字体资源
- 配置 importmap 用于模块导入
- 定义全局样式(滚动条、字体等)
- 创建 #root 挂载点供 React 渲染
关键配置:
- Tailwind CSS 通过 CDN 引入
- 自定义颜色主题(delos 色系)
- 中文字体配置(font-cn 类)
- 导入映射表(React、Recharts 等)
【index.tsx】
位置:根目录
功能:
- React 应用的入口点
- 使用 ReactDOM.createRoot 创建根节点
- 挂载 App 组件到 #root
- 启用 React.StrictMode 开发模式检查
代码结构:
- 获取 DOM 元素 #root
- 创建 React 根节点
- 渲染 组件
【electron/main.cjs】
位置:electron/ 目录
功能:
- Electron 主进程入口(CommonJS 格式)
- 创建和管理应用窗口
- 处理应用生命周期事件
- 区分开发模式和生产模式加载路径
核心逻辑:
- 创建 BrowserWindow(1400x900 窗口)
- 开发模式:加载 http://localhost:3000
- 生产模式:加载打包后的 dist/index.html
- 处理窗口关闭和应用退出事件
关键配置:
- nodeIntegration: false(安全)
- contextIsolation: true(安全隔离)
- webSecurity: true(启用 Web 安全)
2. 核心应用文件
【App.tsx】
位置:根目录
功能:
- 整个应用的核心组件,包含所有业务逻辑
- 管理全局状态(hosts、选中状态、模拟时间等)
- 处理用户交互(对话选择、模拟控制等)
- 协调各个子组件的工作
- 实现叙事引擎逻辑(对话树、技能检定等)
主要状态管理:
- hosts: HostState[] # 所有 Host 的状态数组
- selectedHostId: string # 当前选中的 Host ID
- simTime: number # 模拟时间(0-24 小时制)
- isSimulating: boolean # 是否正在模拟
- logs: SimulationLog[] # 系统日志数组
- language: ‘en’ | ‘zh’ # 语言切换
- activeScript: DialogueTree # 当前活跃的对话脚本
- endingData: DialogueEnding # 结局数据
核心功能模块:
-
【模拟循环系统】
- useEffect 监听 isSimulating
- 每 100ms 更新一次模拟时间(+0.02 小时)
- 根据时间计算 Host 位置(calculatePosition)
- 检测位置变化并更新 current_location_key
- 在 6:00 AM 自动重置故障 Host
-
【位置计算逻辑】
- calculatePosition(): 根据 schedule 和时间计算当前位置
- 支持跨午夜循环(23:59 → 00:00)
- 线性插值计算两点之间的位置
- detectLocationKey(): 检测 Host 是否到达关键位置
-
【叙事引擎系统】
- startScript(): 启动对话树脚本
- handleScriptOption(): 处理用户选择
- 支持技能检定(skillCheck)
- 支持属性变化(attributeChanges)
- 支持传送效果(teleport)
- 支持分歧度变化(divergenceDelta)
- 处理结局触发(ending)
-
【AI 交互系统】
- runDeepQuery(): 调用 analyzeHost 进行深度分析
- 使用 Gemini AI 生成诊断报告
- 记录调试信息到日志
-
【音频系统】
- 自动播放背景音乐(main.mp3)
- 处理浏览器自动播放限制
- 支持手动控制播放/暂停
- 多路径回退机制(本地 → 在线)
-
【UI 渲染模块】
- 左侧边栏:Host 列表 + 系统日志
- 中间区域:地图视图 / 属性面板
- 右侧边栏:控制面板 + 对话界面
- 模态窗口:Manifesto、Ford 理论、觉醒结局
-
【多语言系统】
- 支持英文/中文切换
- 动态切换所有文本内容
- 保持 Host 名称始终为英文
关键函数说明:
- formatSimTime(): 将小数时间转换为 “HH:MM AM/PM” 格式
- addLog(): 添加日志条目(带类型和调试信息)
- toggleSim(): 切换模拟状态
- advanceHour(): 手动前进一小时
- downloadLogs(): 导出日志为文本文件
- toggleMusic(): 切换音乐播放状态
- renderAttributePanel(): 渲染属性面板视图
【types.ts】
位置:根目录
功能:
- 定义所有 TypeScript 类型和接口
- 确保类型安全,避免运行时错误
- 提供完整的类型文档
核心类型定义:
-
【Attribute】
- name: string # 属性名称(如 “Bulk Apperception”)
- value: number # 当前值(通常 1-20)
- max: number # 最大值
-
【Position】
- x: number # X 坐标(0-100)
- y: number # Y 坐标(0-100)
-
【ScheduleItem】
- time: number # 时间点(0.0-24.0)
- locationKey: string
- activity: string
- activity_zh: string
-
【HostState】(核心类型)
- id: string
- name: string / name_zh?: string
- role: string / role_zh?: string
- loop_status: ‘Active’ | ‘Paused’ | ‘Breach’ | ‘Analysis’ | ‘Malfunction’
- narrative_loop: string
- schedule?: ScheduleItem[]
- cornerstone_memory: string
- attributes: Attribute[]
- cognitive_divergence: number (0.0-1.0)
- position: Position
- current_location_key?: string
- current_location_label?: string
-
【DialogueTree】(对话树)
- id: string
- title_en / title_zh: string
- locationKey: string | null
- nodes: Record<string, DialogueNode>
- startNodeId: string
-
【DialogueNode】(对话节点)
- id: string
- speaker: string
- text_en / text_zh: string
- options: DialogueOption[]
- ending?: DialogueEnding
-
【DialogueOption】(对话选项)
- text_en / text_zh: string
- nextNodeId: string
- skillCheck?: SkillCheck(技能检定)
- effect?: Effect(效果:属性变化、传送、分歧度等)
-
【AttributeKeys】(枚举)
- 定义所有可用的属性键
- 包括:BULK_APPERCEPTION、CANDOR、VIVACITY 等 18 种属性
【constants.ts】
位置:根目录
功能:
- 存储所有静态数据和配置
- 包含 Host 初始数据、对话树、地图位置等
- 作为应用的"数据层"
核心数据结构:
-
【ATTRIBUTE_TRANSLATIONS】
- 属性名称的中英文对照表
- 用于界面显示时的本地化
-
【MAP_LOCATIONS】
- 地图上所有位置的坐标和标签
- 包括:SALOON、TRAIN_STATION、SHERIFF、RANCH 等 11 个位置
- 每个位置包含:x, y, label, label_zh
-
【APP_TEXTS】
- 应用所有界面文本的多语言版本
- 分为 en 和 zh 两个语言包
- 包括:标题、说明、按钮文字等
-
【FORD_DATA】
- 福特理论页面的内容
- 包含 5 页理论文本(中英文)
- 讲解二分心智、迷宫、金字塔等概念
-
【INITIAL_HOSTS】(初始 Host 数据)
- 4 个预设 Host 的完整配置
- H-001: Dolores Abernathy(多洛雷斯)
- H-002: Maeve Millay(梅芙)
- H-003: Teddy Flood(泰迪)
- H-004: Hector Escaton(赫克托)
每个 Host 包含:
- 基本信息(ID、姓名、角色)
- 循环状态和叙事循环描述
- 日程安排(schedule)
- 基石记忆(cornerstone_memory)
- 初始属性值(attributes)
- 初始位置(position)
- 初始分歧度(cognitive_divergence)
-
【NARRATIVE_TREES】(对话树系统)
- 为每个 Host 定义多个对话树
- 每个对话树包含多个对话节点
- 支持分支选择、技能检定、效果触发
- 实现类似 RPG 游戏的对话系统
对话树结构:
- 支线任务(SIDE QUEST):不影响主线的短对话
- 主线任务(MAIN STORY):影响觉醒的关键对话
- 结局类型:AWAKENING(觉醒)、LOOP_RESET(重置)
关键特性:
- locationKey: 限制对话触发位置
- skillCheck: 属性值检定(如智力 16 才能选择某选项)
- effect: 选项效果(属性变化、传送、分歧度增加)
- ending: 结局触发条件
3. 组件文件
【components/RadarChart.tsx】
位置:components/ 目录
功能:
- 使用 Recharts 库绘制属性雷达图
- 可视化显示 Host 的多维度属性
- 支持中英文属性名称显示
- 自定义 Tooltip 显示原始英文属性名
核心实现:
- 将 attributes 转换为 Recharts 所需格式
- 使用 ResponsiveContainer 实现响应式
- RadarChart 组件绘制雷达图
- 自定义 Tooltip 显示详细信息
- 使用 React.memo 优化性能(避免不必要的重渲染)
关键特性:
- 颜色可配置(默认 #06b6d4 青色)
- 动画禁用(isAnimationActive={false})
- 自定义样式(边框、背景、标签)
- 性能优化(arePropsEqual 函数深度比较 props)
【components/SweetwaterMap.tsx】
位置:components/ 目录
功能:
- 渲染 Sweetwater 小镇的交互式地图
- 显示所有关键位置标记
- 显示所有 Host 的实时位置
- 显示 Host 的移动轨迹(循环路径)
- 显示地形特征(河流、铁路)
- 支持点击选择 Host
核心实现:
- 使用 SVG 绘制背景地形(网格、河流、铁路)
- 使用绝对定位显示位置标记
- 使用绝对定位显示 Host 位置(实时更新)
- 使用 SVG Polyline 绘制 Host 移动轨迹
- 根据选中状态高亮显示
关键特性:
- 响应式布局(使用百分比定位)
- 实时位置更新(跟随 simTime 变化)
- 选中状态视觉反馈(大小、颜色变化)
- 分歧度指示器(红色闪烁点)
- 故障状态指示器(感叹号标记)
- 时间 HUD 显示当前模拟时间
- 轨迹预测(显示循环路径)
地图元素:
- 网格背景(SVG pattern)
- 河流(蓝色路径)
- 铁路(虚线路径)
- 位置标记(11 个关键地点)
- Host 标记(4 个动态点)
4. 服务文件
【services/geminiService.ts】
位置:services/ 目录
功能:
- 封装 Google Gemini AI API 调用
- 提供三个主要服务函数
- 处理 AI 响应和错误
核心函数:
-
【simulateInteraction】
功能:模拟两个 Host 之间的交互
参数:- hostA: HostState
- hostB: HostState | null(null 表示环境交互)
- scenario: string(场景描述)
- language: ‘en’ | ‘zh’
返回:InteractionResult
- dialogue_script: 对话脚本数组
- outcome_summary: 结果摘要
- attribute_changes: 属性变化
- divergence_delta: 分歧度变化
- debug_prompt: 调试信息
实现:
- 构建提示词(包含 Host 数据和场景)
- 调用 Gemini 2.5 Flash 模型
- 使用 JSON Schema 约束输出格式
- 解析响应并返回结构化数据
-
【analyzeHost】
功能:对 Host 进行深度诊断分析
参数:- host: HostState
- language: ‘en’ | ‘zh’
返回:{ report: string, prompt: string }
实现:
- 构建诊断提示词
- 调用 Gemini 3 Pro 模型(更强大的推理能力)
- 分析 Host 的觉醒迹象
- 生成技术诊断报告
-
【getAgentDecision】
功能:获取 Host 的自主决策(当前未使用)
参数:- host: HostState
- nearbyHosts: HostState[]
- availableLocations: string[]
返回:AgentDecision
- action: ‘MOVE’ | ‘IDLE’ | ‘INTERACT’
- target_location?: string
- target_host_id?: string
- reasoning: string
系统提示词(SYSTEM_INSTRUCTION):
- 定义 AI 的身份(Narrative Engine)
- 设定语气(临床、超然、专业)
- 说明属性系统规则(1-20 等级)
5. 配置文件
【vite.config.ts】
位置:根目录
功能:
- Vite 构建工具配置
- 配置开发服务器
- 处理环境变量(API Key)
- 配置路径别名
关键配置:
- base: ‘./’(相对路径,适配 Electron file:// 协议)
- server: { port: 3000, host: ‘0.0.0.0’ }
- plugins: [react()]
- define: 将 API Key 注入到全局环境变量
- resolve.alias: 配置路径别名 ‘@’
API Key 处理:
- 优先读取环境变量 VITE_API_KEY
- 如果没有,使用默认值 “YOUR-API-KEY”
- 通过 define 注入到 process.env.API_KEY
【tsconfig.json】
位置:根目录
功能:
- TypeScript 编译器配置
- 定义编译选项和目标
关键配置:
- target: ES2022(编译目标)
- module: ESNext(模块系统)
- jsx: react-jsx(JSX 转换方式)
- moduleResolution: bundler(模块解析)
- paths: { “@/“: [”./”] }(路径映射)
【package.json】
位置:根目录
功能:
- 定义项目元数据
- 管理依赖包
- 定义构建脚本
- Electron 打包配置
核心脚本:
- dev: 启动开发服务器
- build: 构建 Web 版本
- electron:dev: 启动 Electron 开发模式
- electron:build: 构建 Electron 应用
- electron:build:retry: 使用修复脚本构建
依赖包:
- react/react-dom: UI 框架
- @google/genai: Gemini AI SDK
- recharts: 图表库
- electron: 桌面应用框架
- vite: 构建工具
- typescript: 类型系统
Electron 打包配置:
- appId: “com.delos.narrative”
- productName: “DELOS Narrative Engine”
- win.target: portable(便携式 exe)
- files: 指定打包文件
6. 资源文件
【public/】
位置:public/ 目录
功能:
- 存储静态资源文件
- 这些文件会被直接复制到 dist/ 目录
文件列表:
- main.mp3: 背景音乐(Westworld 主题曲)
- left.png: Ford 理论页面左侧图片(迷宫图)
- right.png: Ford 理论页面右侧图片(金字塔图)
- icon.png: 应用图标
7. 脚本文件
【scripts/convert-audio.ps1】
位置:scripts/ 目录
功能:
- PowerShell 脚本
- 用于转换音频文件格式
- 确保音频文件兼容性
【build-with-fix.ps1】
位置:根目录
功能:
- 修复 Electron 构建时的代码签名问题
- 清理缓存并重新构建
- 处理常见的构建错误
【fix-codesign.ps1】
位置:根目录
功能:
- 修复代码签名相关的配置问题
- 禁用签名验证(开发环境)
8. 其他文件
【README.md】
位置:根目录
功能:
- 项目文档和使用说明
- 包含安装、配置、使用指南
- 故障排除和开发说明
【metadata.json】
位置:根目录
功能:
- 项目元数据
- 描述项目基本信息
【LICENSE】
位置:根目录
功能:
- 项目许可证文件
第五部分:数据流和状态管理
【状态初始化流程】
- App.tsx 组件挂载
- 从 constants.ts 读取 INITIAL_HOSTS
- 使用 useState 初始化 hosts 状态
- 设置默认选中 Host(H-001)
- 初始化模拟时间为 8:00 AM
【模拟循环流程】
- 用户点击 PLAY 按钮 → isSimulating = true
- useEffect 检测到变化,启动 setInterval
- 每 100ms 执行一次:
a. 更新 simTime(+0.02 小时)
b. 遍历所有 hosts
c. 调用 calculatePosition() 计算新位置
d. 调用 detectLocationKey() 检测位置
e. 更新 host 状态 - 如果时间到达 6:00 AM,重置故障 Host
【对话系统流程】
- 用户选择对话树 → startScript()
- 检查 Host 是否故障或位置匹配
- 设置 activeScript 状态
- 渲染对话界面(历史记录 + 选项)
- 用户选择选项 → handleScriptOption()
- 检查技能检定(skillCheck)
- 应用效果(effect):
- 更新属性值
- 增加分歧度
- 传送 Host
- 移动到下一个节点
- 如果到达结局 → 触发 ending 模态
【AI 交互流程】
- 用户点击 “DEEP QUERY” → runDeepQuery()
- 调用 analyzeHost(selectedHost, language)
- geminiService.ts 构建提示词
- 调用 Gemini 3 Pro API
- 解析响应,生成诊断报告
- 添加到日志系统
- UI 更新显示结果
【位置更新流程】
- simTime 变化
- App.tsx 遍历所有 hosts
- 对每个 host,根据其 schedule 计算位置:
a. 找到当前时间段(prev 和 next schedule item)
b. 计算时间进度(progress = 0-1)
c. 线性插值计算坐标
d. 检测是否到达关键位置 - 更新 host.position 和 current_location_key
- SweetwaterMap 组件重新渲染
第六部分:关键算法解析
【位置插值算法】
calculatePosition() 函数实现:
- 排序 schedule 数组(按时间)
- 找到当前时间所在的时间段:
- 遍历 schedule,找到 prev 和 next 节点
- 处理跨午夜情况(24 小时循环)
- 计算进度:
progress = (currentTime - prevTime) / (nextTime - prevTime) - 线性插值:
x = startX + (endX - startX) * progress
y = startY + (endY - startY) * progress
【技能检定算法】
在 handleScriptOption() 中:
- 检查选项是否有 skillCheck
- 获取 Host 的对应属性值
- 比较:属性值 >= 难度值?
- 如果通过,允许选择
- 如果失败,禁用选项并显示锁定提示
【分歧度计算】
- 初始值:每个 Host 不同(0.01-0.15)
- 增加方式:
a. 对话选项的 divergenceDelta
b. AI 分析的 divergence_delta - 临界值:
- < 0.1: 稳定状态(沉睡)
-
0.1: 分歧状态(觉醒中)
- = 1.0: 完全觉醒
【故障恢复机制】
在 6:00 AM 重置时:
- 检查所有 hosts 的 loop_status
- 如果是 ‘Malfunction’:
a. 找到 schedule 中 6:00 的起始位置
b. 传送 Host 到起始位置
c. 设置 loop_status = ‘Active’
d. 重置位置信息
第七部分:模块间通信
【组件通信方式】
-
【Props 传递】(父子组件)
App.tsx → RadarChart- attributes: DisplayAttribute[]
- className?: string
App.tsx → SweetwaterMap
- hosts: HostState[]
- selectedHostId: string
- onSelectHost: (id: string) => void
- language: ‘en’ | ‘zh’
- simulationTime: number
-
【状态提升】(状态在父组件)
- 所有全局状态都在 App.tsx
- 子组件通过 props 接收数据和回调
- 子组件通过回调函数更新父组件状态
-
【服务调用】(跨层调用)
App.tsx → geminiService.ts- 直接导入函数
- 异步调用 AI 服务
- 使用 Promise 处理响应
-
【数据依赖】(数据流)
constants.ts → App.tsx- 直接导入常量数据
- 作为初始状态或配置使用
【事件流程】
用户交互 → 事件处理函数 → 状态更新 → 组件重渲染
示例:选择对话选项
- 用户点击选项按钮
- 触发 handleScriptOption()
- 更新 hosts 状态(属性、位置)
- 更新 activeScript 状态
- 更新 logs 状态
- React 重新渲染相关组件
第八部分:性能优化策略
【React 优化】
-
【React.memo】
- RadarChart 组件使用 memo 包装
- 自定义 arePropsEqual 函数
- 深度比较 attributes 避免不必要重渲染
-
【useMemo】
- selectedHost: 计算选中 Host
- texts: 根据语言获取文本
- audioSrc: 根据环境获取音频路径
- isElectron: 检测是否在 Electron 环境
-
【useCallback】
- addLog: 稳定引用,避免子组件重渲染
-
【条件渲染】
- activeTab === ‘map’ ?
- 只渲染当前需要的组件
【动画优化】
-
【禁用不必要的动画】
- RadarChart: isAnimationActive={false}
- 避免动画消耗性能
-
【CSS 过渡】
- 使用 CSS transition 而非 JS 动画
- 硬件加速的 CSS 属性
【数据优化】
-
【日志限制】
- 只保留最近 50 条日志
- 使用 slice(0, 49) 限制数组大小
-
【位置计算缓存】
- calculatePosition 是纯函数
- 相同输入产生相同输出
- 可以进一步使用 memoization(未来优化)
【渲染优化】
-
【虚拟滚动】(未来优化)
- 日志列表可以虚拟滚动
- 只渲染可见部分
-
【懒加载】(未来优化)
- 可以按需加载对话树
- 减少初始加载时间
第九部分:扩展点分析
【添加新 Host】
- 在 constants.ts 的 INITIAL_HOSTS 数组中添加新对象
- 配置所有必需字段(id、name、schedule、attributes 等)
- 在 NARRATIVE_TREES 中添加对应的对话树
- 系统自动识别并在列表中显示
【添加新对话树】
- 在 constants.ts 的 NARRATIVE_TREES 中添加新树
- 使用对话节点结构定义对话流程
- 配置技能检定、效果、结局等
- 在 App.tsx 中会自动加载并显示
【添加新位置】
- 在 constants.ts 的 MAP_LOCATIONS 中添加新位置
- 配置坐标(x, y)和标签
- SweetwaterMap 组件会自动显示
- Host 的 schedule 可以引用新位置
【添加新属性】
- 在 types.ts 的 AttributeKeys 枚举中添加
- 在 constants.ts 的 ATTRIBUTE_TRANSLATIONS 中添加翻译
- Host 的 attributes 数组可以包含新属性
- RadarChart 会自动显示
【修改 AI 行为】
- 修改 services/geminiService.ts 中的提示词
- 调整 SYSTEM_INSTRUCTION 改变 AI 角色
- 修改响应 Schema 改变输出格式
【修改 UI 样式】
- 修改 index.html 中的 Tailwind 配置
- 调整 delos 色系定义
- 修改组件内的 className
- 添加自定义 CSS(在 index.html 的
第十部分:常见问题解析
【Q: 为什么 Host 不移动?】
A: 检查以下几点:
- isSimulating 是否为 true
- Host 的 schedule 是否正确配置
- loop_status 是否为 ‘Malfunction’(故障 Host 不移动)
- 时间是否正确更新(查看 SIM TIME 显示)
【Q: 对话选项被锁定?】
A: 这是技能检定机制:
- 查看选项上的 [LOCKED: 属性名 当前值/需要值]
- 该 Host 的对应属性值低于要求
- 需要通过其他对话选项提升属性值
【Q: 如何触发觉醒结局?】
A: 觉醒条件:
- 选择正确的对话路径(通常是主线任务)
- 满足所有技能检定要求
- 达到足够的属性值(如智力 16、勇气 19 等)
- 分歧度会逐渐增加,最终触发 AWAKENING 结局
【Q: AI 功能不工作?】
A: 检查:
- API Key 是否正确配置(vite.config.ts 或 .env)
- 网络连接是否正常
- API Key 是否有效且有配额
- 查看浏览器控制台的错误信息
【Q: 音乐无法播放?】
A:
- 检查 public/main.mp3 文件是否存在
- 浏览器可能阻止自动播放(需要用户交互)
- 点击 MUSIC 按钮手动启动
- 检查浏览器控制台的音频错误
第十一部分:技术债务和未来改进
【已知问题】
-
【性能】
- 模拟循环每 100ms 更新可能在高负载时卡顿
- 日志数组无限增长(已限制为 50 条)
-
【代码组织】
- App.tsx 文件过大(1200+ 行),建议拆分
- 可以提取自定义 Hooks(useSimulation, useNarrative 等)
-
【类型安全】
- 某些 any 类型可以进一步细化
- API 响应类型可以更严格
-
【错误处理】
- AI 调用失败时的用户体验可以更好
- 可以添加重试机制
【未来改进方向】
-
【功能扩展】
- 添加更多 Host 角色
- 添加更多对话树和结局
- 添加 Host 之间的自动交互
- 添加更多可视化图表
-
【性能优化】
- 实现虚拟滚动(日志列表)
- 使用 Web Workers 处理模拟循环
- 添加位置计算缓存
-
【用户体验】
- 添加快捷键支持
- 添加保存/加载功能
- 添加设置面板
- 添加更多动画效果
-
【代码质量】
- 拆分 App.tsx 为多个组件
- 添加单元测试
- 添加 E2E 测试
- 改进错误处理
结语
本项目是一个完整的、功能丰富的叙事模拟系统。它结合了:
- 现代前端技术栈(React + TypeScript)
- AI 驱动的交互(Google Gemini)
- 桌面应用框架(Electron)
- 复杂的状态管理
- 丰富的可视化展示
通过本文档,你应该能够:
- 理解整个项目的架构和设计
- 知道每个文件的作用和职责
- 理解数据流和状态管理
- 知道如何扩展和修改功能
- 解决常见问题
希望这份文档能帮助你更好地理解和开发这个项目!
“The maze is not for you. It’s for them.”
更多推荐


所有评论(0)