feat(engine): 四座自动化设施——喷灌 / 收割机 / 售货机 / 磨坊

为什么:自动化建筑只有水井和喂食器,中期以后每天的操作只剩浇水喂食
的重复劳动。新设施把"替代行动点动作"的思路推到完整流水线:
浇水(井/喷灌)→ 收割机收熟地 → 磨坊把陈粮变饲料 → 喂食器喂牲口
→ 售货机趁高价清库存,人不在也能持续产出。

- config.BUILDINGS 注册 4 座:喷灌系统 2800 金(全量浇水)、
  自动收割机 900 金 ×3(每天各收 2 块熟地,刻意不给经验——机器收的
  不算劳动,给手动玩法留价值)、自动售货机 1200 金(市价 > 基准价才
  出手、每天上限 5 份、越贵越先卖)、饲料磨坊 500 金(1 份最便宜的
  作物磨 3 份饲料)。
- engine._run_buildings 扩成六段流水线,顺序即依赖:磨坊排在喂食器前,
  早上磨的饲料当天就能喂上;收割机遇满仓停摆、作物留地(同喂食器
  缺料停摆哲学——自动系统绝不硬来,更绝不自动花钱)。
- webui / build 动作 / catalog 全部由 config.BUILDINGS 驱动,零改动。
- 测试 +6(喷灌全量浇水、收割入库且无经验、满仓停摆留作物、磨坊挑
  最便宜、磨坊→喂食器同日链路、售货机阈值与配额)。修复断言时确认
  两个既有行为:引擎自带 START_FEED=5;advance_day 末尾会把动物 fed
  复位("喂到了"的证据是 pending 累计而非 fed 本身)。
- 门禁:534 项 OK(skip 39)、ruff/pyright 全绿。
This commit is contained in:
snowy-yang committed 2026-09-25 21:05:27 +08:00
1 parent 2676927c1a
commit cb4c1e7800
7 files changed
+332 -10

No files matched your search

+32
View File
@@ -289,6 +289,10 @@ MAX_GRANARY = 400 # 仓容硬上限
# max_level : 最多能造几座
# effect : 一句话说明(原样出现在 catalog 与界面上)
HARVESTER_PLOTS = 2 # 每台自动收割机每天收获的地块数
VENDOR_QUOTA = 5 # 自动售货机每天最多卖出的份数
MILL_OUTPUT = 3 # 饲料磨坊每份作物磨出的饲料量
BUILDINGS: dict[str, dict[str, Any]] = {
"granary": {
"name": "谷仓",
@@ -318,6 +322,34 @@ BUILDINGS: dict[str, dict[str, Any]] = {
"max_level": 1,
"effect": "作物不再被暴风雨损毁,水分蒸发减半",
},
"sprinkler": {
"name": "喷灌系统",
"cost": 2800,
"level_req": 4,
"max_level": 1,
"effect": "每天自动给所有缺水的地块浇满",
},
"harvester": {
"name": "自动收割机",
"cost": 900,
"level_req": 3,
"max_level": 3,
"effect": f"每天自动收获 {HARVESTER_PLOTS} 块成熟作物入谷仓(不给经验)",
},
"vendor": {
"name": "自动售货机",
"cost": 1200,
"level_req": 4,
"max_level": 1,
"effect": f"每天自动卖出市价高于基准价的库存(上限 {VENDOR_QUOTA} 份)",
},
"mill": {
"name": "饲料磨坊",
"cost": 500,
"level_req": 2,
"max_level": 1,
"effect": f"每天把 1 份库存作物磨成 {MILL_OUTPUT} 份饲料(挑最便宜的)",
},
}
BUILD_PRICE_GROWTH = 1.6 # 同类建筑第 n 座的价格系数