6.6 KiB
6.6 KiB
P1 模块拆分
P1 目标:种田 → 交货 → 灵石 → 修炼 → 更强的种田 循环跑通。本文档定义 P1 的模块划分、职责、依赖、通信方式与测试方式。详见 doc/Roadmap.md、doc/弟子管理.md。
1. 架构原则:前后端分离
- 后端:Manager 脚本(持有数据和逻辑),不依赖 UI。
- 前端:UI 场景(只管显示),不持有任何游戏状态,所有数据从后端读取。
- 通信规则:
- UI → 后端:调用公开方法(如
refine_pill()) - 后端 → UI:信号推送状态变化(如
balance_changed)
- UI → 后端:调用公开方法(如
- 好处:后端可脱离 UI 单独测试;UI 可随意更换;存档只序列化 Manager 状态。
- 不抽象过度:Manager 脚本本身就是后端,Godot 信号就是通信机制,不引入额外 Service/Interface 层。
2. 文件结构总览
src/
├── Core/ # 已有,不改
│ ├── GameState.gd
│ ├── TimeSystem.gd
│ ├── SaveSystem.gd
│ └── MainGame.gd # 挂载所有 P1 管理器
│
├── Data/
│ └── Models/ # 数据模型(纯 RefCounted,无逻辑)
│ ├── Disciple.gd # 弟子数据(见 弟子管理.md)
│ ├── FieldData.gd # 灵田数据
│ ├── PillRecipeData.gd # 丹方数据
│ └── OrderData.gd # 订单数据
│
├── Character/
│ ├── DiscipleManager.gd # 弟子管理器
│ └── test_disciple.tscn # 独立测试场景
│
├── Production/
│ ├── FieldManager.gd # 灵田管理器
│ ├── AlchemyManager.gd # 炼丹管理器
│ ├── test_field.tscn # 灵田测试
│ └── test_alchemy.tscn # 炼丹测试
│
├── Sect/
│ ├── InventoryManager.gd # 库存管理(灵药/丹药/凡粮)
│ ├── EconomyManager.gd # 经济系统(灵石收支)
│ ├── OrderManager.gd # 订单管理
│ ├── FoodManager.gd # 口粮管理
│ ├── test_economy.tscn # 经济测试
│ ├── test_order.tscn # 订单测试
│ └── test_food.tscn # 口粮测试
│
└── UI/
└── HUD/
└── MainSceneHud.gd # 已有,P1 加灵石显示(前端接入)
3. 模块职责与依赖
| 模块 | 文件 | 职责 | 依赖 | 信号 |
|---|---|---|---|---|
| 弟子数据 | Data/Models/Disciple.gd |
弟子属性(境界/技艺/忠诚/修为) | 无 | — |
| 灵田数据 | Data/Models/FieldData.gd |
内外田、作物、生长周期、品质 | 无 | — |
| 丹方数据 | Data/Models/PillRecipeData.gd |
材料→成品、技艺要求、品质系数 | 无 | — |
| 订单数据 | Data/Models/OrderData.gd |
客户、物品、数量、品质要求、期限、奖励 | 无 | — |
| 弟子管理 | Character/DiscipleManager.gd |
CRUD + 修炼结算 | Disciple | disciple_added/removed/attr_changed |
| 灵田管理 | Production/FieldManager.gd |
种植/生长/收获 → 库存 | FieldData, InventoryManager | field_harvested |
| 炼丹管理 | Production/AlchemyManager.gd |
消耗材料产出丹药 | PillRecipeData, InventoryManager | pill_refined |
| 库存管理 | Sect/InventoryManager.gd |
物品存取(灵药/丹药/凡粮) | 无 | inventory_changed |
| 口粮管理 | Sect/FoodManager.gd |
凡人弟子口粮消耗 | DiscipleManager, InventoryManager | food_shortage |
| 订单管理 | Sect/OrderManager.gd |
订单生成/交货/过期 | OrderData, InventoryManager, EconomyManager | order_fulfilled/expired |
| 经济系统 | Sect/EconomyManager.gd |
灵石收支、余额 | 无 | balance_changed |
4. 信号流(核心循环)
TimeSystem.advance_month()
→ month_passed
→ FieldManager.settle_month() [灵田生长/收获入库存]
→ DiscipleManager.settle_month() [修炼消耗灵石、修为增长]
→ FoodManager.settle_month() [口粮消耗,凡人弟子数×口粮]
→ OrderManager.settle_month() [订单过期检查]
→ EconomyManager.settle_month() [香火供奉等固定收入]
玩家操作:
FieldManager.plant_field() → field_harvested (收获灵药) → InventoryManager
AlchemyManager.refine() → pill_refined (炼丹成功) → InventoryManager
OrderManager.fulfill() → order_fulfilled (交货) → EconomyManager 加灵石
- 各管理器暴露
settle_month(),由 MainGame 连接month_passed按顺序调用;管理器自身不依赖 TimeSystem autoload,测试时可直接调用。
5. 依赖注入方式
管理器不直接引用 autoload,通过 setup() 注入依赖:
# MainGame._ready() 中:
economy_manager.setup()
field_manager.setup(inventory_manager)
alchemy_manager.setup(inventory_manager)
food_manager.setup(disciple_manager, inventory_manager)
order_manager.setup(inventory_manager, economy_manager)
好处:测试场景只需注入 Mock 依赖,模块可独立运行。
6. 独立测试方式
每个模块对应一个测试场景(test_xxx.tscn):
- 实例化被测管理器 + 注入 Mock 依赖
_ready()中自动执行用例- 用例覆盖:正常流程、边界条件(余额不足/库存不足/过期)、信号是否正确发出
print输出 PASS/FAIL,编辑器直接 F6 运行该场景验证
7. 开发顺序(依赖链自底向上)
| 步骤 | 模块 | 理由 |
|---|---|---|
| 1 | 4 个数据模型(Disciple/FieldData/PillRecipeData/OrderData) | 无依赖,纯数据 |
| 2 | InventoryManager | 无依赖,被 3 个模块使用 |
| 3 | DiscipleManager + 测试 | 只依赖数据 |
| 4 | FieldManager + 测试 | 依赖库存 |
| 5 | AlchemyManager + 测试 | 依赖库存 |
| 6 | FoodManager + 测试 | 依赖弟子+库存 |
| 7 | OrderManager + 测试 | 依赖库存+经济 |
| 8 | EconomyManager + 测试 | 无依赖(独立收支) |
| 9 | MainGame 集成所有管理器 | 组装 |
| 10 | HUD 灵石显示(前端接入) | UI 层 |
每完成一步都能单独测试验证,不会出现"全做完才能跑"的情况。
8. P1 简化决策
| 完整愿景 | P1 取舍 | 后续 |
|---|---|---|
| 忠诚度系统 | 仅存字段,不参与结算 | P2 启用 |
| 收徒 | 不做,初始弟子固定 | P2 |
| 随机委托 | 不做 | P2 |
| 香火供奉 | 简化为每月固定小额收入 | P2 完整化 |
| 灵田品质 | 收获时按种植者技艺定品质,无随机 | 可加随机 |
| 炼丹失败 | 材料足够即成功,品质随技艺浮动 | 可加失败率 |