# P1 模块拆分 P1 目标:种田 → 交货 → 灵石 → 修炼 → 更强的种田 循环跑通。本文档定义 P1 的模块划分、职责、依赖、通信方式与测试方式。详见 `doc/Roadmap.md`、`doc/弟子管理.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()` 注入依赖: ```gdscript # 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 完整化 | | 灵田品质 | 收获时按种植者技艺定品质,无随机 | 可加随机 | | 炼丹失败 | 材料足够即成功,品质随技艺浮动 | 可加失败率 |