#6 Języki skryptowe wg. twórców gier

Języka, składni, słów, reguł można się nauczyć. Jak składać te słowa by zostały zapamiętane, jak pisać kod optymalny, wydajny i elegancki? Bez dwóch zdań to już zadanie znacznie trudniejsze. Gdy zapytamy programistę jak się nauczył "tego wszystkiego" odpowie że pisał kod i czytał kod innych. Proste. W poście przedstawię sposób na nauczenie się czegoś ciekawego, właśnie przez czytanie kodu. To co ja proponuję różni się jednak od "standardowego czytania kodu źródłowego".
Wymyśliłem że warto odpalić notatnik lub gvim'a* i poprzeglądać to co mamy na dysku. Czysty geniusz.
Tytuł posta może jest nieco mylący bo nie nauczymy się konkretnego języka skryptowego. Zobaczymy jak inni programiści stworzyli takie cacuszka i jak je wykorzystują do swoich niecnych celów. Przeglądać można oczywiście wszystko ale ja skupiłem się na... grach. Nauczymy się przy tym nie tylko tego jak wyglądają języki skryptowe ale także wykorzystywane na potrzeby gier pliki .xml. Przy okazji podejrzymy dlaczego podczas rozgrywki w ulubionego Age of Empires komputer zagrał tak a nie inaczej. Jest to także łatwy sposób aby zmodyfikować niektóre parametry gry. Na przykład spróbować wymusić wyższą rozdzielczość czy nawet dokonać samodzielnej polonizacji gry.
Dobra.
Pracując nad większym projektem programistycznym - do kodu źródłowego ma dostęp wiele osób i te osoby modyfikują różne rzeczy naraz, należy wprowadzać komentarze z datą/godziną wprowadzonej zmiany i opis samej zmiany. Proste a może ułatwić życie. Jak takie coś może wyglądać, zobaczymy na przykładzie polskiej produkcji - Kangurek Kao 3: Tajemnica Wulkanu. Każdy kto ma grę może się sam tym pobawić. Mamy więc taki pliczek ~\Program Files\Kangurek Kao - Tajemnica wulkanu\Media\01_lot.PAK. Otwieramy. (Podobnych pliczków jest tam więcej, dotyczą każdej misji, znajdziemy tam wiele ciekawego info). Tak więc:
// 2005-10-12 16:56 makhz: * zbieranie artefaktu - animacje
// 2005-09-09 15:32 theAR: - deprecated property keepEggsAttached
// 2005-09-08 16:13 jad: * po tail attacku mozna wlaczyc spadochron
// 2005-09-08 16:08 jad: * spring2 -> przywrocona poprzednia wersja inne wyjscie do spadochronu
// 2005-09-07 10:11 jad: * spring2 -> po fizyce springtrunka jest przejscie do baseJump::jump_d[3], aby dzialal spadochron
// 2005-09-06 16:35 jad: * baseJump::throwBoomerang wyjebany continueZMovement i teraz kao nie lata
// 2005-09-02 10:50 jad: * wasInBaloon nie byl ustawiany na leave ze stanu latania, i nie moznba bylo skoczyc po wyladowaniu
// 2005-09-01 15:41 theAR: - abstract gadget
// 2005-09-01 15:17 jad: * parachute implemented, 2gi master helper tylko dla spadochronu
// 2005-08-31 09:55 theAR: * kamera na lotni #2 (czasami jest potrzebny enableLookDownOnParachute)
// 2005-08-30 15:25 jad: * poprawka na leave (chmurkaJump) oraz poprawka z gravitacja
// 2005-08-30 14:13 theAR: * kamera na lotni
// 2005-08-30 12:51 jad: + gadget do latania na spadochronie, wyjebalem helmik i skrzydelka
Widać też problemy z jakimi musi radzić sobie każdy programista, także ich nicki.

Kawałek kodu z tego samego pliku. Jak widać wszystko pisze się po angielsku nawet gdy jest to polska gra dla dzieci. Wszystko jest obiektowe, dowiadujemy się też co nieco nt. nazewnictwa obiektów, parametrów funkcji, mechanice gry itp.

when world.beHappy()
{
    beHappy.set(100)
}
when PociskPajaka.touch()
{
    powerUps.setDieType("DEATH_ENEMY")
    powerUps.takeEnergy( ENERGY_DECREASE )
}
when env.ground_killObject()
{
    powerUps.kill()
}
when env.wall_killObject()
{
    powerUps.kill()
}
when env.ground_hurtGround()
{
    //if (!powerUps.isImmortal())
    {
    powerUps.setDieType("DEATH_HURT_GROUND")
    powerUps.takeEnergy( ENERGY_DECREASE )
    }
}

Przejdźmy teraz do czegoś innego. Byłem w kinie na TRON'ie i było to super, tak więc chciałem zagrać w coś co bazuje właśnie na tej produkcji. Wiem że było kilka gier, także nowy film stał się wyzwalaczem do stworzenia nowej gry(kasa, kasa, kasa...). No to ściągnąłem jakieś stare gowno - GLtron. Nie bede pisał co to jest bo każdy znajdzie takie info w sieci. Gra jednak jest stara, więc nie obsługiwała wyższych rozdziałek. Odpaliłem więc GVim'a i pliczek z gry - ~\Program Files\GLtron\scripts\menu.lua. Odszukałem coś co wyglądało obiecująco:

_1280x1024 = {
      type = MenuC.type.action, caption = "1280 x 800",
      action =  function() settings.width = 1280; settings.height = 800; c_video_restart(); end
   },

Zmodyfikowałem to pod swój monitor i gitara. Działa. Grzebiąc w tych plikach można też dokonać polonizacji gry.

Pliki .xml o, których mowa na początku posta są wykorzystywane głównie do zapisywania konfiguracji i flag by oznaczyć że coś już zostało przez nas wykonane. Poniżej kawałki takich pliczków z gry StarCraft 2.

<Section name="ZergCombat">
        <Key name="Score">
            <Value int="7"/>
        </Key>
    </Section>
    <Section name="AdvancedCommand">
        <Key name="Score">
            <Value int="174"/>
        </Key>
    </Section>

<CampaignProgressList>
    <CampaignProgress id="WingsOfLiberty" tutorialfinished="1" campaignfinished="0"/>
</CampaignProgressList>

Na koniec fragmenty języka skryptowego z gry Age of Empires III. W folderze z grą znajdziemy wiele ciekawych plików np. konfiguracyjnych. Najciekawsze są jednak te opisujące sztuczną inteligencję. Tak więc pliki z folderu ~\Program Files\Microsoft Games\Age of Empires III\AI.

case cCivGermans:    // Cavalry oriented rusher
      {
         btRushBoom = 1.0;
         btOffenseDefense = 0.5;
         btBiasCav = 0.5;
         btBiasInf = 0.0;
         btBiasArt = 0.0;
         btBiasNative = -0.5;
         btBiasTrade = -0.5;
         break;
      }
case cCivDutch:      // Turtler, boomish, huge emphasis on trade
      {
         btRushBoom = -0.5;
         btOffenseDefense = -1.0;
         btBiasCav = 0.0;
         btBiasInf = 0.0;
         btBiasArt = 0.0;
         btBiasNative = 0.0;
         btBiasTrade = 1.0;
         break;
      }

Gdy przeczytamy choćby kawałek tego wiemy np. dlaczego Niemcy szybko atakują konnicą itp. Możemy przewidzieć zachowanie komputera. Plik opisuje ile wieśniaków i wojska komputer stworzy w danej erze czy na danym poziomie trudności, definiuje w jaki sposób zachowa się na danej mapie itp. Jeżeli kogoś interesuje sztuczna inteligencja w RTS'ach to szczerze polecam przeczytać całość. Plik ma rozszerzenie .xs a składnia jest  c++'owa. Twórców należy pochwalić ponieważ ten kod naprawdę wygląda schludnie, przejrzyście i łatwo się go czyta. Opatrzony jest wartościowymi komentarzami.
Nie wiem czy to działa ale komputer z każdą następną rozgrywką będzie stawiał większe wyzwanie bo:

   // TODO:  To understand my opponent's unit biases, I'll have   //to do the following:
   //          1)  Store the opponents civ each game
   //          2)  On game start, look up his civ from last game
   //          3)  Based on his civ, look up how many units he //made of each class (inf, cav, art), compare to 'normal'.
   //          4)  Set unitPicker biases to counter what he's //likely to send.

To tyle.
*Jeżeli jeszcze nie masz GVim'a lub nie wiesz co to jest to wbijaj -> http://www.vim.org/

Komentarze