Projektkonventionen
Architekturregeln
- Game3D ist das einzige aktive Spielziel; Game2D nicht wiederbeleben.
- Fachliche, deterministische Daten nach
src/HolodeckArena.Shared; Godot-Nodes undVector3bleiben in Game3D. - Scenes navigieren über
IGameFlowService/ISceneLoader, nicht mit verstreuten Szenenpfad-Strings. - Services werden in
BootstrapBaseregistriert und überIServiceConsumerinjiziert. Keine parallelen Service-Locator ergänzen. RunDefinitionund die kanonischeDungeonDefinitionsind 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.
SeededRandombeziehungsweise bestehende Seed-Ableitungen verwenden. - Kein gespeichertes
PlayerLoadoutdirekt instanziieren; validieren und nurValidatedRunLoadoutverwenden. - 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.*undHolodeckArena.Shared.*fortführen. - Exportierte Node-Referenzen bevorzugen; wiederholte Node-Suchen aus
_Process/_PhysicsProcessfernhalten. - Events/Signals in
_ExitTreesauber 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.Printfür lokale Diagnose,ILoggerfü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.