hy-farm/docs/godot-migration-progress.md
2026-05-29 19:54:56 +08:00

274 lines
23 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.

# Godot 重构进度
## 已完成
- 删除旧 Unity 目录:`unity`
- 安装 Godot 4.6.2 stable 到:`/Users/hy/Applications/Godot.app`
- 添加命令行入口:`/Users/hy/.local/bin/godot`
- 安装 Godot 4.6.2 官方导出模板到用户模板目录。
- 新建 Godot 工程:`godot/FarmGodot`
- 添加并验证 Web 导出预设:`export_presets.cfg`
- 拷贝登录页第一批 Egret 素材:
- `login_bg.jpg`
- `login_bg.png`
- `login_db.png`
- `login_phone.png`
- `login_pwd.png`
- `login_jizhuPassword.png`
- `login_regist.png`
- `login_findpwd.png`
- `login_goubg.png`
- `login_gou.png`
- `select_db.png`
- `select_db1.png`
- `common.png``c_btn1_png`
- `huakang.ttf`
- `huakanghaibao.ttf`
- 拷贝资源规格:
- `default.res.json`
- `default.thm.json`
- `LoginSceneSkin.exml`
- 已按新版解密 HTML 完整同步原版素材:
- 来源:`muchang/home/web/game/resource/`
- 目标:`godot/FarmGodot/assets/egret/`
- 保留原版相对路径:`assets/``config/``fonts/``skins/`、根目录资源清单。
- 原版 `resource` 下 882 个文件已同步;`rsync -ani --inplace --omit-dir-times` 复查无待同步文件。
- 添加第一版场景:
- `scenes/bootstrap.tscn`
- `scenes/ui/login_scene.tscn`
- 添加第一版脚本:
- `scripts/bootstrap.gd`
- `scripts/services/api_client.gd`
- `scripts/core/egret_resource_catalog.gd`
- `scripts/core/number_formatter.gd`
- `scripts/ui/login_scene.gd`
- 已完成验证:
- Godot 工程导入通过。
- 所有 GDScript `--check-only` 通过。
- 主场景 headless 启动通过。
- Web release 导出通过。
- 本地 HTTP 服务访问 `index.html``index.wasm``index.pck` 均返回 200。
- Godot `--write-movie` 录帧成功,登录页可渲染,截图路径:`/tmp/farmgodot_frame00000000.png`
- 根据“UI 完全一致”要求,当前登录页只算预览版,不计入 UI 完成。
- 已处理第一批明显不一致:
- 输入框去除 Godot 默认黑色样式,改为白鹭输入框底图和 `NinePatchRect` 承载。
- 登录按钮改为 `common.png``c_btn1_png` 图集区域作为底图。
- 登录页坐标改以运行时 `default.thm_4ef35e2b.js` 编译皮肤为准,源 EXML 只作为辅助。
- Web 导出改用自定义 shell当前 Godot 预览按 `640 x 960` 全画布验证,避免桌面预览右侧黑边。
- 已生成白鹭/Godot 对照截图和差异图:
- `docs/ui-baseline/egret-login-page.png`
- `docs/ui-baseline/godot-login-page.png`
- `docs/ui-baseline/login-page-diff.png`
- `docs/ui-baseline/egret-login-canvas.png`
- `docs/ui-baseline/godot-login-canvas.png`
- `docs/ui-baseline/login-canvas-diff.png`
- 当前截图对比结果:
- 页面截图:`11206 / 614400` 像素不同,差异率 `0.018239`
- 实际 canvas`11206 / 460800` 像素不同,差异率 `0.024319`
- 差异主要集中在中文字体渲染、按钮文字和少量贴图边缘采样;因此登录页仍不能标记为 UI 完成。
## 当前能力
- Godot 启动后进入登录页预览。
- 能解析 Egret `default.res.json` 并统计资源数量。
- 登录表单能做账号和密码非空校验。
- 已配置本地后端地址:`http://127.0.0.1:18082/index.php?r=`
- 已配置登录路径:`user/login`
- 登录请求已按旧 Egret 协议发送:`application/x-www-form-urlencoded`body 为 `msg=<base64(JSON)>`
- 登录响应中的 `data` 已按旧客户端逻辑做 Base64 + JSON 解码。
- 使用账号 `13800000001 / 123456` 已验证 Godot Web 版可真实登录并进入主农场。
- 第一版主农场已接入:
- 顶部玩家信息栏、头像、经验条、金币、钻石、战力。
- 农场背景、房屋、围栏、狗屋。
- 12 块土地显示,已开垦/未开垦状态和扩建入口。
- 左侧活动入口、世界入口、右下家园入口。
- 按后端 `landList` 渲染作物阶段,当前可显示成熟作物和种子期作物。
- 点击空地后显示旧版黄色土地高亮和圆形“播种”菜单。
- 点击“播种”后显示旧版右侧种子包,种子列表从 `store-house` 读取。
- 点击种子后调用 `farm/sow-seeds`,成功后刷新当前地块作物。
- 种子播下后会按 `crop_gather_time` 和作物阶段时间自动刷新作物贴图,不需要刷新页面。
- 点击成长中土地后显示旧版圆形土地菜单:铲除、施肥、除虫、除草。
- 点击成熟土地后显示旧版“收割”菜单,并调用 `farm/gather-crop`
- 点击已收割或枯萎土地后显示旧版“铲除”菜单,并调用 `farm/clear-land`
- 点击“施肥”后显示旧版右侧化肥包,化肥列表从 `store-house` 读取,并调用 `farm/fertilize`
- 点击“除虫”“除草”后调用 `farm/disease`,分别传原版疾病类型 `1``2`
- 土地异常状态已渲染原版 `plant_state1/2/3` 图标。
- 土地倒计时已按原版长按行为显示,不占用普通点击操作菜单。
- 家园菜单已补第一版二级入口和弹窗:
- 点击家园后按旧版弧形弹出商店、仓库、好友入口。
- 商店弹窗已按 `ShopSkin.exml``ShopItemSkin.exml` 迁移第一版,配置来自 `store_list`,买入调用 `store/buy`
- 仓库弹窗已按 `WareHouseSkin.exml``WareHouseItemSkin.exml` 迁移第一版,库存来自 `store-house`,出售弹窗按 `SellSkin.exml` 迁移,出售调用 `store-house/sell`
- 好友弹窗已按 `FriendSkin.exml``FriendRankItemSkin.exml` 迁移第一版,全国排行调用 `comm/get-level-ranking`,好友排行调用 `friend/friend-list`
- 已生成主农场白鹭/Godot 对照截图:
- `docs/ui-baseline/egret-main-page.png`
- `docs/ui-baseline/egret-main-canvas.png`
- `docs/ui-baseline/egret-main-meta.json`
- `docs/ui-baseline/godot-main-page.png`
- `docs/ui-baseline/godot-main-canvas.png`
- `docs/ui-baseline/godot-main-meta.json`
- 已生成种菜流程截图:
- `docs/ui-baseline/egret-plant-menu.png`
- `docs/ui-baseline/egret-seed-bag.png`
- `docs/ui-baseline/egret-after-sow.png`
- `docs/ui-baseline/godot-plant-menu.png`
- `docs/ui-baseline/godot-seed-bag.png`
- `docs/ui-baseline/godot-after-sow.png`
- `docs/ui-baseline/godot-plant-flow-meta.json`
- `docs/ui-baseline/godot-auto-mature.png`
- `docs/ui-baseline/godot-auto-mature-menu.png`
- 已生成土地操作流程截图:
- `docs/ui-baseline/godot-actions-main.png`
- `docs/ui-baseline/godot-countdown-longpress.png`
- `docs/ui-baseline/godot-actions-menu.png`
- `docs/ui-baseline/godot-after-bug-clean.png`
- `docs/ui-baseline/godot-after-grass-clean.png`
- `docs/ui-baseline/godot-fertilizer-bag.png`
- `docs/ui-baseline/godot-after-fertilize.png`
- `docs/ui-baseline/godot-ripe-menu.png`
- `docs/ui-baseline/godot-after-harvest.png`
- `docs/ui-baseline/godot-after-clear.png`
- `docs/ui-baseline/godot-land-actions-flow-meta.json`
- 已生成家园菜单弹窗验证截图:
- `docs/ui-baseline/godot-shop-panel.png`
- `docs/ui-baseline/godot-warehouse-panel.png`
- `docs/ui-baseline/godot-friend-panel.png`
- 已生成狗窝、房屋升级、土地扩建验证截图:
- `docs/ui-baseline/godot-dog-building-extend-main.png`
- `docs/ui-baseline/godot-building-upgrade-panel.png`
- `docs/ui-baseline/godot-dog-panel.png`
- `docs/ui-baseline/godot-dog-food-popup.png`
- `docs/ui-baseline/godot-land-extend-panel.png`
- `docs/ui-baseline/godot-dog-building-extend-meta.json`
- 已生成宠物功能验证截图:
- `docs/ui-baseline/godot-pet-main.png`
- `docs/ui-baseline/godot-pet-panel.png`
- `docs/ui-baseline/godot-pet-doghouse-click.png`
- 已生成统一面板背景验证截图:
- `docs/ui-baseline/godot-panel-background-home-menu.png`
- `docs/ui-baseline/godot-panel-background-shop.png`
- `docs/ui-baseline/godot-panel-background-warehouse.png`
- `docs/ui-baseline/godot-panel-background-friend.png`
- `docs/ui-baseline/godot-panel-background-pet.png`
- `docs/ui-baseline/godot-panel-background-dog.png`
## 未完成
- 登录成功后的玩家模型已开始拆到 `PlayerState/FarmState/InventoryState`,但 UI 层仍有部分直接读写字典的旧逻辑。
- 主场景入口点击、扩建、浇水、土地升级已接第一版;浇水走 `farm/disease type=0`,当前账号没有干旱土地时只做规则/API 链路验证。
- 好友搜索、好友申请、查看好友家园、互动动作只保留入口提示,未接完整二级弹窗和接口。
- Egret 图集自动转 `AtlasTexture` 未实现。
- EXML 辅助转换工具未实现。
- 字体、FNT、音频原始文件已迁入 `assets/egret`,但部分运行时解析和播放逻辑仍未接完。
- 登录页已完成第一轮白鹭基准截图对比,但像素差异未归零,不能标记为 UI 完成。
- 主农场已完成第一版浏览器截图对照,但未做像素差异归零;左侧入口、顶部字体/FNT、围栏招牌语言仍需继续精调。
- 字体、字号、按钮文字效果、图集采样和旧 H5 的 640x1136 缩放差异仍需继续精调。
## 已解决问题记录
- Web 导出第一次失败Godot CLI 只显示空的 configuration errors。
- 查 Godot 4.6.2 官方源码后确认原因:`vram_texture_compression/for_mobile=true` 时要求项目启用 ETC2/ASTC 导入设置;当前项目没有启用,`can_export` 返回失败但没有错误文本。
- 已按官方 Web exporter 默认值改为 `vram_texture_compression/for_mobile=false`,重新导出通过。
- 后端 URL 已从旧客户端 `GameConfig.SERVER_PATH` 定位:
- `muchang/farmer/js/main.min_77d7299f.js` 使用 `http://<host>/home/web/index.php?r=`
- 本地 Docker `home` 服务映射到 `127.0.0.1:18082`,所以 Godot 使用 `http://127.0.0.1:18082/index.php?r=`
- 已用 curl 验证 `user/login` 可达,并返回后端 JSON 业务状态。
- 种菜链路已按旧客户端确认:
- 旧客户端 `BagPanelSkin.exml` 的右侧种子包位置和 `BagIconSkin.exml` 的种子图标样式已迁移。
- 旧客户端 `GameView.clickLand -> CoolMenuItem.plant -> OPEN_BAG -> BagIconRender -> farm/sow-seeds` 链路已在 Godot 复刻第一版。
- 2026-05-11 使用 `13800000001 / 123456` 在 Godot Web 验证:`user/login``store-house``farm/sow-seeds` 均返回 HTTP 200。
- 为验证播种,临时通过 `store/buy` 买入 1 个金桔种子,播种成功后已调用 `farm/clear-land` 把 1 号地恢复为空地。
- 土地操作链路已按旧客户端确认:
- 旧客户端 `GameView.getMyFarmMenu` 的土地菜单规则已迁移:空地播种、成长中铲除/施肥/除虫/除草、成熟收割、已收割或枯萎铲除。
- 旧客户端 `PlantCdTipSkin.exml` 的长按倒计时提示已迁移,普通点击不再弹倒计时,避免遮挡操作菜单。
- 旧客户端 `BagPanelSkin.exml` 的右侧背包位置继续复用,当前支持种子包和化肥包。
- `game_config.json` 已作为非资源文件纳入 Web 导出,用于读取种子、作物、化肥、图标和阶段时间配置。
- 2026-05-11 使用 `13800000001 / 123456` 在 Godot Web 验证:`farm/disease``farm/fertilize``farm/gather-crop``farm/clear-land` 均返回 HTTP 200 且业务状态成功。
- 验证时临时改动的测试账号土地、道具和经验数据已恢复到测试前状态。
- 作物自动成熟刷新已确认:
- 2026-05-11 参考 Godot `Timer.timeout` 机制,在农场场景增加 1 秒一次的地块视觉状态签名检查,只有阶段、收获状态或异常图标发生变化时才重绘地块。
- 使用 `13800000001 / 123456` 在 Godot Web 版播种金桔种子,后端返回 `crop_gather_time = crop_start_time + 22`;页面不刷新等待成熟后,作物贴图自动切换为成熟金桔。
- 点击自动成熟后的地块已验证弹出“Harvest”收获菜单验证结束后已调用 `farm/clear-land` 将 0 号地恢复为空地。
- 家园菜单弹窗链路已按旧客户端确认:
- 旧客户端 `MainMenu` 的弧形菜单动画已迁移为 Godot Tween仓库素材继续以仓库内 replacement 素材为准。
- 旧客户端 `ShopMediator.buy` 对应 `store/buy` 已接入2026-05-11 使用测试账号在 Godot Web 点击商店购买金桔种子HTTP 200 且业务状态成功。
- 旧客户端 `WareHouseMediator.sellWareHouseItem` 对应 `store-house/sell` 已接入,仓库物品点击可弹出售面板。
- 旧客户端 `FriendMediator.getRankList/getFriendList` 对应 `comm/get-level-ranking``friend/friend-list` 已接入2026-05-11 使用同一 token 直接验证全国排行返回 `total_count=70`、好友排行返回 `total_count=0`Godot Web 全国排行显示 1/10。
- 狗窝、房屋升级和土地扩建第一版已接入:
- 狗屋点击打开 `DogSkin` 对应面板;按旧版 `DogSelectFoodSkin` 显示三档狗粮,接口逻辑对应 `user/feed-dog`
- 房屋点击打开 `BuildingSkin` 对应“房屋升级”面板,读取 `farm_level` 配置表,材料和等级不足时按旧版禁用升级按钮;接口逻辑对应 `farm/upgrade`
- 未开垦土地和扩建木牌点击打开 `LandOpenSkin` 对应扩建面板,读取 `land_extend` 配置表,等级/金币不足时禁用扩建按钮;接口逻辑对应 `farm/extend-land`
- 2026-05-11 在 Godot Web 版使用 `13800000001 / 123456` 验证三个入口均能打开,当前账号下一块土地要求 `LV.13 / 1888`,因等级不足未执行不可逆扩建。
- 宠物主场景和战宠面板已按旧资源修正:
- 场景宠物展示从静态 `petIcon` 改为读取 `assets/swf/dog1.{json,png}` 的 Egret MovieClip 帧,饥饿状态使用趴地动画并加轻微呼吸/语言淡入淡出。
- 宠物位置移到狗窝右侧草地区域,点击热区缩小到狗身,避免遮挡土地和抢狗窝牌子点击。
- 战宠面板保留 `BattleBaseCompomentSkin` 对应的头像框、属性区、经验条、介绍区、底部宠物卡片资源,主外框和内容底图改用统一透明背景素材。
- 战宠基础属性页的经验条按 `BattleProssBar2Skin.exml` 改为九宫格背景 + 裁剪遮罩填充,修复 Godot 纹理按图集原宽度向右溢出的问题。
- 对照旧版 `WidgetDog` 逻辑,家园场景宠物只作为动画展示,不再点击打开战宠面板;战宠面板入口保留在世界菜单/竞技相关入口。
- 2026-05-12 在 Godot Web 版使用 `13800000001 / 123456` 验证:主场景宠物可见且不压土地;点击家园宠物不打开战宠面板;世界菜单战宠入口可打开面板且经验条不越界;点击狗窝牌子仍打开“亲家护院”狗窝面板。
- 统一面板背景素材已接入:
- `tools/batch_prepare_icons.py` 增加 `--cutout SOURCE OUTPUT WIDTH HEIGHT`,可直接对绿幕素材抠图并输出指定尺寸透明 PNG。
- 两张新素材已输出到 `godot/FarmGodot/assets/replacement/panels/panel_shell.png``godot/FarmGodot/assets/replacement/panels/panel_content.png`
- `UiBuilder.create_panel_shell()` 统一使用新外框;狗面板手写外框、商店/仓库/好友/充值/公告/世界/宠物等主内容区统一改用新内容底图。
- 2026-05-12 通过 Godot Web 截图验证商店、仓库、好友、宠物、狗窝面板均能打开且新背景生效。
- 异步面板关闭后的失效节点问题已修复:
- `PanelModule` 增加节点存活和当前节点校验,避免面板关闭后接口返回继续调用已释放节点。
- `LevelGiftPanel`、公告、日志、好友、兑换记录、宝箱、签到、福利、宠物、世界信息等同类面板已按同一规则补防护。
- 2026-05-12 通过相关脚本 `--check-only`、Web 导出、`npm run smoke:godot:web` 和等级礼包快速打开/关闭 Playwright 检查验证。
- 房屋升级和用户信息面板本轮修正:
- 房屋升级按钮按 `BuildingSkin.exml` 的主内容组坐标上移,避免遮盖房屋贴图。
- 用户信息顶部资料区补统一内容底图,避免新面板外框透明中心露出主场景背景。
- 用户信息标题改用 `roleinfo` 图集的 `panel_title_role_info_png`,用户 ID 显示清理为整数文本,避免 `600.0` 这类浮点格式露出。
- `BoxPanel``LotteryPanel` 的右侧装饰节点补显式 `TextureRect` 类型,修复 Web 编译时 `_ui.add_texture()` 返回值无法推断导致主场景加载失败的问题。
- 2026-05-12 通过 `building_panel.gd``player_info_panel.gd``box_panel.gd``lottery_panel.gd` 脚本检查、Web 导出、Playwright 截图和 `npm run smoke:godot:web` 验证。
- 农场主界面入口和作物提示本轮修正:
- 种子包按旧版 `BagPanelSkin.exml``x=526,width=114` 对齐到 640 右边缘,并隐藏内部滚动条。
- 生长倒计时提示条按旧版 `PlantCdTipSkin.exml` + `CDBarSkin.exml` 改为背景/填充双九宫格,修复普通拉伸导致的进度条质感不一致。
- 左侧“福利中心/Benefits”入口、命中区、回调、面板装配和 Godot 福利面板脚本已移除smoke 流程改为新的左侧菜单顺序。
- 2026-05-13 通过相关脚本 `--check-only``verify_p0.gd`、工程导入、Web 导出、`npm run smoke:godot:web``tools/verify_ui_regressions.gd` 验证。
- 背包外部点击关闭已接入:
- 种子/化肥背包打开后会启用全屏透明关闭命中层;点击背包以外区域只关闭背包,不再把点击透传到土地或主菜单。
- 背包面板本体设置为输入阻挡层,点击背包内部空白、滚动区域或物品不会触发外部关闭。
- 2026-05-13 通过 `seed_bag_view.gd` 脚本检查、`verify_p0.gd`、Web 导出、`npm run smoke:godot:web``tools/verify_ui_regressions.gd` 验证。
- 作物收获/生长信息卡片拉伸问题已修复:
- 旧版 `PlantCdTipSkin.exml` 使用 `log_itembg_png``scale9Grid="24,20,4,3"`;该素材原始区域为 53x49Godot `NinePatchRect` 右/下边距应换算为 25/26而不是直接使用 4/3。
- 已把作物提示卡片背景九宫格改为 `24,20,25,26`,避免收获信息卡片横向拉伸后边角和阴影变形。
- 2026-05-13 通过 `plant_tip_view.gd` 脚本检查、`verify_p0.gd`、Web 导出、`npm run smoke:godot:web``tools/verify_ui_regressions.gd` 验证。
- 作物信息气泡常驻逻辑已补齐:
- 有作物且未收获/未枯萎的土地会在作物头顶持续展示 `PlantCdTip` 气泡;点击作物弹出操作菜单或打开种子/化肥背包时隐藏。
- 操作菜单关闭或操作完成刷新土地后,会按当前土地状态恢复气泡;收获后、空地或只剩枯萎草时不再展示。
- 农场视口拖动或土地节点位置变化时,气泡每帧按土地当前全局位置重算,避免停留在旧坐标。
- 2026-05-23 通过 `plant_tip_view.gd``farm_interaction_coordinator.gd``verify_ui_regressions.gd` 脚本检查、`tools/verify_ui_regressions.gd``verify_p0.gd`、Web 导出和 `npm run smoke:godot:web` 验证。
- Home 菜单点击穿透到土地扩建的问题已修复:
- 主场景 `_input` 现在先让 `MainMenuController` 处理 Home 按钮、菜单项和菜单外部关闭命中,命中后直接标记输入已处理,再进入农场土地点击兜底。
- Home 弧形菜单打开时,点击 Store/Storage/Friends 等菜单项只触发对应菜单动作;点击菜单外部只关闭菜单,不再继续传给土地扩建入口。
- 2026-05-13 通过 `main_menu_controller.gd``game_scene.gd``verify_ui_regressions.gd` 脚本检查、`tools/verify_ui_regressions.gd``verify_p0.gd`、Web 导出和 `npm run smoke:godot:web` 验证。
- 顶部功能菜单改为单行布局:
- 转盘入口从第二行移动到第一行第三个槽位,顺序为 `Log / Land Up / Wheel / Pack`
- 第二行底部木板 `TopPanelBack` 隐藏,不再占用主场景上方空间。
- 2026-05-22 通过 `verify_ui_regressions.gd` 增加单行菜单布局断言,并用脚本检查、`verify_p0.gd`、Web 导出、`npm run smoke:godot:web` 和 smoke 截图 `docs/ui-baseline/smoke/01-main.png` 验证。
- 种植失败前台反馈已补齐:
- 对照旧版 `plantSeed()` 失败分支 `TipsUtils.showErrorCodeTips(status)``ServerCode[1009] = "当前等级不足"`Godot 现在会把后端土地操作错误码转成可见 toast不再只在控制台输出 warning。
- `FarmController` 的播种、收获、铲除、施肥、浇水/除虫/除草失败均复用同一错误提示;播种成功补回旧版“播种成功”提示。
- `verify_ui_regressions.gd` 增加种子背包物品点击回调断言和服务端 `1009` 文案断言,覆盖“点击种植没有反应”的交互链路。
- 狗窝宠物列表背景板已修复:
- 旧版 `DogListItemSkin.exml` 使用 `shop_itembg_png`,位置来自 `assets/common.json``Rect2(262,303,179,110)`,之前 Godot `TextureRegionCatalog` 没登记该区域,导致列表项取到默认 1x1 纹理并被九宫格拉伸成异常背景。
- 已补 `shop_itembg` 图集区域,继续按 EXML 的 `scale9Grid="90,57,4,2"` 渲染狗窝列表项。
- 2026-05-22 通过 `texture_region_catalog.gd``dog_panel.gd``verify_ui_regressions.gd` 脚本检查、`verify_ui_regressions.gd``verify_p0.gd`、Web 导出、`npm run smoke:godot:web` 和 Playwright 截图 `docs/ui-baseline/godot-dog-list-bg-fixed.png` 验证。
- 访问好友农场链路已接入:
- 对照旧版 `FriendItemRender.onTouchTap -> GO_OTHER_FARM -> interaction/get-other-user-info -> OPEN_OTHER_GAME`,好友榜家园/手指按钮现在会请求好友农场数据并切换到访客农场。
- 新增 `InteractionApi``FriendVisitController`,接入 `interaction/get-other-user-info``interaction/interaction`;好友土地动作按后端 `interaction_type_list` 映射偷菜、放虫、放草、浇水、除虫、除草。
- 访客模式隐藏自家 Home/World/左侧活动/顶部功能按钮和建筑扩建热区,只保留旧版 `btn_back_home_png` 回家按钮;返回后恢复自家玩家状态、土地、菜单和命中区。
- 2026-05-22 通过相关脚本 `--check-only``verify_p0.gd`、工程导入、Web 导出、`tools/verify_ui_regressions.gd``npm run smoke:godot:web` 和 Playwright 截图 `docs/ui-baseline/smoke/22-friend-panel.png``docs/ui-baseline/smoke/23-friend-visit.png``docs/ui-baseline/smoke/24-friend-back-home.png` 验证。
- 土地扩建金豆图标约束已修复:
- 原版 `LandOpenSkin.exml` 使用 `sicon_gold_png`,图集区域为 35x35Godot 当前替换素材 `assets/replacement/ui/gold_bean.png` 为 500x500之前 `TextureRect` 在入树后继承原图最小尺寸,导致扩建弹窗右下角出现超大金豆。
- `UiBuilder.add_texture()` 改为先设置 `EXPAND_IGNORE_SIZE` 和伸缩模式,再绑定纹理和显式尺寸;扩建弹窗 `GoldIcon` 明确使用 `STRETCH_KEEP_ASPECT_CENTERED`,保持原版 35x35 容器。
- 2026-05-22 通过 `ui_builder.gd``building_panel.gd``verify_ui_regressions.gd` 脚本检查、`tools/verify_ui_regressions.gd``verify_p0.gd`、Web 导出、`npm run smoke:godot:web` 和 Playwright 截图 `docs/ui-baseline/godot-land-open-gold-icon-fixed.png` 验证。
## 下一步
1. 继续压登录页像素差异,优先处理按钮文字和底部健康提示字体。
2. 对照 `egret-main-page.png` 继续压主农场:左侧入口层级、世界/家园入口、顶部 FNT 字体。
3. 继续收敛 `PlayerState/FarmState/InventoryState`,减少 UI 层直接改字典。
4. 继续补齐未开垦土地购买/开放细节,并把土地相关 UI 从 `game_scene.gd` 拆到独立模块。
5. 补齐好友搜索、好友申请和好友互动日志/赠送等二级链路。