feat: 加天气 / 谷仓 / 建筑三套系统,收获改为入库 + 择时卖出
动手前先修掉了两处「死机制」,新增的三个系统各自激活一个: * 天气:小麦 2 天成熟、初始水分 2、每天只掉 1 点,等于永远不需要浇水。 现在水分消耗由天气决定(晴 1 / 多云 0 / 干旱 2,雨天反补 3),而 `state.forecast` 把明天的天气提前告诉你——「今晚浇不浇」成了能算的决策。 5 种天气、权重合计 100、同种不连出;暴风雨会毁未熟作物,温室免疫。 * 谷仓:市场波动原本纯装饰(收获当场按市价变现,没有择时空间)。现在收获与 收取只进 `state.inventory`,靠新增的 `sell` 换金币,价格波动才真正参与决策。 仓满时 `_store()` 抛 `granary_full` 且不改状态,作物原样留在地里。 * 建筑:新增 `build`,买的是「以后不用天天手动做」——水井自动浇干地、 喂食器自动喂食(只吃库存饲料,绝不自动花钱)、温室、谷仓扩容。 每天在 `advance_day` 里先于生长执行,同类越造越贵(×1.6)。 存档升到 `SAVE_VERSION=2`,配 `MIN_SAVE_VERSION=1` 向后兼容,旧档缺的新字段 一律走默认值,不作废玩家手里的档。`advance_day(weather=...)` 是留给测试的 确定性入口。 顺带修两个真 bug: * `daemon.py` 三处 `makedirs(os.path.dirname(path))`:`--pid-file pid.txt` 这种只给文件名的用法会让 dirname 变成空串,启动阶段直接崩。抽出 `ensure_parent_dir()` 兜底。 * `RemoteFarm.snapshot()` 是本地缓存,非实时客户端轮询会一直读到旧数据, 看起来像服务器卡死。补 docstring 指明要自己调 `refresh()`。 质量门禁:ruff format/check 全绿、pyright 0 错误、503 项测试 OK(skip 35)、 bench 无回归(brief 19.5µs / snapshot 48.5µs / POST full=1 400µs)。 另起真实服务器(--tick 3 + 预置存档)跑了 38 项端到端验收,全过。
This commit is contained in:
1 parent
a92c29ead2
commit
cf24cb43f1
21 files changed
+1349
-112
No files matched your search
+24
-2
@@ -104,6 +104,26 @@ class RuleBot:
|
||||
if cost and gold >= cost * 3 and ap >= 1:
|
||||
return 30.0 + (info.get("profit_per_day", 0) if info else 0)
|
||||
return 3.0
|
||||
if name == "sell":
|
||||
# 卖货是唯一的现金流入口(收获不再直接给钱),所以优先级跟着"缺钱"
|
||||
# 和"仓快满"走:仓满了不腾地方,下一茬根本收不进来。
|
||||
used = state.get("storage_used", 0) or 0
|
||||
capacity = state.get("granary_capacity", 1) or 1
|
||||
if gold < 150:
|
||||
return 90.0
|
||||
if used >= capacity * 0.8:
|
||||
return 88.0
|
||||
return 30.0
|
||||
if name == "build":
|
||||
key = params.get("key")
|
||||
used = state.get("storage_used", 0) or 0
|
||||
capacity = state.get("granary_capacity", 1) or 1
|
||||
if key == "granary" and used >= capacity * 0.7:
|
||||
return 46.0
|
||||
if key in ("well", "feeder"):
|
||||
# 这两个买的是"以后不用天天手动做",放置玩法里稳赚
|
||||
return 38.0
|
||||
return 22.0
|
||||
return 1.0
|
||||
|
||||
def choose(self) -> dict[str, Any] | None:
|
||||
@@ -195,8 +215,10 @@ class RuleBot:
|
||||
|
||||
state = self.client.snapshot()
|
||||
if state.get("ap", 0) <= 0:
|
||||
# 行动点用完:只能等这一天自己走完,没有手动快进
|
||||
if not self.wait_for_next_day(wait_seconds):
|
||||
# 行动点用完 ≠ 没事可做:sell / build / harvest / collect / buy_*
|
||||
# 都是 0 消耗,而 available_actions 本身就按行动点筛过一遍了,
|
||||
# 所以照常挑一次最优的;真的没得选才等下一天。
|
||||
if self.step() is None and not self.wait_for_next_day(wait_seconds):
|
||||
break
|
||||
idle = 0
|
||||
continue
|
||||
|
||||
Reference in new issue
Block a user