Programování pro hračičky/Měniči/Lekce 8
Tato 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)
→ní
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!
Úkoly
[editovat]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]- ↑ 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í. - ↑ 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. - ↑ Funkce
dan()
si umí poradit s nepravidelnými tvarysám
(další tvary se tvoří od zkráceného kmenesam-
) 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. - ↑ 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 jeob
objekt, který hráč právě čistí, pakTen(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, aLampu nemáš ještě vyčištěnu.
, jedná-li se o lampu. - ↑ Ú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.