Files
SimpleFarm/.workbuddy/memory/2026-09-25.md
T
snowy-yang 4bc7729715 地图手感打磨:动作粒子 + 昼夜色温 + 成熟呼吸金光
为什么:地图功能已全通但缺"游戏手感"——点击有反馈(toast)却看不到
画面上的动静,时间流动也只在倒计时数字里。这一轮全部补上。

- 动作粒子特效(webui):act() 成功后在目标位置喷粒子 + 上浮表情小字
  (浇水💧水花、播种🌱扬土、收获/收取✨金点、喂食🍽)。粒子受重力、
  按寿命衰减,失败动作不触发(api() 返回 null 时 mapJuice 不执行)。
- 昼夜色温:一天的进度(1 - seconds_to_tick/tick_seconds)映射成
  清晨淡金 → 正午不叠色 → 黄昏橙 → 入夜靛紫的半透明覆盖层,
  让"40 分钟一天"在画面光色上也流动。tick_seconds 完整快照里有、
  brief 里没有,靠 refreshFromBrief 的合并语义保留。
- 成熟作物金光改呼吸式(shadowBlur 随 sin 起伏),悬停可交互对象时
  指针变手型。

验证:532 项测试全绿、ruff/pyright 干净;真机 headless Chrome 实测
粒子注入 23 枚 2 秒内衰减归零、失败动作不产生特效、dayTint 三时段
数值正确、截图目检清晨色调正常、控制台零报错。
2026-09-25 23:38:40 +08:00

63 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## 2026-09-25 四座自动化设施
- 用户要「添加自动化设施」,AskUserQuestion 给了 4 个候选,用户全选:
喷灌系统 / 自动收割机 / 自动售货机 / 饲料磨坊。
- 设计上沿用既有建筑哲学:**只替代行动点动作,绝不自动花钱**。
`_run_buildings` 扩成六段流水线(顺序即依赖):
水井 → 喷灌 → 收割机 → 磨坊 → 喂食器 → 售货机。
磨坊刻意排在喂食器前——早上磨的饲料当天就能喂上;
收割机遇满仓停摆、作物留地(同喂食器缺料停摆)。
- 数值:喷灌 2800/限1/全量浇水;收割机 900/限3/每天各收 2 块熟地、
**刻意不给经验**(机器收的不算劳动,给手动玩法留价值);
售货机 1200/限1/市价>基准价才卖、每天上限 5 份、越贵越先卖
(_earn 复用 sell 的入账逻辑);磨坊 500/限1/1 份最便宜的作物磨 3 份饲料
(FEED_UNIT_PRICE=6,小麦 14 磨 18 金的料,微赚但吃掉作物)。
- 架构红利:config.BUILDINGS 驱动一切(build 动作、catalog、网页建筑区、
可用动作推荐),新增建筑 engine 之外零改动。
- 测试 +6,途中确认两个既有行为:引擎自带 START_FEED=5(feed 断言要先清零);
advance_day 牲畜阶段末尾会把 fed 复位(「喂到了」的证据是 pending 累计,
鸡 cycle=1 当天喂到就 pending=1)。
- 门禁 534 项 OK(skip 39)、ruff/pyright 全绿;提交 cb4c1e7 已推送。
服务器已重启到新代码,catalog 8 座建筑齐全。
## 2026-09-25 Canvas 二维农场地图
- 用户问「能不能做成二维的」,AskUserQuestion 三选一:CSS 农田视图 /
Canvas 像素农场 / 网页+TUI 都改,用户选 **Canvas 像素农场**。
- 实现:全在 webui.py(服务端零改动,state 里现成的 plots/animals/buildings
够用)。页首插一张全宽 canvas 卡片:逻辑坐标绘制(456×152 起,随地块数变)、
实际像素 = 容器宽 × dpr,命中检测自己算(逻辑坐标 = clientX × MAP.w/rect.width)。
农田 4 列方阵(>12 块改 6 列)土壤颜色随水分插值、作物 emoji 随生长放大、
成熟金光、干裂画裂纹;牧场围栏里牲畜随机漫步回弹、待收产物金泡、没喂 💢;
底部建筑带(owned>0 才画);天气五種各有天色+雨滴/云/烈日。
交互复用 openCropPick/act():空地点击弹选种、熟地收获、缺水浇水、
牲畜收取优先于喂食。下方卡片面板全保留(地图负责沉浸,卡片负责精确)。
- **踩坑:rAF 循环首帧同步执行**。updateMap 原顺序 bind→layout,首帧
`f.ts` 在 MAP.field=null 上 TypeError,把 requestAnimationFrame 注册一起吞掉,
表现是「画布全白但点击命中正常」(命中是纯数学不经过画布)。
修复:layout→sync→bind→fit 顺序 + mapStep/mapDraw 空值护栏。
排查手法:截图空白先别信,`getImageData` 读像素 + 探针 rAF 计数 + 云位移
三连定位「画了没」和「循环活着没」。
- 真机验收:登录、canvas 点击浇水(AP 4→3、水分 2→3、toast)、
悬停 tooltip、截图目检全过;errors/console 干净。534 项测试全绿。
## 2026-09-25 移除行动点系统
- 用户拍板:「谁家浇水还要体力啊 体力删掉 都已经有时间了」——时间
(40 分钟一天、只能自然流动)本身就是唯一节奏阀门,AP 是重复惩罚。
- 连根拔的触点:config(START_AP/AP_COST)、models(ap/max_ap 字段,旧档
payload 的 ap 键 from_dict 自然忽略)、engine(_spend_ap + 8 调用点 +
每日恢复)、bot(AP 分支)、client/TUI/main/README/规则文本。
- **SQLite 老库迁移**:ap 是标量 NOT NULL 列,connect() 里
`PRAGMA table_info` 发现即 `ALTER TABLE farms DROP COLUMN ap`
(Python 3.13 的 SQLite ≥3.35 支持)。实测 saves/farm.db 自动迁完。
- 网页端:删"行动点"统计卡;"下一天"倒计时改**客户端本地走秒**
(render 记 tickLeft/tickStamp 基点,1s 定时器补 SSE 推送间隙);
字体栈补 MiSans/HarmonyOS Sans/PingFang、正文 15px、数字
tabular-nums、canvas 小字加粗。
- 测试 -2(AP 专属用例没了)改 5,532 项全绿;提交 15d290a 已推送。
真机:老库迁移 ✅、无行动点卡 ✅、倒计时 39:04→39:02 走秒 ✅。