„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 😉

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 YouTube… a potem uruchomię ChatGPT, aby robił rzeczy, dla których został stworzony.
Psy-pociski i podróż tam-i-z-powrotem do otchłani

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:

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.
🤣