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

136 lines
9.8 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 架构重构进度
## 本轮已完成
- 新增资源层:
- `scripts/resources/texture_region_catalog.gd`
- `scripts/resources/atlas_texture_cache.gd`
- 新增状态层:
- `scripts/state/player_state.gd`
- `scripts/state/farm_state.gd`
- `scripts/state/inventory_state.gd`
- 新增规则层:
- `scripts/domain/rules/crop_phase_rules.gd`
- `scripts/domain/rules/land_action_rules.gd`
- `scripts/domain/rules/cost_rules.gd`
- 新增数据映射层:
- `scripts/domain/mappers/farm_mapper.gd`
- `scripts/domain/mappers/inventory_mapper.gd`
- 新增接口服务层:
- `scripts/services/farm_api.gd`
- `scripts/services/inventory_api.gd`
- `scripts/services/building_api.gd`
- `scripts/services/shop_api.gd`
- `scripts/services/warehouse_api.gd`
- `scripts/services/dog_api.gd`
- `scripts/services/friend_api.gd`
- `game_scene.gd` 已改为通过服务层调用接口UI 主脚本不再直接写业务接口路径。
- 土地动作判断、作物阶段判断、背包数据提取、土地返回数据归一化已迁出 `game_scene.gd`
- 顶部 HUD、主菜单、世界菜单、弹窗层/Toast、农场缩放手势已从 `game_scene.gd` 迁出:
- `scripts/ui/hud/top_bar_view.gd`
- `scripts/ui/menus/main_menu_controller.gd`
- `scripts/ui/menus/world_menu_controller.gd`
- `scripts/ui/common/modal_layer_controller.gd`
- `scripts/ui/common/ui_motion.gd`
- `scripts/ui/farm/farm_viewport_controller.gd`
- 公共 UI 构建和图集资源访问已迁出:
- `scripts/ui/common/ui_builder.gd`
- `scripts/ui/common/texture_provider.gd`
- `UiBuilder` 已提供统一面板外框和内容底图入口,素材来自 `assets/replacement/panels/panel_shell.png``panel_content.png`,避免各面板继续手写旧 `c_panel/inner_page/common_db_10` 背景。
- Egret MovieClip 帧解析已迁到资源层:
- `scripts/resources/egret_movie_clip_cache.gd`
- 当前用于场景宠物 `dog1` swf 帧,避免 UI 面板直接重复解析 `{mc,res}` 图集。
- 土地、背包和种植提示已迁出:
- `scripts/farm/farm_controller.gd`
- `scripts/ui/farm/land_grid_view.gd`
- `scripts/ui/farm/land_action_menu.gd`
- `scripts/ui/farm/plant_tip_view.gd`
- `scripts/ui/farm/seed_bag_view.gd`
- 主场景深拆第二阶段已完成:
- `scripts/ui/game_scene_bootstrap.gd`装配服务、状态、规则、Facade、FarmController 和面板模块。
- `scripts/ui/game_scene_runtime_assembler.gd`:装配顶部 HUD、主菜单、世界菜单、弹窗层、宠物展示、农场缩放、土地网格、土地动作菜单、种子背包、种植提示和运行时 hit 路由。
- `scripts/ui/game_scene_panel_router.gd`:统一承接商店、仓库、好友、房屋/土地扩建、狗窝、活动、支付、宠物等弹窗入口。
- `scripts/ui/scene_hit_router.gd`:顶部/左侧入口、农场建筑入口、直接命中兜底。
- `scripts/ui/farm/farm_interaction_coordinator.gd`:土地点击、长按、选中光圈、动作菜单、种子/肥料背包和作物提示。
- `scripts/state/player_inventory_facade.gd`:仓库刷新、奖励发放、消耗扣除、货币和狗饥饿时间写入。
- `scripts/ui/game_scene_context.gd`:收敛面板和 UI 模块共享依赖,替代 Bootstrap 中的大 callback 字典。
- `scripts/state/player_state.gd`:合并原 `PlayerDataAccessor`,作为玩家快照唯一权威来源。
- `scripts/ui/common/icon_texture_provider.gd`:缓存物品、宠物、作物和房屋图标加载。
- 面板按功能拆成独立模块:
- `scripts/ui/panels/shop_panel.gd`
- `scripts/ui/panels/warehouse_panel.gd`
- `scripts/ui/panels/friend_panel.gd`
- `scripts/ui/panels/building_panel.gd`
- `scripts/ui/panels/dog_panel.gd`
- `scripts/ui/panels/log_panel.gd`
- `scripts/ui/panels/notice_panel.gd`
- `scripts/ui/panels/level_gift_panel.gd`
- `scripts/ui/panels/online_gift_panel.gd`
- `scripts/ui/panels/pay_panel.gd`
- `scripts/ui/panels/welfare_panel.gd`
- `scripts/ui/panels/gold_exchange_panel.gd`
- `scripts/ui/panels/world_info_panel.gd`
- `scripts/ui/panels/sign_panel.gd`
- `scripts/ui/panels/box_panel.gd`
- `scripts/ui/panels/lottery_panel.gd`
- `scripts/ui/panels/pet_panel.gd`
- 修复了土地数据收集逻辑,改由 `FarmState.setup_from_player_data()` 统一归一化。
- 删除了临时 `DEBUG/print` 调试输出。
## 当前保留在 GameScene 的职责
`game_scene.gd` 当前 957 行,已低于 1200 行目标;保留职责收敛为场景生命周期、常驻节点引用、上下文桥接、土地快照渲染和少量兼容状态同步。已完成本阶段深拆:
- `GameSceneBootstrap` 已接管 `_setup_architecture_modules()` 和原 `_setup_panel_views()` 装配逻辑。
- `GameSceneRuntimeAssembler` 已接管 HUD/菜单/弹窗/宠物/土地交互运行时装配。
- `GameScenePanelRouter` 已接管 `_open_*_panel` 方法族、房屋/土地扩建入口包装和弹窗 active 状态。
- `SceneHitRouter` 已接管顶部/左侧/土地建筑点击区域注册和直接命中检测。
- `FarmInteractionCoordinator` 已接管长按、土地选择、背包打开、土地高亮等交互胶水。
- `PlayerInventoryFacade` 已接管奖励发放、消耗扣除、仓库刷新等跨模块状态写入。
- `GameSceneContext` 已接管面板共享依赖和 legacy callback 兼容层。
- `PlayerState` 已合并原 `PlayerDataAccessor`,主场景 token、房屋等级、狗饥饿时间等玩家字段访问统一从 `PlayerState` 读取/写入。
下一阶段建议转入 P1 功能拆分:好友完整互动、世界玩法、活动面板像素级对齐,并继续把旧面板从 legacy callbacks 迁到显式 `GameSceneContext` 方法。
## 已验证
- `game_scene.gd` 和新增 UI 控制器/面板模块通过 Godot `--check-only`
- `game_scene_bootstrap.gd``game_scene_context.gd``game_scene_runtime_assembler.gd``game_scene_panel_router.gd``scene_hit_router.gd``farm_interaction_coordinator.gd``player_inventory_facade.gd``player_state.gd` 均通过 Godot `--check-only`
- 新增资源、状态、规则、Mapper、Service 脚本全部通过 `--check-only`
- 工程导入通过:`godot --headless --path godot/FarmGodot --import --quit`
- P0 验证通过:`godot --headless --path godot/FarmGodot --script res://tools/verify_p0.gd`
- Web 导出通过:`godot --headless --path godot/FarmGodot --export-release Web build/web/index.html`
- 本地 H5 预览通过:`http://127.0.0.1:8792/index.html`
- 自动登录成功,请求 `user/login` 返回 HTTP 200业务 `status=0`
- 背包请求 `store-house` 返回 HTTP 200业务 `status=0`
- 主场景、土地菜单打开/关闭、主菜单、世界菜单、弹窗、缩放和新增功能入口完成浏览器烟测:`npm run smoke:godot:web`
- 宠物功能本轮验证通过:`pet_panel.gd``egret_movie_clip_cache.gd``game_scene.gd``game_scene_bootstrap.gd``game_scene_runtime_assembler.gd` 通过 `--check-only`;工程 `--import --quit` 和 Web 导出通过;浏览器截图确认主场景宠物、战宠面板、狗窝牌子入口均可用。
- 战宠面板经验条补充验证通过:按 `BattleProssBar2Skin.exml` 的九宫格背景和遮罩结构重做进度条Web 截图确认经验条不再穿出面板;`pet_panel.gd` 通过 `--check-only`Web 导出和 `npm run smoke:godot:web` 均通过。
- 家园宠物点击行为补充验证通过:对照旧版 `WidgetDog`,移除场景宠物显示节点、运行时装配层和直接命中路由里的 `open_pet_panel` 绑定;点击家园宠物不再打开战宠面板,世界菜单的战宠入口仍可打开;相关脚本通过 `--check-only`Web 导出和 `npm run smoke:godot:web` 均通过。
- 统一面板背景本轮验证通过:`batch_prepare_icons.py` 可用 `--cutout` 抠出两张透明素材;所有受影响面板脚本通过 `--check-only`;工程 `--import --quit`、Web 导出、`npm run smoke:godot:web` 和补充 Playwright 截图均通过。
- 异步面板关闭防护本轮验证通过:`LevelGiftPanel` 复现路径已修复,公告、日志、好友、兑换记录、宝箱、签到、福利、宠物、世界信息等同类异步面板增加节点存活校验;相关脚本通过 `--check-only`Web 导出、`npm run smoke:godot:web` 和等级礼包快速打开/关闭 Playwright 检查均通过。
- 房屋升级和用户信息面板本轮验证通过:`BuildingPanel` 的房屋升级按钮坐标回到旧 EXML 主内容组顶部位置,不再遮盖房屋;`PlayerInfoPanel` 顶部资料区补统一内容底图,标题改用 `roleinfo` 图集标题,用户 ID 清理为整数文本;`BoxPanel``LotteryPanel` 右侧装饰节点补显式类型,修复 Web 编译时类型推断失败;相关脚本通过 `--check-only`Web 导出、Playwright 截图和 `npm run smoke:godot:web` 均通过。
## 验证产物
- `docs/ui-baseline/godot-architecture-refactor-main.png`
- `docs/ui-baseline/godot-architecture-refactor-land-menu.png`
- `docs/ui-baseline/godot-architecture-refactor-land-menu-closed.png`
- `docs/ui-baseline/godot-architecture-refactor-main-menu.png`
- `docs/ui-baseline/godot-architecture-refactor-meta.json`
- `docs/ui-baseline/smoke/*.png`
- `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-pet-scene-click-no-panel.png`
- `docs/ui-baseline/godot-world-pet-entry-still-opens.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-pet-panel-expbar-fixed.png`
- `docs/ui-baseline/godot-panel-background-dog.png`
- `docs/ui-baseline/godot-house-upgrade-button-position-fixed.png`
- `docs/ui-baseline/godot-player-info-bg-fixed.png`
- `docs/ui-baseline/godot-player-info-title-id-fixed.png`