Jak vytvořit vlastní textovku aneb TGI a TGE2 v praxi

Jak už vešlo ve všeobecnou známost, pořádá tento server letošní rok první textovkářskou soutěž, a to hned ve dvojí podobě. Tento článek je určen pro všechny, kteří s tvorbou textovek žádné zkušenosti nemají, zato ale mají v hlavě vynikající scénář a chtěli by ho proměnit v nadějný příspěvek do soutěže. Ukážeme si, jaké možnosti nám nabízejí dva programy pro tvorbu textovek, které jsou zde volně ke stažení.

Na úvod si dovolím upřesnit, že veškeré níže uváděné poznatky vycházejí z těch verzí představovaných programů, které v době jeho sepsání byly autory naposledy publikovány. V případě TGI se jedná o verzi 1.05 a v případě TGE2 o verzi 1.00. TGE2 je na tomto serveru již delší dobu ke stažení. Pokud jste se s programem TGI doposud nesetkali, tak vězte, že se jedná o interpreter, na kterém běží hra Filipíny 1945 a který tu již je, nebo co nejdříve bude samostatě ke stažení v sekci Editory her. (Pokud tu ještě není, stáhněte si ho operativně z mých stránek).

Domnívám se, že schopnosti a postupy obou nástrojů si nejlépe představíme na kratičké demonstrační hře. Scénář této minihry je následující: Hladový otec, povalující se v obýváku na pohovce, nás požádal, abychom mu z lednice přinesli naložené syrečky. Lednice se samozřejmě nachází v kuchyni. Problém ale je, že naložené syrečky ukrutně páchnou, a tak se do „zamořené“ lednice jen tak nedostaneme. Naštěstí nalezneme pod pohovkou plynovou masku, kterou si nasadíme a nyní již bez problému lednici otevřeme a syrečky vyndáme. V okamžiku, kdy je dáme otci, hra končí. Je to samozřejmě otřesná pitomost, ale pro naše účely to plně postačí.

Scénář si nyní rozklíčujeme na jednotlivé komponenty budoucí textové hry. Tak jednak tu máme dvě různé místnosti, a to obývák a kuchyň, které jsou vzájemně propojeny. Pak tu máme hromadu objektů (předměty a osoby), tj. pohovka, otec, maska, lednice, syrečky. A konečně tu máme „akce“, které s objekty můžeme provádět. Každý objekt by se především měl dát prozkoumat, ostatně teprve prozkoumáním pohovky objevíme masku. Některé objekty by se měly dát vzít (maska, syrečky). Dalšími akcemi budou otevírání lednice, nasazení masky a předání syrečků otci. Nejzajímavější a nejkomplikovanější akcí bude otevírání lednice, neboť její průběh se bude lišit podle toho, zda máme nasazenou masku či ne a také podle toho, zda v ní ještě syrečky jsou, nebo už jsme je sebrali.

A nyní si již podrobně ukážeme to nejdůležitější, totiž to, jak tyto jednotlivé komponenty sestavíme do skriptu, kterému bude TGI resp. TGE2 rozumět a podle kterého budou tyto interpretry realizovat naší hru. Oba skripty mají formát prostého textu a můžeme je „sepisovat“ v jakémkoliv rozumném textovém procesoru. Oba hotové, funkční skripty si můžete stáhnout z mých stránek: skript pro TGI tady a skript pro TGE2 tady.

1) TGI

TGI nám ve zkratce umožňuje realizovat textovou hru, která bude rozumět výhradně těmto příkazům: vezmi, pouzij, zkoumej, s, j, z, v, inventar, text, konec, uloz a nacti. To znamená, že například k otevření lednice povede ve hře příkaz „pouzij lednici“, masku si nasadíme příkazem „pouzij masku“ a syrečky dáme otci příkazem „pouzij syrecky na otce“.

Veškeré komentáře, kterými si budeme při sestavování skriptu pomáhat, abychom se v něm později snadno zorientovali, začínají dvěma lomítky: „//“. Interpreter tyto komentáře přeskakuje, takže nemají naprosto žádný vliv na průběh skriptované hry. My si umístíme komentář hned na první řádek skriptu a bude představovat jakousi informační hlavičku:

// Toto je skript určený pro interpreter textových her TGI

První řádek skriptu, který není komentář, je povinná identifikace skriptu a má tuto podobu: „identifikace = „““. V naší minihře to bude vypadat takto:

identifikace = „Demo hra Syrecky“

Nyní budeme definovat jednotlivé objekty hry. Začněme nejprve místnostmi, či univerzálně (a v souladu se syntaxí skriptu) lokacemi. Každá lokace má především svůj „název“ a svůj „popis“. Obsah těchto položek je myslím každému jasný. Dalším jejím atributem jsou „směrové ukazatele“, které udávají, kam se z této místnosti můžeme dostat, půjdeme-li na sever, na jih, na západ nebo na východ; položky jsou označeny jako „s“, „j“, „z“ a „v“ a udávají se jen ty, které jsou aktivní. Tímto ukazatelem není nic jiného, než jméno nějakého (definovaného) objektu typu lokace. Poslední položkou s názvem „kam“ je slovní vymezení odkazu na místnost (např. u „hospody“ by to bylo třeba „do hospody na pivko“).

Jak jsme si již řekli, budeme mít v naší hře dvě místnosti, a to obývák a kuchyň. Umístíme je tak, že kuchyň bude ležet na východ od obýváku. Do našeho skriptu zavedeme tyto místnosti takto:

kuchyn: lokace
{
kam = „do kuchyne“
nazev = „Kuchyn“
popis = „Jsi v kuchyni. Nadobi je tyden nemyte a vrsi se nerusene ve drezu.“
z = „obyvak“
}

obyvak: lokace
{
kam = „do obyvaku“
nazev = „Obyvak“
popis = „Nachazis se v obyvaku. Rozvrzana sedacka je jediny kus nabytku“
„ktery tu momentalne je.“
v = „kuchyn“
}

Zdůrazňuji, že je naprosto nutné dodržovat přesně syntaxi. To znamená, že všechny položky příslušného objektu musí být uzavřeny mezi složené závorky {}, všechny „hodnoty“ položek musí být uzavřeny v uvozovkách „“ apod.!

Až budete dělat vlastní hru, budete možná chtít, aby se propojení mezi některými místnostmi realizovala až v jejím průběhu, například jako důsledek toho, že hráč odemkl nějaké dveře apod. Řekněme například, že hráč otevřel tajné dveře a díky tomu se může z místnosti 1 dostat na jih do místnosti 2 (a naopak z místnosti 2 na sever do místnosti 1). To se v příslušné části skriptu udělá jednoduše takto (mistost1 a mistnost2 jsou objekty typu lokace):

mistnost1.j = „mistnost2“
mistnost2.s = „mistnost1“

Stejně tak můžeme v průběhu hry změnit popis lokace. Toho docílíme tímto přiřazením v příslušné části skriptu:

mistnost1.popis = „nový popis místnosti 1“

Teď si do hry zavedeme předměty, což je ve skriptovacím jazyce TGI další druh objektů. Objektem typu předmět (pozor syntaxe je bez háčku!) bude i „otec“. Každý předmět má opět svůj „popis“ (to je ten text, který se bude běžně vypisovat při zadání příkazu „prozkoumej predmet“ a svůj „název“. Dále má předmět atribut „lzevzit“, jehož hodnota je buď „ano“, pokud daný předmět můžeme sebrat (v našem případě např. maska), anebo hodnotu „ne“, pokud předmět sebrat nelze (např. lednice). Dalším atributem je místo, kde se předmět nachází, tj. položka „kde“. Této položce buď můžeme přiřadit jméno nějakého objektu typu lokace (např. lednice je v kuchyni, takže lednici přiřadíme: kde = „kuchyn“), anebo jednu ze dvou speciálních hodnot: „#hrac“ a „#nikde“. Hodnota „#hrac“ samozřejmě znamená, že daný předmět má naše herní postava u sebe (v průběhu naší minihry to bude maska a syrečky). Hodnota „#nikde“ pak značí, že předmět neleží ani v žádné lokaci (tj. neleží v lokaci přímo „na podlaze“), ani jej nemá postava u sebe (v naší hře to je maska, která je schovaná pod pohovkou, a syrečky, které jsou v lednici). Posledním atributem „co“ je čtvrtý pád názvu předmětu, který se bude používat v příkazech hry a v definicích akcí (např. maska má „co“ rovno „masku“, takže hra bude ve vztahu k tomuto objektu rozumět příkazům „vezmi masku“, „pouzij masku“, „zkoumej masku“). Do našeho skriptu zavedeme předměty takto:

otec: předmět
{
kde = „obyvak“
co = „otce“
nazev = „Otec“
popis = „Tak takhle bys za tricet let vypadat nechtel…“
lzevzit = „ne“
}

maska: předmět
{
kde = „#nikde“
co = „masku“
nazev = „Plynova maska“
popis = „Pochazi z davne minulosti.
Je s podivem, ze stale drzi pohromade.“
lzevzit = „ano“
}

pohovka: předmět
{
kde = „obyvak“
co = „pohovku“
nazev = „Pohovka“
popis = „Pamatuje prijezd ruskych vojaku do Prahy. Neni jiste, zda ten prvni“ „nebo az ten druhy.“
lzevzit = „ne“
}

lednice: předmět
{
kde = „kuchyn“
co = „lednici“
nazev = „Lednice“
popis = „Prastara, vecne chrcici >>mrazici skrin<< znacky CALEX.“
lzevzit = „ne“
}

syrecky: předmět
{
kde = „#nikde“
co = „syrecky“
nazev = „Nakladane syrecky“
popis = „Olomoucke tvaruzky nalozene ve svetlem pive.“
lzevzit = „ano“
}

Hodnoty atributů můžeme opět měnit v průběhu hry. A nyní již pojďme k tomu, co naší hře „vdechne život“. Jedná se o „akce“. Na úvod si stručně představíme všechny instrumenty, pomocí kterých se akce realizují:

_promenna … všechny proměnné, které ve skriptu použijeme, mají tuto závaznou syntax; proměnné budeme používat jako indikátory stavů (např. zda má postava masku nasazenou nebo nenasazenou)

if (podmínka) {} … pokud je splněna podmínka, provede se kód skriptu obsažený v bloku mezi složenými závorkami; v podmínce porovnáváme atribut nějakého objektu nebo obsah nějaké proměnné s nějakou hodnotou nebo s obsahem jiné proměnné či atributem jiného objektu; rovnost se vyjadřuje posloupností „==“, nerovnost posloupností „!=“

tisk = „“ … vypíše se text mezi uvozovkami

stop … kód skriptu obsažený v těle akce za příkazem stop se již neprovede

= … znamená přiřazení; např. proměnné přiřadíme nějakou hodnotu

Speciální akcí je „start“. V rámci této akce provedeme inicializaci použitých proměnných (tj. přiřadíme jim počáteční hodnotu), dále zde povinně (!) stanovíme, ve které místnosti se postava nachází a popřípadě vypíšeme nějaký úvodní text. V našem konkrétním případě má akce „start“ tuto podobu:

akce: start
{
_syrecky = „0“ // 0 = jsou v lednici, 1 = nejsou v lednici
_maska = „0“ // 0 = nenasazena, 1 = nasazena
_nalez = „0“ // 0 = maska nenalezena, 1 = maska nalezena
tisk = „Toto je kratka demonstracni hra k interpretru TGI.“
tisk = „“
tisk = „Vasim ukolem je donest nalozene syrecky hladovemu otci.“
tisk = „“
#hrac.kde = „obyvak“
}

Ve hře budeme používat tři proměnné, a to _syrecky, _maska a _nalez. Pokud bude v proměnné _syrecky uložena hodnota „0“, bude to znamenat, že syrečky jsou stále v lednici. Hodnota „1“ pak bude značit, že syrečky již v lednici nejsou. Počáteční hodnota proměnné je „0“. Proměnná _maska nám zase bude indikovat to, zda má postava masku nasazenou (tomu odpovídá hodnota „1“), nebo nenasazenou (hodnota „0“). Počáteční hodnota je pak samozřejmě „0“ (masku ani na začátku nemáme). Poslední proměnnou již jistě pitvat netřeba, stačí si přečíst komentář. Dále se vytiskne úvodní text. Pokud jsou uvozovky prázdné, vynechá se při výpisu řádek. Posledním přiřazením určíme, že postava začíná v lokaci „obyvak“.

TGI má přednastavené akce (default) pro příkazy „zkoumej“ a „vezmi“. V případě příkazu „zkoumej“ zkontroluje, zda je předmět, na který se odvoláváme, dostupný (tj. zda se nachází v lokaci, kde je naše herní postava, nebo zda ho má postava u sebe), a pokud ano, tak provede výpis položky „popis“ tohoto předmětu. Pokud ne, vypíše hlášku, že akci provést nelze. U příkazu „vezmi“, zkontroluje, zda se předmět, na který se odkazujeme, nachází v lokaci, kde je naše herní postava, a zda má vlastnost „lzevzit“ nastavenu na hodnotu „ano“. V tom případě umožní postavě předmět vzít (tj. nastaví predmet.kde = „#hrac“ a vypíše hlášku o tom, že byl předmět sebrán. V opačném případě vypíše hlášku, že danou akci provést nelze. V naší hře si plně postačíme s defaultním průběhem příkazu „vezmi“. I u příkazu „zkoumej“ nám bude vyhovovat defaultní průběh s jedinou výjimkou, a tou je samozřejmě prozkoumání pohovky. Tam nám totiž nestačí jen její popis, ale u této akce i chceme, aby v případě, že maska je doposud ukryta, byla postavou nalezena. Akci, která má proběhnout po zadání herního příkazu „zkoumej pohovku“, si tedy „naskriptujeme“ takto (dobře si prohlédněte syntax):

akce: zkoumej pohovku
{
tisk = „Pamatuje prijezd ruskych vojaku do Prahy. Neni jiste, zda ten prvni“ „nebo az ten druhy.“
if (_nalez == „0“) // kdyz maska doposud neobjevena
{
maska.kde = „obyvak“
_nalez = „1“
tisk = „Nalezl jsi masku! A to masku plynovou, nikoliv maskarni.“
}
}

Co se stane? Tak v první řadě se samozřejmě vypíše text popisující pohovku. (Pozor! Není možné to napsat takto: „tisk = pohovka.popis“.) Pak následuje blok kódu uzavřený do složených závorek, který se provede pouze tehdy, bude-li splněna podmínka v kulatých závorkách. V podmínce zjišťujeme, zda proměnná _nalez obsahuje hodnotu „0“, což jsme si ujednali, že bude indikovat stav, kdy maska ještě objevena nebyla. V případě splnění podmínky umístíme masku do lokace „obyvak“, do proměnné _nalez vložíme hodnotu „1“ (indikuje, že maska již byla nalezena) a vypíšeme text o nalezení masky.

Poznámka: V naší jednoduché hře jsme ani proměnnou _nalez zavádět nemuseli, neboť to, že maska nebyla objevena, nám stejně dobře může indikovat hodnota „#nikde“ obsažená v položce maska.kde. Podmínka a jí příslušný blok by pak vypadaly takto:

if (maska.kde == „#nikde“) // kdyz maska doposud neobjevena
{
maska.kde = „obyvak“
tisk = „Nalezl jsi masku! A to masku plynovou, nikoliv maskarni.“
}

Uděláte ale jen dobře, když budete používat výhradně první způsob, tj. zavedení zvláštní proměnné.

Poslední typ akce odpovídá hernímu příkazu „pouzij“. Zde interpreter automaticky ověřuje, zda předmět rersp. předměty u příkazu „pouzij na “ je dostupný (tj. nachází se buď ve stejné lokaci, jako naše herní postava, nebo ho má herní postava přímo v držení). Nejprve si ukážeme skript akce, která se má provést po zadání herního příkazu „pouzij masku“. Budeme uvažovat, že tímto příkazem by si měl hráč masku nasadit, pokud ji doposud nasazenou nemá, anebo naopak sundat, pokud ji již nasazenou má. Proměnná, která nám tento stav indikuje, je _maska. Skript vypadá takto:

akce: pouzij masku
{
if (_maska == „0“) // kdyz maska nenasazena
{
_maska = „1“ // promenna nove indikuje stav – nasazena
maska.kde = „#hrac“ // nasazena maska je vzdy u hrace
tisk = „Nasadil sis masku.“
stop // nutne, aby neprobehl zbytek naskriptovane akce
}
_maska = „0“ // promenna nove indikuje stav – nenasazena
tisk = „Sundal sis masku.“
}

Pokud je podmínka splněna (tj. maska nenasazena), provede se blok skriptu mezi složenými závorkami: naše proměnná _maska se nastaví na hodnotu „1“ (což indikuje, že maska je nasazena); dále se maska umístí do držení hráče, a to pro případ, že by tam doposud nebyla a jen ležela v lokaci, kde se herní postava nachází; vypíše se text „Nasadil sis masku“. Poslední je důležité klíčové slovo „stop“. To říká, že provádění akce se zastaví, nebo-li vše ostatní, co se nachází ve skriptu za slovem „stop“ se už vyhodnocovat nebude (samozřejmě v rámci akce, nikoliv celé naší naskriptované hry)! Pokud podmínka splněna není, přeskočí se blok ohraničený složenými závorkami. Vzhledem k tomu, že v našem případě existují jen dva možné stavy masky (nasazená, nenasazená) a tedy jen dvě různé hodnoty proměnné _maska, jsme v situaci, kdy je jednoznačné, že maska je nasazena. Náš skript tedy nastaví proměnnou _maska na hodnotu „0“ (tj. maska nenasazena) a vypíše text „Sundal sis masku.“

Předpokládám, že je jasné, proč bylo nutné využít klíčového slova „stop“. Pokud bychom totiž tak neučinili, hráč by si podle skriptu nasadil masku a hned by si ji zase sundal!!!

Nyní jsme už dostatečně připraveni na to, abychom se pustili do nejsložitější akce. Je to ta, která má proběhnout po zadání příkazu „pouzij lednici“ (tj. otevírání lednice). Zde je příslušný skript:

akce: pouzij lednici
{
if (_syrecky == „1“) //Uz sebral syrecky z lednice?
{
tisk = „V lednici uz nic zajimaveho neni!“
stop
}
// nasledujici cast probehne, jen jsou-li syrecky doposud v lednici
if (_maska == „0“) //Ma nasazenou masku?
{
tisk = „Sotva jsi otevrel dvere lednice, vyvalil se ven takovy puch,“ „ze jsi malem omdlel. Jesteze jsi dvere zase rychle zavrel!“
stop
}
// nasledujici cast probehne, jen jsou-li syrecky doposud v lednici a ma
// nasazenou masku
tisk = „Otevrel jsi lednici. Diky nasazene masce ti puch valici se z ni ven“ „pranic neskodil. V klidu jsi lednici prohledal a objevil nakladane“ „syrecky. Vzal jsi je a lednici zase zavrel.“
_syrecky = „1“ //Indikuje, ze syrecky uz sebrany
syrecky.kde = „#hrac“ //Syrecky jsou nyní v drzeni hrace.
}

Myslím, že komentáře u skriptu vám již budou zcela dostačovat k jeho pochopení Podívejte se zejména na to, jak jsou jednotlivé bloky skriptu seřazeny a uvědomte si při tom nutnost uplatnění klíčového slova „stop“!

Poslední akcí v naší hře bude ta, která proběhne po zadání příkazu „pouzij syrecky na otce“. Touto akcí bude hra dokončena. Toho ve skriptu dosáhneme tímto přiřazením: #hrac.kde = „#konec“. Akci realizujeme tímto skriptem:

akce: pouzij syrecky na otce
{
tisk = „Podal jsi hladovemu otci nakladane syrecky. Jeho radost byla nelicena.“ „>>Ty jsi to dokazal! Pravy syn sveho otce!<< “ „>>Ocekavam, ze se to pozitivne projevi na vysi meho kapesneho.<<“
tisk = „“
tisk = „KONEC HRY.“
#hrac.kde = „#konec“
}

Naši naskriptovanou hru si nejjednodušeji spustíme tak, že textový soubor, ve kterém je uložena, pojmenujeme „game“ a uložíme ho do stejného adresáře jako je interpreter TGI.

A to je vše přátelé…

2) TGE2

TGE2 nám ve zkratce umožní vytvořit textovou hru, která bude rozumět všem příkazům, které si sami nadefinujeme. Na rozdíl od TGI tak můžeme ve hře zadávat příkazy jako „otevri lednici“, „dej syrecky otci“ apod. Ve srovnání s TGI však má jednu ohromnou nevýhodu, a to tu, že neumožňuje ukládat a načítat stav hry. V současné verzi je TGE2 proto de facto nepoužitelný pro tvorbu rozsáhlých her, neboť sotva by je někdo dohrál v jednom zátahu a začínat znovu a znovu od začátku, jistě každého brzy otráví…

Autor interpreteru TGE2 si dal záležet a udělal k němu vcelku podrobnou dokumentaci, která je součástí distribuce. Tuto dokumentaci si důkladně prostudujte, neboť v následujícím textu její znalost předpokládám! A nyní již vzhůru k tvorbě skriptu naší drobné demohry.

Povinným začátkem je identifikace autora a hry:

Petr Kain
Demo hra Syrecky

Nyní následují deklarace předmětů. Budeme zavádět jen masku a syrečky, které jsou „odnosné“. Ostatní předměty (lednici, pohovku a otce) si můžeme bez problému dovolit vnímat jako součást scenérie. Deklarace se provede takto:

[ITEMS]
MASKA
SYRECKY

Dále si zavedeme všechny příkazy, kterým bude naše hra rozumět. Deklarace má v našem případě tuto podobu:

[WORDS]
PROZKOUMEJ ZKOUMEJ
VEZMI SEBER VEM
POUZIJ UZIJ
DEJ
OTEVRI
EXIT QUIT KONEC END

Jak vyplývá z deklarace, hra bude např. slova „VEZMI“, „SEBER“ a „VEM“ považovat za synonyma.

Nyní si vytvoříme průchod mezi lokacemi. První řádek reprezentuje obývák (room 1), druhý kuchyň (room 2). Hodnoty zleva doprava jsou: „sever“ „východ“ „jih“ „západ“. Deklarace vypadá takto:

[MAP]
0 2 0 0
0 0 0 1

Na rozdíl od TGI neumožňuje TGE2 dávat proměnným slovní označení, musíme si vystačit s číslicemi. Přibyla nám navíc pomocná proměnná 4, která nemá ve skriptu TGI důvod. K čemu tato proměnná je, to si vysvětlíme později. Proměnné se deklarovat nemusejí. V našem skriptu jsou pouze vyjmenovány a vysvětleny pro přehlednost v komentáři:

;vyznam podminek:
; 1 — maska: nasazena / nenasazena
; 2 — syrecky: jsou v lednici / nejsou v lednici
; 3 — nalez masky: nalezena / nenalezena
; 4 — pomocna promenna u masky

Nyní si budeme deklarovat místnosti. Pozor, na rozdíl od TGI neobsahuje TGE2 žádnou obdobu akce „start“, takže abychom dosáhli stejného efektu, tj. vypsání úvodního textu a přiřazení počátečních hodnot do proměnných, musíme tak učinit v rámci skriptu k místnosti, ve které se hra začne, tj. v obýváku. Na stejném místě také musíme oběma předmětům přiřadit počáteční místnost. Protože se ale jakoby nenacházejí v žádné místnosti, ani je nemá herní postava při sobě, umístíme je do neexistující místnosti č. 255. V našem skriptu si místnosti zavedeme takto:

[ROOM]1
[? #1023=0] [! #1023=1 #1=0 #2=0 #3=0 #4=0 !1=255 !2=255] Toto je kratka demonstracni hra k interpretru TGI. Vasim ukolem je donest nalozene syrecky hladovemu otci.
[?] Obyvak. Nachazis se v obyvaku. Rozvrzana pohovka je jediny kus nabytku, ktery tu momentalne je. Je tu otec. [? !1=1] Je tu maska.

[ROOM]2
Kuchyne. Jsi v kuchyni. Nadobi je tyden nemyte a vrsi se nerusene ve drezu. Je tu lednice.

A nyní si „jedničku“ pořádně probereme! Skript říká normálním jazykem toto: „Pokud má proměnná číslo 1023 hodnotu 0, potom proveď následující: vlož do proměnné 1023 hodnotu 1, do proměnných 1 až 4 vlož nuly, předměty 1 a 2 umísti do (pseudo)místnosti č. 255 a nakonec vypiš uvítací text. Nastavení hodnoty proměnné 1023 na hodnotu 1 zapříčiní to, že se blok za podmínkou provede právě jen a pouze při prvním výpisu místnosti. Naopak popis místnosti, který následuje za vždy splněnou podmínkou [?], se vypíše pokaždé. Poslední podmínka se ptá, zda je předmět 1 (tj. maska) v aktuální místnosti (tj. obývák). Pokud ano, vypíše se ještě text „Je tu maska“. Je to tu proto, že TGE2 na rozdíl od TGI neumí sám vypisovat předměty, které se nacházejí v aktuální místnosti.

Na rozdíl od TGI nemá TGE2 žádný „defautltní“ průběh akcí. Protože minimálně chceme, aby se daly všechny předměty prozkoumat, musíme si to sami kompletně naskriptovat:

[PROZKOUMEJ]1- OTCE|TATU|FOTRA
Tak takhle bys za tricet let vypadat nechtel…

[PROZKOUMEJ]1- POHOVKU
Pamatuje prijezd ruskych vojaku do Prahy. Neni jiste, zda ten prvni nebo az ten druhy.
[? #3=0] [! !1=1 #3=1] Nalezl jsi masku! A to masku plynovou, nikoliv maskarni.

[PROZKOUMEJ]2- LEDNICI|LEDNICKU
Prastara, vecne chrcici „mrazici skrin“ znacky CALEX.

[PROZKOUMEJ]- MASKU
[? !1=1] Pochazi z davne minulosti. Je s podivem, ze stale drzi pohromade.
[? !1=0] Pochazi z davne minulosti. Je s podivem, ze stale drzi pohromade.
[PROZKOUMEJ]- SYRECKY
[? !2=0] Olomoucke tvaruzky nalozene ve svetlem pive.

Rozeberme si nejdůležitější akci, kterou je prozkoumání pohovky. Tento příkaz má smysl jen tam, kde se pohovka nachází, tj. v místnosti 1 (obývák), proto je bezprostředně za [PROZKOUMEJ] uvedeno „1-„. Pokaždé se vypíše popis místnosti. Nyní následuje podmíněný příkaz, který říká: „Je maska doposud nenalezena (tj. proměnná 3 má hodnotu 0)? Pokud ano, umísti předmět do místnosti 1 (obývák) a dej do proměnné 3 hodnotu 1 (indikuje, že maska už byla nalezena)“.

Ještě poznamenejme, proč skript k akci „prozkoumej masku“ vypadá tak krkolomně. Je to proto, že masku můžeme prozkoumat, pokud leží ve stejné lokaci jako je naše herní postava (a to je pouze obývák, neboť naše hra neumožňuje předměty pokládat, takže v kuchyni prostě nikdy ležet nebude), anebo pokud ho má postava u sebe.

Další naskriptované akce nyní budou následovat v rychlejším sledu.

Masku sebereme takto (jak jsme si již řekli, maska se může nacházet jen v lokaci 1):

[VEZMI]1- MASKU [? !1=1] [! !1=0] Sebral jsi plynovou masku.

Nasazení a sundání masky realizujeme tímto skriptem:

[POUZIJ]- MASKU
[?] [! #4=0]
[? !1=0 #1=0] [! #1=1 #4=1] Nasadil sis masku.
[? !1=0 #1=1 #4=0] [! #1=0] Sundal sis masku.

Zde nám vstupuje do hry dříve zmíněná pomocná proměnná 4. Je tu jen proto, že TGE2 nemá žádnou obdobu klíčového slova „stop“. Abychom zabránili tomu, že by si hráč masku nasadil a hned ji zase sundal, nastavíme její hodnotu při nasazování na „1“ a do podmínky pro sundání masky připojíme požadavek na její nulovou hodnotu. Na začátku tohoto skriptu se přitom vždy nastaví na hodnotu „0“!

Otevření lednice se provede následujícím zápisem. Abychom byli „kompatibilní“ s verzí hry pro TGI, umožníme otevřít lednici i příkazem „pouzij lednici“:

[OTEVRI]2- LEDNICI
|[POUZIJ]2- LEDNICI
[? #2=1] V lednici uz nic zajimaveho neni!
[? #2=0 #1=0] Sotva jsi otevrel dvere lednice, vyvalil se ven takovy puch, ze jsi malem omdlel. Jesteze jsi dvere zase rychle zavrel!
[? #2=0 #1=1] [! #2=1 !2=0] Otevrel jsi lednici. Diky nasazene masce ti puch valici se z ni ven pranic neskodil. V klidu jsi lednici prohledal a objevil nakladane syrecky. Vzal jsi je a lednici jsi zase zavrel.

Akce, která ukončí hru, je ta, při které dáme otci syrečky. Opět jsme kompatibilní s verzí pro TGI. Zde je nejdůležitější „tag“: [ENDGAME], který ukončuje provádění skriptu, a tedy celé hry.

[POUZIJ]1- SYRECKY NA OTCE
|[DEJ]1- SYRECKY OTCI
[? !2=0] Podal jsi hladovemu otci nakladane syrecky. Jeho radost byla nelicena. „Ty jsi to dokazal! Pravy syn sveho otce!“ „Ocekavam, ze se to pozitivne projevi na vysi meho kapesneho.“
[ENDGAME]

A na závěr ještě definice příkazu „exit“:

[EXIT]-
[ENDGAME]

Naši naskriptovanou hru si nejjednodušeji spustíme tak, že textový soubor, ve kterém je uložena, pojmenujeme „gametxg.txt“ a uložíme ho do stejného adresáře jako je interpreter TGE2.

A to je vše přátelé…

Mohlo by se vám líbit...

Počet komentářů: 2

  1. 12.11.2015

    […] nevie čo sú textovkárske Syrečky odporúčam článok na Jak vytvořit vlastní textovku… na […]

  2. 27.1.2019

    […] nevie čo sú textovkárske Syrečky odporúčam článok na Jak vytvořit vlastní textovku… na textovky.cz Pripravil som teda samostatný balíček. Dátový súbor je v obyčajnom […]