18. Listopad 2017 - 02:00

Autor Téma: Seriál o programování textových her v TADS 3  (Přečteno 8188 krát)

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #90 kdy: 20. Říjen 2017 - 14:22 »
Moc díky za vysvětlení s překladem, vyzkoušel jsem ve frobtadsu volbu -we a s definicí provaz.moveinto jsem opravdu pohořel.  A máš pravdu, vše jsem zkusil znovu a nyní již i WB píše:

TADS Compiler 3.1.3  Copyright 1999, 2012 Michael J. Roberts
Exoter.t(338): warning: undefined symbol "moveinto" - assuming this is a property name
Errors:   0
Warnings: 1

Zajímavé, včera jsem zkoušel WB restartovat a vše znovu kompilovat, druhý den vše funguje, nechce se mi věřit, možná že zafungoval „restart“ celého linuxu. Tak to je super, jen bych rád volbu -we využil i ve WB, zkoumal jsem jeho manuály, především The TADS 3 Debugger a zatím nenašel nic, co by mi pomohlo, ještě na to juknu.

Byl jsem nadmíru překvapen příkazem provaz.moveinto(studna) a vše jsem dnes ještě jednou otestoval a zasílám v příloze.

1. scénář – použil jsem svůj upravený soubor cs_cz.t, takže mi funguje příkaz přivaž zatím bez využití Tebou doporučovaného VerbRule, ve zdrojovém kódu je „chybný“ vnitřek metody provaz.moveinto. Takto vše v pořádku funguje a hra nemá problém s přivázáním provazu a vlezením do studny. V příloze jsou to soubory provaz_moveinto_Exoter.t, transskript_provazmoveinto.txt a cs_cz.t

2. scénář – stejně jako 1 bod, ale s využitím „správného“ vnitřku metody provaz.moveInto, zde hra píše nesmyslné hlášení:
(nejprve dáváš provaz na podlahu, potom ho uvolňuješ od studnu)
Provaz jsi spustil dolů.
// do studny se však nedostanu
>d
Studna je moc hluboká na to, abys do ní skočil jen tak.
V příloze jsou to soubory provaz_moveInto_Exoter.t, transskript_provazmoveInto.txt a cs_cz.t

3. scénář stejně jako bod 1, jen využívám Tvůj aktuální překlad cs_cz.t, který jsem si stáhnul na stránkách. Zde musím zatím místo „přivaž“ použít „připevni“, jinak ale vše funguje tak jak má.
V příloze je to soubor transskript_provazmoveinto_preklad_Gaspoda.txt

4. scénář stejně jako bod 2, jen využívám Tvůj aktuální překlad cs_cz.t, který jsem si stáhnul na stránkách. Zde dopadnu zase špatně, viz soubor transskript_provazmoveInto_preklad_Gaspoda.txt

Z toho jsem zmaten, zatím s využitím mého zdrojáku musím využít původní chybný provaz.moveinto, jinak nemohu provaz ke studni připevnit a dostat se dolů. Na druhou stranu se divím, že hra místo chyby vyhodí jen varování, v Library jsem našel jen moveInto.

Pokud se na to podíváš, budu moc vděčný, snad jsem se vyjádřil srozumitelně. Tady mi potíž přijde nelogická, spíš ale někde dělám chybu, o které zatím nevím.

Krásný víkend přeje

Orel

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #91 kdy: 20. Říjen 2017 - 20:33 »
Tak to je super, jen bych rád volbu -we využil i ve WB, zkoumal jsem jeho manuály, především The TADS 3 Debugger a zatím nenašel nic, co by mi pomohlo, ještě na to juknu.

Ony to jsou úplně stejné nástroje, jako ve frobtads, jen přeložené do Windows a Workbench je k nim doplněný jako nadstavba. Možnost naklikat tuto volbu najdeš v menu Build - settings - diagnostics - treat warnings as errors. To propíše danou volbu do makefile.

2. scénář – stejně jako 1 bod, ale s využitím „správného“ vnitřku metody provaz.moveInto, zde hra píše nesmyslné hlášení:
(nejprve dáváš provaz na podlahu, potom ho uvolňuješ od studnu)
Provaz jsi spustil dolů.
// do studny se však nedostanu
>d
Studna je moc hluboká na to, abys do ní skočil jen tak.
V příloze jsou to soubory provaz_moveInto_Exoter.t, transskript_provazmoveInto.txt a cs_cz.t

Ano, tohle jsou už docela zapeklité situace, kdy je potřeba si dobře uvědomit, jak to tam funguje. Podíváš-li se na popis NearbyAttachable, tak uvidíš, že se snaží vynutit, aby provaz sdílel se studnou stejný nadřazený kontejner. Jinými slovy, aby mohl být provaz přivázán, tak musí být umístěn přímo v místnosti, protože studna je také přímo v místnosti.

Citace
A "nearby" attachable is a subclass of Attachable that adds a
requirement that the attached objects be in a given location.  By
default, we simply require that they have a common immediate
container,...

Tedy nesmí být přímo ve studni, což se právě pokoušíš dělat pomocí toho moveInto. On se položí na podlahu jako součást přivázání ke studni, ale pak příjde tvůj příkaz přemístění do studny a tak se provaz poslušně zase odváže, aby mohl být strčen dovnitř studny. (Ta špatná koncovka "uvolňuješ od studnu" je jen překlep ve tvém skloňování.)

Takže nejjednodušší řešení je žádné moveInto nedělat (ani to chybné s malým i). Budeš-li to chtít vylepšit a skutečně mluvit o provazu ve studni, tak to chce pár změn. Jednak udělej studnu také NearbyAttachable, ať je vztah symetrický. Dále z ní udělej kontejner, aby se daly věci do ní vůbec dávat. No a nakonec si pomocí getNearbyAttachmentLocs definuj, kde má být provaz a studna, když jsou k sobě přivázány. Tedy ne vedle sebe v lokaci, ale v sobě:

Kód: [Vybrat]
++ studna : NearbyAttachable, Container, Heavy 'studna' 'studna' *3
    "Hluboká studna, nyní však již zcela vyschlá. "
    specialDesc = "Je tu stará kamenná studna. "

    canAttachTo(obj) {return obj == provaz;}
    handleAttach (other)
    {
        "Provaz jsi spustil dolů. ";
    }

    getNearbyAttachmentLocs(other)
    {
        return [location, self, 0];
    }

     gcName = 'studny, studni, studnu, studni, studnou'
     gcVocab = 'studny/studni/studnu/studnou'
;

Potom dostaneš něco takového:

Citace
>přivaž provaz
K čemu ho chceš připevnit?

>studna
(nejprve dáváš provaz do studny)
Provaz jsi spustil dolů.

>podívej se do studny
Studna obsahuje provaz.

>p studnu
Hluboká studna, nyní však již zcela vyschlá. Obsahuje provaz.

Studna je připevněna k provazu.

>p provaz
Je pevný.

Provaz je připevněn k studni.

>d
Sešplhal jsi dolů za pomoci přivázaného lana.

To je už jistě lepší, akorát je to trochu problém, že "Studna je připevněna k provazu.". To by ti mohla vyřešit třída SimpleAttachable, kterou napsal Eric Eve a je k dispozici v SampleGames ve zdrojácích attachment. Ta umí určit, který předmět je tzv. hlavní objekt (major) a pak správně mluví, který je připevněn k čemu.

Na druhou stranu se divím, že hra místo chyby vyhodí jen varování, v Library jsem našel jen moveInto.

Programátorům se poměrně často stává, že použijí nějakou proměnnou a zapomenou ji deklarovat. V dynamicky typovaných jazycích často ani deklarace nejsou potřeba. TADS tedy v rámci přítulnosti k autorům předpokládá, že když použiješ nějaký název, který nezná, tak že to je proměnná, kterou jsi zapoměl deklarovat a tak ji promptně vyrobí a vyhodí jen varování. Nechce působit prudérně.

TADS ale zároveň na rozdíl od leckterého jiného jazyka nedělá velký rozdíl mezi proměnnou a funkcí. Totiž tam, kde se očekává nějaká proměnná v objektu, která má hodnotu, tak TADS rád připustí metodu, která hodnotu vygeneruje. Proto si o neznámé metodě tak snadno pomyslí, že jde o zapomenutou deklaraci proměnné.

I když v tomto případě je to zmatečné, tak je to důsledek vlastností, které jinde zase pomáhají šetřit práci. On tě na to upozorní, jen to nesmíš přehlížet ;-)

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #92 kdy: 24. Říjen 2017 - 14:17 »
1. Debugger ve WB
Výborně, treat warnings as errors jsem všude nastavil a snad se podobným situacím už vyhnu. Je to na jednu stranu smůla, ale na druhou parádní ukázka toho, že dělám tradiční začátečnické chyby, netušil jsem, že „neznámý“ název systém bere jako proměnnou. Vidím, že kromě malého rozdílu mezi třídou a objektem je zde i minimální mezi funkcí a proměnnou. Je super, že je TADS v tomto benevolentnější, na druhou stranu jsem se jako laik dostal do pro mě nemožné situace, kdy mě nedefinovaná proměnná tak zmátla a jakoby fungovala a i když jsem provaz.moveinto v Library nenalezl, vše jakoby fungovalo tak jak mělo.
Všiml jsem si, že WB má v nastavení Diagnostics ještě volbu Pedantic, kterou si teď zapnu, zpočátku potřebuji znát i sebemenší chyby.
A nyní po rekompilaci stávajícího souboru provaz_moveInto_Exoter.t se dozvídám následující:

--------------------------------------------------------------------------------------------------------------------------
warning:
The symbol "executeCommand" is defined in the symbol file, but is already
defined.  This usually indicates that two symbol files that you're importing
both define this symbol as a function, object, or property name (the two files
might define the symbol as the same type, or as different types - it doesn't
matter, because the symbol can only be used once for any of these types).  You
must resolve the conflict by renaming the symbol in one or more of the source
files to make each name unique.
Errors:   0
Warnings: 1
t3make: error code 1
Build failed.
----- end build: Tue Oct 24 11:52:58 2017 -----
--------------------------------------------------------------------------------------------------------------------------

Varování executeCommand není ale definováno na konkrétním řádku, to chápu, když píše, že už je zavedeno v „symbol file“. Setkal jsi se už s touto chybou?

2. Attachable
Ano, tohle je opravdu zamotané, sakra, takovéhle chyby by měli autoři programátorských učebnic ukazovat jako parádní náročné příklady… Projel jsem třídu NearbyAttachable, ano, vidím zde informaci o nadřazeném kontejneru, upřímně řečeno ale až po Tvém vysvětlení chápu, oč skutečně jde. Skloňování jsem upravil a přidal definici kontejneru ke studni, jen jsem využil jediné plus, protože žádný jiný objekt zde v místnosti nemám, zkusil jsem i Tvůj příklad se dvěma plusy, který ale umístil místnost se dnem studny o místnost dále:
--------------------------------------------------------------------------------------------------------------------------
Severozápadní část nádvoří
Jsi na nádvoří. Na západě jsou dveře vedoucí do kamenné chodby.
Můžeš jít na východ, na jih, na západ.
Je tu stará kamenná studna.

>pripevni provaz ke studni
(nejprve dáváš provaz do studny)
Provaz jsi spustil dolů.

>d
Tímto směrem se pohybovat nemůžeš. Zřetelné směry vedou na jih zpátky do jihozápadní části nádvoří, na východ do severovýchodní části nádvoří a na západ.

>j
Jihozápadní část nádvoří
Stojíš na nádvoří.
Můžeš jít na sever, na východ, na jih, dolů.

>d
Sešplhal jsi dolů za pomoci přivázaného lana.

Ve tmě
Je tu naprostá tma.
--------------------------------------------------------------------------------------------------------------------------

Tomu snad již rozumím, ponechám tedy jediné plus. Třídu SimpleAttachable jsem podrobněji nezkoumal, přečetl jsem si o ní pouze v Learning TADS3 a studoval attachment.t ze Samples. 
Nakonec se zadařilo, podařilo se mi po malé úpravě charsetu inkludnout SimpleAttachable a takto definovat studnu i provaz, nyní je vše včetně češtiny v pořádku, viz soubory v příloze.
Plus jsem přidal nové VerbRule dle Tvého příkladu s bodni v Základně, nyní už nemusím upravovat nic v knihovně.

3. Malá otázka a poznámky
Přemýšlel jsem o definici

+ FireSource, Candle 'pochodeň/pochodně/pochodni/pochodní' 'pochodeň' *3

a přišla mi záhadná, objekt reprezentující předmět jsem zvyklý deklarovat spíše takto:

+ sekera : Thing 'sekera/sekerou/sekeru' 'sekera' *3

teď po pročítání Learning TADS3 se mi zdá, že je zde poprvé použit tzv. Anonymní objekt, je to tak správně?

Takže až na to malé varování u volby Pedant ve WB hra docela hezky hraje, nyní mě snad čekají už jen ty potvůrky typu strážce, drak a pes, po ukončení hry u brány bude Exoter na hrubo dokončen. Ještě jsem si všiml malé chyby při odvazování provazu od studny:

>odvaz provaz

(ke studni)
Hotovo.

Tady bude asi chyba v definici (co) (od čeho), ještě se s tím zkusím poprat. Příkaz  uvolni definovaný v knihovně funguje správně:

>uvolni

Co chceš uvolnit?

>provaz
Hotovo.

Ještě, že se s těmito potížemi setkávám, je mi jasné, že u C++ se stanou taky a budu zase o něco zkušenější. Zítra mi začínají podzimní prázdniny u koní, dorazí skoro dvacet řechtákomilců, takže k dalšímu vývoji se dostanu až po neděli.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #93 kdy: 24. Říjen 2017 - 20:57 »
Varování executeCommand není ale definováno na konkrétním řádku, to chápu, když píše, že už je zavedeno v „symbol file“. Setkal jsi se už s touto chybou?

Kompilovat to s volbou pendantic je už asi trochu přehnané. Nevím přesně, čím je to způsobené. Tedy vím, že executeCommand předefinovávám v českém překladu pomocí modify, ale to se mi zdá, že dělám správně. Takže sice se jedná o stejný symbol, ale ne o duplicitu, nýbrž o redefinici. Nemyslím, že by šlo o skutečný problém.

(Symbol file se vytváří před kompilací. Jedná se o takový katalog, jaké funkce, proměnné, třídy atd. jsou v každém souboru naprogramované. Slouží během samotného překladu.)

Skloňování jsem upravil a přidal definici kontejneru ke studni, jen jsem využil jediné plus, protože žádný jiný objekt zde v místnosti nemám, zkusil jsem i Tvůj příklad se dvěma plusy...

Promiň, to jsem tě zmátl neúmyslně. Já to kopíroval do fóra z diff souboru, protože jsem se koukal, co jsem nakonec ve tvém zdrojáku změnil. No a plus na začátku řádky znamená přidanou změnu. Ze zbytku zdrojáku jsem plusy a mínusy odmazal, ale tohle jsem přehlédl.

Nakonec se zadařilo, podařilo se mi po malé úpravě charsetu inkludnout SimpleAttachable a takto definovat studnu i provaz, nyní je vše včetně češtiny v pořádku, viz soubory v příloze.

Includovat? Ne, to sice bude fungovat, ale tak se to nedělá. #include je na hlavičkové soubory, to jsou ty s příponou .h. Přidej si SimpleAttachable do Makefile jako další zdroják a to před ten zdroják, ve kterém používáš. Třeba můj Makefile.t3m pro Frob vypadá takhle:

Kód: [Vybrat]
-o Exoter.t3
-D LANGUAGE=cs_cz
-D MESSAGESTYLE=neu
-D INSTRUCTIONS_MENU
-Fy obj
-Fo obj
-FC

-lib system
-lib adv3/adv3
-source Exoter.t

Tak bych prostě přidal -source SimpleAttachable.t před poslední řádek. No a ve Workbenchi se to udělá nějakým klikáním na stromečku vlevo, kde ti ukazuje soubory.

...teď po pročítání Learning TADS3 se mi zdá, že je zde poprvé použit tzv. Anonymní objekt, je to tak správně?

Ano, uložit referenci objektu do nějaké pojmenované proměnné musíš jen tehdy, pokud ji ty sám potřebuješ např. na to, abys někde jinde v programu něco s objektem provedl. Tak např. prakticky každou místnost člověk nějak pojmenovává, protože se na ni potřebuje odkázat z konektorů v jiných místnostech, aby je propojil do mapy. Nebo když mám nějaký objekt abudu s ním pak nějak interagovat pomocí programu, třeba ho někam přesouvat v nějaké akci, nebo se někde budu ptát, zda ho hráč drží apod.

Ale spousta objektů, zejména různé dekorace, ale i abstraktní věci, jako předměty rozhovorů, žádnou interakci nepotřebují, tak není důvod jm dávat jméno. Mimochodem když jsi v nějakém objektu, který je vložen kontejnerovou hierarchií do jinho objektu (tj. když seš v objektu s dvema plus), tak na nadřazený objekt (s jedním plus) se dostaneš pomocí vlastnosti location. Takže nemusíš třeba pojmenovávat objekt, na který se chceš dostat z potomka.

Ještě jsem si všiml malé chyby při odvazování provazu od studny:

>odvaz provaz
(ke studni)
Hotovo.

Tady bude asi chyba v definici (co) (od čeho), ještě se s tím zkusím poprat.

No schválně, jestli na to přijdeš:

Kód: [Vybrat]
VerbRule(UnStabTo)
    ('odvaž' | 'odvázat') dobjList
    ('k' | 'ke' | 'na' | 'do') singleIobj
    : DetachFromAction
    askIobjResponseProd = atSingleNoun
    verbPhrase
    {
            return 'odvázat/odvazu{ješ}/odvázal{a} (co) (k čemu)';
    }
;

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #94 kdy: 2. Listopad 2017 - 10:28 »
1. Volba pedantic a znaménko plus u studny
Ano, já  jsem upřímně řečeno trochu tušil, že chyba vyvolaná přepínačem Pedantic bude asi způsobena českým překladem a je mi jasné, že tohle se sakra těžko odchytává. Takže nechám Standard plus detailnější vypisování chyb, to mi plně vyhovuje. Symbol file tedy mohu chápat jako index u databáze. U studny jsem za malou chybku se znaménkem vděčný, alespoň mě to nutí přemýšlet nad problémem a ne jen otrocky opisovat, bez toho se u vývoje nikam nedostanu.

2. Include
Aha, tady narážím na svojí nezkušenost, ale to je dobře, správné programátorské návyky potřebuji jako sůl. Máš pravdu, že v jiném zdrojáku jsem také nalezl pouze include xxx.h, ponechám tedy jen adv3.h a cs_cz.h. Mnou upravenou třídu SimpleAttachable jsem tedy přidal do projektu jako další položku TADS3 Adventure Library, Tvůj makefile si uložím na později, zatím mi práce s WB vyhovuje, škoda, že Frob nemá takový debugger jako WB, v takovém případě by mi plně dostačoval.

3. Odvazování provazu od studny
Zde jsem upravil definici, nyní již „odvaž od studny“ funguje. Mám jen jeden dotaz:

Přivaž:

VerbRule(privaz)
    ('přivaž' | 'přivázat') dobjList
    ('k' | 'ke' | 'na' | 'do') singleIobj

Odvaž:

VerbRule(odvaz)
    ('odvaž' | 'odvázat') dobjList
    ('od' | 'od' | 'od' | 'od') singleIobj

Prozkoumal jsem Tvé informace na adrese http://tads.cz/cs/definice-ceske-verbphrase, rád bych upravil slova 'k' | 'ke' | 'na' | 'do' také u VerbRule(odvaz), odvázat mohu od něčeho/z něčeho, můžeš mě nasměrovat ke správné definici? Odvázání od studny mi v Exoteru plně dostačuje, v další hře už ale může být problém.

4. Anonymní objekt
Jasné, s těmito se v manuálech setkávám poměrně často, máš recht, že u dekorací nemá smysl konkrétní objekt přímo pojmenovat – dekorace a Tebou popisovanou třídu Vaporous mám v plánu v plánovaném Bad Nightu, kde se původní hrou budu jen lehce inspirovat. Ano, location Eric také často využívá a jak vidím, i Ty u Základny.

5. Mříž a šperhák vs pilník:
Po akci s pochodní a provazem mě napadlo, že by podobná metoda měla zafungovat i u mříže. Zatím jsem rezignoval na pilník a situaci řešil šperhákem ve funkci klíče, teď už ale vím jak na to:

- pilník definuji metodou iobjFor(CutWith) jako předmět, kterým lze něco přeříznout
- spíše než přeříznout bych využil slovo „přepilovat“, využil jsem novou definici VerbRule jako minule
- u mříže jsem pomocí metody dobjFor(CutWith) zajistil možnost jejího přepilování

Takže šperhák vesele mažu, přiznám se, že je bájo pocit, když se s takovou věcí konečně mohu poprat sám, na to bych bez Tvé pomoci nepřišel. O to více se těším na další tvorbu.

6. Strážce a boj obecně
Nyní se konečně dostávám k poslední bolístce, k boji. Na internetu jsem moc informací k tomuto tématu nenalezl, zajímavý je boj se zombiemi:

https://www.intfiction.org/forum/viewtopic.php?f=10&t=753
Depending on what you actually want to happen to the zombie (does its body stay in the zombie lair after it has been killed?), you'll have to change the "moveIntoForTravel(nil)" bit.

Pokud využiji popsanou definici metody moveIntoForTravel z Library:

        action()
        {
          moveIntoForTravel(newContainer);

              {
                 mainMoveInto(newContainer);
             }

             "Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť. ";
        }

objeví se chyba:

The symbol "newContainer" is undefined, but appears from context to be a
property name.  The compiler is assuming that this is a property.  Check the
spelling of the symbol.  If this assumption is correct, you can avoid this
warning by explicitly declaring a value to the property in an object definition
rather than in method code.

V Library vidím:
moveIntoForTravel - method of Thing in thing.t[5465]
takže tuto metodu lze využít pro třídu Thing, strážce je Actor nebo v mém případě UntakeableActor, což jsou podtřídy, takže tuto metodu využít mohu.

Prázdná metoda moveIntoForTravel(nil) způsobí zmizení objektu, takže funguje dle očekávání. To si budu pamatovat pro příště, nyní ale potřebuji, aby mrtvola strážce v místnosti zůstala a já k němu konečně mohl přiřadit svazek klíčů a křesadlo, které zatím leží na zemi.

Nyní se dívám na: www.tads.org/howto/t3npcTravel.htm

a také jsem prozkoumal zdrojové kódy Základny, v souborech
actorCommander.t       
actorCaptain.t       
roomCorridors.t           
roomControl.t       
actorTechnician.t
se vyskytuje metoda moveIntoForTravel

Nyní se zaměřím právě na tuto metodu, abych jí správně pochopil, ta se mi bude hodit při každém boji v textovkách, i když jej budu využívat minimálně.

Tábory mám za sebou, teď mě čeká spravování věcí po vichřici, za pár dní se zase k TADSu vrátím za budu pokračovat.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #95 kdy: 3. Listopad 2017 - 00:31 »
3. Odvazování provazu od studny
Zde jsem upravil definici, nyní již „odvaž od studny“ funguje. Mám jen jeden dotaz:

Přivaž:

VerbRule(privaz)
    ('přivaž' | 'přivázat') dobjList
    ('k' | 'ke' | 'na' | 'do') singleIobj

Odvaž:

VerbRule(odvaz)
    ('odvaž' | 'odvázat') dobjList
    ('od' | 'od' | 'od' | 'od') singleIobj

Prozkoumal jsem Tvé informace na adrese http://tads.cz/cs/definice-ceske-verbphrase, rád bych upravil slova 'k' | 'ke' | 'na' | 'do' také u VerbRule(odvaz), odvázat mohu od něčeho/z něčeho, můžeš mě nasměrovat ke správné definici? Odvázání od studny mi v Exoteru plně dostačuje, v další hře už ale může být problém.

Je to jednoduché, při zapisování gramatiky parseru se do apostrofů dávají jednotlivá slova, která se v příkazu mohou vysktovat. V každých apostrofech vždy jen jedno slovo. Kromě těchto slov se vyskytují placeholdery pro přímé a nepřímé objekty.

Napíšu-li 'a' 'b', tak to znamená, že hráč může zadat příkaz >a b, tedy dvojici slov za sebou. Na samotné >a nebo >b nebude příkaz reagovat. Svislítko značí alternativy. Tedy když např. napíšu 'a' | 'b', tak to znamená, že hráč musí napsat buď >a nebo >b, ale ne oboje. Svislítko ale dělá alternativu neomezeně doleva a doprava, takže např. 'a' 'b' | 'c' 'd' znamená, že hra má reagovat buď na >a b nebo >c d, ale ne na žádnou jinou kombinaci.

Dosah alternace lze omezit závorkami. Když dám ('a' | 'b') 'c', bude to reagovat na >a c i na >b c. Takže jednoduše:

Kód: [Vybrat]
VerbRule(UnStabTo)
    ('odvaž' | 'odvázat') dobjList
    ('od' | 'z' | 'ze') singleIobj
    : DetachFromAction
    askIobjResponseProd = atSingleNoun
    verbPhrase
    {
            return 'odvázat/odvazu{ješ}/odvázal{a} (co) (od čeho)';
    }
;

Bude reagovat na příkaz >odvaž provaz od studny nebo >odvázat provaz ze studny apod. Nakonec to chce i vhodnou verbPhrase, která poskytuje slovíčka do otázek "od čeho chceš provaz odvázat?" apod.

6. Strážce a boj obecně
Pokud využiji popsanou definici metody moveIntoForTravel z Library:

Metoda moveIntoForTravel je určená na přemisťování postav z místnosti do místnosti či z místa na místo.

Ne, nemusíš si kopírovat, jak je metoda napsaná v knihovně. Stačí ji použít. Ta deklarace s proměnnou newContainer prostě jen znamená, že při volání funkce máš předat nějaký nový kontejner, do kterého chceš postavu přesunout. Tak např.:

Kód: [Vybrat]
action()
{
"Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť. ";
moveIntoForTravel(nil);
}

Tím postavu vyhodíš ze hry pryč. moveIntoForTravel je metoda postavy, takže když jsi přímo v action metodě dané postavy, tak zavoláš takhle, ale i kdekoliv jinde můžeš zavolat, pak bys specifikoval, se kterou postavou pracuješ. Např. me.moveIntoForTravel(sz_nadvori) by přesunulo hráče na nádvoří, spici_drak.moveIntoForTravel(chodba) zase draka na chodbu.

nyní ale potřebuji, aby mrtvola strážce v místnosti zůstala a já k němu konečně mohl přiřadit svazek klíčů a křesadlo, které zatím leží na zemi.

No jo, tak pokud postavu nechceš přemisťovat, tak ji tam nech. Nebo ji odsuň pryč a na její místo dej objekt reprezentující mrtvolu. Jestli chceš zviditelnit klíče, tak jako Hidden a zavolat discover().

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #96 kdy: 7. Listopad 2017 - 11:43 »
1. VerbRule
Moc díky za detailní vysvětlení, definici nových VerbRule a vhodných verbPhrase budu určitě velmi často používat u dalších her – pokud bude textovku testovat kdokoliv jiný, než já, vždy poprosím o seznam synonym, hledat to správné slovo je šíleně otravné.

2. Strážce
Výborně, vyzkoušel jsem Tvůj příklad metody  moveIntoForTravel u zabití strážce, funguje parádně tak jako v příkladu se zombiemi.

Nyní se snažím o jeho zabití, změnu na mrtvolu a možnost odebrání předmětů. Při studiu Learning T3 je postava Boba definována jako OutOfReach a poté ještě jednou s využitím HermitActorState, zkusil jsem využít tuto definici, viz soubor Exoter_OutOfReach.t v příloze, zde však dostávám při pokusu o zabití strážce hlášku Nepřipadá Ti vhodné dotýkat se mrtvoly!

Ve druhém případě, kdy by strážce zmizel a vytvořil bych objekt nový, by dle Learning T3 měla fungovat třída PresentLater nebo Hidden s pozdějším využitím discover. Eve popisuje rozdíl ve svém manuálu na stranách 25 a 26. Přiznám se, že zatím netuším, která třída bude v dané situaci vhodnější, o PresentLater se dále nezmiňuje, zkusím prozkoumat SampleGames a vyzkouším obě. Zde pracuji se svým klasickým zdrujákem Exoter.t .

Teď mě ještě napadá, že bych tu samou metodu moveIntoForTravel mohl využít v místnosti druha_mistnost_vrchol_vez, odkud hráč spadne do sena, potřeboval-li bych postavu kamkoliv přemístit, zde se ale samozřejmě nabízí TravelMessage.
Tohle člověku docvakává až postupně, dostupných metod je mnoho a alespoň u klasických akcí, které se vyskytují v Exoterovi a ve spoustě dalších českých textovek mi alespoň zpočátku moc pomůže navedení na správnou metodu, než získám více zkušeností.

3. Verbrule u strážce

Zde je seznam příkazů, které jsem zkoušel:

>zabij strážce
Zaútočit na strážce holýma rukama není dobrý nápad.

Zde je malá potíž:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>zabij strážce sekerou
Strážcem nemůžeš zaútočit.
>udeř strážce sekerou
Strážcem nemůžeš zaútočit.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

V pořádku:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>zaútoč na strážce
Zaútočit na strážce holýma rukama není dobrý nápad.
>zaútoč sekerou
Příběh tomuto příkazu nerozumí.
// je třeba přesná definice
>zaútoč na strážce sekerou
Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Prozkoumal jsem definice VerbRule(Attack), VerbRule(AttackWith) a VerbRule(AttackWithType2) ve Tvém překladu. Zkoušel jsem definovat nové dle Tvého vzoru, např.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
VerbRule(zabij)
    ('zabij' | 'zabít') 'na' singleDobj singleIobj
    | ('zabij' | 'zabít') singleIobj 'na' singleDobj
    : AttackWithAction
    verbPhrase = 'zabít/zabíj{íš}/zabil{a} (na koho) (čím)'
    askDobjResponseProd = onSingleNoun
    askIobjResponseProd = singleNoun
;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

umožňuje příkazy:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>zabij na strážce
Nevidíš nic neobvyklého ve strážci.
>zabij na strážce sekerou
Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

To už je o něco lepší, jen po vymazání slova 'na' z definice
('zabij' | 'zabít') 'na' singleDobj singleIobj jsem zase na začátku.

Ještě si s tím zkusím pohrát, tyhle české definice musím bezchybně chápat, takové chyby jsou pro hráče k uzoufání a tomu bych se rád v maximální míře vyhnul. Znovu jsem popsal Tebou podrobně popsanou definici VerbRule(UnStabTo), tady bude ale asi zádrhel v něčem jiném, u „zaútoč“ potřebuji napsat „na“, kdežto u „zabij“ nikoliv.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #97 kdy: 7. Listopad 2017 - 21:09 »
1. VerbRule
pokud bude textovku testovat kdokoliv jiný, než já, vždy poprosím o seznam synonym, hledat to správné slovo je šíleně otravné.

Při testování je nejlepší od testerů vyžádat kompletní přepis celé hry a projít si celé jejich snažení. Sám narazíš na mnoho drobností k doladění, nejen chybějící synonyma příkazů, ale i chybějící slovník objektů, chybějící objekty zmíněné v nějakém popisu, nefungující příkazy a kde co. Stačí na začátku hraní zadat příkaz >zapni zápis a celý průbeh se pak ukládá do souboru. Tester může hned během hry napsat i různé poznámky pro autora, stačí do příkazového řákdku zadat hvězdičku a za ní cokoliv, ve hře se to bere jako poznámka.

2. Strážce

Mohl by s prosím doplnit průchod hrou? Naposledy mám níže uvedené, ale asi to trochu nakynulo a nějak se ztrácím, jak se dostat ke strážci a mít sekeru. No jo, jsem línej...

Kód: [Vybrat]
>zapni zápis
>testTranscript.txt
>koukni se do mrtvoly
>vezmi šperhák
>prozkoumej šperhák a mříž
>odemkni mříž
>n
>v
>vezmi pochodeň
>v
>vezmi svazek a křesadlo
>v
>prozkoumej dveře
>otevři dveře
>odemkni dveře svazkem
>v
>zapal pochodeň křesadlem
>i
>v
>j
>n
>v
>n
>s
>z
>koukni se do truhly
>prozkoumej provaz
>vezmi provaz
>d
>j
>z
>prozkoumej studnu
>přivaž provaz
>studna
>podívej se do studny
>p studnu
>p provaz
>d
>n
>polož pochodeň
>d
>n
>vezmi provaz
>d
>konec
>a

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #98 kdy: 8. Listopad 2017 - 10:42 »
Nádhera, takové testování ušetří čas hráči i mě, máš pravdu, že nepůjde zdaleka jen o synonyma, tady mě TADS zase jako obvykle příjemně překvapil. Vyzkoušel jsem i znak *, komentáře zaznamenány, vše funguje náramně.

Připravil jsem transkript obou situací, které jsem popisoval, nejprve pomocí definice OutOfReach a ve druhém případě s využitím třídy Hidden, kde si nejsem jist, zda bude lépe právě ona nebo PresentLater – vše zasílám včetně zdrojáků.

Ještě jednou si projedu příslušné kapitoly v manuálu a následně v Library, tohle mi zatím nepřipadá jednoznačné.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #99 kdy: 14. Listopad 2017 - 21:12 »
2. Strážce
Nyní se snažím o jeho zabití, změnu na mrtvolu a možnost odebrání předmětů. Při studiu Learning T3 je postava Boba definována jako OutOfReach a poté ještě jednou s využitím HermitActorState, zkusil jsem využít tuto definici, viz soubor Exoter_OutOfReach.t v příloze, zde však dostávám při pokusu o zabití strážce hlášku Nepřipadá Ti vhodné dotýkat se mrtvoly!

Jo, koukám, že je v manuálu chyba. Třída OutOfReach se primárně používá např. pro modelování police, která je vysoko na stěně a hráč na předměty na ní umísté nedosáhne. A ano, dá se použít i pro zamezení, aby hráč manipuloval s mrtolou. Chyba spočívá v tom, že OutOfReach rozlišuje, zda je mimo hráčův dosah jen obsah daného objektu (co je v něm/na něm, jako kniha na polici) nebo i samotný objekt. Metodou canObjReachContentsObj se určí, které objekty z obsahu budou nepřístupné. My ale potřebujeme omezit dosah především na samotnou mrtvolu, takže musíme opravit název metody na canObjReachSelf.

Ve druhém případě, kdy by strážce zmizel a vytvořil bych objekt nový, by dle Learning T3 měla fungovat třída PresentLater nebo Hidden s pozdějším využitím discover. Eve popisuje rozdíl ve svém manuálu na stranách 25 a 26. Přiznám se, že zatím netuším, která třída bude v dané situaci vhodnější, o PresentLater se dále nezmiňuje, zkusím prozkoumat SampleGames a vyzkouším obě. Zde pracuji se svým klasickým zdrujákem Exoter.t .

Lepší je modelovat stav postavy pomocí ActorState. Je to stále ta samá postava, jen se změní její stav a tím pádem popis. ActorState resp. potomek HermitActorState se vloží pomocí plus do postavy. Tam máš ve zdojáku chybu - postava má jedno plus, tak abys HermitActorState vložil do postavy, tak musíš dát dvě plus.

ActorState automaticky přidává svůj popis za základní popis postavy, proto je nevhodné mít to "chystá se zabít tě" v popisu postavy. To platí, jen než bude strážce mrtvý, takže místo popisu postavy vložíme ještě jeden HermitActorState, který představuje stav postavy na začátku hry. Proto je označen isInitState = true. Jakmile udělá hráč ten jedný mocný úder, tak pomocí setCurState(strazceDeadState); stav změníme a toho změněného stavu se chytne ten výše zmíněný canObjReachSelf a zamezí s mrtvolou manipulovat. Předměty pak třeba pohodíme do místnosti.

Teď mě ještě napadá, že bych tu samou metodu moveIntoForTravel mohl využít v místnosti druha_mistnost_vrchol_vez, odkud hráč spadne do sena, potřeboval-li bych postavu kamkoliv přemístit, zde se ale samozřejmě nabízí TravelMessage.

Často se stane, že je více možností. Současné řešení mi přijde ok.

3. Verbrule u strážce

>zabij strážce sekerou
Strážcem nemůžeš zaútočit.
>udeř strážce sekerou
Strážcem nemůžeš zaútočit.

>zaútoč sekerou
Příběh tomuto příkazu nerozumí.
// je třeba přesná definice
>zaútoč na strážce sekerou
Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Myslím, že jsem oba problémy (prohazování iobj/dobj i zaútoč sekerou) pořešil v nové verzi českého překladu, bylo tam pár chyb a nedodělků. Níže pak úpravy ve zdrojáku hry:

Kód: [Vybrat]
--- Exoter.orig 2017-11-08 19:52:07.000000000 +0100
+++ Exoter.t    2017-11-14 20:31:21.000000000 +0100
@@ -260,7 +260,6 @@

 + strazce: OutOfReach, UntakeableActor, RestrictedContainer 'stráž/strážce/strážný/strážného' 'strážce' *1
 //+ strazce: Person 'stráž/strážce/strážný/strážného' 'strážce' *1
-      "Chystá se zabít tě. "

       gcName = 'strážce, strážci, strážce, strážci, strážcem'
       gcVocab = 'strážci/strážci/strážce'
@@ -288,16 +287,25 @@
                         strazce.moveIntoForTravel(chodba_se_strazcem);

              "Jediným mocným úderem se ti podařilo poslat strážce do věčných lovišť. ";
+             setCurState(strazceDeadState);
+            kresadlo.moveInto(location);
+            svazek_klicu.moveInto(location);
 //                      moveIntoForTravel(nil); - v takovém případě zmizí z místnosti
         }
     }

-canObjReachContentsObj(obj) { return curState != strazceDeadState; }
+canObjReachSelf(obj) { return curState != strazceDeadState; }
 cannotReachFromOutsideMsg(dest) { return 'Nepřipadá Ti vhodné dotýkat se mrtvoly!'; }

 ;

+++ strazceGuardState: HermitActorState
+    noResponse = "Chystá se zabít tě. "
+    stateDesc = "Chystá se zabít tě. "
+    isInitState = true
+;
+
-+ strazceDeadState: HermitActorState
+++ strazceDeadState: HermitActorState
 noResponse = "Je mrtvý a nic už neslyší. "
 specialDesc = "Strážce leží mrtvý na podlaze. "
 stateDesc = "Strážce je mrtvý. "
@@ -310,7 +318,7 @@
 // po zabití vidíš mrtvolu strážce: "V obličeji má hlubokou krvavou ránu, kdo mu to asi udělal." - po prvním prozkoumání najd
 //  strazce.makePosture(sitting);   --- ze Základny, může si sednout, př. actorCommander.t

-++ PreferredIobj, Thing 'křesadlo/křesadla/křesadlu/křesadlem' 'křesadlo' *4
+++ kresadlo: PreferredIobj, Thing 'křesadlo/křesadla/křesadlu/křesadlem' 'křesadlo' *4
     "Snad by se s ním dal rozdělat oheň. "
     iobjFor(BurnWith)
     {
« Poslední změna: 14. Listopad 2017 - 21:14 od gaspoda »

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 117
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #100 kdy: 16. Listopad 2017 - 10:51 »
A sakra, neznalce malá chyba v manuálu dosti zmate. Vidím ale, že třída OutOfReach zde asi ideálním řešením nebude,  ActorState určitě vypadá lépe, se znaménkem je mi už vše jasné, je to podobná situace jako u kontejnerů. Chápu už také konečně použití  HermitActorState, které mi z manuálu jasné rozhodně nebylo. Teda tyhle na první pohled jednoduché záležitosti jsou alespoň pro mě dost komplikované, bez tebe bych akci se strážcem neměl šanci vyřešit.

Moc díky za další verzi překladu, vše jsem vyzkoušel a parádně funguje. Je super, že svojí tvorbou a hlavně otázkami alespoň trochu pomáhám ke zlepšování českého překladu, jak bys postupoval u chyby v manuálu s OutOfReach? Vím, že TADS se už pár let nevyvíjí a to samé bude i u manuálů, poslední verze např. Learning je z roku 2012,má ještě dnes smysl tyto chyby hlásit Ericovi na jeho email eric.eve@hmc.ox.ac.uk? Prozkoumal jsem diskuzní fórum TADSu, vypadá to, že:

https://www.intfiction.org/forum/viewforum.php?f=10

je stále živé a dotazy se zde řeší. Diskutující popisuji i své problémy, nenalezl jsem však, kam posílat zaslané chyby. Rád bych projektu stejně jako Ty pomáhal, TADS za to určitě stojí a pokud nás bude více, věřím, že vývoj bude zdárně pokračovat, už jen např. překlad dnes již nevyvíjeného frobtadsu pod novějšími kompilátory není úplně triviální a to je vzhledem k práci, kterou autoři v minulosti odvedli, obrovská škoda.

Při další tvorbě bych měl ještě dva dotazy, které spolu souvisí:

1. Popis místnosti u strážce potřebuji změnit tak, aby se po jeho zabití již neobjevil text „Vidíš strážce, naštěstí je k Tobě obrácen zády.“. Zatím mám ve zdrojáku toto:

    "Jsi v chodbě. <<if strazce.isIn(chodba_se_strazcem)>>Vidíš strážce, naštěstí je k Tobě obrácen zády. \b<<else>> <<end>>Můžeš jít na východ, na západ. "

Je jasné, že strážce, i když mrtvý stále v místnosti je. Pokusil jsem se o různé změny, např. logické mi přijde:

    "Jsi v chodbě. <<if curState != strazceDeadState>>Vidíš strážce, naštěstí je k Tobě obrácen zády. \b<<else>> <<end>>Můžeš jít na východ, na západ. "

Zde však větu „Vidíš strážce...“ vidím stále, zkusil jsem místo curState také ActorState, ale bez výsledku. Grepnul jsem si základnu, if zde běžně používáš např. u Borise nebo kapitána. Ani v manuálu jsem více k těmto if příkazům v souvislosti se změnou desc nenalezl, můžeš mě prosím blíže navést jak je správně používat? Eve uvádí v Learning T3 na straně 51 ohledně if – else podívat se do String Literals v System manual, to jsem udělal, příkladů je zde mnoho, např. if door is open, then…, jen u třídy Actor mi konstrukce nefungují a někde dělám chybu.

Existuje nějaká tabulka konstrukce if – else podobné např. té s operátory na str. 29 nebo stringů str. 39 z Learning T3? Změnu popisu místnosti po nějaké manipulaci s předmětem/postavou budu potřebovat u dalších her také a rád bych znal tu konstrukci, která se v praxi využívá.

2. Pokud strážce žije a hráč se chce přesunout na V, stejně jako v Exoteru bude zabit – strážce je ale otočen, takže na Z je vše v pořádku. Zkusil jsem využít konstrukci, kterou využívám u pádu z výšku do kupky sena upravenou na místnost se strážcem takto:

    east : TravelMessage
          {  ->konec_chodby
              "Opatrně procházíš kolem mrtvého strážce dál na východ . "
                canTravelerPass(traveler) {return !strazce.isIn(chodba_se_strazcem); }
              explainTravelBarrier(traveler)
         { "Strážce se na tebe se strašlivým řevem vrhl a celkem snadno ukončil tvůj život. "; finishGameMsg(ftDeath, [finishOptionUndo] );}
}

Nyní je jedno, zda strážce žije nebo ne a při průchodu na V vždy zemřu. Hra pomocí výrazu strazce.isIn pravděpodobně neřeší, je-li živ nebo ne, stále se nachází v místnosti. Podobně jako u prvního dotazu ani konstrukce:

                canTravelerPass(traveler) {return curState = strazceDeadState; }

nepomohla.

Teď mě ještě napadá, že u další hry budu potřebovat simulaci plížení, např. v jedné místosti si rytíř bude muset sundat brnění, aby se dokázal tiše proplížit okolo nějakého toho potvoráka, určitě podobnou konstrukci využiji i tam.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 103
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #101 kdy: 16. Listopad 2017 - 11:21 »
A sakra, neznalce malá chyba v manuálu dosti zmate. Vidím ale, že třída OutOfReach zde asi ideálním řešením nebude,  ActorState určitě vypadá lépe, se znaménkem je mi už vše jasné, je to podobná situace jako u kontejnerů.

Aby nedošlo k nedorozumění, OutOfReach (se správným názvem metody) je správným řešením. Použij oboje - HermitActorState se týká konverzace s postavou, když je postava v tomto stavu, tak s ní nejde komunikovat, tedy zeptat se, požádat apod. OutOfReach zajistí druhou část problematiky, aby s postavou nešlo manipulovat, tj. odpoví na všechny příkazy, jako vem, tlač, prohledej atd.

Jak bys postupoval u chyby v manuálu s OutOfReach? Vím, že TADS se už pár let nevyvíjí a to samé bude i u manuálů, poslední verze např. Learning je z roku 2012,má ještě dnes smysl tyto chyby hlásit Ericovi na jeho email?

Jo, já jsem to Ericovi minulý týden řekl a až/jestli bude nějaká nová verze, tak to v manuálu opraví. Jinak TADS má i databázi bugů, ale tam dávam spíše technické věci pro Mika Robertse. Ericovi jsem psal přímo. Ano, Mike je teď pár let poněkud zaneprázdněný a na TADS mu evidentně nezbývá čas. Po všech těch letech docela intenzivního vývoje se mu ani nedivím. Přímo jsem s ním nemluvil, tak nevím, jak vidí budoucnost, ale já osobně věřím, že se někdy zase k TADSu vrátí a chyby, které jsou hlášené opraví.

Rád bych projektu stejně jako Ty pomáhal, TADS za to určitě stojí a pokud nás bude více, věřím, že vývoj bude zdárně pokračovat, už jen např. překlad dnes již nevyvíjeného frobtadsu pod novějšími kompilátory není úplně triviální a to je vzhledem k práci, kterou autoři v minulosti odvedli, obrovská škoda.

To je zajímavé, pokud k tomu máš nějaké detaily, tak mi je klidně pošli mailem. Já už nějakou dobu neaktualizoval a nekompiloval Frobtads, ale v minulosti jsem žádné problémy nezaznamenal. Možná to souvisí s konkrétní distribucí, kdo ví. O frob se stará Nikos Chantziaras a je normálně pravidelně aktivní na fóru, určitě se dá mu problém nahlásit.

    "Jsi v chodbě. <<if curState != strazceDeadState>>Vidíš strážce, naštěstí je k Tobě obrácen zády. \b<<else>> <<end>>Můžeš jít na východ, na západ. "

Skoro dobře. Jen si musíš dát pozor, na čem vyhodnocuješ curState. Když programuješ nějaký objekt (zde chodbu) a napíšeš jméno nějaké vlastnosti, tak se ta vlastnost hledá v tom objekt, který programuješ. Ale chodba žádné stavy nemá, takže na ní curState neexistuje. Ale to není problém, prostě se odkaž na curState dané postavy, tj. do podmínky napiš <<if strazce.curState != strazceDeadState>>. U druhého dotazu to samé.

Teď mě ještě napadá, že u další hry budu potřebovat simulaci plížení, např. v jedné místosti si rytíř bude muset sundat brnění, aby se dokázal tiše proplížit okolo nějakého toho potvoráka, určitě podobnou konstrukci využiji i tam.

Pak se bude hodit podmínka ve stylu if(brneni.isWornBy(me)), která testuje, jestli nějaký Wearable předmět máš oblečený (nezávisle na tom, jestli ho máš v inventáři).