Cyfrowe Arcydzieła: Stworzyli kosmos w 32 KB pamięci. Gra „Elite” była technicznym absurdem w 1984 roku

Cyfrowe Arcydzieła: Stworzyli kosmos w 32 KB pamięci. Gra „Elite” była technicznym absurdem w 1984 roku

Maciej Zabłocki | Dzisiaj, 22:00
Google Chcesz częściej widzieć nasze treści w Google? Dodaj do źródeł

Jedno współczesne zdjęcie wykonane smartfonem zajmuje dużo więcej miejsca niż niemal całe „Elite”. Mówię tu o kodzie, grafice, ekonomii, walce, przeciwnikach, ośmiu galaktykach i 2048 układach planetarnych. Wszystko zostało niegdyś uruchomione w 1984 roku na komputerze z procesorem taktowanym zegarem 2 MHz i 32 KB pamięci RAM. Otwieram nową serię "Cyfrowe Arcydzieła" w której poruszę najciekawsze gry w historii naszej branży, ale z technicznego punktu widzenia. 

 CYFROWE ARCYDZIEŁO
Dlaczego „Elite” zapisał się w technicznej historii?
BBC Micro • 1984 • 32 KB RAM
01
Galaktyka z sześciu bajtów
Trzy 16-bitowe liczby stanowiły punkt wyjścia do odtworzenia całego uniwersum.
02
2048 spójnych systemów
Osiem galaktyk po 256 układów powstawało bez przechowywania ogromnej bazy planet.
03
Prawdziwe 3D bez GPU
Statki obracano i rysowano programowo na procesorze 6502A 2 MHz.
04
Cały świat w 32 KB RAM-u
Większość gry mieściło się w pamięci mniejszej niż jedno marnej jakości zdjęcie.
05
Tylko 12 lokalnych obiektów
Gra symulowała najbliższe otoczenie. Słońce i stacja współdzieliły nawet ten sam slot.
06
Zostały 144 wolne bajty
W głównym obszarze kodu kasetowej wersji pozostały zaledwie 34 bajty.
Dalsza część tekstu pod wideo

„Elite” to wydany 20 września 1984 roku kosmiczny symulator handlu i walki, stworzony przez Davida Brabena oraz Iana Bella. Gra zadebiutowała na komputerach BBC Micro i Acorn Electron, a później została przeniesiona na kilkanaście kolejnych platform. Akcję obserwowaliśmy z kokpitu statku, swobodnie podróżując między układami planetarnymi, handlując towarami oraz walcząc z przeciwnikami. Dzisiaj nazwalibyśmy to połączeniem sandboksa, gry ekonomicznej i kosmicznego symulatora.

Gracz wcielał się w Commandera Jamesona, rozpoczynającego przygodę w systemie Lave ze statkiem Cobra Mk III, setką kredytów, ale za to pełnym bakiem paliwa. Nie było nadrzędnej fabuły ani listy misji prowadzących do zakończenia. Można było zostać uczciwym kupcem, górnikiem, łowcą nagród, przemytnikiem albo zwyczajnym piratem, a głównym wyznacznikiem postępów pozostawała rozbudowa statku oraz wspinanie się po kolejnych rangach bojowych. Była to jedna z pierwszych gier, które zamiast mówić graczowi, co ma zrobić, przekazywały mu cały świat i pozwalały samodzielnie zdecydować, kim chce w nim zostać. Mogliśmy więc handlować, przemycać kontrabandę, polować na piratów, napadać na kupców, wydobywać minerały z asteroid, ulepszać statek i budować własną reputację. Nie było tu poziomów, punktów kontrolnych ani fabularnego korytarza prowadzącego do napisów końcowych. 

Za projektem stali David Braben i Ian Bell, studenci University of Cambridge. Bell miał już na koncie wydaną komercyjnie grę „Free Fall”, natomiast Braben eksperymentował z trójwymiarową grafiką w projekcie nazwanym „Fighter”. Połączyli więc dwa pomysły: technologię pozwalającą rysować przestrzeń 3D oraz grę, która nie kończyłaby się po kilku minutach podliczeniem punktów.

Dzisiaj taki opis brzmi zupełnie normalnie. W 1983 roku wydawcy widzieli w nim natomiast listę pełną błędów projektowych (twórcy po ponad roku prac zaczęli prezentować grę na zamkniętych spotkaniach). Według wspomnień Brabena, firma Thorn EMI odrzuciła „Elite”, ponieważ produkcja nie miała trzech żyć, jasno określonego celu i rozgrywki zamykającej się w około dziesięciu minutach. Gracze mieli nie rozumieć, co robić, a sprzedawcy nie wiedzieć, jak coś takiego reklamować. Projekt przyjęło dopiero Acornsoft, czyli wydawnicze ramię firmy odpowiedzialnej za BBC Micro. Po mniej więcej dwóch latach pracy „Elite” trafiło na rynek 20 września 1984 roku. Już samo pudełko podpowiadało, że nie jest to kolejna zręcznościówka: obok instrukcji znajdowała się w nim nowela „The Dark Wheel” Roberta Holdstocka. Skoro rozbudowanej fabuły nie dało się zmieścić w pamięci komputera, część świata przedstawionego dostarczono po prostu na papierze.

Wszechświat zbudowany z sześciu bajtów

Elite 1984
resize icon

Wspominam o tej grze, ponieważ największym absurdem tamtych czasów była jej skala. Nawet gdyby każdy układ opisano za pomocą zaledwie kilkunastu bajtów, kompletna baza 2048 światów pochłonęłaby znaczną część pamięci BBC Micro. Bell i Braben nie mogli więc przechowywać wszystkich planet jako osobnych rekordów. Zamiast tego zapisali zestaw liczb oraz algorytm, który odtwarzał potrzebne systemy za każdym razem, gdy gra chciała je wyświetlić lub wykorzystać. Fundamentem całego uniwersum były trzy 16-bitowe liczby, zajmujące łącznie zaledwie sześć bajtów. Punktem wyjścia był Tibedied, czyli pierwszy system pierwszej galaktyki, którego ziarna miały w zapisie szesnastkowym wartości 0x5A4A, 0x0248 i 0xB753. Na podstawie tego jednego zestawu gra potrafiła wyprowadzić wszystkie 2048 unikalnych systemów. Każda z ośmiu galaktyk zawierała 256 układów, a ziarna kolejnych galaktyk uzyskiwano przez obracanie bitów w sześciu bajtach wartości początkowych.

Algorytm opierał się na ciągu Tribonacciego, w którym każda nowa liczba jest sumą trzech poprzednich. Pierwsza wartość była zastępowana drugą, druga trzecią, a trzecia sumą całej wcześniejszej trójki. Ponieważ komputer operował na liczbach 16-bitowych, po przekroczeniu wartości 65 535 wynik po prostu zawijał się od początku. Aby przejść do następnego systemu, gra wykonywała taką operację cztery razy. Nie korzystano przy tym z prawdziwej losowości. Identyczny zestaw liczb zawsze prowadził do identycznego systemu, dlatego cały świat pozostawał spójny między kolejnymi uruchomieniami gry.

Elite
resize icon

Sama deterministyczna generacja nie była wynalazkiem Elite - już Akalabeth: World of Doom z 1979 roku pozwalało wpisać ten sam „szczęśliwy numer” i odtworzyć identyczny układ świata oraz lochów. Wyjątkowa na tle epoki była natomiast skala i spójność rozwiązania Bella i Brabena. Z kilku liczb gra rekonstruowała 2048 nazwanych systemów wraz z ich położeniem, ustrojem, gospodarką, poziomem technologicznym i populacją. Elite nie było więc pierwszą grą wykorzystującą deterministyczne generowanie, ale należało do najbardziej ambitnych i przekonujących zastosowań tej techniki w całej ówczesnej branży.

Ziarno nie było żadnym gotowym opisem świata zapisanym w miniaturze. To po prostu niewielki zestaw liczb, który stanowił punkt wyjścia dla kolejnych obliczeń. Jeżeli algorytm otrzymywał identyczne ziarno, zawsze tworzył identyczny system. W Elite taki zestaw składał się z trzech liczb 16-bitowych, czyli sześciu bajtów. Gra przechowywała w pamięci roboczej ziarno pierwszego systemu aktualnej galaktyki oraz ziarno systemu wybranego przez gracza. Dane pozostałych światów mogła w każdej chwili odtworzyć, wielokrotnie przekształcając wartości początkowe.

Poszczególne bity ziarna wyznaczały między innymi współrzędne, ustrój, rodzaj i zamożność gospodarki, pochodzenie mieszkańców, promień planety oraz elementy potrzebne do utworzenia nazwy. Inne informacje obliczano dopiero na ich podstawie. Poziom technologiczny zależał od gospodarki, ustroju i dwóch dodatkowych bitów, populacja wynikała głównie z poziomu technologicznego, a produktywność była pochodną populacji, gospodarki oraz formy rządów. Ziarno Lave miało wartości AD38, 149C i 151D. Algorytm wyliczał z nich bogaty świat rolniczy rządzony przez dyktaturę, zamieszkany przez ludzkich kolonistów. Na ekranie widniał piąty poziom technologiczny, populacja wynosząca 2,5 miliarda, produktywność na poziomie 7000 mln kredytów oraz średni promień planety równy 4116 kilometrów. Lave nie było więc ręcznie przygotowanym rekordem w wielkiej bazie. Było wynikiem kilkunastu działań wykonanych na sześciu bajtach danych.

Elite 1984_2
resize icon

Podobnie powstawały nazwy. Gra nie korzystała z listy 2048 gotowych słów, lecz z niewielkiej tablicy krótkich fragmentów tekstu. Jeden bit decydował, czy algorytm ma sprawdzić trzy, czy cztery pary znaków, a kolejne wartości wskazywały odpowiednie elementy tablicy. Po każdym wyborze ziarno było ponownie przekształcane. Dla Lave procedura wskazała „LA”, następnie „VE”, a potem pusty element, który został pominięty. W ten sposób cztery litery nie zajmowały osobnego miejsca w bazie nazw - za każdym razem wynikały z obliczeń. Osobno działał rynek. Cena oraz dostępność każdego produktu wynikały z jego wartości bazowej, współczynnika określającego zależność od gospodarki, maski wyznaczającej zakres wahań, typu gospodarki danego systemu oraz jednego losowanego przy przylocie bajtu. Dlatego świat rolniczy sprzedawał żywność taniej, a więcej żądał za komputery i maszyny. W systemach przemysłowych zależność generalnie się odwracała. Poszczególne rynki nie wymagały więc osobnych cenników, chociaż ceny mogły zmieniać się pomiędzy wizytami.

W bogatszych wydaniach Elite tą samą zasadę wykorzystano do tworzenia opisów planet. Mechanizm nazwany przez Iana Bella „Goat Soup” rozwijał kolejne znaczniki tekstowe, które mogły odwoływać się do następnych znaczników, tworząc w ten sposób całe zdania. Jako punkt wyjścia dla generatora pseudolosowego wykorzystywano dwie z trzech liczb należących do ziarna systemu, dlatego ten sam świat zawsze otrzymywał ten sam opis. Tak powstały rozległe lasy deszczowe i laviańska larwa drzewna, z których słynęło Lave, Rigeti określone jako „odrażająca dziura” czy Raale znane z „jadalnego poety”. Rozszerzonych opisów nie było w kasetowej wersji na BBC Micro ani w wydaniu na Acorn Electron. W dyskowej edycji na BBC Micro pojawiały się wyłącznie po zadokowaniu, ponieważ podczas lotu w pamięci nie mieściła się procedura odpowiedzialna za ich tworzenie. W bardziej rozbudowanych wersjach, które dysponowały większą ilością pamięci, można było wyświetlać je również podczas lotu.

Matematycznie generator mógł stworzyć znacznie więcej niż osiem galaktyk. Acornsoft przekonało jednak autorów, że nieskończona liczba niemal przypadkowych światów osłabi wrażenie istnienia spójnego uniwersum. Ograniczenie pozwalało też przejrzeć wyniki i wyłapać niefortunne nazwy. Według relacji z produkcji jedną z wygenerowanych galaktyk wyrzucono między innymi dlatego, że znajdowała się w niej planeta nazwana „Arse”. Proceduralna generacja już wtedy potrzebowała moderacji. Równie oszczędnie potraktowano zapis postępów. Plik Commandera miał dokładnie 256 bajtów, ale właściwe dane zajmowały tylko pierwszych 75. Zapisywano wyposażenie, gotówkę, paliwo, ładunek, status prawny, wynik bojowy oraz bieżący stan generatora. Trzy ziarna galaktyki trafiały do bajtów od trzeciego do ósmego. Gra nie musiała pamiętać odwiedzonych planet, ponieważ mogła w każdej chwili odtworzyć cały wszechświat z kilku liczb.

3D bez GPU, mnożenia i litości

Elite
resize icon

Źródło tego zdjęcia: https://www.youtube.com/watch?v=lC4YLMLar5I

BBC Micro Model B miał 8-bitowy procesor 6502A taktowany częstotliwością 2 MHz. Komputer posiadał kontroler obrazu Motorola 6845 i układ Video ULA, ale nie było to GPU potrafiące samodzielnie rysować linie, obracać bryły czy wykonywać inne działania potrzebne do stworzenia grafiki 3D. Maszyna nie dysponowała również jednostką zmiennoprzecinkową ani sprzętowymi instrukcjami mnożenia i dzielenia. Kod Elite napisano w asemblerze 6502, przygotowując własne procedury mnożenia metodą przesunięć i dodawania oraz dzielenia przez przesuwanie i odejmowanie. Tablice z gotowymi wartościami sinusów, cosinusów i arcus tangensów pomagały przede wszystkim przy rysowaniu planet, natomiast obroty statków obliczano za pomocą znacznie tańszych przybliżeń dla niewielkich kątów.

Statki składały się z ograniczonej liczby punktów, krawędzi i ścian. Cobra Mk III została opisana za pomocą 28 wierzchołków, 38 krawędzi i 13 powierzchni. Samo narysowanie wszystkich linii zamieniłoby jednak czytelną bryłę w prześwitującą plątaninę, ponieważ przez przód statku byłoby widać elementy znajdujące się z tyłu. Gra stosowała więc usuwanie niewidocznych powierzchni. Do każdej ściany przypisano wektor normalny, czyli zestaw trzech liczb opisujących wyobrażoną strzałkę wychodzącą prostopadle z jej powierzchni. Za pomocą iloczynu skalarnego program sprawdzał, czy taka strzałka jest skierowana w stronę obserwatora. Krawędź trafiała na ekran, jeśli widoczna była przynajmniej jedna z dwóch powiązanych z nią ścian. Autorzy zastosowali jeszcze jeden sprytny skrót. Statek gracza stanowił nieruchomy punkt odniesienia umieszczony w środku układu współrzędnych. Kiedy pilot wykonywał przechył albo podnosił i opuszczał dziób, program obracał pozycje całego otoczenia: przeciwników, stacji, planety oraz słońca. Dzięki temu nie musiał uwzględniać orientacji Cobry gracza w każdym kolejnym obliczeniu. Z perspektywy kokpitu rezultat wyglądał dokładnie tak samo, ale wymagał prostszej matematyki.

Ten „cały wszechświat” był zresztą ściśle kontrolowaną iluzją. Wersje na BBC Micro przechowywały lokalnie najwyżej 12 obiektów: planetę, słońce albo stację kosmiczną oraz maksymalnie dziesięć pozostałych elementów (co ważne, nie dotyczy to jednak wydania współpracującego z 6502 Second Processor, które mieściło 20 obiektów: planetę, słońce lub stację oraz 18 pozostałych jednostek). Wspomniane elementy mogły być statkami, pociskami, kapsułami ratunkowymi, asteroidami lub kontenerami z ładunkiem. Słońce i stacja współdzieliły jeden slot, ponieważ nigdy nie występowały jednocześnie w lokalnej symulacji. Po wejściu do bezpiecznej strefy wokół stacji słońce było z niej usuwane, a po oddaleniu pojawiało się ponownie. Bieżący stan każdego obiektu - między innymi jego położenie, orientacja, prędkość i energia - zajmował 36 bajtów.

Stała geometria oraz podstawowe parametry statku znajdowały się osobno we wspólnym wzorcu, więc nie trzeba było ich powielać dla każdej jednostki. Te same dane geometryczne mogły również służyć obiektom zachowującym się inaczej. W kasetowej wersji na BBC Micro dwa typy Cobry Mk III - spokojny handlarz oraz łowca nagród - wskazywały ten sam wzorzec graficzny, chociaż program nadawał im inną rolę i poziom agresji. Gra nie potrzebowała więc drugiego kompletu 28 wierzchołków, 38 krawędzi i 13 ścian tylko po to, aby identycznie wyglądający statek zachowywał się inaczej. Dzisiejsze produkcje oszczędzają w ten sposób czas pracy grafików. Elite oszczędzało pojedyncze bajty.

Elite
resize icon

Osobnym osiągnięciem był ekran. Zamiast korzystać z jednego ze standardowych trybów BBC Micro, twórcy przeprogramowali kontroler 6845 i przygotowali własny układ o rozdzielczości 256x248 pikseli. Górne 192 linie wyświetlały monochromatyczny widok przestrzeni, natomiast dolne 56 tworzyło czterokolorową deskę rozdzielczą o niższej rozdzielczości poziomej. Komputer nie oferował gotowego trybu łączącego oba rozwiązania, dlatego Elite zmieniało sposób interpretowania pamięci obrazu już podczas wyświetlania klatki. Przy każdym sygnale synchronizacji pionowej gra uruchamiała licznik T1 znajdujący się w układzie 6522 System VIA. Timer działał z częstotliwością 1 MHz i rozpoczynał odliczanie od wartości 14 622. Kiedy dochodził do zera, wywoływał przerwanie, a jego procedura przeprogramowywała Video ULA: górna część ekranu korzystała z dwukolorowego trybu o wyższej rozdzielczości, dolna z czterokolorowego trybu o dwukrotnie niższej rozdzielczości poziomej. Wszystko odbywało się w ramach jednej pamięci obrazu. Acorn Electron nie miał odpowiednika timera T1, dlatego tamtejsza wersja używała standardowego trybu monochromatycznego dla całego ekranu, łącznie z kokpitem.

Podczas lotu program przetwarzał kolejne obiekty lokalnej symulacji: aktualizował ich położenie, uruchamiał taktykę, sprawdzał możliwość dokowania, kolizje, zbieranie ładunku, namierzanie rakiet i trafienia laserem. Po przejściu całej listy odnawiał tarcze i energię, aktualizował deskę rozdzielczą oraz obsługiwał efekty broni. Nie wszystko wykonywano jednak przy każdym obiegu. Kontrolę wysokości nad planetą przeprowadzano w jednej iteracji 32-elementowego cyklu, sprawdzanie odległości od słońca i tankowanie paliwa w innej, a możliwość wygenerowania nowych obiektów rozpatrywano tylko raz na 256 przebiegów głównej pętli. Dopiero wtedy gra decydowała, czy w lokalnej przestrzeni pojawi się handlarz, policjant, łowca nagród, grupa piratów, Thargoid, asteroida albo kontener.

Nawet rozsypane przed kabiną punkty miały konkretne zadanie. W zwykłej przestrzeni BBC Micro wyświetlał 18 takich drobin, a w przestrzeni międzygwiezdnej zaledwie trzy. Ich pozycje zmieniały się zgodnie z prędkością, przechyłem i pochyleniem statku, a punkt wypadający poza ekran był natychmiast wykorzystywany ponownie. Nie był to realistyczny obraz kosmicznej próżni, tylko niezwykle tani wskaźnik ruchu. Bez niego gracz patrzyłby na czarne tło i nie miałby pojęcia, czy właśnie pędzi przez system, czy stoi w miejscu.

144 wolne bajty i gra większa od sprzętu

Elite 1984 Micro
resize icon

Najlepiej skalę tej pracy pokazuje mapa pamięci kasetowej wersji BBC Micro. Niestandardowy ekran zajmował 7936 bajtów. Główny kod pochłaniał 18 170 bajtów, projekty statków poza Pythonem kolejne 2502, skompresowane teksty 1024, a pozostałe dane - w tym osobny projekt Pythona - 256 bajtów. Łącznie kod i dane gry zajmowały 21 952 bajty, do których dochodziły 2033 bajty przestrzeni roboczej. Często można przeczytać, że autorzy wykorzystali absolutnie każdy bajt BBC Micro. To nieprawda, choć rzeczywistość jest niewiele mniej niedorzeczna. Analiza kodu wykazała 144 niewykorzystane bajty, przy czym 64 z nich należały do bufora drukarki systemu operacyjnego. W głównym obszarze kodu pozostały 34 wolne bajty. Odnaleziono też 22 instrukcje, które nie wywoływały żadnego efektu. Optymalizowanie gry po czterech dekadach przypomina tutaj archeologię prowadzoną pincetą.

Ograniczenia nie kończyły się na technologii. W „Elite” nie było samouczka, znaczników celu ani bezpiecznej misji wprowadzającej. Pierwsze ręczne dokowanie potrafiło zakończyć karierę Commandera szybciej niż spotkanie z piratami. Słynny trójwymiarowy radar dodano zresztą późno, gdy podstawowa gra już działała. Zamiast przebudowywać cały interfejs, twórcy znaleźli sposób, by wcisnąć kolejną funkcję w pamięć, w której praktycznie nie było już miejsca. Część graczy zachwyciła się wolnością, inni uznali „Elite” za nieprzystępny koszmar. W listach publikowanych w 1985 roku pojawiały się zarówno porady, jak i skargi osób mających ochotę potraktować komputer siekierą. Zdobycie tytułowej rangi również nie było symbolicznym finałem: poziom Elite przyznawano dopiero po osiągnięciu 6400 zwycięstw bojowych. Produkcja nie tylko nie prowadziła gracza za rękę. Momentami sprawdzała, czy po tej ręce można przejechać statkiem kosmicznym.

Dokładna sprzedaż pozostaje przedmiotem sporu. David Braben mówił później o około milionie egzemplarzy na siedemnastu platformach, Ian Bell szacował wynik bliższy 600 tysiącom. Pewne jest coś ważniejszego: „Elite” przetrwało własny sprzęt. Nie wynalazło grafiki 3D, proceduralnego generowania ani otwartego świata, ale połączyło je w system, który dawał graczowi niespotykaną wcześniej swobodę. Kod źródłowy wersji BBC Micro można dziś ponownie zbudować i prześledzić niemal instrukcja po instrukcji. Widać w nim, że twórcy nie zmieścili ogromnej galaktyki w 32 KB. Zrobili coś znacznie mądrzejszego - wykorzystali matematykę w sposób absolutnie innowacyjny, dzięki czemu obeszli wiele technicznych ograniczeń. 

Google Chcesz częściej widzieć nasze treści w Google? Dodaj do źródeł
Źródło: Opracowanie własne
Maciej Zabłocki Strona autora
Swoją przygodę z recenzowaniem gier rozpoczął w 2005 roku. Z wykształcenia dziennikarz, ale zawodowo pracujący też w marketingu. Na PPE odpowiada głównie za testy sprzętów i dział tech. Gatunkowo uwielbia RPG, strategie i wyścigi. Uzależniony od codziennego czytania newsów i oglądania konferencji.
cropper