wahnsinn
This commit is contained in:
86
plan.md
86
plan.md
@@ -1,3 +1,15 @@
|
||||
# Kernspiel
|
||||
Siehe `base.md` für Vision und Ziel. Dieses Dokument beschreibt die Implementierung.
|
||||
|
||||
## Run-Loop
|
||||
- Welt mit Taverne im Zentrum, regelmäßig spawnen Portale (je ein Dungeon)
|
||||
- Pro Welle zusätzlich **ein rotes Portal** (= deutlich stärkerer Dungeon)
|
||||
- Portal-Clear (Dungeon-Boss besiegt) → XP → Level-Up **verdoppelt alle Attribute**
|
||||
- Timer 1h pro Welle. Läuft er ab, ohne rotes Portal besiegt: Monster des roten Portals brechen aus → Invasion greift Taverne an
|
||||
- Welle endet:
|
||||
- Rotes Portal besiegt ODER Invasion abgewehrt → nächste Welle, alles stärker
|
||||
- Taverne zerstört → **Game Over** (harter Reset, neuer Run)
|
||||
|
||||
# Projektstruktur
|
||||
|
||||
## Ordnerstruktur
|
||||
@@ -23,7 +35,7 @@ scenes/ — Darstellung + Input
|
||||
systems/ — Spiellogik
|
||||
aggro/ — AggroSystem (system, tracker, decay, events) + aggro_config
|
||||
effect.gd — Effect Resource (Buff/Debuff/Aura Daten)
|
||||
11× *_system.gd — health, shield, ability, auto_attack, cooldown, enemy_ai, respawn, spawn, effect, element, buff_calc
|
||||
14× *_system.gd — health, shield, ability, auto_attack, cooldown, enemy_ai, respawn, spawn, effect, element, buff_calc, wave, xp, invasion
|
||||
aura_system.gd — Aura-Propagierung (Child von EffectSystem)
|
||||
autoloads/ — Globaler Zustand
|
||||
event_bus.gd
|
||||
@@ -33,7 +45,7 @@ autoloads/ — Globaler Zustand
|
||||
|
||||
## Szenenbaum
|
||||
- Welt
|
||||
- Systems (12 Systeme als Child-Nodes)
|
||||
- Systems (15 Systeme als Child-Nodes)
|
||||
- Taverne
|
||||
- Player
|
||||
- Portale (dynamisch)
|
||||
@@ -90,6 +102,22 @@ autoloads/ — Globaler Zustand
|
||||
- element_damage_dealt(attacker, target, amount, element)
|
||||
- element_applied(target, element)
|
||||
- element_reaction(target, element_a, element_b, reaction_name)
|
||||
- Wave:
|
||||
- wave_started(wave_number)
|
||||
- wave_timer_tick(seconds_remaining)
|
||||
- wave_ended(wave_number, success)
|
||||
- XP / Level:
|
||||
- xp_gained(player, amount)
|
||||
- level_up(player, new_level)
|
||||
- Taverne:
|
||||
- tavern_damaged(current, max)
|
||||
- tavern_destroyed()
|
||||
- Invasion:
|
||||
- invasion_started(enemies)
|
||||
- invasion_ended(success)
|
||||
- Run:
|
||||
- run_started(wave_number)
|
||||
- game_over()
|
||||
|
||||
## Stats (autoload/stats.gd)
|
||||
- Speichert aktuelle Attribute aller Entities
|
||||
@@ -106,11 +134,15 @@ autoloads/ — Globaler Zustand
|
||||
- max_health, health_regen, max_shield, shield_regen_delay, shield_regen_time
|
||||
### PlayerStats (player_stats.gd, extends BaseStats)
|
||||
- speed, jump_velocity, target_range, combat_timeout, respawn_time, gcd_time, aa_cooldown
|
||||
- level, xp, xp_to_next — Level-Up verdoppelt alle Attribute
|
||||
### EnemyStats (enemy_stats.gd, extends BaseStats)
|
||||
- speed, attack_range, attack_cooldown, attack_damage, regen_fast, regen_slow, aggro_decay, portal_radius, alert_radius
|
||||
### BossStats (boss_stats.gd, extends EnemyStats)
|
||||
### PortalStats (portal_stats.gd, extends BaseStats)
|
||||
- spawn_count, thresholds
|
||||
- variant: NORMAL | RED (rotes Portal: höhere HP, stärkere Gegner + Boss)
|
||||
### TavernStats (tavern_stats.gd, extends BaseStats)
|
||||
- Nur max_health (kein Schild, kein Regen) — bei 0 HP → tavern_destroyed → Game Over
|
||||
|
||||
## resources/roles/
|
||||
### Ability (ability.gd)
|
||||
@@ -191,6 +223,26 @@ autoloads/ — Globaler Zustand
|
||||
- Portal-HP-Schwellen-Spawning
|
||||
- Listener: health_changed, entity_died
|
||||
- Event: portal_spawn
|
||||
### WaveSystem (wave_system.gd)
|
||||
- Wellen-Management: Timer (1h), Wellen-Counter, Portal-Skalierung pro Welle
|
||||
- Startet neuen Run, spawnt 1× rotes Portal pro Welle, steuert normale Portal-Spawns
|
||||
- Rotes Portal besiegt ODER Invasion abgewehrt → nächste Welle, Portal-Stats skalieren
|
||||
- Timer-Ablauf ohne rotes Portal besiegt → löst InvasionSystem aus
|
||||
- Bei tavern_destroyed: Game Over, nach Delay neuen Run starten (Reset: Level 1, Portale weg)
|
||||
- Event: wave_started, wave_timer_tick, wave_ended, run_started, game_over
|
||||
- Listener: portal_defeated, invasion_ended, tavern_destroyed
|
||||
### XpSystem (xp_system.gd)
|
||||
- XP bei Dungeon-Clear (Boss besiegt); rotes Portal gibt mehr XP
|
||||
- Level-Up: alle PlayerStats-Attribute ×2, aktuelle HP/Schild auf neues Max heben
|
||||
- Event: xp_gained, level_up
|
||||
- Listener: entity_died (Boss), dungeon_cleared
|
||||
### InvasionSystem (invasion_system.gd)
|
||||
- Wird von WaveSystem ausgelöst, wenn Timer abläuft ohne rotes Portal besiegt
|
||||
- Spawnt Monster des roten Portals an Karten-Rändern, Ziel = Taverne
|
||||
- Schaden an Taverne über HealthSystem (TavernStats registriert wie Entity)
|
||||
- Alle Invasions-Gegner tot → invasion_ended(true)
|
||||
- Event: invasion_started, invasion_ended
|
||||
- Listener: wave_ended (timeout), entity_died (Invasions-Gegner)
|
||||
|
||||
# Szenen
|
||||
- Szenen sind Views — rendern, Input senden, Events empfangen
|
||||
@@ -200,12 +252,16 @@ autoloads/ — Globaler Zustand
|
||||
|
||||
## Welt (world/)
|
||||
- world.tscn — Hauptszene (100x100m)
|
||||
- Systems (alle 11 Systeme als Child-Nodes)
|
||||
- Systems (alle Systeme als Child-Nodes, siehe Systeme-Sektion)
|
||||
- NavigationRegion3D
|
||||
- Boden (MeshInstance3D, 100x100m PlaneMesh)
|
||||
- Kollision (StaticBody3D, WorldBoundaryShape3D)
|
||||
- Licht (DirectionalLight3D, 45°, Schatten)
|
||||
- Taverne (StaticBody3D, BoxMesh, Mitte der Karte)
|
||||
- Gruppe (tavern)
|
||||
- HitArea (Area3D) — nimmt Invasions-Schaden entgegen
|
||||
- Healthbar (Sprite3D + SubViewport, groß, nur Health — kein Schild)
|
||||
- Registriert bei Stats mit TavernStats Resource
|
||||
- Spieler (Instanz von player.tscn)
|
||||
- HUD (Instanz von hud.tscn)
|
||||
- PortalSpawner (Node, portal_spawner.gd)
|
||||
@@ -218,12 +274,12 @@ autoloads/ — Globaler Zustand
|
||||
- CameraPivot (Node3D, camera.gd)
|
||||
- Camera3D
|
||||
- Movement (Node, movement.gd) — WASD + Springen, liest Werte von Stats
|
||||
- Combat (Node, combat.gd) — Input-Handler, emittiert ability_use_requested
|
||||
- CombatState (Node, combat_state.gd) — in_combat-Tracking, Combat-Timer
|
||||
- Role (Node, role.gd) — Rollenwechsel ALT+1/2/3, emittiert role_changed (auch bei _ready)
|
||||
- Ability (Node, ability.gd) — Input-Handler 1/2/3/4, emittiert ability_use_requested
|
||||
- Role (Node, role/role.gd) — Rollenwechsel ALT+1/2/3, emittiert role_changed (auch bei _ready)
|
||||
- Targeting (Node, targeting.gd) — Klick/TAB/Auto-Target, emittiert target_changed
|
||||
- player.gd — Registriert bei Stats mit PlayerStats Resource, Sichtbarkeit bei Tod/Respawn
|
||||
- init.gd — Registriert bei Stats mit PlayerStats Resource, Sichtbarkeit bei Tod/Respawn
|
||||
- camera.gd — LMB freies Umsehen, RMB Kamera + Laufrichtung
|
||||
- Combat-State (in_combat, Combat-Timer) wird im AggroSystem (aggro_decay.gd) getrackt, nicht als Player-Node
|
||||
|
||||
## Gegner (enemy/)
|
||||
- enemy.tscn — CharacterBody3D
|
||||
@@ -231,14 +287,14 @@ autoloads/ — Globaler Zustand
|
||||
- Kollision (CapsuleShape3D)
|
||||
- Mesh (SphereMesh)
|
||||
- HitArea (Area3D)
|
||||
- DetectionArea (Area3D, emittiert enemy_detected)
|
||||
- DetectionArea (Area3D, Detection-Node, detection.gd, emittiert enemy_detected/lost)
|
||||
- NavigationAgent3D
|
||||
- EnemyMovement (Node, enemy_movement.gd) — Empfängt Bewegungsbefehle
|
||||
- Bewegung wird vom AI-System (ai_system.gd) gesteuert — Enemy hat keinen eigenen Movement-Node
|
||||
- Healthbar (Sprite3D + SubViewport, healthbar.gd) — Health-Anzeige
|
||||
- HealthbarShield (Node, healthbar_shield.gd) — Shield-Anzeige
|
||||
- HealthbarStatus (Node, healthbar_status.gd) — Target-Border + Aggro-Farbe
|
||||
- HealthbarEffects (Node, healthbar_effects.gd) — Effekt-Icons
|
||||
- enemy.gd — Registriert bei Stats mit EnemyStats Resource, Detection-Area Signal
|
||||
- init.gd — Registriert bei Stats mit EnemyStats Resource, Detection-Area Signal
|
||||
- Aggro-Regeln (Werte in AggroConfig Resource):
|
||||
- Aufbau:
|
||||
- Schaden = Aggro (1:1), Tank 2x Multiplikator
|
||||
@@ -258,20 +314,20 @@ autoloads/ — Globaler Zustand
|
||||
## Boss (enemy/)
|
||||
- boss.tscn — wie enemy.tscn aber größer (Mesh lila, 1.5x)
|
||||
- Gruppe (enemies, boss)
|
||||
- boss.gd — Erbt von enemy.gd, registriert bei Stats mit BossStats Resource
|
||||
- Nutzt enemy/init.gd (gleiche Registrierung), aber mit BossStats Resource
|
||||
|
||||
## Portal (portal/)
|
||||
- portal.tscn — StaticBody3D
|
||||
- Gruppe (portals)
|
||||
- portal.tscn — StaticBody3D (variant: NORMAL = blau, RED = rot, stärker)
|
||||
- Gruppe (portals); rotes Portal zusätzlich in Gruppe (red_portal)
|
||||
- Kollision (CylinderShape3D)
|
||||
- Mesh (CylinderMesh, blau)
|
||||
- Mesh (CylinderMesh, blau normal / rot für rotes Portal)
|
||||
- HitArea (Area3D)
|
||||
- DetectionArea (Area3D, Auto-Targeting bei Betreten)
|
||||
- Healthbar (Sprite3D + SubViewport, healthbar.gd)
|
||||
- HealthbarShield (Node, healthbar_shield.gd)
|
||||
- HealthbarStatus (Node, healthbar_status.gd)
|
||||
- HealthbarEffects (Node, healthbar_effects.gd)
|
||||
- portal.gd — Registriert bei Stats mit PortalStats Resource
|
||||
- init.gd — Registriert bei Stats mit PortalStats Resource
|
||||
- Spawnt Gegner bei HP-Schwellen (→ SpawnSystem)
|
||||
|
||||
## Gate (portal/)
|
||||
|
||||
Reference in New Issue
Block a user