From 0d371c9f68be5352cd4435cb9cd0392556edda53 Mon Sep 17 00:00:00 2001 From: Andre Date: Sun, 15 Mar 2026 20:16:28 +0100 Subject: [PATCH] =?UTF-8?q?Projektdokumentation=20vollst=C3=A4ndig=20aktua?= =?UTF-8?q?lisiert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Klassen-System, Level-System, Equipment-System dokumentiert - GCD/Haste-Formel, Schadensberechnung, DPS erklärt - Inventar-System, Loot-System, Gold-Anzeige dokumentiert - Gegner-Stats, KI-Verhalten, Respawn beschrieben - Geplante Features und Projektstruktur aktualisiert Co-Authored-By: Claude Opus 4.6 --- PROJEKTDOKU.md | 428 +++++++++++++++++++++++++++++-------------------- 1 file changed, 255 insertions(+), 173 deletions(-) diff --git a/PROJEKTDOKU.md b/PROJEKTDOKU.md index 372bef2..105b308 100644 --- a/PROJEKTDOKU.md +++ b/PROJEKTDOKU.md @@ -26,6 +26,8 @@ Gegner bekämpfen und ihre Charaktere mit verschiedenen Klassen und Ausrüstunge | 1 | Autoattack manuell starten | | 2 | Heavy Strike (starke Attacke) | | 3 – 9 | Aktionsleiste Slots (noch frei) | +| C | Charakter-Panel (Stats + Equipment) | +| I | Inventar öffnen/schließen | | Leertaste | Springen | | T | (Test) 10 Schaden am Spieler | @@ -34,7 +36,7 @@ Gegner bekämpfen und ihre Charaktere mit verschiedenen Klassen und Ausrüstunge ## Szenen-Struktur ### world.tscn -Hauptszene der Spielwelt. +Hauptszene der Spielwelt. Zeigt bei Start das Klassenauswahl-Menü. ``` World (Node3D) ├── Player (player.tscn) @@ -47,18 +49,21 @@ World (Node3D) ``` ### player.tscn -Der Spielercharakter. +Der Spielercharakter mit allen UI-Panels. ``` Player (CharacterBody3D) ├── [Kenney GLB Modell] ├── CollisionShape3D ├── CameraPivot (Node3D) │ └── Camera3D -└── HUD (hud.tscn) +├── HUD (hud.tscn) +├── CharacterPanel (character_panel.tscn) +├── InventoryPanel (inventory_panel.tscn) +└── LootWindow (loot_window.tscn) ``` ### enemy.tscn -Ein Gegner. +Ein Gegner mit Level-basiertem Stats-System. ``` Enemy (CharacterBody3D) ├── [Kenney GLB Modell] @@ -69,213 +74,290 @@ Enemy (CharacterBody3D) └── HealthLabel (Label3D) ``` -### hud.tscn -Die Spieler-UI. -``` -HUD (CanvasLayer) -└── Control - ├── HealthBar (ProgressBar) - │ └── HealthLabel (Label) - └── ActionBar (HBoxContainer) - └── A1 – A9 (Panel) - └── Label (1–9) -``` - --- -## Scripts +## Klassen-System -### player.gd -Steuert den Spielercharakter. - -**Variablen:** -| Variable | Typ | Beschreibung | -|---|---|---| -| SPEED | const float | Bewegungsgeschwindigkeit (5.0) | -| JUMP_VELOCITY | const float | Sprungkraft (4.5) | -| GRAVITY | const float | Schwerkraft (9.8) | -| max_hp | int | Maximale HP (100) | -| current_hp | int | Aktuelle HP | -| can_attack | bool | Angriff möglich (Cooldown-Flag) | -| target | Node | Aktuell markierter Gegner | -| equipped_weapon | Weapon | Ausgerüstete Waffe (null = unbewaffnet) | - -**Funktionen:** -| Funktion | Beschreibung | -|---|---| -| take_damage(amount) | Schaden abziehen, HP-Leiste aktualisieren | -| heal(amount) | HP heilen | -| die() | Spieler gestorben | -| get_attack_damage() | Schaden berechnen (Waffe oder 1) | -| get_attack_range() | Reichweite (Waffe oder 1.5) | -| get_attack_cooldown() | Cooldown (Waffe oder 1.5s) | -| set_target(target, start_attack) | Ziel markieren, optional Autoattack starten | -| autoattack() | Wiederholt angreifen solange Ziel gültig | -| _try_select_target(start_attack) | Raycast von Kamera auf Mausposition | - ---- - -### enemy.gd -Steuert den Gegner. - -**Variablen:** -| Variable | Typ | Beschreibung | -|---|---|---| -| SPEED | const float | Bewegungsgeschwindigkeit (3.0) | -| ATTACK_DAMAGE | const int | Schaden pro Angriff (5) | -| ATTACK_RANGE | const float | Angriffsreichweite (1.5) | -| ATTACK_COOLDOWN | const float | Angriffspause (2.0s) | -| max_hp | int | Maximale HP (50) | -| target | Node | Ziel des Gegners (Spieler) | - -**Funktionen:** -| Funktion | Beschreibung | -|---|---| -| take_damage(amount) | Schaden nehmen, bei 0 HP sterben | -| die() | Gegner aus Szene entfernen | -| show_health() | HP-Label einblenden | -| hide_health() | HP-Label ausblenden | -| _attack() | Angriff mit Cooldown | - ---- - -### camera_pivot.gd -Steuert die Third-Person-Kamera. - -**Einstellbare Parameter (Export):** -| Parameter | Standard | Beschreibung | -|---|---|---| -| sensitivity | 0.3 | Mausempfindlichkeit | -| min_pitch | -40° | Maximale Neigung nach unten | -| max_pitch | 20° | Maximale Neigung nach oben | -| min_zoom | 5.0 | Minimale Kameraentfernung | -| max_zoom | 20.0 | Maximale Kameraentfernung | -| zoom_speed | 1.0 | Zoom pro Mausrad-Schritt | - ---- - -### hud.gd -Verwaltet die Spieler-UI. - -**Funktionen:** -| Funktion | Beschreibung | -|---|---| -| update_health(current, max) | HP-Leiste und Text aktualisieren | -| set_active_slot(index) | Aktions-Slot 0.1s golden hervorheben | - ---- - -## Ressourcen-Klassen - -### Weapon (resources/weapon.gd) -Definiert eine Waffe als Godot-Ressource (.tres). +### CharacterClass (character_class.gd) +Resource-Klasse die eine spielbare Klasse definiert. | Property | Typ | Beschreibung | |---|---|---| -| name | String | Waffenname | -| weapon_type | WeaponType | UNARMED, SWORD, AXE, MACE, DAGGER, STAFF, BOW | -| min_damage | int | Minimaler Schaden | -| max_damage | int | Maximaler Schaden | -| attack_speed | float | Angriffsgeschwindigkeit (Cooldown) | -| range | float | Angriffsreichweite | -| icon | Texture2D | Icon für die Aktionsleiste | +| class_name_de | String | Deutscher Klassenname | +| main_stat | MainStat | STRENGTH, AGILITY oder INTELLIGENCE | +| base_strength/agility/intelligence/stamina | int | Basis-Stats auf Level 1 | +| strength/agility/intelligence/stamina_per_level | float | Stat-Zuwachs pro Level | +| unarmed_min_damage | int | Unbewaffneter Mindestschaden | +| unarmed_max_damage | int | Unbewaffneter Maximalschaden | +| unarmed_attack_speed | float | Unbewaffnete Angriffsgeschwindigkeit | -### Attack (resources/attack.gd) -Definiert einen Angriff — Schaden kommt von der ausgerüsteten Waffe. +**Konstanten:** +- `HP_PER_STAMINA = 10` — HP pro Stamina-Punkt +- `DAMAGE_PER_MAIN_STAT = 0.5` — Zusatzschaden pro Main-Stat-Punkt + +### Verfügbare Klassen (classes/) + +| Klasse | Main-Stat | STR | AGI | INT | STA | Unbewaffnet | +|---|---|---|---|---|---|---| +| Krieger | Stärke | 15 | 8 | 5 | 12 | 2-4 Schaden, 1.8s | +| Schurke | Beweglichkeit | 8 | 15 | 7 | 10 | 1-3 Schaden, 1.5s | +| Magier | Intelligenz | 5 | 8 | 15 | 8 | 1-2 Schaden, 2.0s | + +### Klassenauswahl (class_selection_menu.gd) +Wird bei Spielstart angezeigt. Spieler wählt eine Klasse, danach wird Startausrüstung angelegt. + +--- + +## Level-System + +- **XP-Kurve:** Level N benötigt `100 * N` XP (Level 2: 100, Level 3: 200, ...) +- **Stats pro Level:** Basierend auf Klassen-Zuwachsraten +- **HP bei Level-Up:** Werden vollständig aufgefüllt +- **Character Panel:** Aktualisiert sich automatisch bei Level-Up + +--- + +## Equipment-System + +### Equipment (equipment.gd) +Resource-Klasse für alle Ausrüstungsgegenstände. + +**Slots:** HEAD, CHEST, HANDS, LEGS, FEET, WEAPON, OFFHAND + +**Seltenheiten:** +| Seltenheit | Farbe | +|---|---| +| COMMON | Weiß | +| UNCOMMON | Grün | +| RARE | Blau | +| EPIC | Lila | + +**Stats auf Equipment:** +| Property | Typ | Beschreibung | +|---|---|---| +| item_name | String | Name des Items | +| slot | Slot | Equipment-Slot | +| rarity | Rarity | Seltenheitsstufe | +| armor | int | Rüstungswert | +| strength/agility/intelligence/stamina | int | Stat-Boni | +| haste | float | Angriffsgeschwindigkeits-Bonus (0.1 = 10%) | +| min_damage / max_damage | int | Waffenschaden (nur Waffen) | +| attack_speed | float | Angriffsgeschwindigkeit (nur Waffen) | +| weapon_range | float | Reichweite (nur Waffen) | + +### Vorhandene Equipment-Items (equipment/) +- **iron_sword.tres** — Eisenschwert (Waffe) +- **steel_sword.tres** — Stahlschwert (Waffe, besser) +- **leather_chest.tres** — Lederrüstung (Brust) +- **iron_helm.tres** — Eisenhelm (Kopf) +- **wooden_shield.tres** — Holzschild (Nebenhand) + +### Character Panel (character_panel.gd, C-Taste) +Zeigt zwei Spalten: +- **Stats-Spalte:** Stärke, Beweglichkeit, Intelligenz, Ausdauer, Rüstung, HP +- **Equipment-Spalte:** Alle 7 Slots mit ausgerüsteten Items, Waffenschaden + DPS + +Unbewaffnet: Zeigt klassenabhängige Schadenswerte. + +--- + +## Inventar-System + +### Inventory (inventory.gd) +Resource-Klasse für das Spieler-Inventar. + +- **MAX_SLOTS:** 20 Inventarplätze +- **Gold:** Währung, wird im HUD angezeigt +- **Signals:** `inventory_changed`, `gold_changed` + +**Funktionen:** +| Funktion | Beschreibung | +|---|---| +| add_item(item) | Item hinzufügen (false wenn voll) | +| remove_item(item) | Item entfernen | +| add_gold(amount) | Gold hinzufügen | +| spend_gold(amount) | Gold ausgeben (false wenn nicht genug) | +| is_full() | Prüfen ob Inventar voll | + +### Inventory Panel (inventory_panel.gd, I-Taste) +- 5x4 Grid mit Item-Slots +- Gold-Anzeige im Header +- Items in Seltenheitsfarbe +- Tooltips mit vollständigen Item-Stats +- **Rechtsklick** auf Item: Direkt anlegen (tauscht mit aktuellem Equipment) + +--- + +## Loot-System + +### LootTable (loot_table.gd) +Resource die mögliche Drops eines Gegners definiert. | Property | Typ | Beschreibung | |---|---|---| -| name | String | Angriffsname | -| damage_type | DamageType | PHYSICAL, FIRE, ICE, LIGHTNING, POISON | -| icon | Texture2D | Icon für die Aktionsleiste | +| min_gold | int | Minimaler Gold-Drop | +| max_gold | int | Maximaler Gold-Drop | +| possible_drops | Array[LootEntry] | Mögliche Item-Drops | + +### LootEntry (loot_entry.gd) +Ein einzelner Drop-Eintrag. + +| Property | Typ | Beschreibung | +|---|---|---| +| item | Equipment | Das droppbare Item | +| drop_chance | float | Wahrscheinlichkeit (0.0 - 1.0) | + +### Vorhandene LootTables (loot_tables/) +- **goblin_loot.tres** — 2-8 Gold, Eisenschwert (15%), Lederrüstung (10%), Eisenhelm (10%) +- **skeleton_loot.tres** — 5-15 Gold, Stahlschwert (10%), Holzschild (12%), Eisenhelm (15%) + +### LootWindow (loot_window.gd) +- Erscheint automatisch wenn ein Gegner stirbt +- Zeigt Gold und gedropte Items +- Einzelne Items per Klick aufheben +- "Alles aufheben" Button +- Gold skaliert mit Gegner-Level --- ## Kampfsystem -### Autoattack -- Rechtsklick auf Gegner → Ziel markieren + Autoattack startet -- Linksklick auf Gegner → nur Ziel markieren -- Autoattack läuft automatisch im Takt der Waffen-Angriffsgeschwindigkeit -- Ohne Waffe: 1 Schaden, 1.5s Cooldown, 1.5 Reichweite -- Mit Waffe: Schaden = zufällig zwischen min/max, Speed und Range von der Waffe +### Global Cooldown (GCD) +Alle Aktionen (Autoattack + Skills) teilen sich einen GCD. + +**Formel:** `GCD = Waffen-Attackspeed / (1 + Haste)` + +Beispiel: Waffe mit 1.5s + 50% Haste → `1.5 / 1.5 = 1.0s` + +### Schadensberechnung +1. **Basisschaden:** Zufällig zwischen Waffen min/max (oder unbewaffnet klassenabhängig) +2. **Stat-Bonus:** `Main-Stat * 0.5` +3. **Rüstungsreduktion (Nahkampf):** `Reduktion = Rüstung / (Rüstung + 50)` +4. **Level-Differenz:** `±10% pro Level, max ±50%` +5. **Mindestschaden:** Immer mindestens 1 + +### DPS-Berechnung +`DPS = (Durchschnittsschaden + Stat-Bonus) / GCD` ### Skills #### Autoattack (Taste 1) -- **Schaden**: 1 (unbewaffnet) oder Waffenschaden -- **Cooldown**: 1.5s (unbewaffnet) oder Waffengeschwindigkeit -- **Reichweite**: 1.5 (unbewaffnet) oder Waffenreichweite -- **Icon**: Faust mit grünem Kreispfeil -- Manuell per Taste 1 starten oder automatisch per Rechtsklick +- **Schaden:** Waffenschaden oder klassenabhängig unbewaffnet + Main-Stat Bonus +- **Cooldown:** GCD (Waffen-Attackspeed / Haste) +- **Reichweite:** Waffen-Reichweite oder 3.0 (unbewaffnet) +- Automatisch per Rechtsklick oder manuell per Taste 1 #### Heavy Strike (Taste 2) -- **Schaden**: 10-15 (zufällig) -- **Cooldown**: 3 Sekunden -- **Reichweite**: 2.0 -- **Icon**: Schwert mit roten Schlaglinien -- Manuell aktivierbare starke Attacke für höheren Schaden +- **Schaden:** 10-15 + Main-Stat Bonus +- **Cooldown:** 3 Sekunden (eigener Cooldown, löst auch GCD aus) +- **Reichweite:** 4.0 +- Aktiviert automatisch Autoattack danach ### UI & Icons -- Aktionsleiste zeigt Icons für Skills an -- Icons werden dynamisch beim Spielstart geladen -- Slot 1: Autoattack Icon (Faust) -- Slot 2: Heavy Strike Icon (Schwert) -- Slots 3-9: Verfügbar für weitere Skills -- **Mausklick**: Alle Slots sind per Maus klickbar -- **Cooldown-Anzeige**: Dunkle Überlagerung mit verbleibender Zeit in Sekunden +- Aktionsleiste mit 9 Slots (Taste 1-9) +- Icons werden beim Spielstart geladen +- Cooldown-Anzeige: Dunkle Überlagerung + verbleibende Zeit +- Alle Slots per Maus klickbar -### Schadenstypen (geplant) -- **PHYSICAL** – normaler Schaden -- **FIRE** – Feuerschaden (z.B. Magier) -- **ICE** – Eisschaden -- **LIGHTNING** – Blitzschaden -- **POISON** – Giftschaden (Schaden über Zeit geplant) +--- + +## Gegner-System (enemy.gd) + +### Stats +Level-basiert mit automatischer Skalierung: + +| Stat | Formel | +|---|---| +| Stärke | base_strength + (level-1) * 2 | +| Ausdauer | base_stamina + (level-1) * 3 | +| Rüstung | base_armor + (level-1) * 2 | +| HP | Ausdauer * 10 | +| Schaden | Stärke * 0.5 + 2 | +| XP-Belohnung | 25 * Level | + +### KI-Verhalten (State Machine) +| State | Beschreibung | +|---|---| +| PATROL | Zufällig im Radius um Spawn-Position herumlaufen | +| CHASE | Spieler verfolgen (Aggro-Range: 8.0) | +| ATTACK | Angreifen wenn in Reichweite (1.5) | + +### Respawn +- Gegner spawnen nach 5 Sekunden am Ursprungsort neu +- Verwaltet durch world.gd + +### Loot-Drops +- Jeder Gegner hat eine optionale `loot_table` (LootTable Resource) +- Gold skaliert mit Gegner-Level +- Ohne LootTable: Standard-Gold-Drop (1-3 * Level) + +--- + +## HUD (hud.gd) + +| Element | Beschreibung | +|---|---| +| HealthBar | Rote HP-Leiste mit Text "aktuell / max" | +| LevelLabel | "Lv X" Anzeige | +| XPBar | Blaue XP-Leiste | +| GoldLabel | Gold-Anzeige in Goldfarbe | +| ActionBar | 9 Slots mit Icons, Cooldowns, Klick-Support | --- ## Geplante Features - -### Klassen-System -Jede Klasse hat unterschiedliche Basis-Stats und verfügbare Skills: - -| Klasse | Stärken | Waffen | -|---|---|---| -| Krieger | Hohe HP, hoher physischer Schaden | Schwert, Axt, Streitkolben | -| Magier | Hoher Magieschaden, niedrige HP | Stab | -| Bogenschütze | Hohe Reichweite, schnelle Angriffe | Bogen, Dolch | - -### Weitere geplante Features -- [ ] Klassen-System mit unterschiedlichen Stats - [ ] Mana-System für Magier - [ ] Spell-System (Feuerbälle etc.) -- [ ] Inventar und Ausrüstungssystem -- [ ] Waffen aufheben und ausrüsten -- [ ] Erfahrungspunkte und Level-Up +- [ ] Schadenstypen (Physical, Fire, Ice, Lightning, Poison) - [ ] Mehrere Gegnertypen - [ ] Dungeon-Level mit Wänden und Räumen - [ ] Multiplayer (bis zu 6 Spieler) -- [ ] Gegner-Respawn - [ ] Boss-Gegner +- [ ] Item-Shop / Händler --- ## Projektstruktur ``` DungeonCrawler/ -├── assets/ # 3D-Modelle (Kenney GLB) -├── resources/ -│ ├── attack.gd # Attack-Ressourcen-Klasse -│ └── weapon.gd # Weapon-Ressourcen-Klasse -├── basic_attack.tres # Autoattack-Ressource -├── camera_pivot.gd # Kamera-Script -├── enemy.gd # Gegner-Script -├── enemy.tscn # Gegner-Scene -├── hud.gd # HUD-Script -├── hud.tscn # HUD-Scene -├── player.gd # Spieler-Script -├── player.tscn # Spieler-Scene -├── world.gd # Welt-Script -├── world.tscn # Hauptszene -└── PROJEKTDOKU.md # Diese Dokumentation +├── assets/ # 3D-Modelle (Kenney GLB) +├── classes/ # Klassen-Definitionen (.tres) +│ ├── warrior.tres +│ ├── rogue.tres +│ └── mage.tres +├── equipment/ # Equipment-Items (.tres) +│ ├── iron_sword.tres +│ ├── steel_sword.tres +│ ├── leather_chest.tres +│ ├── iron_helm.tres +│ └── wooden_shield.tres +├── loot_tables/ # Loot-Tabellen (.tres) +│ ├── goblin_loot.tres +│ └── skeleton_loot.tres +├── icons/ # Skill-Icons (SVG) +│ ├── autoattack_icon.svg +│ └── heavy_strike_icon.svg +├── camera_pivot.gd # Kamera-Script +├── character_class.gd # CharacterClass Resource +├── character_panel.gd # Charakter-Panel Script +├── character_panel.tscn # Charakter-Panel Scene +├── class_selection_menu.gd # Klassenauswahl Script +├── class_selection_menu.tscn # Klassenauswahl Scene +├── enemy.gd # Gegner-Script +├── enemy.tscn # Gegner-Scene +├── equipment.gd # Equipment Resource +├── hud.gd # HUD-Script +├── hud.tscn # HUD-Scene +├── inventory.gd # Inventar Resource +├── inventory_panel.gd # Inventar-Panel Script +├── inventory_panel.tscn # Inventar-Panel Scene +├── loot_entry.gd # LootEntry Resource +├── loot_table.gd # LootTable Resource +├── loot_window.gd # Loot-Fenster Script +├── loot_window.tscn # Loot-Fenster Scene +├── player.gd # Spieler-Script +├── player.tscn # Spieler-Scene +├── world.gd # Welt-Script +├── world.tscn # Hauptszene +└── PROJEKTDOKU.md # Diese Dokumentation ```