Files
ImmortalSect/doc/P1模块拆分.md
T

6.6 KiB
Raw Blame History

P1 模块拆分

P1 目标:种田 → 交货 → 灵石 → 修炼 → 更强的种田 循环跑通。本文档定义 P1 的模块划分、职责、依赖、通信方式与测试方式。详见 doc/Roadmap.mddoc/弟子管理.md

1. 架构原则:前后端分离

  • 后端:Manager 脚本(持有数据和逻辑),不依赖 UI。
  • 前端:UI 场景(只管显示),不持有任何游戏状态,所有数据从后端读取。
  • 通信规则
    • UI → 后端:调用公开方法(如 refine_pill()
    • 后端 → UI:信号推送状态变化(如 balance_changed
  • 好处:后端可脱离 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):

  1. 实例化被测管理器 + 注入 Mock 依赖
  2. _ready() 中自动执行用例
  3. 用例覆盖:正常流程、边界条件(余额不足/库存不足/过期)、信号是否正确发出
  4. 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 完整化
灵田品质 收获时按种植者技艺定品质,无随机 可加随机
炼丹失败 材料足够即成功,品质随技艺浮动 可加失败率