Compare commits
7
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d632abd93c | ||
|
|
92cc3cb4ed | ||
|
|
15098c887a | ||
|
|
e8386c99d4 | ||
|
|
639c11ad9c | ||
|
|
ca1ec24c22 | ||
|
|
957107ea49 |
@@ -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
@@ -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
|
||||
@@ -13,3 +13,8 @@ desktop.ini
|
||||
# Build output (keep out of src/)
|
||||
bin/
|
||||
osu!/
|
||||
|
||||
.env
|
||||
.env.gitea
|
||||
|
||||
*.uid
|
||||
@@ -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
@@ -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
@@ -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**. I’m 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**. I’m 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 Godot’s `CharacterBody3D`.
|
||||
### 1. Third-Person Player Controller
|
||||
Create an over-the-shoulder third-person player controller using Godot’s `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 **6–12 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 4–7: Player + Goose
|
||||
- Build first-person controller.
|
||||
- Build third-person player controller.
|
||||
- Add mouse look.
|
||||
- Add throw input.
|
||||
- Create goose projectile.
|
||||
|
||||
@@ -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).
|
||||
@@ -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**: 5–10 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.*
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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.")
|
||||
Reference in New Issue
Block a user