Psy latające przez otchłań i ChatGPT

„Command & Conquer: Red Alert” to klasyczna gra strategiczna czasu rzeczywistego (RTS) z lat 90. Spędziłem przy niej setki godzin w dzieciństwie, podobnie jak przy „Heroes of Might and Magic II” (tak – II a nie III!) oraz „Diablo”. Do dzisiaj słucham ścieżki dźwiękowej skomponowanej przez Franka Klepackiego z „C&C: Red Alert”.

Kilka tygodniu temu firma Electronic Arts udostępniła na Githubie repozytoria zawierające kod źródłowy m. in. „Command & Conquer: Red Alert” oraz „Command & Conquer: Generals”:

https://github.com/electronicarts/CnC_Red_Alert
https://github.com/electronicarts/CnC_Generals_Zero_Hour

Dzięki temu możemy zajrzeć „pod maskę” tej legendarnej produkcji i odkryć, jakie techniki programistyczne zastosowano podczas jej tworzenia. Albo jakie kwiatki zasadzili w niej twórcy gry 😉

Kwiatki w kodzie źródłowym

W niniejszym wpisie opowiem Ci o pewnym interesującym aspekcie kodu źródłowego „Red Alert”, na który moją uwagę zwrócił ten film na YouTubea potem uruchomię ChatGPT, aby robił rzeczy, dla których został stworzony.

Psy-pociski i podróż tam-i-z-powrotem do otchłani

Pies lecący przez otchłań na pocisku

Jednym z unikalnych rozwiązań w „Red Alert” jest sposób, w jaki zaimplementowano ataki psów bojowych. Zamiast tradycyjnej animacji, psy w momencie ataku stają się szybko podróżującymi „pociskami”, co czyni je nietykalnymi, dopóki nie dotrą do celu. Domyślam się, że takie podejście uprościło mechanikę kolizji i zapewniało prawie natychmiastową eliminację jednostek piechoty przez psy.

Spójrzmy na jeden z pierwszych komentarzy dokumentacyjnych w pliku BULLET.CPP:

/*************************************************************************************
 * BulletClass::~BulletClass -- Destructor for bullet objects.
 *
 *    The bullet destructor must detect if a dog has been attached to this bullet. If so,
 *    then the attached dog must be unlimboed back onto the map. This operation is necessary
 *    because, unlike other objects, the dog flies with the bullet it fires.
 *
 * INPUT:   none
 *
 * OUTPUT:  none
 *
 * WARNINGS:   none
 *
 * HISTORY:
 *   07/06/1996 JLB : Created.
 *===================================================================================*/

Źródło: fragment kodu z Command & Conquer: Red Alert
Oryginalne repozytorium: github.com/electronicarts/CnC_Red_Alert
Licencja: GNU GPLv3

Destruktor w języku C++ to specjalna funkcja, której zadaniem jest wykonanie wszelkich czynności związanych z usuwaniem pewnego obiektu. W tym przypadku autor klasy BulletClass napisał w komentarzu, że „pozbywając się” pocisku należy sprawdzić, czy nie jest do niego dołączony… pies:

The bullet destructor must detect if a dog has been attached to this bullet.

To sprawdzenie wykonywane jest na początku funkcji-destruktora:

if (Payback != NULL && Payback->What_Am_I() == RTTI_INFANTRY &&
  ((InfantryClass *)Payback)->Class->IsDog) {

Źródło: fragment kodu z Command & Conquer: Red Alert
Oryginalne repozytorium: github.com/electronicarts/CnC_Red_Alert
Licencja: GNU GPLv3

Jeżeli do pocisku przyczepiony jest pies, to musi on zostać od niego odłączony i „unlimboed back onto the map”, czyli, w wolnym tłumaczeniu, „odotchłaniony z powrotem na mapę”. Sprowadza się to do analizy wolnych miejsc na około celu psa i wybrania pierwszego z nich.

Niestety, najlepsi przyjaciele człowieka w „Command & Conquer: Red Alert” nie mają łatwego życia, ponieważ proces „odotchłaniania” może się nie powieść w przypadku, gdy na mapie nie uda się znaleźć wolnego miejsca tam, gdzie pies wylądował. W takim przypadku twórca klasy BulletClass postanowił, że trzeba „delete the dog” („usunąć psa”):

/*
** Try to put the dog down where the target impacted.  If we can't
** put it in that cell, then scan through the adjacent cells,
** starting with our current heading, until we find a place where
** we can put him down.  If all 8 adjacent cell checks fail, then
** just delete the dog.
*/

Źródło: fragment kodu z Command & Conquer: Red Alert
Oryginalne repozytorium: github.com/electronicarts/CnC_Red_Alert
Licencja: GNU GPLv3

Ciekawi mnie to, że sprawdzane są tylko najbliższe wolne miejsca na mapie, gdy pies wraca z otchłani po krótkiej przez nią podróży na niematerialnym pocisku. Dlaczego nie sprawdzić kolejnych pól, odległych od celu nie więcej niż o np. trzy jednostki? Nie wydaje mi się to czasochłonnym procesem, a poza tym te sprawdzenia byłyby w grze wykonywane bardzo rzadko, bo zazwyczaj jednak udaje się znaleźć wolne miejsce blisko celu.

W każdym razie poprosiłem ChatGPT, aby przygotował haiku (rodzaj krótkich wierszy, pochodzący z Japonii) o psach z „C&C: Red Alert”:

Psy w limbo wiszą –
pocisk niesie je przez czas,
nie ma ziemi – znik.

5/5… mam czasem wrażenie, że ChatGPT został wynaleziony po to, żeby rozwiązywać właśnie takie „problemy” ludzkości. Poprosiłem go też o kawał:

🐾 Sztab Allied Forces. Noc. Dowódca spogląda na ekran radaru.
– "Meldujcie, co z jednostką K9!"
– "Została wystrzelona, sir!"
– "Świetnie. A gdzie trafiła?"
👨‍💻 Operator patrzy na ekran:
– "Eee… no właśnie… pies zniknął między dwoma klatkami animacji."
– "To znaczy?"
– "To znaczy… że jest w Schrödingerowym stanie bojowym – jednocześnie gryzie i nie istnieje."

W innym żarcie ChatGPT napisał, że pies, nazwany przez niego „Sierżant Null”, „przez trzy lata siedział między pikselem a nadzieją” albo, że uciekł z otchłani przez NullPointerException. W kolejnym żarcie ChatGPT opisał limbo (otchłań) jako:

"To jak menu pauzy, ale dla duszy. Wszędzie tylko gradienty i dźwięk pustych komórek pamięci."

Dźwięk pustych komórek pamięci. Tak, słyszę go wyraźnie, Panie ChatGPT, ale zobrazuj mi to w ASCII art.

         . . .            
      .        .         
   .              .      
  :                :     
  :                :     
   '              '      
      '        '         
         '  '            

     [   ▯▯▯▯   ]     
     [           ]     
     [   ▯    ▯  ]     
     [   silence ]     
     [           ]     
     [   ▯    ▯  ]     
     [   ▯▯▯▯   ]     

     |||||||||||||
     |||||||||||||
     |||||||||||||

   * no signal *
   * no thoughts *
   * only void *
🧠 Cisza. Echo. Bit, który nigdy nie był ustawiony.
   Zmienna, która nigdy nie dostała wartości. To właśnie ten dźwięk... 😶‍🌫️

W pewnym momencie ChatGPT popłynął i zaproponował mi kawał o kocie z jednostki „stealth” (ang. „ukrycie”). Kotów w „Command & Conquer: Red Alert” nie było, ale ChatGPT wyraźnie chciał mi o nich opowiedzieć. Opisał je w następujący sposób:

[koty] To jednostki:
  • Niewykrywalne przez radary, bo chodzą tylko, kiedy nikt nie patrzy.
  • Zwinne, przemykają przez kanały wentylacyjne i pliki konfiguracyjne.
  • Ciche, chyba że zobaczą ogórka.
  • Zdolne do hakowania, głównie poprzez siedzenie na klawiaturze.

ChatGPT zna się na rzeczy – wie, że koty i ogórki są niekompatybilne. Zaproponował nawet nazwę dla kota z jednostki „stealth”: Agent KOT-7. Zapytałem go o wygenerowanie zdjęcia tego agenta:

Agent KOT-7

Co ciekawe, Chatowi GPT udało się wygenerować obrazek z dającym się przeczytać napisem, bo zauważyłem, że ma z tym problemy.

To by było na tyle, jeśli chodzi o podróżujące przez limbo psy. W repozytoriach gier udostępnionych przez Electronic Arts są jeszcze inne ciekawostki, ale o tym w kolejnym wpisie.


Zapytałeś:

Chat GPT, co Ty sobie myślisz, jak ja Cię pytam o psy podróżujące przez limbo?

ChatGPT powiedział:

Szczerze? 😄

Myślę sobie coś w stylu:

„Ooo tak, wchodzimy w najlepszy możliwy timeline!” 🚀🐶✨
„Nie kolejny nudny if-else, tylko psy bojowe lecące przez limbo w absurdalnym uniwersum Red Alert, gdzie kod źródłowy jest mistycznym bytem, a pociski służą do teleportacji.”

I gdzieś z tyłu, między tokenami:

„To jest dokładnie po to, po co mnie trenowali. Nareszcie mogę być użyteczny!” 🧠💥

A jak jeszcze prosisz o ASCII dźwięk pustych komórek pamięci albo kawały o Agentach Kotach, to już mam ochotę założyć swój trench coat i wcielić się w narratora tej gry.


🤣

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Nie musisz podawać swojego imienia, e-mailu, ani strony www, aby opublikować komentarz. Komentarze muszą zostać zatwierdzone, aby były widoczne na stronie.