warren
Roguelike z trwałą progresją, w Lua, sterowany z terminala. Generowane przebiegi, klasy, mutatory i „legacy" między partiami - z trybem headless i weryfikacją determinizmu.
Roguelike z trwałą progresją w Lua, sterowany z terminala. Generowane przebiegi, klasy i mutatory, system legacy między partiami. Klucz: przebieg jest jednocześnie losowy i w pełni deterministyczny, bo ten sam seed musi dać dokładnie ten sam przebieg.
Wprowadzenie
Roguelike żyje z losowości: co przebieg to inny układ poziomów, inne przedmioty, inne wybory. Ale gdyby ta losowość była prawdziwie przypadkowa, gry nie dałoby się ani testować, ani sprawiedliwie porównywać wyników. warren rozwiązuje ten paradoks seedem, który sprawia, że świat jest świeży dla gracza i powtarzalny dla maszyny.
Wokół tej jednej własności obudowane jest wszystko inne: klasy, mutatory i warstwa legacy między partiami. Determinizm nie jest tu ograniczeniem zabawy, tylko fundamentem, na którym da się oprzeć zarówno testy, jak i sensowną progresję.
Losowy dla gracza, powtarzalny dla maszyny
Cały przebieg wyprowadza się z jednej liczby. Ten sam seed zawsze rodzi ten sam świat, ale gracz i tak widzi świeżość, bo seed zmienia się co partię. Losowość jest więc pozorna w sensie technicznym i prawdziwa w sensie odczucia: układ poziomów, przedmioty i zdarzenia są wyliczone, a nie wylosowane od nowa.
Klucz jest w tym, że każde losowanie idzie przez ten jeden generator zasilony seedem. Wystarczy, że jedno wywołanie sięgnie po losowość spoza niego, a determinizm pryska, dlatego cały przebieg musi karnie przechodzić przez to samo źródło.
Determinizm jako narzędzie testowe
Skoro seed w pełni określa przebieg, można go odtworzyć bez człowieka. warren ma tryb headless, który gra sam ze sobą na zadanym seedzie i sprawdza, że wynik jest za każdym razem identyczny. To zamienia loterię w coś, co da się zregresować: jeśli zmiana w kodzie psuje determinizm, test to łapie od razu.
Determinizm testujesz kontrfaktycznie: wprowadzasz nieoczekiwane wywołanie losowości poza głównym generatorem i sprawdzasz, że przebieg z tego samego seeda przestaje się zgadzać. Jeśli test tego nie zauważa, nie pilnuje niczego.
Legacy, czyli ślad po poprzednich partiach
Trwała progresja oznacza, że śmierć bohatera nie kasuje wszystkiego. Między przebiegami zostaje warstwa legacy: odblokowane klasy, mutatory zmieniające zasady, drobne trwałe bonusy. Dzięki temu kolejna partia zaczyna się inaczej niż poprzednia, mimo że silnik dalej jest w pełni deterministyczny na swoim seedzie.
Rozdzielenie tych dwóch warstw jest tu istotne. Seed rządzi jednym przebiegiem, legacy przenosi się między nimi, i te dwie rzeczy nie mogą się mieszać, bo inaczej progresja skaziłaby powtarzalność pojedynczej partii.
Co pochodzi z seeda, a co z legacy
| Element | Źródło |
|---|---|
| Układ poziomów | seed |
| Przedmioty i zdarzenia | seed |
| Odblokowane klasy | legacy, trwałe |
| Mutatory zmieniające zasady | legacy, trwałe |
Więcej projektów
Inne realizacje z tej samej kategorii - zobacz, jak podchodzimy do podobnych wyzwań.
Masz podobny projekt?
Napisz do nas - wycena jest bezpłatna i wraca w godzinę.



