4

10 tysięcy ludzi, 1.7 miliona screenshotów, superkomputer i 281 bilionów światów. Czego szukali w Minecraft?

Minecraft to gra, która cieszy się umiarkowaną reputacją. Są jednak ludzie, którzy pokazują, że pod maską prostego survivalu kryje się niesamowicie dużo interesujących mechanik. Tak jest chociażby w przypadku seedfindingu, czyli odnajdywania światów na bazie obrazków lub filmów. Ostatnio grupa ludzi dokonała na tym polu niemożliwego.

Jeżeli chodzi o grę Minecraft, większość ludzi kojarzy ją z prostą graficznie produkcją o budowaniu z elementami survivalu. Gra w ciągu kilkunastu lat swojego istnienia kilka razy osiągała szczyty popularności, by potem usunąć się w cień. Przez cały ten czas produkcja zebrała wokół siebie ludzi, którzy nie tylko chcą się dobrze bawić, ale też tych, dla których wyzwaniem było zrozumienie reguł stojących za grą i wykorzystanie ich by osiągać rzeczy których nikt wcześniej nie zrobił. Na takiej podstawie został zbudowany chociażby serwer SciCraft, znany z odkrywania nowych mechanik w grze. Niedawno jednak w społeczności gry wydarzyło się coś, co nawet przez najbardziej technicznych graczy było uznawane za niemożliwe.

Czym jest seedfinding w Minecraft i na czym on polega?

Jak zapewne wiecie, świat Minecrafta generowany jest przez algorytm, który dba o to, by przestrzeń gry była jakkolwiek podobna do świata rzeczywistego. Chodzi o to, by ukształtowanie terenu (góry, jaskinie, łąki) i znajdujące się na nim obiekty (drzewa, jeziora, trawa, moby) nie pojawiały się w losowych miejscach. Informacją dla algorytmu, w jaki sposób ma stworzyć dany świat jest tzw. seed, czyli ciąg 19 cyfr które gra może wybrać za nas podczas generowania terenu, ale które możemy też sami wprowadzić do systemu. I tutaj właśnie pojawia się zabawa znana jako seedfinding – jest to wsteczna inżynieria wykorzystująca każdy skrawek wiedzy o grze by na podstawie obrazu bądź pliku wideo odszukać seed świata i dokładne miejsce z którego pochodzi materiał. W taki właśnie sposób docierano do światów na których grają YouTuberzy (m.in. PewDiePie).

Im więcej materiałów dotyczących danego miejsca, tym seedfinding jest łatwiejszy. Co jednak, jeżeli obrazek z którego chcemy pobrać informacje ma zaledwie 128×128 pikseli i jest jedynym istniejącym zdjęciem danego miejsca? Cóż, tu zaczyna się historia znana jako „pack.png”.

Pack.PNG, czyli najsłynniejszy obrazek w Minecraft

Nie ma osoby, która grałaby w Minecraft Java Edition i nie natknęła się nigdy na Pack.PNG. Jest to domyślny obrazek dla używanego w Minecrafcie zbioru tekstur, a także – jako domyślny obrazek dla serwera. Jeden bardziej popularnych, technicznych YouTuberów, SalC1, patrząc na niego zaczął się zastanawiać, czy istnieje możliwość, by na tak małej próbce przeprowadzić seedfinding i odnaleźć świat oraz koordynaty tej lokacji, aby każdy mógł na niej zagrać. Było to niesamowite wyzwanie, ponieważ sam obrazek jest bardzo mały i nie zawiera żadnych dodatkowych informacji. Opublikował więc film zachęcający ludzi do przyłączenia się do akcji, na który odpowiedziało ponad 10 tys. osób, w tym sam twórca Minecrafta – Notch. Zaznaczył on, że nie ma dokładnych informacji na temat tego, kto i kiedy zrobił screen będący podstawą do tego obrazka i najprawdopodobniej został on wykonany przy wpisaniu losowego seedu. Dlatego też rozpoczęły się mozolne poszukiwania.

Jak znaleziono seed dla Pack.PNG

Inżynieria wtórna gry nie jest zadaniem prostym, szczególnie jeżeli chodzi tak ograniczone dane wejściowe. To, jakie problemy musieli rozwiązać gracze zgromadzeni wokół projektu czasem po prostu wysadza mózg. Pozwólcie, że przedstawię wam to w bardzo, bardzo uproszczonej formie.

  • Przede wszystkim, należało odnaleźć dokładną wersję gry, w której został zrobiony dany screen. Najmniejsza pomyłka tutaj skutkowałaby fiaskiem całej akcji. Poszczególne gry różnią się od siebie zestawem bloków z których są zbudowane, więc ten sam seed da w nich różne efekty. Tutaj niezbędna była wiedza o tym, że obrazek ten pojawił się po raz pierwszy w wersji gry 1.2.2 w 2010 r. Istniało oczywiście ryzyko, że screen został zrobiony w jednym z wcześniejszych buildów, ale na szczęście właśnie w tej wersji kolor liści został zmieniony na nieco ciemniejszy, co widać właśnie na obrazku. Dzięki tej wiedzy wiadomo było, że poszukiwania muszą odbywać się właśnie na wersji 1.2.2.
  • Trzeba było odgadnąć, w jakiej orientacji w stosunku do osi X/Y/Z zrobiony został screen. Tutaj pomogło ułożenie tekstury wody, która zawsze zorientowana jest w jednej osi.
  • Jednym z najbardziej przydatnych narzędzi przy znajdowaniu danej lokalizacji są chmury. Niewiele osób wie, że w Minecrafcie nie są generowane losowo, ale stanowią wzór poruszający się wzdłuż jednej z osi. Znając orientację obrazka można było odtworzyć wzór chmur widziany na Pack.PNG, dzięki czemu liczba koordynatów niezbędnych do przeszukania w każdym świecie drastycznie malała.
  • Najtrudniejszym do wykonania zadaniem było odtworzenie obrazu w grze. Była to czynność wymagana do tego, by algorytm mógł zmapować stworzony w ten sposób teren i automatycznie przeszukać wszystkie możliwe światy w celu odnalezienia identycznego wzoru. Niestety, ze względu na niską rozdzielczość, grupa skupiona wokół projektu nie mogła dokładnie odtworzyć tego, co widać na obrazku – był on po prostu zbyt rozmazany. Jeden blok postawiony nie tam gdzie trzeba rujnował całą pracę. Dlatego też postanowiono skorzystać z narzędzia do upscale’ingu. I to nie byle jakiego, bo takiego wykorzystującego sztuczną inteligencję. Zespół graczy dostarczył mu 1,7 miliona screenów do treningu, dzięki czemu był on w stanie wiernie odtworzyć wygląd terenu w grze.
  • Po wykonaniu dokładnego modelu, przyszedł czas na szukanie. Oczywiście, nie chodzi tu o manualne przeszukiwanie wszystkich światów, a o próbę znalezienia chunku, który ukształtowaniem terenu odpowiadałby stworzonemu modelowi. Na tym etapie trzeba było wybrać, które elementy mogą w tym pomóc (drzewa, woda i kwiaty były umieszczane przez algorytm) a które nie (zwierzęta były umieszczane kompletnie losowo na mapie). Niestety, nie wiadomo było, gdzie na obrazku są granice chunku (kolumny o powierzchni 16×16 bloków), dlatego zespół musiał  stworzyć 16 wariantów, gdzie dane granice chunku mogłyby znajdować się w rzeczywistości (lepiej jest to wyjaśnione na filmie). Niestety, ta metoda, pomimo iż zajęła dużo czasu, okazała się ślepym zaułkiem, ponieważ na obrazie było zbyt dużo niewiadomych.

  • Postanowiono więc zastosować inną metodę, polegającą na automatycznym odtworzeniu świata bazując na tym, co widział gracz robiący oryginalny screen (pixel perfect). Do tego potrzebne było jednak więcej danych – oryginalna rozdzielczość obrazka, wiedza o tym z którego jego miejsca pochodzi wycięty fragment, kąt pod jakim była kamera i umiejscowienie samej kamery. Pomogli tu gracze z całego świata, dostarczając informacje odnośnie rozdzielczości monitora używanego przez deweloperów minecrafta, obliczając, jak duży był oryginalny plik bazując na artefaktach kompresji (dzięki temu wiadomo było że oryginalnie wycięty fragment miał 512×512 pikseli) a także, używając skomplikowanych formuł matematycznych, obliczyli położenie i kąt kamery oraz miejsce z którego wycięto wspomniany fragment. Dopiero w taki sposób udało się stworzyć replikę obrazu która była zgodna z oryginałem co do piksela.
  • Bazując na położeniu chmur względem bloków w końcu udało się odnaleźć jeden z koordynatów (Z) jednak drugi (X) wciąż pozostawał nieznany. Tutaj jednak wykorzystano znajomość sposobu generowania terenu (która przyznam się, przeraża nawet mnie) by zastosować wsteczną inżynierię tego procesu, ujawniając potrzebne koordynaty.
  • Znając koordynaty i mając wiedzę odnośnie specyficznych detali świata, zaczęło się mozolne przeszukiwanie światów, które pasowałyby do wzorca. Pomimo tego, że dużą część udało się wyeliminować, wciąż pozostawało 2 do 48, czyli ponad 281 bilionów (!) seedów do przeszukania. Tutaj znów pomogła społeczność. 3500 osób udostępniło zasoby swojego komputera (podobnie jak w przypadku Folding@home) do przeszukiwania światów na określonych koordynatach.

Finalnie, po 8 miesiącach pracy w którą zaangażowane było ponad 10 tys. osób – seed świata został znaleziony.

Jeżeli pobierzecie grę w wersji 1.2.2 (aczkolwiek, jak się okazało, działa to też w nieco późniejszych wersjach) do na seedzie 3257840388504953787 i koordynatach  x=49, z=0 znajdziecie dokładnie ten sam obrazek co na Pack.PNG. Inicjatywa ta oczywiście nie zmieniła świata, ale dla mnie pokazała, jak złożoną grą potrafi być Minecraft i ile mechanik stoi za tak wydawałoby się prostą produkcją. Jestem pełen podziwu dla determinacji SalC1 i poziomu wiedzy o grze wszystkich, którzy uczestniczyli w projekcie. Mam małą nadzieję, że dzięki takim projektom niektórzy zobaczą, że gra ta ma nieco więcej do zaoferowania niż tylko stawianie bloków.