# NULL DEPTH — technická architektúra ## Stack - Blazor WebAssembly standalone - .NET 10 / C# - HTML/CSS fullscreen UI - JSON obsah bez backendu a databázy - browser localStorage pre save a settings - Web Audio/HTML Audio vrstva s procedurálnym fallbackom - Browser Fullscreen API ovládané zo Settings ## Princíp C# obsahuje iba všeobecný engine. Herný obsah je dátový: ```text Input / kliknutie → GameService → zmena GameState → autosave → Razor znovu vykreslí miestnosť ``` ## Súbory ```text Game/GameService.cs načítanie dát, pohyb, flagy, save Game/AudioService.cs ambienty, SFX a live master volume Models/GameModels.cs dátové modely Pages/Home.razor fullscreen obrazovky a overlaye wwwroot/js/null-depth.js audio runtime a fullscreen interop wwwroot/data/game.json celý level a gameplay obsah wwwroot/localization/sk.json slovenské texty wwwroot/localization/en.json anglické texty wwwroot/assets/images/... title a miestnosti wwwroot/assets/audio/... ambience a SFX sloty tests/NullDepth.Validation offline dátové a gameplay testy ``` ## RoomDefinition Každá miestnosť má ID, lokalizačné kľúče, súradnice, obraz, voliteľný alternatívny obraz, exits a interakcie. Exit môže vyžadovať flagy a mať lokalizovanú správu pri zamknutí. Interakcia môže: - vyžadovať alebo zakazovať flagy - nastaviť flagy - pridať predmet - uložiť nájdený záznam do trvalého archívu - vytvoriť checkpoint - ponúknuť dátové voľby - spustiť smrť alebo ending ## GameState Ukladá aktuálnu miestnosť, navštívené miestnosti, flagy, inventár, archív logov, checkpoint, dokončený ending a čas uloženia. Save používa kľúč `null-depth.save.v1`, ale vnútorná verzia stavu je `3` a starší stav sa automaticky migruje. Settings používajú `null-depth.settings.v1`. Nová hra pred prepísaním vyžaduje potvrdenie. Save možno vymazať v Settings. Poškodený alebo budúcou verziou nekompatibilný stav sa nikdy automaticky neprepíše; UI ponúkne jeho explicitné odstránenie. Ak je v miestnosti viac dostupných interakcií, `E` otvorí dátovo naplnený picker. Ovláda sa šípkami, Enterom, číslicami alebo myšou. Pohyb používa krátky fade, dôležité systémové zásahy alarmové bliknutie a text miestnosti jemný reveal. Každý zápis stavu vyvolá viditeľný autosave indikátor. `game.json` definuje aj `items`, `initialItems` a `archive`. Interakcia s `archiveId` pridá záznam do hráčovho archívu a ten zostáva dostupný cez `L` aj po zmiznutí jednorazovej interakcie. ## Rozšírenie hry Pri pridaní miestnosti stačí: 1. doplniť objekt do `wwwroot/data/game.json`, 2. doplniť `nameKey`, `descriptionKey` a texty interakcií do oboch lokalizácií, 3. uložiť 16:9 obraz pod cestu uvedenú v `image`, 4. pridať exit z existujúcej miestnosti. Zásah do C# alebo Razor kódu nie je potrebný.