diff --git a/doc/design/弟子系统设计.md b/doc/design/弟子系统设计.md index c0ac3b5..b98d455 100644 --- a/doc/design/弟子系统设计.md +++ b/doc/design/弟子系统设计.md @@ -97,22 +97,24 @@ "入宗分流"的含义:**按资质将弟子分为四类**,这是生成时的一次性判定,不是持续运行的机制。四类资质弟子日后可能享受不同的培养路线(D4+ 扩展),本期只完成分类本身。 -### 招募机制:定时自动招募 +### 招募机制:定时弹窗招募 -招募**不是玩家点击按钮随时进行**,而是按游戏时间自动进行: +招募**不是玩家随时点按钮**,而是"生成候选 → 暂停时间 → 弹窗选择": -- 间隔:每 **30 游戏日**(1 个月)自动招募一名弟子 -- 驱动:监听 `TimeSystem.day_passed` 信号倒计时,满 30 天触发一次 -- 期间玩家无需任何操作,挂机即可收弟子(与挂机修炼节奏一致) -- 间隔常量可调(后期按宗门声望/规模动态调整,本期固定) +- **开局招募**:新游戏开始,生成 **5 名候选**,暂停时间弹窗,**必须选满 3 名**才能确定 +- **定期招募**:每满间隔(配置文件 `recruit_interval_years`,默认 0.1 年 = 36 天)生成 **3 名候选**,暂停时间弹窗 +- **选择方式**:每个候选独立勾选"入宗",可全部接受、可全部拒绝(定期招募可 0~3 个) +- **结算**:点"确定" → 勾选的入宗、未勾选的拒绝 → 关闭弹窗 → **恢复时间** +- 所有参数(候选数、必选数、间隔)来自 `resources/game_config.cfg`,改配置即改难度 ### 招募流程(文字时序) -1. DiscipleManager 倒计时归零(每 30 游戏日) -2. 生成一名弟子(先判天灵根 3% → 生成灵根 → 按权重掷资质 → 组名字) -3. 弟子加入宗门名录 -4. 名录变化信号发出(供 UI 后续刷新,D4 列表 UI 消费) -5. 控制台打印该弟子完整信息(姓名/年龄/资质/灵根/境界)—— 本期验收方式 +1. 开局(MainGame 调用 `start_new_game()`)或倒计时归零(`_on_day_passed`) +2. 生成候选弟子(先判天灵根 3% → 生成灵根 → 按权重掷资质 → 组名字),进入候选池 +3. `applicants_generated(is_opening)` 信号发出 → 弹窗显示候选列表 +4. 玩家勾选(开局模式:确定按钮在选满 3 名前禁用) +5. 点"确定" → `finish_recruitment(selected)` 结算 → 恢复时间 +6. 控制台打印每位入宗弟子完整信息(姓名/年龄/资质/灵根/境界)—— 本期验收方式 --- @@ -120,26 +122,49 @@ | 接口 | 签名 | 说明 | |------|------|------| -| `recruit()` | 返回新弟子 | 生成 + 分流 + 入名录,发信号(内部由定时器调用,也允许调试手动调用) | -| `remove_disciple(d)` | 入参弟子 | 移出名录,发信号(逐出/陨落) | -| `reset()` | 无 | 清空名录、ID 归零、招募倒计时复位(新游戏开局) | +| `start_new_game()` | 无 | 清空全部数据 → 开局候选(配置数量)→ 暂停时间 | +| `generate_applicants(count, is_opening)` | 返回无 | 清空候选池 → 生成 count 名候选 → 发信号 | +| `accept_applicant(d)` | 入参候选 | 分配 ID,候选池 → 名录,发信号,控制台打印 | +| `reject_applicant(d)` | 入参候选 | 从候选池移除 | +| `finish_recruitment(selected)` | 入参选中列表 | 结算:selected 内的入宗,其余全部拒绝 | +| `remove_disciple(d)` | 入参弟子 | 移出名录(逐出/陨落) | +| `reset()` | 无 | 清空名录与候选池、ID 与倒计时复位 | | 信号 `disciples_changed` | 无参数 | 名录增删/重置时发出 | +| 信号 `applicants_generated(is_opening)` | bool | 候选生成时发出(弹窗监听) | -内部私有方法(不对外):生成姓名、生成灵根(含天灵根判定)、掷资质。 +内部私有方法(不对外):生成姓名、生成灵根(含天灵根判定)、掷资质、创建候选、间隔换算。 内部定时机制: -- 字段 `_days_until_recruit`:距下次招募的剩余游戏天数,初始 30 -- 监听 `TimeSystem.day_passed`,每日减 1,归零 → 招募一名 → 重置为 30 +- 字段 `_days_until_recruit`:距下次定期招募的剩余游戏天数 +- 间隔 = `GameConfig.recruit_interval_years` × 360 天(TimeSystem 常量换算) +- 监听 `TimeSystem.day_passed`,每日减 1,归零 → 生成候选 → `TimeSystem.set_paused(true)`(弹窗期间时间冻结) 存放位置:`src/Character/`(与数据模型同目录),注册为 Autoload 单例,供全局访问。 +## 四·五、配置系统(GameConfig) + +所有可调参数集中在 `resources/game_config.cfg`,由 `src/Core/GameConfig.gd`(Autoload,声明在 DiscipleManager 之前)启动时读取,缺项回退代码默认值。 + +```ini +[recruitment] +opening_applicant_count=5 ; 开局候选人数 +opening_pick_count=3 ; 开局必须选满数 +recruit_interval_years=0.1 ; 定期招募间隔(游戏年) +recruit_applicant_count=3 ; 定期弹窗候选人数 +``` + +> 以后所有可调参数(天赋权重、价格、境界门槛等)统一加到这里。 + --- ## 五、UI 接入点 -- 本期**不加任何按钮**:招募完全自动,顶栏无需改动 -- 弟子信息通过控制台打印展示(验收方式) +- **RecruitPanel**(`src/UI/Panels/RecruitPanel/`):弹窗场景,挂在 MainGame 下(默认隐藏) + - 监听 `applicants_generated` 信号自动弹出 + - 每个候选一行:姓名/年龄/资质(天灵根标记)/灵根/境界 + "入宗"勾选框 + - 底部:全部接受 / 全部拒绝 / 确定 + - 开局模式确定按钮在选满 3 名前禁用;确定后关闭弹窗并恢复时间 - 名录的可视化列表属于 D4(弟子列表 UI),届时由 `disciples_changed` 信号驱动 --- @@ -158,9 +183,11 @@ ## 七、验收清单(D3 交付标准) - [ ] 项目能正常启动,无脚本报错 -- [ ] 进入游戏后**无需操作**,每 30 游戏日(挂机约 15 秒 @1x)自动招募一名弟子 -- [ ] 控制台每次招募打印弟子完整信息(姓名/年龄/资质/灵根/境界) -- [ ] 连续观察多个游戏月,每次生成不同弟子,名录持续增长 -- [ ] 资质四类均可能出现(多次招募后抽样观察分布) -- [ ] 多次招募后能观察到天灵根弟子(约 3% 概率,控制台有标记) +- [ ] **开局**:进入游戏即暂停,弹出"弟子入宗(开局招募)",显示 5 名候选 +- [ ] 开局模式确定按钮在选满 3 名前不可用;选满后可确定 +- [ ] 确定后:勾选的 3 名入宗(控制台打印),时间恢复推进 +- [ ] **定期**:每 36 游戏日(0.1 年 @1x ≈ 18 秒)再次暂停弹窗,显示 3 名候选 +- [ ] 定期模式可勾选 0~3 名,全部拒绝也可确定;时间正常恢复 +- [ ] 多次招募后能观察到天灵根弟子(约 3% 概率,弹窗/控制台有标记) +- [ ] 修改 `game_config.cfg` 中 `opening_applicant_count` 等参数,重启后开局候选数随之变化 - [ ] 返回主菜单再进入,名录已清空(reset 生效)