Programování pro hračičky/Měniči/Lekce 8

Jak používat klasifikační nálepkuTato stránka je součástí kurzu:
středoškolská
Příslušnost: skupinová

Gramatické funkce

editovat

Hlášky, které hráč v různých situacích ve hře dostává, se často odkazují na něho samotného, na někoho z okolních hráčů, na předmět, se kterým se zachází apod. Už když hráč — pro příklad to budiž třeba Všudybud — provede tak jednoduchý úkon, jako že se rozhlédne, dostanou okolní hráči hlášku: Všudybud se rozhlíží. Do hlášky se tedy musí doplnit Všudybudovo jméno. V jiných případech ovšem toto jméno musí být vyskloňované: Všudybudovi se udělalo špatně. Jindy zas hláška závisí na rodu hráče: Vyhrál jsi! (Kdyby na místě Všudybuda byla Anička, dostala by hlášku: Vyhrála jsi!) Jindy se zas musí přidávat různá zájmena a přídavná jména, a to vždy ve správném rodě, čísle a pádě:

Všudybud si prohlíží koženou tašku.
Všudybud si bere koženou tašku.
Všudybud si prohlíží svou koženou tašku.
Všudybud si prohlíží svůj skřetí tesák.
Všudybud dává svůj skřetí tesák do své kožené tašky.

Základní tvary

editovat

V programových knihovnách mudu Prahy se tato dynamická podoba hlášek zajišťuje pomocí tzv. gramatických funkcí, které pro daný objekt vrátí správný tvar, použitelný v herních hláškách. Nejužívanější gramatickou funkcí je funkce ten(), které se jako první parametr předá číslo pádu a jako druhý parametr odkaz na objekt. Funkce se objektu vyptá na některé jeho vlastnosti (jméno, skloňovací vzor jména, mluvnický rod, přídavná jména aj.) a vrátí jeho označení v daném pádu. Jako třetí parametr je případně možno zadat pro objekt jiná přídavná jména, jako čtvrtý parametr vlastníka (či přesněji aktuálního držitele) objektu a jako pátý přídavná jména držitele.

Představíme-li si objekt stolu, který je v programu označen jako st a který má nastavena přídavná jména „bytelný“ a „dřevěný“, můžeme si ilustrovat funkci ten() na několika příkladech:

  • ten(1,st)bytelný dřevěný stůl
  • ten(3,st)bytelnému dřevěnému stolu
  • ten(2,st,"zánovní")zánovního stolu
  • ten(7,st,"")stolem

V programu je potom možno z takto vyskloňovaných frází poskládat věty jako Skláníš se k bytelnému dřevěnému stolu. ("Skláníš se k "+ten(3,st)+".") nebo Přece se nebudeš zbavovat zánovního stolu! ("Přece se nebudeš zbavovat "+ten(2,st,"zánovní")+"!").

Obdobným způsobem jako s funkcí ten() se zachází s funkcemi svuj(), tvuj() a jeho(), které navíc doplní vyskloňovanou formu o příslušný tvar přivlastňovacího zájmena „svůj“, „tvůj“, „jeho“, „její“, „jejich“, pokud se objekt nachází v inventáři nějaké bytosti. V případě našeho stolu, který stojí přímo v místnosti a hráč si jej nemůže vzít, by tedy dávaly stejné výstupy jako funkce ten().[1]

Přivlastňovací tvary

editovat
  • svuj(3,st)bytelnému dřevěnému stolu

Pokud bychom ale uvažovali třeba kožený batoh (označený v programu jako batoh), a tento batoh by se právě nacházel v inventáři hráčky Rastiel (v programu zrovna vystupující pod identifikátorem player), výstup by vypadal jinak:

  • ten(3,batoh)koženému batohu
  • svuj(3,batoh)svému koženému batohu
  • tvuj(3,batoh)tvému koženému batohu
  • jeho(3,batoh)jejímu koženému batohu

V případě, že hráč má objekt ve svém inventáři, můžeme rovněž využít dalších nepovinných parametrů funkce ten():

  • ten(3,batoh,player)Rastielinu koženému batohu
  • ten(3,batoh,player,"unavený")koženému batohu unavené Rastiel

A pro případ, že hráč objekt nemá ve svém inventáři, a přesto jej potřebujeme označit jeho jménem, funkci ci():

  • ci(3,st,player)Rastielinu bytelnému dřevěnému stolu
  • ci(3,st,player,"unavený")bytelnému dřevěnému stolu unavené Rastiel

Zájmenné tvary

editovat

Pro sestavování hlášek, v nichž se má vyskytovat označení objektu pouhým zájmenem, jsou k dispozici funkce jej(), nej() a ho(), které vracejí tvary zájmena v plném (přízvučném) tvaru, zájmena se změnou „j“ v „n“ a zájmena ve zkráceném (nepřízvučném) tvaru:

  • jej(3,batoh)jemu
  • nej(7,player)
  • ho(3,batoh)mu

Varianty s velkými písmeny

editovat

Pro použití na začátku věty mají všechny výše uvedené funkce protějšek s velkým písmenem na začátku (Ten(), Svuj(), Tvuj(), Jeho(), Ci(), Jej(), Nej() a Ho()), jehož výstup se liší právě jen tím, že první písmeno je vždy velké:

  • ten(1,batoh)kožený batoh
  • Ten(1,batoh)Kožený batoh

Spojení s předložkami

editovat

Aby bylo v hláškách snadnější si poradit s pohyblivým „e“ u předložek, jsou k dispozici funkce prep_z(), prep_s(), prep_s2(), prep_v(), prep_v4() a prep_k(), které vytvoří nejen příslušný pádový tvar, ale doplní před něj také příslušný tvar předložky. Pokud by objekt ob1 byla železná truhla a objekt ob2 bavlněná taška, dostali bychom takovéto výstupy:

  • prep_z(ob1)ze železné truhly
  • prep_z(ob2)z bavlněné tašky

Rozlišení podle mluvnického čísla a rodu

editovat

Pro rozrůznění hlášek podle jednotného či množného čísla zúčastněných objektů je k dispozici funkce plural(), které se jako parametry předávají jednotný i množný tvar a potrefený objekt. Pokud je objekt bat batoh a objekt dvr dveře, vypadá výstup funkce takto:

  • plural("obsahuje","obsahují",bat)obsahuje
  • plural("vrže","vržou",dvr)vržou

Pro často užívaný případ plural("je","jsou") je možno užít kratší zápis funkcí jest():[2]

  • jest(bat)je
  • jest(dvr)jsou

To, co zajišťuje funkce plural() pro různá čísla, zajišťuje funkce gender() pro různé rody. Může přitom rozlišovat buď jen mezi rodem ženským a mužským (do něhož se pak počítá všechno ostatní), nebo mezi rodem ženským, mužským a středním, nebo mezi rodem ženským, mužským životným, mužským neživotným a středním. Pro následující příklady předpokládajme, že hracka je objekt ženského rodu hrac objekt mužského životného rodu, hrach objekt mužského neživotného rodu a hradlo objekt středního rodu:

  • "Dobrý den, "+gender("vážená dámo","vážený pane",hracka)+"!"Dobrý den, vážená dámo!
  • "Dobrý den, "+gender("vážená dámo","vážený pane",hrac)+"!"Dobrý den, vážený pane!
  • "Dobrý den, "+gender("vážená dámo","vážený pane",hradlo)+"!"Dobrý den, vážený pane!
  • "Dobrý den, "+gender("vážená dámo","vážený pane","vážené něco",hradlo)+"!"Dobrý den, vážené něco!
  • "Dobrý den, "+gender("vážená dámo","vážený pane","vážené něco",hrach)+"!"Dobrý den, vážený pane!
  • "Dobrý den, "+gender("vážená dámo","vážený pane","vážené něco","vážené něco",hrach)+"!"Dobrý den, vážené něco!

Tvoření správného (rodu i číslu odpovídajícího) tvaru minulého a trpného příčestí v hláškách slouží funkce dan(), kterou je možno použít i obecněji na přídavná jména ve jmenném tvaru.[3][4] Pro následující příklady předpokládejme, že hrac je objekt mužského rodu a hracka je objekt ženského rodu:

  • dan("ztracen",hracka)ztracena
  • dan("podíval",hrac)+" ses"podíval ses
  • "Nyní jsi zcela "+dan("zdráv",hracka)+"."Nyní jsi zcela zdráva.

Pro přídavná jména v plném tvaru je k dispozici funkce dany():

  • dany("promoklý",hracka)promoklá
  • dany("narozený",hrac,2)narozeného
  • dany("babiččin",hracka,4)babiččinu

Správný tvar příčestí nebo přídavného jména ve jmenném či plném tvaru popisujícího více objektů umějí vytvořit funkce shodny() a shodne():

  • shodny("byl",({hrac,hracka}))byli
  • shodny("byl",({hracka1,hracka2}))byly
  • shodne("unavený",({hrac,hracka}))unavení
  • shodne("unavený",({hracka1,hracka2}))unavené

Konečně, pro správné tvary přechodníků je tu funkce prechod():

  • prechod("mlaskaje",hrac)mlaskaje
  • prechod("mlaskaje",hracka)mlaskajíc
  • prechod("povstav",hrac)povstav
  • prechod("povstav",hracka)povstavše
  • Ten(1,dvr)+" se "+dan("otevřel",dvr)+", ukrutně "+prechod("vrzaje",dvr)+"."Dveře se otevřely, ukrutně vrzajíce.

Pseudoklauzury

editovat

Samotné funkce programovacího jazyka LPC nám ve hře nejsou ještě přímo dostupné, dokud se nestaneme mistry Bratrstva měničů. Už jako učni je však můžeme využívat formou tzv. pseudoklauzur. Jedná se o odložená volání gramatických funkcí bez odkazů na zevní proměnné, zařazená do textů hlášek.

Pseudoklauzura je uvozena znakem $, po němž následuje jméno funkce a v závorkách seznam parametrů, přičemž znakové řetězce se zapisují bez uvozovek.[5] Potřebujeme-li tedy vytvořit objekt, který hráče po ohmatání upozorní, že se spálil o jeho horký povrch, můžeme jako jeho hmatovou vlastnost zapsat: Au! Bolestivě ses $dan(spálil,OBJ_TP). Ve chvíli, kdy nějaký hráč takto změněný objekt ohmatá, se pak pseudoklauzury nahradí gramatickými funkcemi, ty se vyhodnotí podle aktuální situace a hráč podle svého rodu obdrží hlášku Au! Bolestivě ses spálil., Au! Bolestivě ses spálila. nebo Au! Bolestivě ses spálilo..

V tomto příkladu použité OBJ_TP je jedna ze standardních konstant vyjadřujících některý ze zúčastněných objektů. Je to zkratka za „this player“ a označuje ten objekt, který právě jedná, tedy hráče nebo naprogramovanou nehráčskou postavu (jakou je třeba mistr Ezechiel). Pro používání učňovského příkazu změň nám stačí ještě jedna další zkratka, a to OBJ_TO („this object“) označující objekt, který byl změněn a s nímž nyní „this player“ zachází.

Pseudoklauzurami můžeme výrazně vylepšit herní efekt příkazu změň. Veškerá skutečnost hry je vytvářena v představách hráčů na základě zpráv, které si objekty vzájemně posílají. Pseudoklauzury nám umožňují tyto zprávy formulovat nejen podstatně věrohodněji, nýbrž také personalizovaně:

  • $plural(Buď,Buďte,OBJ_TP) $dan(zdráv,OBJ_TP), $ten(5,OBJ_TP)! Já jsem $ten(1,OBJ_TO)!
  • Na zdi je napsáno: $Ten(1,OBJ_TP) $jest(OBJ_TP) vůl!
  • Tato truhlice i veškerý její obsah náleží $ten(3,OBJ_TP). Jen $jej(1,OBJ_TP) a nikdo jiný si ji $plural(může,mohou,OBJ_TP) s sebou vzít!

Povinné

editovat
  • Změňte předmět za použití pseudoklauzur. Vyzkoušejte změnu sami, a domluvte se s jiným hráčem, jemuž by gramatické funkce měly dávat jiný výsledek, aby ji vyzkoušel rovněž.
Pokud vám schází inspirace, zkuste nejprve změnit zápach nějakého předmětu třeba na hlášku: Fuj! Ani tě nenapadne, abys $dan(očichával,OBJ_TP) takhle $ten(4,OBJ_TO,ošklivý)! Pak si ale vymyslete ještě nějakou jinou, svoji originální, a vyzkoušejte ji rovněž.

Dobrovolné

editovat
  • Vyzkoušejte si tři příklady použití pseudoklauzur, které jsou uvedeny výše (na konci kapitoly Pseudoklauzury).
  • Vyzkoušejte si použití pseudoklauzur ve všech případech, v nichž to příkaz změň umožňuje: změň povrch, změň zápach, změň zvuk, změň popis, změň označení.
  • Převezte někoho ze spoluhráčů použitím příkazu změň s pseudoklauzurami.

Pomocné stránky

editovat

Poznámky

editovat
  1. Případ stolu ukazuje, že toto automatické zjišťování vlastníka podle obsahu inventáře v některých případech nevyhovuje. Pro takové případy je možno použít nejobecnější skloňovací funkce sklon(), jejíž speciálními případy jsou právě ten(), svuj() a další. Na tovaryšské úrovni se však zatím pro jednoduchost obejdeme bez ní.
  2. Funkci jest() je možno navíc nepovinným parametrem sdělit, že výsledný tvar má být na začátku, na konci nebo na začátku i na konci doplněn o mezeru.
  3. Funkce dan() si umí poradit s nepravidelnými tvary sám (další tvary se tvoří od zkráceného kmene sam-) a šel (další tvary se tvoří od zkráceného kmene šl-), ne však pro složeniny, ty je potřeba poskládat z předpony a základního tvaru: při+dan("šel",hrac) apod.
  4. Pro tu a tam se vyskytující tvary ve 4. pádě je možno doplnit do volání funkce dan() nepovinný parametr značící číslo pádu. Pokud je ob objekt, který hráč právě čistí, pak Ten(4,ob)+" nemáš ještě "+dan("vyčištěn",ob,4)+"." vrátí "Hrnec nemáš ještě vyčištěn.", jedná-li se o hrnec, a Lampu nemáš ještě vyčištěnu., jedná-li se o lampu.
  5. Úplně přesně je to tak, že řetězce mohou být v uvozovkách, ovšem při zápisu do zdrojového textu programu se to musí zvlášť ošetřovat, tak se toho zpravidla užívá jen ve dvou výjimečných případech: když chceme zadat prázdný řetězec (například při použití funkce ten(), kde zadání prázdného řetězce způsobí odstranění přídavných jmen — srovnejte funkci pseudoklauzur $ten(1,OBJ_TP) a $ten(1,OBJ_TP,"")) a když je nutno zadat číslo jako řetězec.