117 lines
5.3 KiB
Markdown
117 lines
5.3 KiB
Markdown
# Godot Architecture Refactor Implementation Plan
|
|
|
|
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
|
|
|
|
**Goal:** Refactor `Fighting_Rthythm_game` to match the provided architecture: EventBus communication, thin Main, componentized Player, SkillData resources, UI subscenes, Stage/ActorsContainer ownership, and named 2D layers.
|
|
|
|
**Architecture:** Keep the game runnable at each increment. Cross-system communication goes through `autoload/event_bus.gd`; parent-to-child orchestration uses typed references; child-to-parent requests use signals. Player becomes a coordinator over child components, while skill definitions move to `.tres` resources loaded by `InputResolver`.
|
|
|
|
**Tech Stack:** Godot 4.6 GDScript, `.tscn` scenes, `.tres` resources, headless SceneTree tests.
|
|
|
|
---
|
|
|
|
### Task 1: Architecture Guard Tests
|
|
|
|
**Files:**
|
|
- Create: `tests/test_architecture_refactor.gd`
|
|
- Modify: `project.godot`
|
|
|
|
- [ ] **Step 1: Write failing tests**
|
|
|
|
Add tests that assert EventBus is autoloaded, Main no longer hand-wires UI with `has_method`/`has_signal`, Player has child components, Player does not use raw `KEY_*`, skills load as `SkillData`, Stage owns `ActorsContainer`, UI exists as a separate scene, and project 2D layers are named.
|
|
|
|
- [ ] **Step 2: Run test to verify it fails**
|
|
|
|
Run: `/Applications/Godot.app/Contents/MacOS/Godot --headless --path /Users/wxm/code/project/Fighting_Rthythm_game -s res://tests/test_architecture_refactor.gd`
|
|
|
|
Expected: FAIL because the current project lacks EventBus, component nodes, resource skills, UI subscenes, and Stage boundaries.
|
|
|
|
### Task 2: EventBus And Rhythm Decoupling
|
|
|
|
**Files:**
|
|
- Create: `autoload/event_bus.gd`
|
|
- Modify: `project.godot`
|
|
- Modify: `scenes/rhythm/rhythm_conductor.gd`
|
|
- Modify: `scenes/characters/player.gd`
|
|
|
|
- [ ] Add EventBus signals for rhythm requests, beats, judgements, skills, health, energy, charge, combo, damage, and projectile requests.
|
|
- [ ] Register EventBus as a game autoload.
|
|
- [ ] Make RhythmConductor listen for rhythm action requests and emit EventBus judgement/beat signals.
|
|
- [ ] Remove Player's `get_first_node_in_group("rhythm_conductor")` fallback and treat missing judgement as a miss.
|
|
|
|
### Task 3: Player Components
|
|
|
|
**Files:**
|
|
- Create: `scenes/components/input_component.gd`
|
|
- Create: `scenes/components/combo_tracker.gd`
|
|
- Create: `scenes/components/energy_component.gd`
|
|
- Create: `scenes/components/health_component.gd`
|
|
- Create: `scenes/components/damage_emitter.gd`
|
|
- Create: `scenes/components/damage_receiver.gd`
|
|
- Create: `scenes/components/state_machine.gd`
|
|
- Modify: `scenes/characters/player.gd`
|
|
- Modify: `scenes/characters/player.tscn`
|
|
- Modify: `project.godot`
|
|
|
|
- [ ] Move raw input handling into InputComponent using only InputMap actions.
|
|
- [ ] Move combo slot storage and clear timing into ComboTracker.
|
|
- [ ] Move energy/health state into components that emit EventBus updates.
|
|
- [ ] Add DamageEmitter and DamageReceiver Area2D components with collision-layer-based targeting.
|
|
- [ ] Keep Player as a typed coordinator over components.
|
|
|
|
### Task 4: SkillData Resources
|
|
|
|
**Files:**
|
|
- Create: `resources/skill_data.gd`
|
|
- Create: `resources/skills/*.tres`
|
|
- Modify: `scenes/combat/input_resolver.gd`
|
|
- Modify: `scenes/characters/player.gd`
|
|
|
|
- [ ] Define `SkillData extends Resource`.
|
|
- [ ] Convert each hard-coded skill pattern into a `.tres` resource.
|
|
- [ ] Make InputResolver load resources and return `SkillData`.
|
|
- [ ] Move animation, energy cost/reward, projectile flags, clear-window behavior, and displacement into resources.
|
|
|
|
### Task 5: UI Subscenes And Thin Main
|
|
|
|
**Files:**
|
|
- Create: `scenes/ui/main_ui.tscn`
|
|
- Create: `scenes/ui/main_ui.gd`
|
|
- Create: `scenes/ui/rhythm_track.tscn`
|
|
- Create: `scenes/ui/rhythm_track.gd`
|
|
- Create: `scenes/ui/combo_window_hud.tscn`
|
|
- Create: `scenes/ui/combo_window_hud.gd`
|
|
- Create: `scenes/ui/energy_bar.tscn`
|
|
- Create: `scenes/ui/energy_bar.gd`
|
|
- Modify: `scenes/main/main.gd`
|
|
- Modify: `scenes/main/main.tscn`
|
|
|
|
- [ ] Move rhythm track animation into `RhythmTrack`.
|
|
- [ ] Move combo slot rendering into `ComboWindowHud`.
|
|
- [ ] Move energy/health/charge display into UI nodes that subscribe to EventBus.
|
|
- [ ] Reduce Main to typed child references and scene setup only.
|
|
|
|
### Task 6: Stage And ActorsContainer
|
|
|
|
**Files:**
|
|
- Create: `scenes/stage/stage.tscn`
|
|
- Create: `scenes/stage/stage.gd`
|
|
- Create: `scenes/stage/actors_container.gd`
|
|
- Create: `scenes/combat/player_projectile.tscn`
|
|
- Modify: `scenes/combat/player_projectile.gd`
|
|
- Modify: `scenes/characters/player.gd`
|
|
- Modify: `scenes/main/main.tscn`
|
|
|
|
- [ ] Put ground and Player under Stage/ActorsContainer.
|
|
- [ ] Make Player emit projectile requests instead of adding children to the scene tree.
|
|
- [ ] Make ActorsContainer instantiate projectiles, own them, and group them.
|
|
|
|
### Task 7: Verification
|
|
|
|
**Files:**
|
|
- Modify: tests as needed to target public component interfaces instead of Player internals.
|
|
|
|
- [ ] Run every `tests/*.gd` with Godot headless.
|
|
- [ ] Confirm architecture guard tests cover every explicit objective item.
|
|
- [ ] Inspect key source files to ensure raw key matching, group conductor lookup, Player projectile spawning, and Main `has_method`/`has_signal` probing are gone.
|