【西游劫:第八篇】领域系统详解
领域系统详解
欢迎来到修仙世界。为了让游戏体验丰富且自洽,整个系统由多个子系统协同运作:从角色的修炼境界,到可学习的技能树,再到与各方势力的声望关系、成就与任务、世界事件、物品与合成系统,以及营造氛围的音效和帮助探索的小地图。
下面将按照逻辑顺序,逐一解释每个模块的设计原理、数据结构和核心流程。文中会穿插 Mermaid 图示,帮助理解模块之间的关系和数据流向。



1. 修炼境界系统
境界是角色成长的主线。从凡人开始,逐步突破至渡劫期,每一次晋升都带来属性提升和视觉反馈。
1.1 境界层级
总共有 8 个境界,每个境界包含 5 个小级(1~5 重),对应玩家等级 1~40 级。
1.2 数据结构 (CultivationRealm)
每个境界由以下字段定义:
| 字段 | 类型 | 说明 |
|---|---|---|
name | string | 显示名称,如“金丹期” |
startLevel | number | 起始等级(包含) |
endLevel | number | 结束等级(包含) |
description | string | 文本描述 |
color | string | UI 文字颜色类 |
icon | string | 表情符号图标 |
healthPerLevel | number | 每升一级增加的生命值 |
manaPerLevel | number | 每升一级增加的法力值 |
expMultiplier | number | 该境界内的升级经验倍率 |
1.3 关键函数逻辑
-
getRealmForLevel(level)
遍历所有境界,根据startLevel/endLevel返回当前等级所在的境界。 -
getRealmLevel(level)
计算在当前境界内的第几小级:level - startLevel + 1(范围 1~5)。 -
getExpForLevelUp(level)
所需经验 =(50 + level * 50) * realm.expMultiplier。
解释:基础经验随等级线性增长,再乘以境界倍率(高境界升级更慢)。 -
isRealmBreakthrough(oldLevel, newLevel)
如果新旧等级跨越了任意realm.startLevel,则触发“突破”。 -
getBreakthroughRealm(newLevel)
当newLevel正好等于某个境界的startLevel时,返回该境界对象(用于突破播报)。
1.4 玩家体验实现
- UI 展示:状态面板(
StatusPanel)中绘制两条进度条:- 当前境界内的小级进度(如“金丹期 3/5”)
- 总修仙进度(相对于 40 级)
- 突破通知:升级时弹出
Toast和浮动通知,例如:
“境界突破!🔮 金丹大成 · Lv.16” - 快捷跳过:在突破动画或提示中,按
Esc可跳过(通过wheel提示和tooltip实现)。
2. 技能树系统
技能树让玩家在修炼之外,选择修行方向:基础、功法、法术或神通。
2.1 数据定义
技能列表 SKILL_TREE 存储在 game-types.tsx 中,每个技能节点包含:
interface SkillNode {
id: string;
name: string;
desc: string;
level: number; // 学习所需最低等级
prereqs: string[]; // 前置技能 id 列表
category: '基础' | '功法' | '法术' | '神通';
}
2.2 解锁与学习流程
- 前端预估可用性:
const canLearn = prereqs.every(s => playerState.skills.includes(s)) - 实际学习:点击“Learn”按钮,调用
handleLearnSkill,向引擎发送"学习 技能名"动作。引擎在响应中通过skillsGained数组确认习得。 - 分类检索:根据
SKILL_CATEGORIES提供选项卡筛选,前端过滤SKILL_TREE.filter(s => s.category === cat)。
2.3 UI 入口
技能树界面内嵌于状态面板(StatusPanel),通过 GameDialogs 组件或面板内联动触发。
3. 阵营声望系统
玩家与六方势力的关系动态变化,影响剧情走向和交互选项。
3.1 六方阵营
| 阵营 | 图标 | 说明 |
|---|---|---|
| 天庭 | ☁️ | 仙界正统 |
| 佛门 | 🙏 | 清净修行 |
| 妖族 | 👹 | 妖修势力 |
| 人族 | 👤 | 凡人联盟 |
| 龙族 | 🐉 | 古老龙裔 |
| 幽冥 | 💀 | 阴司鬼界 |
声望值范围 -100 ~ +100,通过 Math.max/min 钳制。
3.2 声望变动来源
- 主要来源:引擎在
npcInteractions中直接返回{ faction, relationshipChange }。 - 文本兜底:前端
detectFactionChanges分析叙述文本,尝试提取“天庭好感+5”等模式,作为补充。
3.3 持久化
每次声望变动后立即写入 localStorage.xiyouFactions,游戏加载时读取,确保跨会话保留。
4. 成就系统
成就是里程碑奖励机制,用于激励玩家探索和成长。
4.1 成就示例
| 成就名称 | 触发条件 |
|---|---|
| 初踏异世 | 游戏开始 |
| 初遇众生 | 第一次与NPC交互 |
| 初试锋芒 | 等级达到 2 级 |
| 初获宝物 | 获得第一件物品 |
| 等级 5 | 达到 5 级 |
| 练气突破 | 达到练气期 |
| 探索 3 个地点 | 发现 3 个不同地图 |
4.2 检测机制
ACHIEVEMENTS 数组中的每个成就包含一个 condition 函数。在每次行动后,调用 checkAchievements:
- 输入:当前消息历史、状态变化列表 (
stateChanges) - 过程:遍历成就,执行
condition判断是否满足且未被领取 - 输出:解锁新成就,触发通知
5. 任务系统
任务系统当前为只读展示,由服务端自动初始化并维护,前端不主动创建或修改任务。
5.1 数据结构
任务对象包含:
name:任务名称type:任务类型(主线/支线/日常)status:状态(进行中/已完成)description:详细描述target:目标(如“击败妖王×1”)reward:奖励描述
5.2 客户端行为
- 在
sendAction后,从更新的gameState中读取activeQuests。 - 仅在 UI 的“任务日志”中展示当前任务列表。
- 无任何 API 用于发送“完成任务”或“领取奖励”——任务进度由引擎内部逻辑自动推进。
6. 世界事件
世界事件是影响整个游戏世界的临时状态,例如“灵气潮汐”、“魔道入侵”。
6.1 事件来源
- LLM 在叙事响应中描述世界事件的发生或结束。
- 前端没有显式的“创建世界事件”API,仅通过解析响应中的
activeWorldEvents字段更新。
6.2 UI 展示
- 顶部横幅(
TopBar):滚动文字显示当前活跃事件,例如“🌊 东海龙宫举办盛宴,持续3天”。 - 点击横幅:展开详情面板,显示事件描述、剩余时间、影响等。
7. 物品系统
玩家背包中的物品具有类型、稀有度、属性和装备状态。
7.1 物品类型与稀有度
| 类型 | 说明 | 稀有度 |
|---|---|---|
weapon | 武器 | common, uncommon, rare, epic, legendary |
armor | 防具 | 同上 |
consumable | 消耗品(丹药等) | 同上 |
material | 材料 | 同上 |
quest | 任务物品 | 同上 |
misc | 杂项 | 同上 |
前端通过 getItemTypeIcon(item.type) 映射对应图标(🔫、🛡️、💊等)。
7.2 效果与装备
effects字段存储 JSON 字符串,例如{ defense: 1 }或{ health: 15 }。- 使用消耗品时,应用效果:生命+15、攻击力+N、防御力+B。
equipped为true时,该物品被视为已装备,并在状态面板中预览属性加成(如“防御力 +5”)。
interface InventoryItem {
id: string;
name: string;
type: ItemType;
rarity: Rarity;
effects: string; // JSON
equipped: boolean;
}
8. 音效系统
音效系统使用 Web Audio API 生成和播放环境音效及 UI 音效,不需要外部音频文件。
8.1 环境音效类型
| 类型 | 场景 |
|---|---|
rain | 雨天 |
wind | 山谷、高空 |
night | 夜晚 |
combat | 战斗中 |
calm | 平静探索 |
8.2 技术实现
initAudioContext:初始化AudioContext,创建白噪声发生器、LFO 调制器和滤波器节点。playAmbientSound(type):根据类型配置 LFO 频率、滤波器截止频率,生成连续氛围声。playUISound:播放短促的 UI 反馈音(点击、升级等)。- 音效开关状态存入
localStorage.xiyouSoundEnabled,通过loadSoundEnabled读取控制。
9. 小地图系统
小地图记录玩家探索过的地点和路径,帮助导航。
9.1 数据结构
interface MapLocation {
name: string; // 地点名称
x: number; // 网格横坐标
y: number; // 网格纵坐标
explored: boolean;
}
interface MapConnection {
from: string; // 起点地点名
to: string; // 终点地点名
direction: string; // 方向(东/南/西/北)
}
9.2 自动发现机制
前端没有专门的地图写回 API,而是通过分析叙述文本中的移动关键词来更新:
- 正则匹配 “前往东市”、“向南走” 等模式。
- 推断新地点和连接关系,存入
localStorage(键名xiyouMapLocations/xiyouMapConnections)。 - 每次行动后重新构建地图视图。
9.3 可视化
小地图以网格形式展示已探索的节点和路径,未探索的地点显示为问号。
10. 炼丹/炼器/烹饪系统(合成系统)
允许玩家使用材料合成物品,过程模拟了成功率和动画。
10.1 配方定义
CRAFTING_RECIPES 数组定义在 game-types.ts,每个配方包含:
interface CraftingRecipe {
id: string;
name: string;
description: string;
icon: string;
ingredients: { itemId: string; name: string; quantity: number }[];
result: string; // 产出物品ID
requiredSkill: string; // 需要的技能名
difficulty: number; // 难度系数
successRate: number; // 基础成功率 (0~1)
category: string; // 分类(丹药/法器/食物)
}
10.2 合成流程
- 材料筛选:前端根据当前
inventory计算每个配方是否可用。 - 动画与结果:
craftingAnimation控制进度条动画,craftingResult展示最终成功或失败信息。
总结
以上十个子系统共同构建了一个沉浸式的修仙世界:
| 系统 | 核心作用 |
|---|---|
| 修炼境界 | 角色等级与属性成长主线 |
| 技能树 | 玩家主动选择的修行方向 |
| 阵营声望 | 动态势力关系,影响叙事 |
| 成就系统 | 里程碑奖励与引导 |
| 任务系统 | 被动展示,引擎驱动 |
| 世界事件 | 全局临时状态,增加变数 |
| 物品系统 | 装备与消耗品管理 |
| 音效系统 | 氛围营造(纯代码生成) |
| 小地图 | 探索记录与导航 |
| 合成系统 | 材料消耗与新物品产出 |
每个模块都可以独立理解,又通过玩家行动反馈相互交织。希望这份整理能帮助你快速掌握整体设计,并在后续开发或调优中得心应手。
更多推荐




所有评论(0)