6.1 KiB
6.1 KiB
Here’s a phased development roadmap for YeetGeese, structured around indie pacing and optimized for Godot 4.x workflows. Each phase includes core deliverables, Godot-specific implementation notes, and how the first-person TD + goose-throwing twist is handled.
Phase 1: Pre-Production & Design (Weeks 1–3)
Goal: Lock scope, define the loop, set up the project structure.
- Core Loop Doc: Spawn wave → position/aim → throw geese → defend choke point/base → upgrade/reward → next wave.
- Art/Tone Direction: Stylized low-poly or cartoonish (eases iteration). Geese should read clearly in motion.
- Technical Spec: Node hierarchy, scene boundaries, data flow (Resource-driven balance tables recommended).
- Godot Setup:
- Project structure:
res://src/,res://art/,res://audio/,res://scenes/with clear naming (goose.tscn,enemy_spawner.gd). - Use Godot’s built-in version control integration or Git +
.gdignore. - Set up export templates early (itch.io web build for playtests, Windows/Linux for QA).
- Project structure:
Phase 2: Core Prototype (Weeks 4–6)
Goal: Playable loop with no art polish. Prove the throw mechanic & TD flow work in first-person.
- FPS Controller:
CharacterBody3D+ mouse look (Input.mouse_mode = Input.MOUSE_MODE_CAPTURED). Add walk/run, crouch if needed for aiming stability. - Goose Throw System:
- Instantiation:
var g = preload("res://scenes/goose.tscn").instantiate()→ add to a dedicatedProjectileLayernode so geese don’t collide with each other or the player. - Physics/projectile logic: Apply initial velocity + gravity via
_physics_process(), or useRigidBody3Dfor bouncy, chaotic honking (lean into it). - Aim assist/crosshair via a fixed
Sprite3Din front of the camera.
- Instantiation:
- Enemy Pathing:
NavigationRegion3Don level geometry → enemies inheritNavigationAgent3Dto route toward your base/heart node. - Wave Manager: Autoload or scene-local manager that tracks spawn timers, enemy count, and triggers UI/audio events via signals.
- Godot Tip: Use Signals everywhere (
goose_impact,wave_cleared) to keep systems decoupled. Balance numbers live in a.tresResource file so you can tweak mid-playtest without touching code.
Phase 3: Vertical Slice & Systems (Weeks 7–10)
Goal: One polished, complete level with full UI/audio/save functionality.
- HUD/UI:
CanvasLayerfor health bar, score, throw cooldown/charge meter. Use Godot’s control nodes + anchors; test on multiple resolutions early. - Progression/Upsell: Goose powerups (bigger honk radius, sticky geese, flock shot) stored in a player stat Resource.
- Audio Pipeline:
AudioStreamPlayer3Dfor spatialized throws/honks,AudioBuslayout for SFX/music/Master so you can mix per platform. - Save System: Serialize wave progress/unlocks to JSON or a Godot
ResourceSaverfile inuser://. Load on startup via an autoloadGameManager. - Playtesting Loop: Build → share itch web build → iterate cooldowns/damage/spawn curves using your balance Resource.
- Godot Tip: Use the Debugger > Profiler to watch FPS/memory while waves scale up. Enable
Rendering > Quality > VoxelGIor baked lighting if you go 3D art-heavy, but keep it lightweight for indie budgets.
Phase 4: Content Production & Levels (Weeks 11–16)
Goal: Ship the full game scope. Multiple arenas, enemy variety, upgrade tree.
- Level Design: Build 5–8 distinct arenas using modular
GridMapor instanced scene pieces. Vary choke points to force different throw angles/strategies. - Enemy Types: Rushers, tanks that absorb hits before routing, splitters, maybe a "farmer" enemy that drops currency you can grab between waves.
- Goose Synergy: Add placement-style mechanics if desired (e.g., drop a
GooseNest.tscnthat auto-throws weak geese while you aim heavy throws). Keep the first-person perspective central to aiming. - Polish Systems: Screen shake on big hits, hit markers, dynamic music intensity tied to wave danger level.
- Godot Tip: Preload heavy scenes with
ResourceLoader.load_threaded_request()if levels are large. UseObject.set_physics_process_group()for systems that need to run independently of the main loop (rare but useful for spawners).
Phase 5: Polish, QA & Launch Prep (Weeks 17–20)
Goal: Stable, performant, release-ready build.
- QA & Optimization: Fix collision layer conflicts, clamp delta time drift, profile with Godot’s built-in profiler. Enable
Editor > Project Settings > Rendering > Qualityscaling for low-end PCs. - Input/Accessibility: Remappable controls via
ProjectSettings.input_map, colorblind-safe UI, volume sliders tied to your AudioBus layout. - Export & Distribution: Test each export template on target OS. Set up itch.io page + demo build (Godot’s one-click web export is perfect here).
- Launch Assets: Record gameplay in Godot with
Movie Makermode or external software, cut a trailer, write store description focusing on the "first-person TD + thrown geese" hook.
Godot Architecture Recommendations for YeetGeese
- Scene-First Design: Every entity is its own
.tscn+.gd. Player, Goose, Enemy, Spawner, HUD each encapsulated. - Data-Driven Balance: All numbers (throw cooldown, goose mass, enemy HP/spawn rate) live in
Resourcefiles or JSON autoloads. Swap balance tables without recompiling. - Signal Bus Pattern: A lightweight autoload (
Signals.gd) holding global events (wave_started,enemy_died,base_hit) keeps your manager code clean and UI/audio reactive. - Collision Layers: Player/Geese on layer 1, Enemies on 2, Base on 3. Geese mask enemies+base only → no self-collision or environment clutter hits.
Immediate Next Steps
- Block out the scene hierarchy in Godot:
Main.tscn→Player,WaveManager,HUD. - Implement the goose throw prototype with a placeholder
RigidBody3D+ gravity + damage on collision. - Wire one enemy using
NavigationAgent3Dtoward your base node. - Get the web export working and share a raw prototype build to test aiming feel in first-person.