Přeskočit na obsah

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

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

Efekty přeonačení

[editovat]

V příkladech použití příkazu přeonač v minulé lekci jsme se zatím setkali jen s efektem zadávaným pomocí klíčového slova self, spočívajícím ve vyslání hlášky tomu, kdo použil definovaný příkaz. Herní realita se však neskládá jen ze zpráv, které dostáváme v odpověď na zadané příkazy, nýbrž také ze zpráv, které dostáváme o činnosti jiných hráčů. A právě k tomu je určen druhý z hlavních efektů, zadávaný pomocí klíčového slova others. Jeho použití si nejlépe ukážeme na jednoduchém příkladě:

> přeonač okolí
Soustředíš se na měnění...

Zadej příkazy, pomocí nichž má být možné tvoji metodu zavolat.
Seznam příkazů: pšoukni,psoukni,pšouknu,psouknu

Zadej efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): self:Pšouk! (Teď se ti opravdu ulevilo.)

Celková náročnost přeonačení je nyní 13 ŽB a 21 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): others:Najednou to tu zasmrdělo, jako by... si tu někdo upšoukl.

Celková náročnost přeonačení je nyní 14 ŽB a 28 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): .
Svět se ti krátce zavlnil před očima.
Přeonačil jsi své okolí na tak akorát dlouho.

Dalším široce využitelným efektem je wait, který způsobí čekání zadaný počet sekund, než se provede další efekt v pořadí:

> přeonač okolí
Soustředíš se na měnění...

Zadej příkazy, pomocí nichž má být možné tvoji metodu zavolat.
Seznam příkazů: kýchni,kychni,kejchni,kýchnu,kychnu,kejchnu

Zadej efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): self:He...

Celková náročnost přeonačení je nyní 17 ŽB a 25 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): wait:2

Celková náročnost přeonačení je nyní 19 ŽB a 25 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): self:... e-e-e...

Celková náročnost přeonačení je nyní 20 ŽB a 30 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): wait:2

Celková náročnost přeonačení je nyní 22 ŽB a 30 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): self:... pčík!!!

Celková náročnost přeonačení je nyní 23 ŽB a 35 DB.
Po posledním efektu zadej "." pro provedení přeonačení.
Chceš-li celé přeonačení ukončit, použij "~q".

Zadej další efekty, jež by měla tvoje metoda vyvolat.
Efekt (a jeho parametr): .
Svět se ti krátce zavlnil před očima.
Přeonačil jsi své okolí jen na krátkou chvilku.

Konečně, poslední z efektů, které jsou v současné verzi příkazu přeonač k dispozici, je random_move, který způsobí, že hráč, který zadal definovaný příkaz, se přesune do náhodné sousední místnosti (navenek přitom vydává normální pohybové hlášky (tedy třeba Všudybud odchází na východ. a Ze západu přichází Všudybud.), sám však žádnou hlášku automaticky neobdrží. Tu je nutno mu vyslat efektem self.

Celkem tedy jsou v příkazu přeonač v současnosti k dispozici tyto efekty (v pravém sloupci tabulky je uveden příklad použití):

self hráči, který zadal příkaz, se vyšle zadaná hláška self:Udělalo se ti špatně.
others do okolí hráče, který zadal příkaz, se vyšle zadaná hláška others:$Ten(1,OBJ_TP) úplně $dan(zezelenal,OBJ_TP). Asi se $ho(3,OBJ_TP) udělalo špatně.
wait čeká se zadaný počet vteřin wait:4
random_move hráč, který zadal příkaz, odejde náhodným směrem random_move

Specifikace objektu akce

[editovat]

Při definici akcí příkazem přeonač jsme se zatím zaměřili jen na samotné příkazové sloveso a nevěnovali jsme žádnou pozornost tomu, co hráč napsal po něm. První příklad z tohoto kroku bude fungovat úplně stejně, ať hráč zadá samotné pšoukni, nebo pšoukni si velmi hlasitě, nebo třeba pšoukni do Všudybudova batohu a pak ho rychle zašněruj. V mnoha případech by však pro věrohodný herní účinek bylo potřeba zbytek zadání příkazu nějak zohlednit.

Příkaz přeonač nám proto umožňuje zadat, že zadané sloveso musí být následováno určením nějakého objektu, s nímž se má příkaz provést, jaká předložka má případně určení objektu předcházet a v jakém pádě má být objekt pojmenován.[1] V současné verzi příkazu přeonač je možno zadat jen jednu předložkovou a pádovou vazbu pro všechna zadaná slovesa — po seznamu sloves oddělených čárkami následuje buď středníkem oddělená předložka a dalším středníkem oddělené číslo pádu od 1 do 7, nebo bez předložky přímo středníkem oddělené číslo pádu.[2] Takto definovaný příkaz pak bude při zadání vyžadovat předmět v daném pádu a případně též s danou předložkou.

Místo jednoduché redefinice příkazu vem, kterou jsme si ukázali jako příklad v minulém kroku, můžeme tedy napsat:

vem,vezmi,vezmu,beru;4

Příkaz pak na zadání vem kleště reaguje stejným způsobem jako v příkladu z minulého kroku, ovšem při zadání předmětu, který se poblíž hráče nevyskytuje, nebo při zadání samotného vem neprovede efekty definované přeonačením, nýbrž — obdobně jako standardní herní příkazy — bude se ptát hráče, co přesně že má na mysli.

Obdobně můžeme definicí předložky a pádové vazby například způsobit, aby jiní hráči mohli standardně plivat kolem sebe, ale nemohli plivat na někoho, pokud plivání na někoho předefinujeme vlastní akcí:

plivni,plivej,plivnu,plivu;na;4
self:Ale ne, to se přece nedělá!
others:Někdo tu chtěl plivat, ale raději si to rozmyslel.
.

V případě takhle definovaného příkazu hráč při zadání samotného plivni bude nově definovaným příkazem odmítnut, ale na jeho místo nastoupí standardní příkaz plivni, takže hráč i jeho okolí dostanou hlášku, že hráč plive kolem sebe. Pokud však hráč zadá například plivni na Všudybuda, tak při Všudybudově nepřítomnosti bude dotázán, koho že má na mysli, a při Všudybudově přítomnosti obdrží on sám hlášku Ale ne, to se přece nedělá! a jeho okolí hlášku Někdo tu chtěl plivat, ale raději si to rozmyslel.

Pseudoklauzury při přeonačování

[editovat]

Podobně jako v příkazu změň můžeme i v příkazu přeonač zadávat do hlášek pseudoklauzury. Důležité je to zejména pro věrohodné výstupy efektu others:

  • $Ten(1,OBJ_TP) se opatrně $plural(rozhlíží,rozhlížejí,OBJ_TP). Že by $dan(větřil,OBJ_TP) nějaké nebezpečí?
  • Co to bylo za dutou ránu? Aha, zdá se, že $ten(4,OBJ_TP) klepla pepka.
  • $Ten(1,OBJ_TP) vyděšeně $dan(vykřikl,OBJ_TP) a $dan(skácel,OBJ_TP) se k zemi.

Kromě objektových zkratek OBJ_TP a OBJ_TO, které jsme poznali při používání pseudoklauzur v příkazu změň, máme v příkazu přeonač k dispozici navíc i zkratku OBJ_CO pro objekt, na který hráč odkázal při zadání příkazu definovaného přeonačováním — například objekt stromu při zadání příkazu ohmatej strom (pokud byla pro ohmatej deklarována vazba se 4. pádem) nebo objekt píšťaly při zadání pískej na píšťalu (pokud byla pro pískej deklarována vazba s předložkou „na“ a 4. pádem). Celkově tedy jsou pro pseudoklauzury k dispozici tyto objektové zkratky:

OBJ_TO „this object“, tedy objekt, který byl změněn nebo přeonačen
OBJ_TP „this player“, tedy jednající objekt (hráč nebo nehráčská bytost)
OBJ_CO „concerned object“, tedy objekt, který byl jmenován při zadání příkazu

Zejména pomocí OBJ_CO můžeme mnohem lépe začleňovat do kontextu hry hlášky, které po zadání přeonačeného příkazu má dostat sám hráč i jeho okolí. Například u příkazu plivej, jak jsme jej definovali na konci minulé kapitoly, můžeme nyní zadat:

self:Plivej si podle libosti, ale ne na $ten(4,OBJ_CO)!
others:$Ten(1,OBJ_TP) se $dan(pokusil,OBJ_TP) plivnout na $ten(4,OBJ_CO), ale
$ten(1,OBJ_CO) se na $nej(4,OBJ_TP) $dan(podíval,OBJ_CO) tak přísně, že si to 
$ten(1,OBJ_TP) $dan(rozmyslel,OBJ_TP).

Úkoly

[editovat]

Povinné

[editovat]
  • Přeonačte nějaký objekt za použití efektu wait.
  • Vyzkoušejte si pseudoklauzury při přeonačování aspoň jednou v hlášce vysílané jednajícímu (akce self) a aspoň jednou v hlášce vysílané okolí (akce others).
  • Vyzkoušejte si v pseudoklauzurách použití OBJ_TP, OBJ_TO i OBJ_CO.

Dobrovolné

[editovat]
  • Přeonačte nějaký objekt tak, aby jedna z jeho standardních smyslových vlastností (popis, zápach, zvuk, povrch) pro prozkoumávajícího zůstala nezměněna, ale pro okolí zjevila děj expresivně zkomolený. (Například topinka, která při očichání vrací hlášku Topinka je cítit česnekem., bude vracet nadále hlášku Topinka je cítit česnekem., ale do okolí místo standardního Všudybud očichává topinku. vyšle Všudybud se naklonil nad topinku, vyvalil oči a začal dávit..)
  • Přeonačte nějaký objekt tak, aby jedna z jeho standardních smyslových vlastností při prozkoumání pro okolí vydala standardní hlášku, ale prozkoumávajícímu sdělila nějakou tajnou zprávu. (Například stůl, který při ohmatání okolí ohlásí Všudybud ohmatává stůl., ale hráči samotnému sdělí: Ohmatáváš stůl, a při tom si všimneš, že v jeho desce je Braillovým písmem vyryta zpráva: Ve dvoře na sever odtud je zakopán poklad.)
  • Standardní příkazy pro pohyb do světových stran není možno přeonačit, nestandardně pojmenované průchody však ano. Najděte místnost s nestandardně pojmenovaným průchodem a překryjte jej pomocí příkazu přeonač.

Pomocné stránky

[editovat]

Poznámky

[editovat]
  1. Současná verze příkazu přeonač povoluje jen jednoslovnou předložku, která musí následovat hned po slovese a po níž musí hned následovat pojmenování objektu v příslušném pádě. Za pojmenováním objektu sice mohou následovat další slova, ale nebere se na ně žádný zřetel.
  2. Ve druhém případě je možno zadat středníky též dva, tedy napsat do zadání i onu prázdnou předložku, ale tím si to nemusíme komplikovat.