Dlaczego Songs of Syx?
Miłosna miłość do gier symulacyjnych sięga lat 90. W 2004 roku powstała Songs of Syx – izometryczna gra symulacyjna o żywej osadzie, gdzie każdy agent ma własne potrzeby, umiejętności i zachowania. Emigranci chodzą do pracy jako farmerzy, zbieractwo surowców, budują budynki – a całość działa na prostych zasadach, które generują emergencję.
Gra była tak dobra, że jej źródła nigdy nie zostały opublikowane. A to mnie nie puszczało z głowy przez lata.
Czego się uczę
SimSandbox to nie jest gra w rozumieniu tradycyjnym. To laboratorium architektury silnika symulacyjnego, zbudowane od zera w .NET 8. Każda decyzja jest świadoma i celowana:
- Zrozumiem jak zbudować ECS (Entity Component System) bez zewnętrznych zależności
- Nauczę się wielowątkowej symulacji – oddzielenie logicznego ticka renderowania
- Przetestuję deterministyczne pętle sima – fixed timestep, double-buffered snapshots
- Poznam AI agentów – FSM, pathfindig A*, resource gathering, ekonomia
Stack
- .NET 8 + MonoGame 3.8 – render na 60-144 Hz
- MemoryPack – szybka binarna serializacja przez source generators
- Własny bitset ECS – ~200 linii, zero zewnętrznym bibliotekom
- A* z
.NET 6+ PriorityQueue+ cache ścieżek w komponencie ECS
Jak to działa
Kluczowa architektura sima: dwa wątki.
┌─────┐ snapshot ┌─────────┐
│Render│─────────────────▶│ Sim │
│60-144HZ│ │30 Hz tick│
└─────┘ └─────────┘
▲ │
│ reads ┌┴────┐
└──── snapshot ─────────────World│
│ECS + Map│
│+AI │
└───────┘
Sim tickuje deterministycznie co 30 Hz na wątku w tle. Render czytuje double-buffered snapshot atomowo pod lockiem – nie blokuję nigdy sima dla renderowania. Resultat? Płynna animacja nawet przy zmiennym FPS.
Co już działa
Prawie rok prac i mam działanie:
ECS – tworzenie/zniszczanie entity, zapytania z 1-4 komponentami, generation counters dla bezpieczeństwa pamięci.
Mapa i pathfindig – proceduralnie generowany świat (4 typy tile’ów: trawa, podłoga, ściana, drzwi). A* z zakazem „corner cutting” – agenci nie przeszukują przez ściany. Path cache w komponencie ECS = A* wylicza się raz, agent porusza się po zapamiętanej ścieżce.
Agenci – spawnowani w domach, z podstawowym statusem głodu. Wędrują z bias 70% dom / 30% mapa. Gdy głodują – idą do magazynu, jedzą, wracają do domu.
Ekonomia – farmerzy automatycznie produkują żywność (IdzieDoPracy → Pracuje → DostarczaDoMagazynu). Magazyn ma pojemność 50/100.
Budowanie – domy 4×4, magazyny 6×6 z niebieskimi drzwiami, farmy 4×4 z zielonym wnętrzem. System planowania budowy i auto-place gdy teren jest wolny.
Save/load – binarny format MemoryPacka, wersjonowanie od dnia 1 (już 5 wersji pliku). Migracje między wersjami – wpisz to teraz, bo za 3 miesiące będziesz dziękował.
Co jeszcze nie działa
- Multithreading w AI – fase logiki wciąż sekwencyjna, planuję
Parallel.Forna slice agentów - Flow fields – dla 1000+ agentów idących do tego samego celu jeden BFS > A* per agent (O(N) vs O(N·log·N))
- Utility AI – scoring potrzeb (głód², pragnienie, sen, zabawa) z priorytetyzacją kwadratową dla emergencji
- Game Over – śmierć agentów z głodu, currently agenci po prostu znikają gdy staną się głodni
- Pause, speed control, builder mode – UI planowane na drugą iterację
Dlaczego to robię publicznie
Bo symulacje to jeden z najtrudniejszych, ale najbardziej satysfakcjonujących gatunków w gamedevie. Songs of Syx dowiodło, że proste zasady mogą wygenerować niesamowitą złożoność. Ale żeby to zrozumieć – trzeba zbudować.
SimSandbox to mój sposób — prywatne laboratorium, w którym uczę się architektury silników symulacyjnych od podstaw.
Linki
- 📄 Strona projektu: /pl/projects/sim-sandbox/
Piszę na bieżąco o postępach. Daj znać jeśli masz pytania lub sugestie!