← Visi ieraksti
← →

{ 2001 }

Doom RF: dzimšanas dienas dāvana, kas tapa divās nedēļās — un gadā

  1. gada 27. februārī es sāku veidot spēli kā dzimšanas dienas dāvanu klasesbiedram — divi draugi palūdza uztaisīt kaut ko, kas viņu sasmīdinātu. Pēc divām nedēļām Doom RF jau varēja spēlēt. Kopš tā laika es ticu: projekts, kas sākts februāra beigās, būs veiksmīgs.

Par pamatu es ņēmu Doom 2D un grafiku paņēmu no tā WAD faila. Dzinējs zīmēja 320×200 izšķirtspējā 256 krāsās. Spraiti tika iepriekš sadalīti vertikālās joslās, un katra josla nonāca videoatmiņā ar ātru atmiņas kopēšanu — triku, ko biju izgudrojis jau agrāk, veidojot Space War 2.

Doom RF spēles gaita

Doom RF spēles gaita, kadrs no mana YouTube video.

Pēc tam es gandrīz gadu turpināju to uzlabot. Lielākais ieguvums bija pāreja no Borland Pascal uz Free Pascal: ģenerētais kods darbojās vairākas reizes ātrāk, un pazuda 64 KB ierobežojums moduļa izmēram.

Free Pascal prata zīmēt arī 640×480 izšķirtspējā 256 krāsās — taču ar āķi. PutPixel bija lēns, bet tiešā piekļuve videoatmiņai sniedzās tikai līdz pirmajiem 64 KB ekrāna, aptuveni piektajai daļai. Tāpēc es apvienoju abus: viens PutPixel, lai draiveris pārslēgtu atmiņas banku, un pēc tam viss šīs bankas buferis tika ierakstīts ar parastu atmiņas kopēšanu.

Es to neatradu nevienā dokumentācijā — atklāju eksperimentējot: viena pikseļa uzzīmēšana pareizajā adresē lika draiverim pārslēgties uz nākamo banku, un no tā brīža parasta atmiņas kopēšana aizpildīja visu 64 KB bloku. Rezultātā grafika bija ļoti ātra.

Otrā problēma bija tastatūra. Spēlei jāzina, kuri taustiņi ir nospiesti tieši tagad, bet Free Pascal tiešā tastatūras ievade vienkārši nedarbojās. Tāpēc es uzrakstīju Turbo Pascal valodā sīku rezidentu programmu agent.exe — kādas trīsdesmit rindiņas. Tā pārtvēra tastatūras pārtraukumu, lasīja neapstrādātos skenēšanas kodus no tastatūras porta un uzturēja atmiņā tabulu ar 256 karodziņiem „vai šis taustiņš ir nospiests”, un pēc tam palika rezidenta režīmā. Startējot tā ierakstīja šīs tabulas atmiņas adresi (segmentu un nobīdi) mazā failā agent.mem. Spēle, kas bija kompilēta ar Free Pascal, vienreiz nolasīja adresi no faila un turpmāk skatījās tieši aģenta atmiņā, kuri taustiņi ir nospiesti. Divas programmas, divi kompilatori, viena kopīga tabula atmiņā.

Kas spēlē bija:

  • 4 spēlētāji pie viena datora un vēl līdz 8 botiem;
  • boti, kas pārvietojas pa maršruta punktiem;
  • teleporti;
  • starpainas starp līmeņiem;
  • līmeņu redaktors.
  1. gadā es to pārnesu uz 64 bitiem un SDL2, pievienoju skaņu un izlaidu kā pilnvērtīgu relīzi — lejupielādē to šeit.