- Add minAge/maxAge to events so infants can't go treasure hunting - Cache event panel DOM to prevent high-speed button destruction - Add 10s auto-select countdown for choice events - Fix event title/text field mapping (name/description → title/text) - Add rotating clock icon for time flow feedback - Fix speed/pause button active states - Fix shop affordability check (disable + show insufficient money) - Add red styling for unmet choice requirements - Fix log re-rendering on every tick
22 KiB
轮回录 - 游戏设计文档
一、游戏概述
类型: Rogue-lite + Incremental RPG
核心体验: 在无限轮回中积累经验与记忆,逐步解锁世界真相,最终对抗隐藏的终极威胁。
目标玩家: 喜欢长期成长、策略试错、叙事探索的玩家。
单局时长: 一局人生 515 分钟(加速模式下),完整通关需 50100+ 世。
二、核心循环(Core Loop)
出生(随机出身 + 词条池抽取)
↓
日常推进(文本事件自动流过 / 选择事件 10秒倒计时)
↓
积累经验 → 职业晋升 → 解锁能力
↓
死亡(自然 / 外敌 / 事件风险)
↓
结算(元经验 + 新词条解锁 + 历史对比)
↓
重生(保留元经验 / 记忆 / 词条池,外敌进度部分继承)
↓
(循环)
关键张力:每世都是不可预测的(随机出身、词条、事件),但跨世成长是确定可感的(元经验压缩前期、词条池扩大、记忆触发新选项)。
三、系统详解
3.1 时间系统
| 项目 | 设计 |
|---|---|
| 最小单位 | 天 |
| 显示单位 | 天 / 年 / 年龄 |
| 加速档位 | 1x(1天/秒)、10x、100x、MAX(瞬间过完一年) |
| 加速时显示 | 文本事件快速滚动(日志流),选择事件暂停等玩家 |
| 存档 | 每年自动存档 + 手动存档 |
一天内的流程:
- 推进日期
- 检查固定事件触发
- 从事件池随机抽取文本事件(概率控制)
- 检查是否有选择事件触发
- 推进经验、属性自然增长
- 推进外敌进度
- 检查死亡条件
3.2 事件系统
事件类型
| 类型 | 触发方式 | 玩家交互 | 占比 |
|---|---|---|---|
| 文本事件 | 概率触发 / NPC事件线 | 无,自动流过 | 80% |
| 选择事件 | 固定时间点 / 条件触发 | 10秒倒计时,不选默认 | 15% |
| 重大事件 | 事件链终点 / 外敌阈值 | 必须选择 | 5% |
事件结构
{
id: 'event_001',
title: '山中奇遇',
// 触发条件
condition: (state) => state.age >= 5 && state.age <= 10
&& !state.worldFlags.met_old_taoist,
// 概率权重(同条件事件竞争)
weight: 10,
// 是否为选择事件
isChoice: true,
// 默认选项索引(倒计时结束时自动选)
defaultChoice: 0,
// 选项
choices: [
{
text: '跟随老者',
// 硬门槛判定
requirement: (state) => state.stats.wisdom >= 3,
// 效果
effect: (state) => {
state.worldFlags.met_old_taoist = true;
return { unlockCareer: 'cultivation', exp: { cultivation: 100 } };
}
},
{
text: '转身离开',
effect: (state) => ({ exp: { hunter: 20 } })
}
],
// 事件链标记
flags: { saw_mountain_path: true },
// 后置事件(本事件触发后,后置事件进入候选池)
unlocks: ['event_002', 'event_003']
}
标记系统(防逻辑错误)
worldFlags: {
'npc.zhangsan.alive': true, // NPC生死
'npc.zhangsan.married': false, // NPC婚姻状态
'event.mountain_discovery.happened': true, // 事件已发生
'enemy.north.barbarian_invasion': false, // 外敌入侵状态
}
任何事件在修改标记前必须检查依赖标记。例如:"张三死了"的事件触发后,npc.zhangsan.alive 设为 false,后续所有涉及张三的事件必须检查此标记。
3.3 职业系统
职业结构
职业呈线性晋升链,无"转换"概念。初始只有少数基础职业,等级达标后解锁后续职业。
示例职业链:
| 层级 | 职业示例 | 类型 | 晋升条件 |
|---|---|---|---|
| 基础 | 混混、磨刀学徒、农夫、书童 | 短线 | 无 |
| 进阶 | 红棍、打刀下手、猎户、秀才 | 短线 | 基础职业 Lv.5 |
| 中阶 | 香主、锻刀师傅、商人、举人 | 中线 | 进阶职业 Lv.10 |
| 高阶 | 堂主、炼刀匠人、大儒、进士 | 中线 | 中阶职业 Lv.20 |
| 顶级 | 舵主、铸剑师、一代宗师、宰相 | 长线 | 高阶职业 Lv.30 |
| 终极 | 帮主、仙匠、圣贤、帝王 | 极长线 | 顶级职业 Lv.50 |
修仙者不是独立职业,而是多条路线的终极交汇点。例如:
- 锻刀师傅 → 炼刀匠人 → 铸剑师 → (悟剑道)→ 剑修
- 大儒 → (悟道)→ 儒仙
- 红棍 → (武道通神)→ 武仙
职业属性
{
id: 'hoodlum',
name: '混混',
type: 'short', // short / medium / long / ultimate
maxLevel: 10,
baseExp: 20,
expCurve: 1.15, // 每级经验需求增长
// 自然成长(每天自动获得的经验)
dailyExp: 5,
// 晋升链
promotesTo: 'red_stick', // Lv.10 解锁
promoteRequirement: { level: 10 },
// 能力解锁(随等级解锁)
abilities: [
{ level: 3, id: 'street_fight', name: '街头斗殴', effect: '战斗事件成功率+10%' },
{ level: 7, id: 'intimidate', name: '威吓', effect: 'NPC事件中威慑选项可用' },
]
}
多职业并行
玩家可以同时拥有多个职业,每个职业独立计算等级和经验。例如:白天当农夫(farmer Lv.5),晚上混帮派(hoodlum Lv.3)。
3.4 成长系统
三层成长
| 层级 | 名称 | 跨轮保留 | 作用 | 示例 |
|---|---|---|---|---|
| L1 | 元经验 | 是 | 压缩前期成长曲线 | 剑术元经验 500 → 前 50 级 +80% 速度 |
| L2 | 能力 | 是 | 解锁新技能/选项 | 剑术 Lv.30 留下"剑气感悟",下世 Lv.10 即可用剑气 |
| L3 | 词条 | 是 | 重生时的随机特性池 | 解锁"孤儿"词条,重生时可能随机到 |
元经验公式
// 元经验加成(对数衰减,永不归零)
function metaBoost(careerId, currentLevel, metaExp) {
return Math.log(1 + metaExp / 100) * Math.exp(-currentLevel / 80);
}
// 总经验倍率
function totalExpMultiplier(state, careerId) {
const career = state.careers[careerId];
const meta = state.metaExp[careerId] || 0;
const level = career?.level || 0;
let multiplier = 1;
// 元经验加成
multiplier += metaBoost(careerId, level, meta);
// 天赋加成
for (const t of state.talents) {
if (t.effect.target === careerId || t.effect.target === 'all') {
multiplier += t.effect.value;
}
}
// 记忆加成
for (const m of state.memories) {
if (m.effect?.target === careerId) {
multiplier += m.effect.value;
}
}
return multiplier;
}
能力链
不是"境界"概念,而是具体技能的解锁。例如:
剑术能力链:
- Lv.1~9:基础剑法(数值成长)
- Lv.10:解锁【剑气】(攻击范围扩大)
- Lv.15:解锁【御剑】(移动速度提升)
- Lv.25:解锁【万剑归宗】(群体攻击)
- Lv.40:解锁【人剑合一】(攻击无视防御)
跨世传承:某一世把剑术练到 Lv.30,死亡后留下"剑气感悟"记忆。下一世再练剑术时,Lv.10 自动解锁【剑气】(不需要重新练到 Lv.25)。
3.5 词条系统
词条定义
词条是重生时随机抽取的"身份/天赋/携带物",影响整局游戏。
{
id: 'orphan',
name: '孤儿',
type: 'identity', // identity / talent / item / curse
desc: '无父无母,街头生存经验丰富',
effect: { target: 'hoodlum', expRate: 0.3, body: 1 },
// 解锁条件
unlockCondition: (history) => history.some(h => h.family < -1)
}
词条类型
| 类型 | 示例 | 效果 |
|---|---|---|
| 身份 | 孤儿、皇室后裔、商贾之子 | 影响出身、初始事件池 |
| 天赋 | 剑骨、灵根、过目不忘 | 直接影响某职业成长 |
| 携带物 | 祖传玉佩、神秘种子、旧日记 | 触发特定事件链 |
| 诅咒 | 短命、招灾、孤星 | 负面效果,但可能解锁隐藏路线 |
解锁机制
- 等级解锁:剑术 Lv.30 → 解锁"剑气"词条
- 事件解锁:完成"梦中悟道"事件链 → 解锁"悟道"词条
- 条件解锁:活到 100 岁 → 解锁"长寿"词条;被毒杀 → 解锁"毒物警觉"词条
- 成就解锁:累计 10 世当混混 → 解锁"江湖中人"词条
重生抽取
每世重生时,从已解锁词条池中随机抽取 3~5 个。词条池越大,组合越丰富。
3.6 NPC系统
NPC结构
{
id: 'zhangsan',
name: '张三',
// NPC有自己的事件线
eventLine: [
{ day: 100, event: 'zhangsan_marriage', condition: (state) => state.worldFlags.npc.zhangsan.alive },
{ day: 500, event: 'zhangsan_death', condition: (state) => state.worldFlags.npc.zhangsan.married === false },
],
// 与玩家的关系
relation: {
trust: 0, // -100 ~ 100
favor: 0, // -100 ~ 100
},
// NPC可以给玩家东西
gifts: [
{ condition: (state) => state.npcs.zhangsan.favor > 50, item: 'old_sword' }
]
}
NPC事件对玩家的影响
| 影响类型 | 示例 |
|---|---|
| 纯文本 | "张三今天娶了李四"(仅信息) |
| 关系影响 | "张三向你求助"(接受+信任,拒绝-信任) |
| 赠送物品 | "张三送你一把旧剑"(激活词条或加成) |
| 世界事件前置 | "张三发现了秘境入口"(开启新事件链) |
| 连锁反应 | "张三死了,他的仇家找上了你" |
3.7 外敌系统
三相威胁
| 相 | 名称 | 增长条件 | 对抗方式 |
|---|---|---|---|
| 军事 | 北方蛮族 | 王朝不稳时加速 | 武道/修仙等级 |
| 精神 | 域外天魔 | 修仙者死亡时泄漏 | 悟性/意志力 |
| 政治 | 王朝崩坏 | 长期无人治国 | 权势/民心 |
三相联动
王朝崩坏 +10% → 蛮族入侵加速 +20%
蛮族入侵 +10% → 民心下降 → 王朝崩坏加速 +15%
天魔侵蚀 +10% → 修仙者恐慌 → 更多修仙者死亡 → 天魔加速
隐藏的第四相
当三相都稳定(均 < 20%)时,触发"真相浮现"事件链:
- 三相只是表象,真正的威胁是"轮回本身"
- 玩家的无限轮回正在撕裂世界
- 最终目标:找到终止轮回或拯救世界的方法
跨轮影响
- 某一世成功击退蛮族 → 下一世蛮族起点降低
- 某一世天魔侵蚀严重 → 下一世天魔起点更高
- 三相整体进度跨轮部分继承(如保留 30%)
3.8 存档系统
| 类型 | 触发方式 | 保存内容 |
|---|---|---|
| 自动存档 | 每年年末 | 完整状态 |
| 手动存档 | 玩家主动 | 完整状态 |
| 死亡存档 | 死亡瞬间 | 本世完整记录(用于历史对比) |
存档结构
{
version: '0.1',
slot: 1,
timestamp: Date.now(),
state: { /* 完整游戏状态 */ },
history: [ /* 往世记录 */ ]
}
3.9 死亡结算
结算内容
-
本世回顾
- 活了多久(天/年)
- 死因
- 职业成就(各职业最高等级)
- 走过的事件链
- 解锁的词条
- 对世界的影响(外敌变化)
-
历史对比
- 这一世 vs 上一世:多活了几年?
- 这一世 vs 历史最佳:职业等级差距?
- 累计元经验增长曲线
-
元经验结算
- 各职业经验 → 元经验(转化率 10%)
-
新词条解锁提示
- "解锁新词条:短命(被毒杀3次)"
四、数值设计
4.1 经验曲线
// 升级所需经验
function expToNextLevel(careerConfig, currentLevel) {
return Math.floor(careerConfig.baseExp * Math.pow(careerConfig.expCurve, currentLevel));
}
// 示例:混混(baseExp=20, curve=1.15)
// Lv.1 → 2: 23
// Lv.5 → 6: 40
// Lv.9 → 10: 71
// 示例:修仙者(baseExp=100, curve=1.25)
// Lv.1 → 2: 125
// Lv.10 → 11: 931
// Lv.50 → 51: 约 60万
// Lv.99 → 100: 约 3万亿
4.2 元经验成长预期
| 轮回 | 单世主要成就 | 累计元经验(剑术) | 前30级加成 |
|---|---|---|---|
| 1 | 剑术 Lv.15 | 150 | +50% |
| 2 | 剑术 Lv.25 | 500 | +90% |
| 3 | 剑术 Lv.35 | 1200 | +120% |
| 5 | 剑术 Lv.50 | 4000 | +160% |
| 10 | 剑术 Lv.80 | 20000 | +200% |
| 20 | 剑术 Lv.100 | 80000 | +240% |
注:加成是"速度倍率",不是"直接加等级"。元经验让前期飞快,但瓶颈期(高等级)仍然需要多轮积累。
4.3 死亡概率
| 年龄 | 自然死亡概率/年 | 备注 |
|---|---|---|
| 0~50 | 0% | |
| 51~60 | 2% | |
| 61~70 | 8% | |
| 71~80 | 20% | |
| 81~90 | 45% | |
| 91~100 | 80% | |
| 100+ | 100% | 必然死亡 |
外敌死亡:三相任一达到 100% 时,每年 40% 概率直接死亡。
4.4 事件密度
| 年龄段 | 文本事件/年 | 选择事件 | 重大事件 |
|---|---|---|---|
| 幼年(0~6) | 20~30 | 2~3 | 0 |
| 少年(7~15) | 10~15 | 3~5 | 1 |
| 青年(16~25) | 5~8 | 2~3 | 1 |
| 壮年(26~40) | 3~5 | 2~3 | 1 |
| 中年(41~60) | 2~4 | 1~2 | 1 |
| 老年(61+) | 5~10 | 2~3 | 1 |
五、架构设计
5.1 模块结构
src/
engine/
state.js # 游戏状态管理
time.js # 时间推进、加速控制
eventEngine.js # 事件调度器(条件匹配 → 加权随机 → 执行)
expSystem.js # 经验计算、升级、能力解锁
death.js # 死亡判定、轮回结算
saveSystem.js # 存档/读档
flagSystem.js # 世界标记管理
content/
events/
index.js # 事件注册中心
child.js # 幼年事件
youth.js # 少年事件
adult.js # 成年事件
common.js # 通用日常事件
chains/ # 事件链定义
careers/
index.js # 职业注册中心
short/ # 短线职业
medium/ # 中线职业
long/ # 长线职业
ultimate/ # 终极职业
talents/
index.js # 词条注册中心
npcs/
index.js # NPC注册中心
ui/
renderer.js # 渲染器
eventPanel.js # 事件面板
logStream.js # 日志流
careerPanel.js # 职业面板
deathScreen.js # 死亡结算界面
main.js # 入口
5.2 数据流
用户交互(点击/加速/选择)
↓
UI Layer → 调用 Engine API
↓
Time.tick() / EventEngine.trigger() / ExpSystem.gain()
↓
修改 State
↓
State 变更通知 UI
↓
UI 重新渲染
5.3 事件引擎核心逻辑
class EventEngine {
constructor() {
this.eventPool = []; // 所有注册的事件
this.activeChains = []; // 当前活跃的事件链
}
// 注册事件
register(eventDef) {
this.eventPool.push(eventDef);
}
// 每tick调用
tick(state) {
// 1. 筛选满足条件的事件
const candidates = this.eventPool.filter(e =>
e.condition(state) &&
!state.triggeredEvents.has(e.id) &&
this.checkPrerequisites(e, state)
);
// 2. 按权重随机选择
const event = this.weightedRandom(candidates);
if (!event) return null;
// 3. 标记已触发
state.triggeredEvents.add(event.id);
// 4. 解锁后置事件
if (event.unlocks) {
event.unlocks.forEach(id => this.activateChain(id));
}
return event;
}
checkPrerequisites(event, state) {
if (!event.prerequisites) return true;
return event.prerequisites.every(flag => {
const negate = flag.startsWith('!');
const key = negate ? flag.slice(1) : flag;
const value = this.getFlag(state, key);
return negate ? !value : !!value;
});
}
}
六、UI设计
6.1 主界面布局
┌─────────────────────────────────────────────────────┐
│ [世数] 第42世 │ [时间] 第15年 第128天 │ [年龄] 15岁 │
├─────────────────────────────────────────────────────┤
│ 加速: [1x] [10x] [100x] [MAX] │ [暂停] [存档] │
├─────────────────────────────────────────────────────┤
│ │
│ 【事件面板】 │
│ (选择事件时显示倒计时) │
│ │
├─────────────────────────────────────────────────────┤
│ 【日志流】(文本事件滚动显示) │
│ [128天] 张三今天娶了李四 │
│ [129天] 你在街头遇到了一个老乞丐... │
│ [130天] 【选择事件】山中奇遇(倒计时: 7秒) │
│ │
├─────────────────────────────────────────────────────┤
│ 词条: [孤儿] [剑骨] [神秘种子] │
├─────────────────────────────────────────────────────┤
│ 属性: 体质12 悟性8 魅力5 气运7 │
├─────────────────────────────────────────────────────┤
│ 职业: │
│ 混混 Lv.7 [=====> ] 红棍(解锁条件: Lv.10) │
│ 磨刀学徒 Lv.3 [==> ] │
├─────────────────────────────────────────────────────┤
│ 外敌: 蛮族35% │ 天魔22% │ 崩坏18% │
├─────────────────────────────────────────────────────┤
│ 记忆: [剑气感悟] [毒物警觉] │
│ 元经验: 剑术+3200 混混+800 │
└─────────────────────────────────────────────────────┘
6.2 死亡结算界面
┌─────────────────────────────────────────────────────┐
│ 【身死道消】 │
│ │
│ 你活了 67 年 128 天 │
│ 死因:寿终正寝 │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 本世成就: │
│ • 混混 Lv.10 → 红棍(晋升!) │
│ • 剑术 Lv.35 │
│ • 走过事件链:山中奇遇 → 老者传道 → 宗门测试 │
│ • 解锁词条:剑气、江湖中人 │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 历史对比: │
│ 本世 vs 上世:多活了 12 年 ✓ │
│ 本世 vs 最佳:剑术差距 -15 级 │
│ 累计元经验:剑术 3200 (+800 本世) │
│ │
│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
│ 新解锁词条:长寿(活到80岁解锁) │
│ │
│ [进入轮回] │
└─────────────────────────────────────────────────────┘
七、内容规划(MVP阶段)
7.1 MVP职业(10个)
基础职业(4个):
- 混混(短线,10级)
- 磨刀学徒(短线,10级)
- 农夫(短线,10级)
- 书童(短线,10级)
进阶职业(4个):
- 红棍(混混 Lv.10 解锁,短线,15级)
- 打刀下手(磨刀学徒 Lv.10 解锁,短线,15级)
- 猎户(农夫 Lv.10 解锁,短线,15级)
- 秀才(书童 Lv.10 解锁,中线,30级)
高阶职业(2个):
- 香主(红棍 Lv.15 解锁,中线,30级)
- 剑修(打刀下手 Lv.15 解锁,长线,50级)
7.2 MVP事件(30个)
- 幼年事件:5个
- 少年事件:5个
- 成年事件:10个
- 通用日常事件:10个
7.3 MVP词条(20个)
- 身份词条:5个
- 天赋词条:8个
- 携带物词条:4个
- 诅咒词条:3个
7.4 MVP NPC(5个)
- 老乞丐(触发侠客路线)
- 道士(触发修仙路线)
- 张三(普通村民,有完整事件线)
- 李四(商人,可交易/赠送)
- 王五(敌对NPC,可能追杀玩家)
八、后续扩展方向
- 多人/异步交互:可以看到其他玩家的轮回记录,学习他们的选择
- MOD系统:允许玩家自定义事件、职业、词条
- 成就系统:Steam/平台成就集成
- 可视化家族树:显示多世的血缘/师承关系
- AI生成事件:用LLM根据玩家历史生成个性化事件