OpenBeach: Beach Life z 2002 roku w przeglądarce, w 5 krokach

OpenBeach: Beach Life (2002) odtworzone od nowa, graj w przeglądarce

Wstęp

Cześć! 👋
Oto mój nowy projekt: OpenBeach.
To otwarta reimplementacja Beach Life, czyli gry ekonomicznej z 2002 roku (Deep Red Games / Eidos; w USA wydanej jako Virtual Resort: Spring Break), w której budujesz i prowadzisz kurort na tropikalnej wyspie.

Silnik napisałem od nowa w C++20 z SDL3. Działa na Windowsie, na Linuksie i, co chyba najfajniejsze, bezpośrednio w przeglądarce: wchodzisz na stronę, wrzucasz swoją kopię gry i grasz. Bez instalatora, bez trybu zgodności, bez szukania łatek pod Windows 11. Kod jest na GitHubie na licencji GPL-3.0-or-later.

W tym artykule opowiem, jak to działa w 5 krokach: od tego, czym w ogóle jest OpenBeach, przez import gry w przeglądarce, aż po to, jak testuję silnik bez ani jednego pliku oryginalnej gry w repozytorium.

Beach Life uruchomione w karcie przeglądarki na openbeach.app
Beach Life w zwykłej karcie przeglądarki, na openbeach.app

1. Czym jest OpenBeach (i czym nie jest)

OpenBeach to silnik, a nie kopia gry. Repozytorium nie zawiera żadnych grafik, muzyki, filmów, tekstów ani danych scenariuszy z Beach Life. Jedyne elementy oryginału w repo to kilka screenshotów w README. Żeby zagrać w oryginalne scenariusze, potrzebujesz własnej kopii gry: obrazu płyty (.iso) albo zainstalowanego folderu.

To podejście znane z projektów takich jak OpenTTD, OpenRCT2 czy OpenMW: nowy, otwarty kod, który czyta dane oryginalnej gry. Dzięki temu gra nie jest zamknięta w jednym systemie i jednej epoce. Silnik da się skompilować na nowe platformy, poprawiać i rozwijać.

2. Granie w przeglądarce: wrzuć, poczekaj, graj

Z punktu widzenia gracza wszystko sprowadza się do trzech kroków:

  1. Wchodzisz na openbeach.app i przeciągasz na stronę swoją kopię gry: plik .iso, zamontowany napęd albo folder instalacji.
  2. Przeglądarka jednorazowo konwertuje dane. Trwa to kilka minut i dzieje się w całości na Twoim komputerze.
  3. Grasz. Przy kolejnej wizycie gra startuje od razu z pamięci przeglądarki.

Nic nie jest wysyłane na serwer. Strona to statyczne pliki: kod gry i konwertera skompilowany do WebAssembly. Twoja kopia gry nigdy nie opuszcza komputera, a wynik konwersji ląduje w prywatnym magazynie przeglądarki, do którego dostęp ma tylko ta strona.

Obsługiwane są wydania: europejskie i francusko-niemieckie CD, brytyjsko-amerykańskie (Virtual Resort: Spring Break), późniejsze angielskie CD oraz zainstalowane foldery tych wersji. Kopia, której importer nie zna, zostaje odrzucona z komunikatem, bez żadnych zmian. Języki zależą od wydania: angielski, francuski, niemiecki, włoski, hiszpański i polski. Język wybierasz na ekranie startowym.

Zapisy gry trzymane są w przeglądarce, ale da się je pobrać jako plik („Download saves”) i wczytać na innym komputerze („Import saves”). Stare zapisy z oryginalnej gry też można przekonwertować.

Nocna impreza w kurorcie w OpenBeach
Noc w kurorcie: dyskoteka, scena i oświetlenie

3. Pod maską: jeden kod, trzy platformy

Gra jest napisana w C++20, a za okno, wejście i dźwięk odpowiada SDL3. Wersja przeglądarkowa to dokładnie ten sam kod co okienkowa wersja na Linuksa, skompilowany przez Emscripten. SDL3 ma własny backend dla Emscriptena (canvas, Web Audio, zdarzenia DOM), więc źródła kompilują się bez zmian. Plik .wasm z grą waży około 5 MB.

Największa różnica jest w pętli głównej. Natywnie gra kręci się w zwykłej pętli, a w przeglądarce jedna klatka jest rejestrowana przez emscripten_set_main_loop, czyli de facto przez requestAnimationFrame.

Osobnym programem jest konwerter. Czyta dane oryginalnej gry i zapisuje je w otwartych formatach: JSON, PNG i OGG. Na desktopie to narzędzie wiersza poleceń, a w przeglądarce ten sam kod chodzi jako WebAssembly w Web Workerze. Jeśli komputer ma dość rdzeni, konwersja sprite’ów i map rozkłada się na kilka workerów pomocniczych. Wynik trafia do OPFS (Origin Private File System), a strona prosi przeglądarkę o trwałe przechowywanie danych, żeby nie zniknęły przy sprzątaniu pamięci.

Jeśli wolisz grać natywnie, każde wydanie na GitHubie ma paczkę ZIP dla Windows x64 i tarball dla Linuksa x86-64. Przeciągasz kopię gry na Import.cmd (albo import.sh), a potem odpalasz Play.cmd. A jeśli chcesz zbudować grę sam, na Linuksie wygląda to mniej więcej tak:

git clone https://github.com/h4570/openbeach.git && cd openbeach
OBL_SIM_SKIP_CONVERSION=1 bash tools/obl_sim_linux.sh -DOBL_LINUX_WINDOWED=ON
bin=build/linux-sim-x64/bin
mkdir -p run/packs/base run/remaster
$bin/obl-convert import "<folder z Beach Life>" run/packs/base
$bin/obl-convert resources "<folder z Beach Life>" run/remaster
$bin/OpenBeach --game-dir run

4. Jak testować grę bez danych gry

Skoro w repozytorium nie ma ani jednego pliku z Beach Life, to jak CI ma cokolwiek sprawdzić? Rozwiązania są dwa.

Pierwsze to headless simulation. Silnik potrafi rozegrać cały scenariusz bez okna, grafiki i dźwięku. Testy to skrypty, które sterują grą i porównują wyniki z wzorcami, więc mechanika (goście, budynki, personel, finanse) jest sprawdzana tak samo jak zwykły kod.

Drugie to paczka L0: mały, własny scenariusz z minimalną mapą i zestawem budynków, który nie potrzebuje żadnych danych oryginału. Działa na tej samej mechanice co pełne scenariusze, więc CI może grać w grę, nie mając gry.

Nie wszystko da się jednak sprawdzić w CI. Do wersji przeglądarkowej mam lokalną sondę: skrypt odpala stronę w headless Chrome lub Edge, klika „Click to start”, robi zrzuty canvasu i zbiera logi. Dzięki niej znalazłem całkiem zabawny błąd. Film intro zawieszał się na samym końcu, bo urządzenie audio w przeglądarce pracuje z częstotliwością 48 kHz, a strumień filmu ma 44,1 kHz. Ostatnie przekonwertowane próbki czekały na flush, który nigdy nie nadchodził, a film czekał, aż strumień się opróżni. Klasyczny deadlock w audio. 🙂

Okno zarządzania personelem w OpenBeach
Zarządzanie personelem i budynkami działa tak jak w oryginale

5. Na jakim etapie jest projekt i jak możesz pomóc

OpenBeach jest wciąż rozwijany. Kampania i scenariusze sandbox są grywalne, ale możesz trafić na błędy. Wersja na telefony działa eksperymentalnie: sterowanie dotykowe jest nowe i jeszcze surowe, a gra trzyma w przeglądarce około 1 GB danych, więc na razie lepiej grać na komputerze. Najlepiej przetestowane są Chrome i Edge.

Jeśli masz starą płytę z Beach Life, będzie mi bardzo miło, jeśli:

  • zagrasz na openbeach.app i dasz znać, jak poszło,
  • zgłosisz błąd na GitHubie albo na Discordzie,
  • zostawisz gwiazdkę na repozytorium, bo to naprawdę pomaga projektowi dotrzeć do ludzi,
  • przekażesz link komuś, kto grał w Beach Life lata temu.

Podsumowanie

OpenBeach pokazuje, że grę sprzed ponad 20 lat da się przenieść do przeglądarki bez wrzucania do sieci ani jednego jej pliku. Wystarczy otwarty silnik w C++20, SDL3, WebAssembly i konwerter, który robi całą robotę lokalnie. Jeśli lubisz gry typu tycoon albo po prostu ciekawi Cię, jak przenieść stary kod do przeglądarki, zajrzyj do repozytorium. Dokumentacja architektury jest całkiem obszerna.

Do zobaczenia! 🏖️

Dołącz do newslettera

Subskrybuj po bonusowe treści. Nie przegap nowych artykułów.

    We won’t send you spam. Unsubscribe at any time.

    Zostaw komentarz

    Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

    Przewijanie do góry