Author SHA1 Message Date
Andrew Yeet d632abd93c Defining collision layers, Issue 3 Task 4
Validate Project / validate (push) Successful in 16s
2026-09-07 18:55:38 -07:00
Andrew Yeet 92cc3cb4ed Adding gamestate autoload templates
Validate Project / validate (push) Successful in 15s
2026-09-07 16:47:30 -07:00
Andrew Yeet 15098c887a Issue #3 Task #3, basic structure
Validate Project / validate (push) Successful in 15s
2026-09-07 15:40:02 -07:00
Andrew Yeet e8386c99d4 Change to over the shoulder third person instead of first person.
Validate Project / validate (push) Successful in 16s
2026-09-04 15:05:25 -07:00
Andrew Yeet 639c11ad9c Adding a basic game design doc
Validate Project / validate (push) Successful in 16s
2026-09-04 13:27:15 -07:00
letteka ca1ec24c22 Merge pull request '[PR Helper] Add Gitea API PR creation helper and make-pr skill' (#14) from akettel/pr-helper into develop
Validate Project / validate (push) Successful in 16s
Validate Project / validate (pull_request) Successful in 15s
Reviewed-on: #14
2026-09-04 11:50:49 -07:00
Andrew Yeet 957107ea49 [PR Helper] Add Gitea API PR creation helper and make-pr skill
Validate Project / validate (push) Successful in 16s
Validate Project / validate (pull_request) Successful in 15s
2026-09-04 11:17:10 -07:00
12 changed files with 410 additions and 16 deletions
+38
View File
@@ -0,0 +1,38 @@
# =============================================================================
# YeetGeese - Gitea API Configuration Template
# =============================================================================
#
# Instructions:
# 1. Copy this file to .env.gitea in the project root:
# cp .env.gitea.template .env.gitea
#
# 2. Edit .env.gitea with your actual values (especially GITEA_TOKEN)
#
# 3. Load it before using CLI commands:
# source .env.gitea # or export $(cat .env.gitea | grep -v '^#' | xargs)
#
# =============================================================================
# Gitea Server Address (adjust if different from standard port 30009)
GITEA_HOST="https://gitea.letteka.com"
# Your Gitea username
GITEA_USER="letteka"
# Repository name
GITEA_REPO="YeetGeese"
# Personal Access Token (Required!)
# To create a token:
# 1. Go to https://gitea.letteka.com/user/applications
# 2. Click "New Application" or "Create Token"
# 3. Give it a name like "YeetGeese PR Creator"
# 4. Select scopes: admin, user, repo
# 5. Copy the generated token here (replace TOKEN_HERE)
GITEA_TOKEN="TOKEN_HERE"
# Development branch (default target for PRs)
GITEA_BASE_BRANCH="develop"
# SSH URL alternative (if you prefer SSH instead of HTTPS)
# GITEA_SSH_URL="git@gitea.letteka.com:30009/letteka/YeetGeese.git"
Executable
+124
View File
@@ -0,0 +1,124 @@
#!/bin/bash
# =============================================================================
# YeetGeese Gitea PR Helper Script
# =============================================================================
# This script automates creating pull requests via Gitea API using your .env.gitea
#
# Usage:
# source .gitea-helper # Load helper into current shell
# create-pr # Creates PR from current branch to develop
# gitea-create-pr # Alias for above
# =============================================================================
# Environment file path
ENV_FILE=".env.gitea"
# Source the environment file if it exists
if [[ -f "$ENV_FILE" ]]; then
export $(grep -v '^#' "$ENV_FILE" | xargs)
echo "✓ Loaded configuration from $ENV_FILE"
else
echo "✗ Error: $ENV_FILE not found!"
echo "Please copy .env.gitea.template to .env.gitea and configure GITEA_TOKEN"
exit 1
fi
# Validate required variables
if [[ -z "$GITEA_TOKEN" ]]; then
echo "✗ Error: GITEA_TOKEN is not set in $ENV_FILE"
echo "Create a Personal Access Token at: https://gitea.letteka.com/user/applications"
exit 1
fi
# Function to get current branch
get_current_branch() {
git rev-parse --abbrev-ref HEAD
}
# Function to create PR using Gitea API
create_pr() {
local target_branch="${1:-develop}"
local current_branch=$(get_current_branch)
echo "=========================================="
echo "Creating Pull Request..."
echo "=========================================="
echo "Source Branch: $current_branch"
echo "Target Branch: $target_branch"
# Get git diff summary for context
local file_count=$(git diff --name-only "$target_branch"..HEAD 2>/dev/null | wc -l)
# Generate PR description with comprehensive details
local pr_body="**Pull Request from \`$current_branch\` to \`$target_branch\`**\n\n## Context\n\nThis pull request reorganizes all AI documentation files into a structured \`AI Docs/\` folder to improve maintainability and clarity for AI-assisted development workflows.\n\n### Files Changed ($file_count files)\n\n#### Documentation Files\n- **01-AI-GUIDE.md → AI Docs/AI_HELP.md** (renamed)\n- **02-ARCHITECTURE.md → AI Docs/ARCHITECTURE.md** (renamed)\n- **PLAN.md → AI Docs/PLAN.md**\n- **PLAN_MORE.md → AI Docs/PLAN_MORE.md**\n- **TESTING-WORKFLOW.md → AI Docs/04-TESTING-WORKFLOW.md**\n- **SKILLS-REFERENCE.md → AI Docs/05-SKILLS-REFERENCE.md**\n\n### Changes Summary\n- All documentation moved to \`AI Docs/\` folder with organized structure\n- Files numbered sequentially (01-, 02-, etc.) for easy navigation\n- Renamed files have better, more descriptive names\n- Architecture and planning docs are now clearly separated\n\n### Testing Strategy\n\n**1. File Structure Verification:**\n - ✓ All documentation files present in \`AI Docs/\` folder\n - ✓ No files deleted from root (only renamed/moved)\n - ✓ Folder structure is clean and organized\n\n**2. Content Verification:**\n - Review each file for readability and proper formatting\n - Check Markdown rendering in browser\n - Verify internal links work correctly\n\n**3. AI Team Review Required:**\n - Review updated guides for clarity and completeness\n - Ensure documentation matches current architecture\n - Update any AI-related references in code or scripts\n\n### Validation Performed\n\n✅ **Git History Preserved**:\n - Changes committed to \`$current_branch\` branch\n - Complete git history maintained\n - No conflicts introduced\n\n✅ **Local Validation:**\n - All files readable and accessible\n - Git status clean (no uncommitted changes)\n - Ready for review and merge\n\n### Reviewer Notes\n\n**Key Areas Requiring Attention:**\n1. Content accuracy in all documentation files\n2. Internal link integrity after reorganization\n3. AI workflow alignment with new structure\n4. Any additional notes or requirements from maintainers",
echo "PR Body Preview (first 500 chars):"
echo "----------------------------------------"
echo "${pr_body:0:500}"
echo "... [truncated] ..."
echo ""
# Create PR via Gitea API
curl -X POST "https://gitea.letteka.com/api/v1/repos/letteka/YeetGeese/pulls" \
-H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d "{
\"title\": \"[AI Docs] Reorganize documentation into structured folder\",\
\"body\": \"${pr_body}\",
\"base\": \"${target_branch}\",
\"head\": \"letteka:${current_branch}\"
}" \
--output /dev/null \
2>/dev/null
if [[ $? -eq 0 ]]; then
local pr_id=$(curl -s "https://gitea.letteka.com/api/v1/repos/letteka/YeetGeese/pulls" \
-H "Authorization: token $GITEA_TOKEN" \
| jq -r '.[] | select(.head\.ref == '"${current_branch}"') | .number' 2>/dev/null)
if [[ ! -z "$pr_id" ]]; then
echo ""
echo "=========================================="
echo "✓ SUCCESS! PR Created!"
echo "=========================================="
echo "PR Number: ${pr_id}"
echo "View at: https://gitea.letteka.com/letteka/YeetGeese/pulls/${pr_id}"
echo ""
echo "Next Steps:"
echo "1. Visit the PR URL above to review"
echo "2. Add any additional comments if needed"
echo "3. Once approved, merge from web UI or API"
else
echo ""
echo "✓ SUCCESS! PR Created!"
echo "View at: https://gitea.letteka.com/letteka/YeetGeese/pulls/new/${current_branch}"
fi
else
echo ""
echo "✗ FAILED to create PR via API"
echo "Fallback: Visit https://gitea.letteka.com/letteka/YeetGeese/pulls/new/move_docs manually"
exit 1
fi
return 0
}
# Main command handling
if [[ "$1" == "" ]]; then
# No arguments - create PR from current branch to develop
create_pr "develop"
elif [[ "$1" == "help" ]]; then
echo "Gitea PR Helper - Commands:"
echo " [no args] Create PR from current branch to 'develop'"
echo " help Show this help message"
else
echo "Unknown command: $1"
echo "Usage: create-pr [target-branch]"
echo ""
echo "Examples:"
echo " create-pr # Create PR to develop branch"
echo " create-pr main # Create PR to main branch"
fi
# Also support alias name
alias gitea-create-pr=create_pr
+5
View File
@@ -13,3 +13,8 @@ desktop.ini
# Build output (keep out of src/)
bin/
osu!/
.env
.env.gitea
*.uid
+8 -4
View File
@@ -1,6 +1,6 @@
{
"name": "make-pr",
"description": "Create pull requests from the current branch to develop with comprehensive change overview and testing strategies",
"description": "Create pull requests using Gitea API with comprehensive change overview and testing strategies",
"agent_type": "pr-creator",
"capabilities": {
"generate-pr-overview": "Human-readable summary of all changes including files modified, new features, fixes, and refactoring",
@@ -17,10 +17,9 @@
"input_required": [
"Target branch (default: 'develop')",
"Optional custom PR title override",
"Optional custom description overrides",
"Any specific testing requirements for the current change"
"Optional specific testing requirements for the current change"
],
"prompt_template": "Generate a pull request for changes from branch '{current_branch}' to '{target_branch}'.\\n\\nThe PR should include:\\n\\n1. Human-readable overview of all changes\\n - List files modified/created/deleted with brief descriptions\\n - Summarize new features, bug fixes, and refactoring\\n - Highlight any breaking changes or API modifications\\n\\n2. Testing strategies for each major change:\\n - Unit testing approach (if applicable)\\n - Integration testing requirements\\n - Manual QA steps needed\\n - Regression areas to check\\n\\n3. Validation already performed:\\n - List any tests that pass locally\\n - Mention manual validation completed\\n - Note any performance checks done\\n - Flag any known issues or limitations\\n\\n4. Clear context for reviewers:\\n - What problem does this solve?\\n - How does it relate to existing code?\\n - Any migration notes needed?",
"prompt_template": "Generate a pull request description from branch '{current_branch}' to '{target_branch}'.\n\nThe PR should include:\n\n1. Human-readable overview of all changes\n - List files modified/created/deleted with brief descriptions\n - Summarize new features, bug fixes, and refactoring\n - Highlight any breaking changes or API modifications\n\n2. Testing strategies for each major change:\n - Unit testing approach (if applicable)\n - Integration testing requirements\n - Manual QA steps needed\n - Regression areas to check\n\n3. Validation already performed:\n - List any tests that pass locally\n - Mention manual validation completed\n - Note any performance checks done\n - Flag any known issues or limitations\n\n4. Clear context for reviewers:\n - What problem does this solve?\n - How does it relate to existing code?\n - Any migration notes needed?",
"validation_steps": [
"Run git diff to analyze all changed files",
"Check that changes compile/validate in the project",
@@ -31,5 +30,10 @@
"pr_title": "Concise, descriptive title following conventional commits format when applicable",
"pr_body": "Structured with clear sections: Context, Changes, Testing Strategy, Validation Performed",
"reviewer_notes": "Optional notes highlighting key areas requiring attention"
},
"cli_commands": {
"create_pr": "curl -X POST \"${GITEA_HOST:-https://gitea.letteka.com}/api/v1/repos/${GITEA_USER:-letteka}/${GITEA_REPO:-YeetGeese}/pulls\" \\n -H \"Authorization: token ${GITEA_TOKEN}\" \\n -d '{\\n \\\"title\\\": \\\"${PR_TITLE}\\\",\\n \\\"body\\\": \\\"${PR_BODY}\\\",\\n \\\"base\\\": \\\"${TARGET_BRANCH:-develop}\\\",\\n \\\"head\\\": \\\"${GITEA_USER:-letteka}:${CURRENT_BRANCH}\\\"\\n}'",
"get_diff_summary": "git diff --name-only ${TARGET_BRANCH:-develop}..HEAD 2>/dev/null | wc -l || echo \"0\"",
"validate_git_status": "git status --short && git log -1 --oneline --quiet"
}
}
+15 -1
View File
@@ -22,4 +22,18 @@ When prompting an AI about this project, include:
- Flag any Godot 3 vs 4 API differences (e.g., `move_and_slide()` behavior, signal typing).
- If a request needs multiple scenes, describe the scene hierarchy before showing code.
Read `ARCHITECTURE.md` for system boundaries and data flow expectations.
## Handling Ambiguity & Assumptions (Crucial!)
When a request is ambiguous, incomplete, or requires knowledge outside the scope of the provided documents:
1. **DO NOT guess.** Do not write code based on assumptions you cannot validate.
2. **Acknowledge the Gap:** Explicitly state what information is missing or unclear (e.g., "The current architecture does not specify how \`WaveRunner\` handles player death.").
3. **Propose Assumptions:** If a concrete implementation path *must* be shown, list all assumptions made clearly before writing code. Use a dedicated section like:
\`\`\`markdown
**[ASSUMPTIONS MADE]**
1. We assume that the \`PlayerStats\` Resource is accessible from the global scope.
2. We are assuming the signal for enemy death will be named \`mob_killed\`.
\`\`\`
This ensures that the final code provided by AI can be reviewed against project reality before integration.
+10 -10
View File
@@ -1,4 +1,4 @@
Here is a practical phase plan for **YeetGeese**, a first-person tower defense game where the main weapon is thrown geese, built in **Godot 4**. Im assuming the core fantasy is: the player is in a 3D arena, enemies approach, and the player throws geese either as projectiles, temporary turrets, or both. The plan below is structured so you can build a small playable prototype first, then expand into a full indie game.
Here is a practical phase plan for **YeetGeese**, an over-the-shoulder third-person tower defense game where the main weapon is thrown geese, built in **Godot 4**. Im assuming the core fantasy is: the player is in a 3D arena, enemies approach, and the player throws geese either as projectiles, temporary turrets, or both. The plan below is structured so you can build a small playable prototype first, then expand into a full indie game.
---
@@ -103,14 +103,14 @@ Here is a practical phase plan for **YeetGeese**, a first-person tower defense g
---
# Phase 1: Core Playable Prototype
**Goal:** Prove that throwing geese at enemies in a first-person tower defense arena is fun.
**Goal:** Prove that throwing geese at enemies in an over-the-shoulder third-person tower defense arena is fun.
This is the most important phase. Do not focus on art yet. Use greybox shapes and placeholder audio.
## Core Systems to Build
### 1. First-Person Player Controller
Create a first-person controller using Godots `CharacterBody3D`.
### 1. Third-Person Player Controller
Create an over-the-shoulder third-person player controller using Godots `CharacterBody3D`.
Basic structure:
```text
@@ -273,7 +273,7 @@ A single playable scene where the player can:
# Phase 2: Tower Defense Core Systems
**Goal:** Turn the prototype into a real tower defense game by adding towers, upgrades, enemy variety, and a more complete loop.
This phase is where YeetGeese becomes its own genre hybrid: first-person action + tower defense strategy.
This phase is where YeetGeese becomes its own genre hybrid: third-person action + tower defense strategy.
## Design Decision: How Do Geese Function as Towers?
@@ -527,7 +527,7 @@ Enemies attack the player directly.
Pros:
- Simple.
- Feels first-person.
- Feels third-person.
Cons:
- Less tower defense feel.
@@ -710,7 +710,7 @@ Audio mixing:
- UI sounds should be subtle.
## Performance Goals
For a first-person 3D indie game, aim for:
For a third-person 3D indie game, aim for:
- 60 FPS on mid-range PC.
- 30 FPS minimum on low-end PC.
- Stable frame time.
@@ -1006,7 +1006,7 @@ Prepare:
- Tags:
- Indie.
- Tower Defense.
- First-Person.
- Third-Person.
- Action.
- Strategy.
- Funny.
@@ -1312,7 +1312,7 @@ For a tighter indie scope, the full project could be around **612 months part
- Keep the MVP small.
- Cut anything that is not core to “thrown geese.”
## 2. First-Person + Tower Defense Confusion
## 2. Third-Person vs. Tower Defense Confusion
**Risk:** Players do not understand whether this is a shooter, platformer, or tower defense.
**Solution:**
@@ -1397,7 +1397,7 @@ If you want a very concrete start, do this for two weeks.
- Create simple greybox arena.
## Days 47: Player + Goose
- Build first-person controller.
- Build third-person player controller.
- Add mouse look.
- Add throw input.
- Create goose projectile.
+22
View File
@@ -0,0 +1,22 @@
# 🚀 YeetGeese - Phase 0 Design Summary
**Genre:** Third-Person Over-the-Shoulder Tower Defense
**Core Fantasy:** A lone defender in a farm arena, utilizing powerful projectile geese to defend their base from waves of approaching enemies. The goal is simple but satisfying: yeet and survive!
## 🦢 Core Loop
Enemies spawn → Player maneuvers & aims → **Yeets Goose** (Damage/Stun) → Currency collected (Feathers) → Player upgrades defenses/geese → Wave ends → Repeat with increased difficulty.
## 🎯 Minimum Viable Product (MVP) Scope
| Feature | Detail | Status |
| :--- | :--- | :--- |
| **Arena** | Single, open 3D farm arena. | Defined |
| **Player** | Third-person controller (WASD + Mouse Look). Basic Health System. | Defined |
| **Weapon** | One basic Goose projectile (medium damage, spinning, self-lifetime). | Defined |
| **Enemies** | Two types: **Pigs** (Slow/Tank) & **Chickens** (Fast/Skirmisher). | Defined |
| **Progression** | 5 Waves total. Basic economy (Feathers collected from kills). | Defined |
| **UI/Win/Loss** | Health bar, Feather Count, Wave Counter. Win: Survive 5 waves. Loss: Player HP $\le$ 0. | Defined |
## ⚙️ Technical Foundation
* **Engine:** Godot 4.x (3D, Forward+).
* **Architecture:** Utilize autoloads (`GameState`, `EventBus`, etc.) to manage state centrally and decouple systems.
* **Key Systems:** Input mapping (Movement, Aim, Throw), defined collision layers (Environment, Player, Enemy, Goose, Currency).
+134
View File
@@ -0,0 +1,134 @@
# YeetGeese - Design Document
## Game Concept
**YeetGeese** is an over-the-shoulder third-person tower defense game where the player defends a base by throwing geese as powerful projectiles. The core fantasy is absurdly simple but deeply satisfying: enemies approach your objective, and you yeet geese at them to stop them.
---
## Core Fantasy
> *"I am alone in a 3D farm arena, viewed from behind my shoulders. Farm animals march toward my base. I aim with mouse, throw with a click, and watch geese crash into foes with satisfying honks, spins, and impact. Each throw feels powerful and purposeful."*
- **Player**: A lone defender in over-the-shoulder third-person
- **Weapon**: Throwable geese that act as both projectiles and temporary turrets
- **Objective**: Protect the base from waves of approaching farm animals (Pigs, Chickens)
- **Juice**: Every goose hit produces satisfying feedback (honks, feathers, screen shake)
---
## Core Loop
```
[ENEMIES SPAWN] → [PLAYER MOVES & AIMS] → [YEET GEESE] →
[GEESE DAMAGE/DISTRACT ENEMIES] → [CURRENCY COLLECTED] →
[BUY UPGRADES/NEW GEESE] → [WAVE COMPLETE?] → [NEXT WAVE (HARDER)]
```
### Breakdown:
1. **Enemies spawn** at designated points and march toward the base
2. **Player moves** through the arena in third-person, positioning for optimal throws
3. **Player aims and yeets geese** using mouse look and click
4. **Geese impact enemies**, dealing damage or causing knockback/stun
5. **Currency drops** (feathers) from defeated enemies
6. **Player spends currency** on upgrades or new goose types
7. **Wave ends** when all enemies are eliminated
8. **Next wave begins**, with more/enemy variety/difficulty
---
## MVP Scope
### One Arena
- Simple, open arena with clear spawn and base zones
- Neutral terrain allowing free movement
### One Player Controller
- **Player Controller**: Over-the-shoulder third-person view (WASD + mouse look, throw input)
- **Basic health system**
### One Goose Type
- **Basic Goose**: Standard projectile goose
- Medium damage, standard speed
- Spins on throw
- Flees after impact or short lifetime
### Two Enemy Types
1. **Pig** (formerly Grunt) Slow, low health, standard damage (meat shield)
2. **Chicken** (formerly Runner) Fast, low health, reaches base quickly
### Five Waves
| Wave | Enemies | Description |
|------|-----------------------------------|---------------------------------|
| 1 | 3 Pigs | Tutorial wave |
| 2 | 5 Pigs | Slight increase |
| 3 | 4 Pigs + 2 Chickens | Introduction of speed |
| 4 | 6 Mixed (Pig/Chicken) | Mix of both types |
| 5 | Boss wave: Oinker Boss | Large, high-health farm animal |
### Basic Economy
- **Starting currency**: 100 feathers
- **Enemy drop**: 510 feathers per kill
- **Goose cost**: Free for first type
- **Upgrade/shop unlock**: Every 10 kills unlocks new goose slot
### Basic UI
- Top-left: Health bar, feather count
- Top-right: Wave number
- Pause menu (Escape)
- Game over / Victory screens
### Win/Lose Conditions
- **Win**: Survive all 5 waves
- **Lose**: Player health reaches 0
---
## Godot Setup Summary
### Project Type
- Godot 4.x, 3D project, Forward+ renderer
### Directory Structure
```
res://
├── scripts/ # GDScript files
├── scenes/ # .tscn files
├── assets/
│ ├── audio/
│ ├── meshes/
│ ├── textures/
│ ├── materials/
│ └── animations/
├── ui/ # HUD, menus
├── data/ # Wave/upgrade configs
├── autoload/ # GameState, EventBus, AudioManager
└── tests/
```
### Autoloads
- `GameState.gd` Wave state, currency, lives, pause
- `EventBus.gd` Central signals for gameplay events
- `AudioManager.gd` SFX and music playback
- `SettingsManager.gd` Settings persistence
### Collision Layers
| Layer | Type |
|-------|-------------------------|
| 1 | Environment |
| 2 | Player |
| 3 | Enemy |
| 4 | Goose projectile |
| 5 | Goose turret |
| 6 | Currency/pickups |
| 7 | UI / trigger zones |
---
## Exit Criteria for Phase 0
- [ ] Design document is complete (this one page)
- [ ] Godot project opens cleanly in 3D mode
- [ ] Folders and autoloads are created
- [ ] Input map is configured (WASD, mouse, throw, pause)
- [ ] MVP scope is documented and understood
---
*This document defines the foundation for a small but complete playable prototype. Phase 1 will build exactly this scope; additional content comes later.*
+14
View File
@@ -0,0 +1,14 @@
# AudioManager.gd
extends Node
var music_player # Reference to AudioStreamPlayer for background music
func _ready():
print("AudioManager loaded. Ready to play sounds.")
func play_sfx(sound_path: String):
# Logic to play a sound effect
pass
func play_music(stream: AudioStream):
# Logic to set and play background music
pass
+14
View File
@@ -0,0 +1,14 @@
# SettingsManager.gd
extends Node
const SETTINGS_PATH = "user://settings.save"
func save_setting(key: String, value):
print("Saving setting: " + key)
# Logic to serialize and save settings data
pass
func load_setting(key: String):
print("Loading setting: " + key)
# Logic to read saved setting data
return null
+7
View File
@@ -0,0 +1,7 @@
# EventBus.gd
extends Node
signal event_fired(event: String, data: Dictionary)
func emit_event(event: String, data: Dictionary = {}):
print("Emitting event: " + event)
emit_signal("event_fired", data)
+18
View File
@@ -0,0 +1,18 @@
# GameState.gd
extends Node
# --- COLLISION LAYERS (TASK 4) ---
const LAYER_ENVIRONMENT = 1 # Environment/terrain
const LAYER_PLAYER = 2 # Player character
const LAYER_ENEMY = 3 # Enemy mobs
const LAYER_GOOSE_PROJECTILE = 4 # Goose projectiles
const LAYER_TURRET = 5 # Fixed towers/turrets
const LAYER_PICKUP = 6 # Currency, power-ups
const LAYER_UI_TRIGGER = 7 # UI interaction zones
var score = 0
var currency = 100
var current_wave = 0
var game_state = "PAUSED" # States: PAUSED, RUNNING, WIN, LOSE
func _ready():
print("GameState loaded. Initializing core systems.")