Engine: Godot 4.x
Language: GDScript
Art Style: Pixel Art / Isometric (2:1 projection)
Core Mechanics: Stamina management, precise combat, Z-axis simulation
Goal: A character that feels good to control, interacts with the "fake" 3D world correctly, and manages resources.
- Input Map: Configure WASD (Movement) + Shift (Sprint) + Space (Action/Jump)
- Isometric Math: Convert Cartesian inputs (WASD) into Isometric vectors (Cartesian to Iso)
- Collision: Setup CharacterBody2D collision box (feet only) for accurate depth
- Camera: Implement Camera2D with position smoothing (child of Player or RemoteTransform)
- State Machine V1: Implement Enum-based states (IDLE, MOVE, JUMP)
- Visuals: Implement "Bobbing" sine-wave animation for walking
- Directional Sprites: 4-Directional sprite swapping based on velocity
- Z-Axis Simulation: Visual jumping (sprite.y offset) independent of physics collision
- Stamina System: Drain on sprint/jump, regen on idle
- UI Integration: TextureProgressBar anchored to screen (HUD)
- Stamina Polish: Add "Exhausted" state (cannot sprint until stamina > 20%)
Goal: Implement the "Crunch" — hitting things and getting hit.
- Dodge Roll: Add ROLL state with high velocity burst and ignoring input during animation
- I-Frames: Implement "Invincibility Frames" during the middle of the roll
- Hit Stop: Tiny time freeze (0.1s) when damage is dealt for impact
- Hurtbox Class: Create a standardized Area2D class that receives damage (used by Player and Enemies)
- Hitbox Class: Create a standardized Area2D class that deals damage
- Signal Bus: Connect on_area_entered to subtract HP
- Attack State: Add ATTACK state that stops movement
- Combo System: Allow chaining 2-3 attacks if clicked with correct timing
- Visuals: Add weapon swipe sprites or separate weapon pivot rotation
Goal: Solving the hardest part of 2D isometric games—height and depth.
- [WIP] Y-Sort: Configure TileMapLayers and Actors for correct occlusion
- Transparency: Detect when Player is behind a wall and turn the wall semi-transparent
- Elevation Logic: Create a variable
current_layer(0, 1, 2) - Collision Masks: Change collision masks dynamically (e.g., on Layer 1, ignore Layer 0 walls)
- Stairs Triggers: Area2D zones that transition z_height and current_layer smoothly
- TileSet Setup: Define collision polygons for walls, pits, and water
- Navigation: Bake NavigationRegion2D for enemy pathfinding
Goal: Creating resistance.
- Stats: HP, Damage, Speed
- Detection: Area2D ("Aggro Range") to detect Player
- Behavior: Simple "Move Toward" logic
- State Machine: Idle → Patrol → Chase → Attack → Stunned
- Pathfinding: Use NavigationAgent2D to avoid walls while chasing
- Telegraphing: Visual flash before attacking to give Player time to dodge
Goal: Turning a prototype into a game loop.
- Interactable Class: Press 'E' to talk/open
- Chests: Animation + Loot drop
- Bonfires: Save point that respawns enemies and refills potions
- Dialogue System: Simple JSON or Resource-based text parser
- UI: Typing effect for text display
- Main Menu: Start, Settings (Audio/Controls), Quit
- Pause Menu: Freeze Engine.time_scale
- Save System: Save Player Position, Stats, and Inventory to
user://savegame.json
Goal: Make it feel professional.
- Particles: Dust clouds when running/rolling
- Screen Shake: On taking damage or heavy attacks
- Lighting: PointLight2D for torches and atmosphere
- Audio: Footsteps (synced to bobbing), Swing SFX, Impact SFX