Píšeme textovku, díl první

Píšeme textovku, díl první

Pro mladší generaci musím dodat: „Textovka“ tu neznamená SMS! 🙂

Už jsem se přiznal na Oldplayeru, že jsem v mládí spáchal pár textovek. Tedy textových her, abych byl přesný.

Vsuvka pro ty, co nevědí: Textová hra je taková hra, kde informace o herním světě není grafická (bludiště, krajina, herní deska), ale textová. V té nejznámější podobě (Adventure) funguje tak, že hráč si přečte popis lokace, toho, co v dané lokaci vidí, a napíše, co chce dělat (někam jít, sebrat nějaký předmět, použít ho…) Hra na to nějak zareaguje, a zase mu napíše, co se děje. Typ her jak stvořený pro textové terminály.

Textové hry postupem času nabídly i jednoduchou ilustrační grafiku, ikonky předmětů, grafické rozhraní, později možnost ovládání pomocí menu, ale základ je stále textová informace. Později vznikly, a jednu dobu byly velmi populární, grafické adventury, kde textový popis už nebyl, hráč pohyboval postavičkou v animovaném světě a pomocí myši zkoumal prostředí, manipuloval s ním a zadával pokyny. Určitě znáte hry jako Loom, Beneath the Steel Sky, Leisure Suit Larry, různé Police Questy a King’s Questy…

Ale zpátky k textovkám. K napsání tohoto článku mě přiměla diskuse o tvorbě textovek. Docela mě zarazilo, co tam diskutující psali, tak jsem se rozhodl sepsat, jak taková textovka vypadá „programátorsky“. Není to obtížné, pojďme na to.  Je úplně jedno, jaký jazyk k tomu použijete, vystačíte si klidně i s BASICem…

Co potřebujete?

  1. Seznam lokací. Potřebujete mít popis každé „místnosti“, který se vypíše, když do ní hráč vstoupí. U každé místnosti je potřeba mít i možné východy. K tomu poznámka: V textovkách se můžete pohybovat buď čtyřmi směry (Sever, Jih, Východ, Západ), šesti (S, J, V, Z, nahoru a dolů), osmi (světové strany + vedlejší světové strany), deseti (dtto + nahoru/dolů) nebo volně (kdy je směr určen popiskem, např. jako v Belegostu – „Můžete jít k hoře, do lesa nebo k potoku“). Místnosti jsou očíslované (doporučuju začít jedničkou) a pro každý směr si uložíte číslo místnosti, kam dotyčný dojde, když daný směr zvolí. Tento postup je mnohem jednodušší než se spoléhat na nějaké pravidelné členění plánku do mřížky apod.
  2. Seznam předmětů. Stejně jako u místností – každý předmět je očíslovaný a u každého je napsaný jeho název a popis. Zároveň je u každého předmětu informace o tom, kde se nachází, tedy buď číslo místnosti, kde ho hráč najde, nebo třeba 255, pokud předmět zatím „neexistuje“ a teprve ve hře „vznikne“.
  3. Speciální pravidla – k nim se ještě dostaneme.

Textovka začne inicializací – nastavíme si do proměnné, která ukládá informaci o lokaci, číslo výchozí lokace, do pracovní paměti si zkopírujeme výchozí pozice předmětů, mapu přechodů mezi místnostmi, a spustíme hlavní smyčku.

Hlavní smyčka nejprve vypíše informace o lokaci. Tj. vezme informaci z proměnné s pozicí, a vypíše odpovídající popis místnosti. Pak vypíše seznam předmětů, které hráč vidí – projede všechny pozice předmětů v pracovní paměti, a pokud je shodná s číslem lokace, vypíše jej. Pak vypíše informaci o tom, kam lze jít – zase k tomu použije informace z mapy přechodů. Pokud je ve hře nějaké specifické pravidlo, jako třeba že při vstupu do místnosti 26 spadne někde most, tak se tato pravidla v tuto chvíli ošetří a kdyžtak se vypíše hráči potřebná informace („Bum! Spadnul most!“)

Teď je řada na hráči, který zadá nějaký příkaz. Ovládání textových her je možné buď klasickým způsobem, kdy hráč píše na klávesnici, co se má dělat, nebo pomocí nějaké volby z přednastaveného menu. Ovládání textem bych nechal na příští díly (je potřeba řešit parsování příkazů), zůstanu u jednoduššího ovládání pomocí menu. Základní příkazy v každé textovce jsou:

  1. Pohyb. Buď pomocí světových stran, nebo pomocí popisných směrů (viz popis lokací). Najdu si číslo nové místnosti, uložím do proměnné s aktuální pozicí, a spustím znovu smyčku.
  2. Zvedni. Parametr je název určitého předmětu. Implementačně jednoduché: zkontroluju, zda je předmět opravdu v té lokaci, kde je i hráč, a pokud ano, v pracovní paměti zapíšu k danému předmětu pozici 0. Co je 0, to je „u hráče“. Vypíšu „Sebral jsi X“ a je to. Složitější hra bude mít například „nezvednutelné předměty“ nebo bude počítat s váhou, ale to na principu nic nemění. Pokud předmět v místnosti není, vypíšu „X nikde nevidíš“. Může existovat speciální pravidlo – pokud hráč sebere předmět X v místnosti Y, stane se to a to… Takže to ošetřím.
  3. Polož. Parametr je název určitého předmětu. Opak předchozího. Hráč musí mít předmět u sebe (tj. v paměti musí být pozice 0). Pokud ano, a nic tomu nebrání, tak zapíšu číslo aktuální lokace – tím ho přesunu „do místnosti“. Zase – je-li zapotřebí nějaké pravidlo, provedu ho teď.
  4. Prozkoumej. Parametr je název určitého předmětu. Předmět musí mít hráč buď u sebe (tj. pozice 0), nebo musí být ve stejné místnosti (tj. aktuální pozice). Jestli ano, vypíšu popis předmětu. U zkoumání jsou speciální pravidla častá – hráč prozkoumá truhlu, najde pergamen. Zase je projdu a pokud všechno sedí, provedu požadované.
  5. Použij. Parametr je název určitého předmětu, u složitějších her dvou předmětů (použij něco na něco). Tady není obecné pravidlo, co se má stát. Hra musí mít nadefinované pro každé možné použití vlastní speciální pravidlo („lze použít předmět X v místnosti Y, pokud tam je předmět Z, a pak se stane to a to“). Pokud pravidlo není, napíšu hráči, že předmět nelze použít.
  6. Inventář. Seznam věcí, co má hráč u sebe, je prostý – projdu si tabulku a vypíšu názvy předmětů, u kterých je pozice 0
  7. Rozhlédni se. Nic než skok na začátek smyčky, k výpisu místnosti.
  8. Speciální příkazy – save, load, konec atd. Save uloží pracovní paměť (tj. aktuální pozici, pozice předmětů a přechodovou mapu), load načte tyto proměnné, konec ukončí hru.

Několikrát jsem se odvolal na speciální pravidla. Pro ně nemůžu dát jednoznačný předpis, záleží na tom, jak je hra napsaná. Obecně jde o kombinace podmínek, které musí platit, pokud se má akce provést, a o vlastní akci. V podmínkách se kombinují podle potřeby následující požadavky:

  • Typ akce – jestli se má něco stát při příchodu, při zvednutí, položení, použití, prozkoumání…
  • Hráč musí být v určité lokaci / nesmí být v určité lokaci
  • Hráč u sebe musí / nesmí mít nějaký předmět
  • V téže lokaci musí / nesmí být nějaký předmět
  • … a další (např. lze využít interní čítače k nějakému odpočítávání apod.)

V případě, že jsou podmínky splněné, tak se stane jedna nebo více následujících akcí:

  • Zmizí předmět. Do pozice se zapíše 255 (nebo jiné číslo pro „neexistující pozici“)
  • Předmět se objeví, tj. do pozice se zapíše 0 nebo aktuální lokace
  • Otevřou / zavřou se dveře – technicky se to řeší zápisem do mapy přechodů mezi lokacemi.
  • … a další, například může přijít / odejít nějaká naskriptovaná postava apod.

Když akce proběhne, dostane o tom hráč zase informaci.

Příklad takového speciálního pravidla je třeba broušení sekery v Belegostu. Toto pravidlo by mohlo vypadat třeba takto:

  • POKUD 
    • je akce POUŽIJ 
    • a zvolený předmět je BROUSEK
    • a hráč má u sebe předmět TUPÁ SEKERA
  • TAK
    • předmět TUPÁ SEKERA zmizí
    • a předmět OSTRÁ SEKERA se přesune do inventáře (pozice=0)
  • a vypíše se hlášení o nabroušení sekery

Prosté, není-liž pravda?

Ve složitějších hrách budete používat nejrůznější čítače (počty kroků atd.) a k nim budou navázaná nějaká speciální pravidla, například pro časové zámky nebo pro pohyb postav… Ale výše popsané je kostra každé textové hry a stačí vám k tomu, abyste dokázali vytvořit jednoduchou textovou hru.

V dalším díle, pokud tedy bude zájem, napíšu něco o tvorbě scénáře, rozepíšu se o parsování příkazů, a pokud budete opravdu chtít, tak představím jednoduchý engine na tvorbu vlastních textovek.