Przejdź do głównej zawartości

Architektura

Novactorio jest celowo wolny od frameworków po stronie renderowania. Pętla gry, symulacja i rysowanie są pisane ręcznie na Canvas 2D API; React służy tylko do nakładek UI. Kod to ponad 21 000 linii TypeScript (21 257 LOC w src/).

Przegląd warstw

┌─────────────────────────────────────────────────────────┐
│ Nakładka React (src/components/, src/ui/) │
│ Routing Auth → Start → Gra, HUD, menu, czat, sklep │
└─────────────────────────┬───────────────────────────────┘
│ stan gry / zdarzenia
┌─────────────────────────▼───────────────────────────────┐
│ Silnik gry (src/game/) │
│ engine.ts — główna pętla: update() + render(), entity│
│ systems.ts — łańcuchy dostaw, taśmy, rury, AI, zaniecz.│
│ world.ts — magazyn chunków, nieskończone przewijanie │
│ noise.ts — generacja terenu szumem Perlina │
│ renderer.ts — 10 wydzielonych metod rysowania │
│ constants.ts, types.ts, audio.ts, postproc.ts │
└─────────────────────────┬───────────────────────────────┘

┌─────────────────────────▼───────────────────────────────┐
│ Pipeline renderowania (src/render/) │
│ AmbientAtmosphere · ParticleEffects · PollutionOverlay │
│ ScreenEffects · SpriteManager · WeatherSystem · utils │
└─────────────────────────────────────────────────────────┘

Mapa źródła (src/)

KatalogPlikiOdpowiedzialność
game/9Rdzeń silnika: pętla, systemy, świat, szum, renderer, audio, postprocessing
core/engine, systems, typesWspólne definicje silnika/systemów/typów
render/7Efekty wizualne: atmosfera, cząsteczki, zanieczyszczenie, pogoda, sprite'y, FX ekranu
components/UI React: AuthScreen, BuildMenu, ChatPanel, sklep, HUD
services/auth, coop, tradeUsługi oparte o Supabase
config/Konfiguracja sterowana środowiskiem
ui/Dodatkowe prymitywy UI
easter/Treść easter eggów
shaders/Definicje shaderów
lib/Wspólne narzędzia

Silnik gry (src/game/)

ModułOdpowiedzialność
engine.tsPętla gry (update/render), cykl życia encji, logika budynków, inventory, combat, cząsteczki
renderer.tsWydzielone przebiegi renderowania: niebo, ziemia, encje, liczby obrażeń itd.
systems.tsŁańcuchy dostaw, taśmociągi, sieci rur, AI wrogów, zanieczyszczenie
world.tsŚwiat oparty o chunki, magazyn bloków, nieskończone przewijanie
noise.tsSzum Perlina do generacji terenu
types.tsWspólne definicje typów
constants.tsStałe strojenia
audio.tsEfekty dźwiękowe
postproc.tsEfekty post-processingu

Pipeline renderowania (src/render/)

ModułOdpowiedzialność
AmbientAtmosphere.tsRenderowanie nieba/atmosfery
ParticleEffects.tsCząsteczki (dym, iskry, obrażenia)
PollutionOverlay.tsWizualizacja zanieczyszczenia
ScreenEffects.tsEfekty przestrzeni ekranu
SpriteManager.tsZarządzanie atlasem sprite'ów
WeatherSystem.tsSymulacja pogody
utils.tsPomocnicze funkcje renderowania

Usługi (src/services/)

UsługaOdpowiedzialność
authIntegracja autoryzacji Supabase
coopMultiplayer co-op przez Supabase Realtime
tradeHandel graczy (checkout z opłatą Stripe za transakcje)

Podejście do renderowania

Renderer jest zorganizowany jako osobne metody rysowania (niebo, ziemia, encje, cząsteczki, liczby obrażeń, …) zamiast monolitowego wywołania draw — dzięki temu każdy przebieg jest tani i łatwy do debugowania. Chunki świata są przycinane do widocznego obszaru podczas przewijania. Pipeline renderowania jest dodatkowo podzielony na dedykowane moduły (atmosfera, cząsteczki, zanieczyszczenie, pogoda) nakładane na bazowy canvas.

Nakładka UI

React 18 renderuje interfejs na canvasie: pełnoekranowy routing (Auth → Start → Gra), menu budowania, panel czatu, sklep, statystyki i ustawienia. Stan płynie z silnika do Reacta przez wspólny most stanu gry.

Rygorystyczność TypeScript

tsconfig.app.json działa z typowaniem strict; projekt waliduje tsc --noEmit (npm run typecheck) i lintuje ESLintem (npm run lint).

Skrypty

SkryptCel
npm run devSerwer dev Vite
npm run buildBuild produkcyjny
npm run typecheckWalidacja TypeScript
npm run lintESLint
npm run previewBuild + lokalny podgląd Wrangler
npm run deployBuild + wrangler deploy (Cloudflare)
npm run easter-eggSkrypt generatora easter eggów

Cel wdrożenia

Gra buduje się Vite i wdraża na Cloudflare przez Wrangler (wrangler.jsonc), z Supabase jako backendem.