Skip to content

Projektkonventionen

Architekturregeln

  • Game3D ist das einzige aktive Spielziel; Game2D nicht wiederbeleben.
  • Fachliche, deterministische Daten nach src/HolodeckArena.Shared; Godot-Nodes und Vector3 bleiben in Game3D.
  • Scenes navigieren über IGameFlowService/ISceneLoader, nicht mit verstreuten Szenenpfad-Strings.
  • Services werden in BootstrapBase registriert und über IServiceConsumer injiziert. Keine parallelen Service-Locator ergänzen.
  • RunDefinition und die kanonische DungeonDefinition sind die reproduzierbare Run-Wahrheit. Presentation darf sie nicht verändern.
  • Für Generator-, Replay-, Score- und Loadout-Hashes stabile Sortierung, stabile IDs und versionierte Contracts verwenden.
  • Keine Zeit oder nicht deterministische Collection-Reihenfolge in runrelevanter Generierung. SeededRandom beziehungsweise bestehende Seed-Ableitungen verwenden.
  • Kein gespeichertes PlayerLoadout direkt instanziieren; validieren und nur ValidatedRunLoadout verwenden.
  • XP, Unlocks, Score und Mastery niemals ungeprüft vom Client übernehmen.
  • Neue Nakama-Storageobjekte standardmäßig server-only schreibbar halten; PII und Secrets nicht loggen.

C# und Godot

  • Nullable ist aktiviert; öffentliche Typen/Methoden PascalCase, lokale Werte camelCase.
  • Godot-Verzeichnisse/Scenes PascalCase; Namespaces HolodeckArena3D.* und HolodeckArena.Shared.* fortführen.
  • Exportierte Node-Referenzen bevorzugen; wiederholte Node-Suchen aus _Process/_PhysicsProcess fernhalten.
  • Events/Signals in _ExitTree sauber abmelden.
  • Kein Resource-Load pro Schuss/Spawn/Frame. Scenes/Resources vorladen oder katalogisieren.
  • LINQ und JSON in Hot Paths vermeiden; in Setup/Validierung ist beides akzeptabel.
  • GD.Print für lokale Diagnose, ILogger für systemischen Flow. Tick-/Frame-Logs nur gedrosselt.

IDs und Versionen

Persistente Domain-IDs sind lowercase mit Präfix: weapon.pulse_rifle, mod.extended_magazine, unlock.weapon.rail_rifle. Raumtemplate-IDs sind derzeit snake_case (combat_small_example_01), Runtime-Encounter-IDs generatorerzeugt (encounter-{roomId}). Einmal persistierte IDs nicht umbenennen; eine Migration/Aliasauflösung ist derzeit nicht implementiert.

Bei Waffenbalance WeaponDefinitionFactory.WeaponBalanceVersion erhöhen. Mastery-Schema über MasteryVersion, Progression über ProgressionVersion, Loadout über PlayerLoadout.SchemaVersion, Replay über replaySchemaVersion, Dungeon über Generator-/RuleSet-/Balance-Versionen führen.

Performance

Bekannte Hot Paths sind PlayerController._PhysicsProcess, DungeonEnemy3D._PhysicsProcess, HubNetworkSync.OnPlayerMoved/ServerUpdateHubPlayer, Remote-Avatar-Interpolation und Projectiles. Dort keine Katalogsuche, Scene-Loads, ungedrosselten Logs oder temporären LINQ-Graphen ergänzen. Profiliere Frame/Physics, GC, Draw Calls, Navigation und Netzwerkintervall mit dem Godot Profiler.

Eine Änderung ist erst vollständig, wenn Domain/Runtime, Katalog/Scene, Backend-Contract, UI, Tests, Versionen und Handbook geprüft wurden. Siehe Änderungsmatrix.