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

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

Zacházení s objekty

editovat

Život ve virtuálním světě Prahů by byl poněkud nudný, kdybychom objekty, s nimiž se v něm setkáváme, mohli jenom pozorovat a přesunovat z místa na místo. S většinou předmětů lze provádět též složitější úkony v závislosti na druhu předmětu:

  • Potraviny lze zpravidla sníst, a tím doplnit síly pro hru.[1] Některými potravinami je také možno se otrávit — naštěstí na ně narazíme spíše jen výjimečně, a vždy dostaneme nějaké varování, pokud je před snědením důkladně prozkoumáme všemi smysly. Sníst lze ovšem i některé předměty, které nejsou primárně určeny k jídlu (třeba sněhovou kouli).
  • Obdobně, tekutiny lze vypít.[2] Při konzumaci vody v terénu je dobré si ji předem prohlédnout a očichat: voda z kašen je obecně pitná, čistá voda z horských pramenů může organismus i slabě posílit, naopak bahnitá voda říční či močálová způsobí tak akorát bolení břicha. Pití mořské či jiné slané vody žízeň nezažene, ale posílí. Některé nápoje zakoupitelné v pohostinstvích mohou být silně alkoholické, jiné dryáky i přímo otrávené.
  • Oděvy a brnění lze oblékat (či nasazovat) a svlékat (či sundávat). Oblečené kusy oděvu chrání hráče před chladem a v některých případech též před horkem či jinými nebezpečími, oblečené kusy brnění chrání (částečně) před údery, které hráč dostává v případném boji.
  • Pochodně, louče, svíčky, lampy a další svítilny lze rozsvěcet a zase zhasínat (a v kouzelném světě Prahů k tomu ani není zapotřebí zápalek). Na rozdíl od mnoha jiných akcí je možno rozsvícení svítilny provést i potmě, pokud ji hráč má přímo v inventáři, takže při pohybu mimo Dům, kde je (kromě sklepa) pořád dostatečné světlo na všechno herní konání, je velmi vhodné nosit nějaký takovýto zdroj světla stále s sebou. Protože se však jednorázové svítilny svícením spotřebovávají a v trvalých dochází palivo, je dobré svítit jen tehdy, když je kolem opravdu tma.
  • Zbraně a některé nástroje lze tasit a opět sklonit. Tasené předměty lze pak použít v boji nebo k jinému zamýšlenému účelu. (Hráč, který by se do boje vrhl s mečem a štítem v inventáři, ovšem aniž by je tasil, by bojoval jen holýma rukama.) Některé nástroje (např. rýč) není pro použití třeba tasit, není je tak ale ani možné využít v souboji. Tím, že je nějaký předmět tasen (tedy, uchopen ho do ruky a připraven k použití), je daná ruka zaplněna: některé akce (např. položení či zvednutí předmětu) mohou ale vyžadovat, aby byla alespoň jedna ruka volná (jinak se objeví hláška Nemáš volnou ruku.). Velmi rozměrné předměty (obouruční meč, válečné kladivo) mohou zaplnit obě ruce najednou.
  • Lahve, měchy a podobné nádoby lze naplnit tekutinou, a tu z nich následně vypít, nebo zase vylít.
  • Celá řada nádob — krom toho, že do nich jdou vkládat a z nich opět vyndávat předměty — se dá rovněž zavřít, případně i zamknout, a následně zase otevřít, případně odemknout. Batohy jsou zároveň uzavíratelnými nádobami i oblečením, tedy je možno si je navíc nasazovat a zase sundávat.
  • Přinejmenším některá okna a dveře se dají zavírat a otvírat;[3] okny se dá často dívat, některá se dají rozbít, případně se jimi dá prolézt nebo na ně zaklepat; na dveře se dá často zaklepat, a má-li člověk ten správný klíč, může je případně i zamknout nebo odemknout.
  • Hráč může vyjadřovat celou řadu emocí jednak sám (např. usměj se), jednak vůči jiným hráčům i vůči nehráčům (např. usměj se na josefa), ba někdy i vůči neživým předmětům (např. plivni na podlahu).
  • Atd.

Všechny zmíněné (i nezmíněné) úkony, které se dají s objekty ve hře provádět, spočívají ve spuštění určitého úseku programového kódu, uloženého v objektu. V jazyce LPC se takovému úseku programového kódu říká zpravidla „funkce“ (v jiných programovacích jazycích by se zase mluvilo třeba o „proceduře“ nebo „podprogramu“). Tím, že hráč zadá určitý příkaz (třeba pij vodu), vyšle se oslovenému objektu pokyn, aby spustil příslušnou funkci, a ta se pak ve hře projeví tím, že rozešle některým objektům nějaké zprávy (třeba hlášku Pokus pije vodu z kohoutku. okolostojícím hráčům), některým objektům změní některé vlastnosti (třeba samotnému hráči přičte „vodobody“, tedy zvětší zásobu vody, z níž hráč svým životem postupně ubírá), případně spustí v některých objektech některé další funkce (pokud voda náhodou nebyla v pořádku, udělá se hráči špatně atd.).

Na stejném principu je založeno i smyslové prozkoumávání herních objektů, o kterém jsme mluvili v minulém kroku. Pokud hráč například očichá nějaký objekt, vyšle se objektu požadavek, aby spustil funkci, která hráči pošle zprávu o zápachu objektu. Rozdíl je jen v tom, že příkazy pro smyslové prozkoumávání okolních objektů jsou definovány v samotném objektu hráče, tedy hráč je má všude k dispozici, zatímco specifické příkazy například pro snědení potravy nebo vypití nápoje definovány právě v objektu potravy, resp. objektu nápoje. Pokud hráč napíše příkaz vypij a v jeho inventáři ani v jeho okolí není žádný objekt, v němž by byl takový příkaz definován, dostane obecnou hlášku Prosím? a žádná akce se nespustí. Jakmile se však hráč dostane do blízkosti nějakého nápoje, získá tím možnost užívat příkaz vypij, a ten pak způsobí buď vypití nápoje, nebo nějakou specifičtější hlášku (např. Co chceš vypít?), pokud se příslušné funkci nepodařilo rozpoznat, co přesně chce hráč daným příkazem provést.

Je-li příkaz takto definován v objektu, se kterým se má provádět, může se stát, že týž příkaz v různých situacích bude znamenat úplně jiný úkon. Například páka umístěná u nějakého stroje může nabízet příkaz zatáhni.[4] Pokud pak postava stojící u páky zadá zatáhni za páku, může daný stroj spustit. U vchodu do nějakého domu zase může být šňůra, která nabízí stejný příkaz zatáhni, avšak zatahání za ni nespustí žádný stroj, nýbrž rozezní domovní zvonek.

Reálné a virtuální objekty

editovat

Když se pokoušíme zacházet s různými objekty, narazíme na případy, kdy se s nějakým objektem nedá provést něco, co u jiných objektů téhož druhu bylo možné. Například jsme si na pár oknech vyzkoušeli, jak reagují na příkazy otevři, zavři a zaklepej — v jednom případě šlo třeba okno skutečně otevřít, ve druhém případě nám třeba sdělilo, že otevřít nejde, protože je zarezlé, ale bylo každopádně jasné, že příkaz otevření okna je definován, a ve třetím případě narazíme na okno, které na všechny zmíněné příkazy reaguje jen obecným Prosím?.

Takovéto dvojí či trojí chování oken (nebo jiných objektů, třeba dveří, židlí, skříní apod.) bývá způsobeno tím, že objekt, který nereaguje na očekávané příkazy, není reálný, nýbrž tzv. virtuální objekt (též detail, nebo z angličtiny v-item či vitem).[5]

Zatímco objekty, o nichž jsme dosud mluvili, jsou samostatné a ucelené programové entity, virtuální objekty jsou vlastně jen do jiných objektů vložené záznamy o vlastnostech objektů, které by mohly být, ale nikdo je nevytvořil. V případě našeho nereagujícího okna je tímto „jiným objektem“ místnost, která má mezi svými vlastnostmi uloženo, že je v ní staré okno v bíle natřeném dřevěném rámu, na omak trochu zaprášené. Pokud pak hráč zadá příkaz prohlédni si okno, pak jeho hráčský objekt, v němž je příkaz prohlédni definován, sice nenajde žádný reálný objekt, jehož by se tato věta mohla týkat, ale od místnosti dostane zprávu, že má popis zmíněného okna, a ten zní: Staré okno v bíle natřeném rámu. Léty nepoužívání už zatuhlo ve své zavřené poloze natolik, že ani při nejlepší vůli nejde otevřít. Hráčský objekt pak hráči pošle tento popis úplně stejně, jako by v místnosti byl samostatný objekt okna.

Zkusíme-li na virtuální objekt použít některý z příkazů, které hráči nabízí okno — jako třeba otevři okno nebo zaklepej na okno — pak se zpravidla dočkáme jen obecné hlášky Prosím?, protože ani hráčský objekt sám, ani místnost s virtuálním oknem nedefinuje příkaz otevři nebo zaklepej. Samozřejmě je možné, že v místnosti se nachází nějaký jiný objekt, který tyto příkazy definuje, pak tento objekt buď vztáhne náš příkaz na sebe (zaklepeme na reálné okno místo na virtuální), anebo nám nějakou hláškou dá najevo, že chceme zacházet s nesprávným objektem (například hláškou Na co že chceš zaklepat?). Rovněž místnost sama může definovat tyto příkazy a odpovídat za virtuální objekt (pak můžeme např. klepat na virtuální okno nebo se dívat do místnosti za oknem), takže můžeme mít docela dlouho dojem, že zacházíme s objektem reálným — než konečně narazíme na nějakou akci, která by měla jít s reálným objektem vykonat, ale s tímto objektem vykonat nelze, protože to není skutečný objekt.

Šikovný programátor nějaké místnosti může virtuální objekty vybavit takovým množstvím příkazů, že se rozdíl vůči reálným objektům při běžném hraní víceméně neprojeví. Protože však všechny takovéto virtuální objekty jsou jen vlastností nějakého reálného objektu, nemohou se nikdy samy přesouvat (nanejvýš spolu s objektem, jehož jsou součástí), ani samy nemohou obsahovat žádné objekty. I na virtuální objekty sice můžeme zkoušet aplikovat základní příkazy pro přesun objektů, jako třeba vezmi, a dočkat se nějaké specifické reakce, avšak virtuální objekt při tom nezmění svůj stav, tedy jenom se dozvíme, že ho nemůžeme vzít. Jen v ojedinělých případech můžeme pokusem o vzetí virtuálního objektu skutečně dostat nějaký objekt do inventáře — pak jsme ovšem nevzali virtuální objekt (ten zůstane na svém místě), nýbrž nový reálný objekt, který byl vygenerován reálným objektem, jehož součástí virtuální objekt je.[6]

Hlášení chyb

editovat

Byť programy jednotlivých objektů — jak později uvidíme — jsou někdy překvapivě přehledné a krátké, celek hry se skládá ze stovek vzájemně komunikujících a spolupracujících programů, z nichž právě ty na první pohled nejméně viditelné jsou nejsložitější. Ani kdyby Prahy vytvářela obchodní softvérová firma se špičkově placenými programátory, nebyla by hra prosta občasných chyb; Prahy však vytváří několik dobrovolníků ve svém volném čase jako svůj koníček, nepravidelný a nesoustavný, a tak je pochopitelné, že různých programových chyb nebo nedodělků v něm potkáme povícero.

Chyba v běhu programu se pro běžného hráče většinou projeví hláškou, že se před ním objevila časoprostorová díra. Taková chyba se automaticky zapíše do interní databáze chyb, kde si ji následně přečtou programátoři Prahů a podle svých časových možností se pokusí ji opravit. Občas se ale vyskytnou chyby, které se neprojeví časoprostorovou dírou, nýbrž které dokáže odhalit jen myslící hráč. Někdy jsou to překlepy v popisech objektů nebo v hláškách o herním dění (například „ne okně“ místo „na okně“), někdy jsou to nespojitosti mezi různými popisy nebo akcemi (například jsou v ulici dva protilehlé domy popisovány oba jako nacházející se na jižní straně), někdy je to neočekávané reakce nehráčských postav (například si od prodavače vyžádáte pochodeň, zaplatíte, a dostanete od něho batoh) atd.

Pro hlášení takovýchto chyb má každý hráč k dispozici příkazy překlep (určeno pro překlepy) a chyba (určeno pro všechny ostatní chyby). Přečtěte si společnou nápovědu k těmto příkazům (tedy pomoc chyba nebo pomoc překlep), a až narazíte na nějakou chybu, neváhejte a oznamte ji.[7]

Povinné

editovat
  • Najezte se a napijte. Kde se dá něco k snědku a k pití sehnat, vám může poradit Josef. Stačí se ho zeptat např. pomocí rci Kde mohu sehnat jídlo?.
  • Vyzkoušejte si svlékání a oblékání. Buď si alespoň svlékněte a znovu oblékněte noční košili, kterou na sobě zprvu má každý začínající hráč, nebo si najděte vícero kusů v truhle, kde se shromažďuje staré oblečení na rozdání, a vyzkoušejte si to s nimi. Prohlédněte si, jak vypadáte s oblečeným a se svlečeným kusem oděvu vy sami, a jak se vám jeví váš inventář.
  • Prohlédněte si různá okna, dveře, židle, pohovky aj. a snažte se používáním specifických příkazů zjistit, zda se jedná o reálné, nebo o virtuální objekty.
  • Přečtěte si nápovědu k příkazu chyba (tedy pomoc chyba).

Dobrovolné

editovat
  • Najděte v Domě svíčku. Navštivte sklep a vyzkoušejte si, jak se popis temné místnosti změní, když v ní svíčku zapálíte a opět ji zhasíte.
  • Zkuste se podívat z okna co nejvíce směry (tedy na severní, jižní, východní i západní straně domu, případně též v různých patrech a zákoutích).
  • Najděte a ohlaste příslušným příkazem aspoň jeden překlep nebo chybu.
  • Vyzkoušejte co nejvíce různých emočních příkazů (viz nápovědu pomoc city) na sobě, na jiných hráčích, na nehráčských postavách, na neživých předmětech.

Pomocné stránky

editovat

Poznámky

editovat
  1. Přesněji řečeno, hráčský objekt si tím připočte určitý počet „stravobodů“, které se pobytem ve hře a zejména namáhavými úkony postupně spotřebovávají. Počet „stravobodů“ je, jak jsme si řekli v minulém kroku, jednou z mnoha vlastností objektu hráče.
  2. Přesněji řečeno si tím hráčský objekt, podobně jako u jídla, připočte určitý počet „vodobodů“. Zvláště v horkém prostředí je časté doplňování tekutin velmi potřeba, neboť nedostatek vodobodů vede ke stavu dehydratace, během nějž postava ztrácí životní body.
  3. Dveře a okna, kterým tato možnost není dána, jsou zpravidla virtuální objekty, pro něž platí i řada dalších omezení. Více viz v kapitole o reálných a virtuálních objektech na této stránce.
  4. Stejně jako příkazy smyslového zkoumání se dají zadávat mnoha synonymy — například místo očichej můžeme použít též varianty očuchej, očichám, očuchám, a s jinou pádovou vazbou rovněž čichni, čuchni, čichnu, čuchnu, přičichni, přičuchni, přičichnu, přičuchnu, přivoň, přivoním — nabízejí zpravidla i příkazy definované jednotlivými objekty vícero variant. V případě příkazu zatáhni to budou nejspíš například varianty zatáhnu, zatahej a zatahám.
  5. Pohybujeme se ovšem ve virtuálním světě, tedy i „reálné“ objekty jsou vůči našemu reálnému světu virtuální, tedy reálně v něm nejsou. Jsou však reálné v rámci virtuálního světa hry, zatímco virtuální objekty jsou i v něm virtuální, tedy nenacházejí se v něm, ale hra se chová, jako by se nacházely.
  6. Příkladem takové akce je trhání plodů z ovocných stromů a keřů, s nímž se můžeme setkat v dalších oblastech hry.
  7. Stejně jako příkazy chyba a překlep fungují i příkazy nápad a pochvala, které ovšem neslouží k hlášení chyb, nýbrž k záznamu dalších nápadů, čím by šlo hru ještě vylepšit, a k vyjádření radosti nad tím, jak to či ono ve hře vypadá či funguje.