15. Prosinec 2017 - 16:48

Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - Kroužící orel

Stran: [1] 2 3 ... 9
1
Rozhovory a GiveTopic

Ještě jsem si trochu hrál s řezáním hlav a zatím se dál nemohu dostat, nevadí, nyní to nechám být a hlavy dočasně upravím tak, aby je bylo možné bez potíží sebrat a než mě napadnou další možnosti, dám si „rozhovor“ se psem.

Vrhnul jsem se na velké téma rozhovory, jen ať mi ze škeble kouří jako z toho milíře u Heidi, určitě za to budou stát. Díky těm navrhnutým tématům a možnostem zeptat se na něco jiného hra vypadá mnohem realističtěji, všiml jsem si, že pár her, které zde mám i se zdrojáky, jsou právě rozhovorem zakončeny. Tady bude obrovská možnost hru notně oživit, u Základny i Heidi jsou parádní příklady, které využiji při další tvorbě.

Zkoušel jsem si ještě před změnami u rozhovoru pohrát s chybou u třech "can", která vypisovala „The symbol "canObjReachSelf" is already defined“, skutečně se jednalo jen o středník navíc, který jsem měl umístěný po řádku

+ GiveTopic @draci_hlavy

Chybu už vidím, středník zde opravdu nesmí být, ani např. po tom pro mě zatím oříšku dobjFor(CutWith) u draka není, sakra, na ty středníky musím dát bacha, parser poté celou definici chápe ouplně jinak.

Ano, také u rozhovorů musím dodržet hierarchii kontejnerů, jdu to upravit. Mám zde místnost a objekt psa s jedním znaménkem, OK. Aha, pokud v tomto případě dám jediné plus do téma konverzace, je toto umístěno v místnosti a já tedy komunikuji s místností… jasně, tam tedy musí být znaménka dvě. Hmm, teď po vymazání středníku u GiveTopis vidím, že stavy psa by v případě jediného plus byly na něj navázány, to samozřejmě nechci. Hmm, teď už mi rozhovory konečně začínají zacvakávat a chápu, že není tak špatný nápad je u GiveTo používat, jsou krásně zapasované do objektu NPC a ty zase díky kontejnerové hierarchii do místností, což obstarává objektový model, tady asi zatím nejlépe vidím jeho výhodu – jo, právě čtu ve Tvém manuálu, že někteří autoři textovek uváděli zbytečnost kontejnerové hierarchie a zde konečně v praxi vidím opak, super, přesně to jsem potřeboval.

Vyzkoušel jsem první způsob s isActive:

++ GiveTopic
     isActive = pes.curState == pesGuardState
     matchObj = draci_hlavy
    topicResponse()
    {
      "Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled. ";
      draci_hlavy.moveInto(nil);
      setCurState(pesDeadState);
    }


canObjReachSelf(obj) { return curState != pesDeadState; }
canObjReachContents(obj) { return curState != pesDeadState; }
cannotReachFromOutsideMsg(dest) { return 'Nepřipadá Ti vhodné dotýkat se psí mrtvoly!'; }
;

++ pesGuardState: HermitActorState
    noResponse = "Vrčí na Tebe a viditelně Tě nechce pustit dál. "
    stateDesc = "Vrčí na Tebe a viditelně Tě nechce pustit dál. "
    isInitState = true
;

++ pesDeadState: HermitActorState
noResponse = "Je mrtvý a už se nehýbe. "
specialDesc = "Pes leží mrtvý na podlaze. "
stateDesc = "Pes je mrtvý. "
;


nebo druhý, kde je pouze pozměněn ++ GiveTopic @draci_hlavy


a zatím získávám stále hlášku:

>dej hlavy psovi
Vrčí na Tebe a viditelně Tě nechce pustit dál.

>dej psovi hlavy
Vrčí na Tebe a viditelně Tě nechce pustit dál.


Nyní zkouším odstranit HermitActorState z PesGuardState, potřebuji, aby pes reagoval na konverzaci. Kód vypadá takto:


+ pes : UntakeableActor 'obrovský pes' 'obrovský pes' *1
      "Vidíš mu na očích, že kromě lidského masa k smrti miluje dračí hlavy. "
     
      gcName = 'obrovský pes, obrovskému psovi, obrovský pes, obrovském psovi, obrovským psem'
      gcVocab = 'obrovskému obrovským obrovského psovi/psem/psa'

      allowAttack = nil

canObjReachSelf(obj) { return curState != pesDeadState; }
canObjReachContents(obj) { return curState != pesDeadState; }
cannotReachFromOutsideMsg(dest) { return 'Nepřipadá Ti vhodné dotýkat se psí mrtvoly!'; }
;

++ pesGuardState: ActorState
    noResponse = "Vrčí na Tebe a viditelně Tě nechce pustit dál. "
    stateDesc = "Vrčí na Tebe a viditelně Tě nechce pustit dál. "
    isInitState = true
;

+++ GiveTopic
     matchObj = draci_hlavy
//     isActive = pes.curState == pesGuardState
    topicResponse()
    {
      "Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled. ";
      draci_hlavy.moveInto(nil);
      setCurState(pesDeadState);
    }
;

++ pesDeadState: HermitActorState
noResponse = "Je mrtvý a už se nehýbe. "
specialDesc = "Pes leží mrtvý na podlaze. "
stateDesc = "Pes je mrtvý. "
;

Po nabídnutí dračích hlav se objeví správné hlášení „Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled.“, ale stále žije i přes direktivu setCurState(pesDeadState) nebo pes.curState == pesDeadState uvnitř topicResponse(). Překladač ovšem chybu nevyhodí, vypadá to, že jí v topic nebudu moci využít. Zkusil jsem si přidat:

+++ DefaultAnyTopic
    "<.p>Pes nereaguje. "

    deferToEntry(entry) { return !entry.ofKind(DefaultTopic); }
;

který správně funguje, pokud chci psovi dát něco jiného, než dračí hlavy.

Napadlo mě ještě jedno řešení, přidal jsem objekt mrtvolu psa do GiveTopic direktivy pes.moveInto(nil) a mrtvola_psa.discover(). Nyní je vše OK, jen mě pes stále zabíjí vzhledem k definované TravelMessage v místnosti. Tu samozřejmě mohu změnit, není zde nějaký elegantnější způsob, jak mrtvolu psa ponechat v místnosti a moci odejít na východ?

Uff, podle zdrojáků mi vše přijde OK, tady se asi snažím o něco, co GiveTopic nedovoluje. Ještě počkám na Tvůj názor, pokud to jinak nepůjde, upravím  TravelMessage a nechám psa být, vše zasílám v příloze včetně transkriptu. Nečekal jsem, že se tak seknu u draka i psa, když se dívám na Tvá kouzla v Základně, které parádně komentuješ, ale samozřejmě mi často nejsou jasné, kdo ví, kdy e k jejich pochopení dostanu, to ale určitě časem.

Až budeš mít chvilku, prosím koukni na zdroják a pokud to půjde také na to useknutí dračí hlavy. Je tu ještě spousta věcí k doladění, to ale k programování patří, tuším, že ten TADS nebude o moc jednodušší, než klasické C++…

Krásný víkend přeje
Orel

2
Programování / Re: Seriál o programování textových her v TADS 3
« kdy: 11. Prosinec 2017 - 12:53 »
Dračí hlavy a CutWith:

Ano, já jsem se opravdu snažil do verify přímo vkládat text, což není dovolené, v Library vždy vidím definici makra illogical, kterou se budu řídit. Zkusil jsem definovat mrtvolu draka jako Heavy, paráda, vše funguje tak jak má, mohu tedy využít Immovable s cannotXXXMsg zprávami nebo Heavy, to je přesně ten typ komentáře, který chci vložit do zdrojového kódu, poznačit si, že jsou zde 2 způsoby. Podobně budu postupovat i u dalších objektů a metod, moc se mi líbí komentáře u Základny a rád bych nejen pro sebe něco podobného vytvořil i u Exotera.

Hm, definovat v gcName dva objekty je nesmysl, já jsem si to také myslel, jen jsem zatím neviděl jiné řešení.
Zkoušel jsem v historii naší komunikace dohledat zmínku o String PreParser, nebyl jsem úspěšný, používáš jej v Základně u componentPreparser.t a roomAlien.t pro to, aby parser poznal znaky obsahující číslici zadanou od hráče společně s textovým řetězcem s nebo bez mezer, jinde jsem se s ním opravdu nesetkal.

Ale je mi jasné, že definice akce CutWith počítá se dvěma objekty, proto získávám odpověď „Spícím drakem nic nepřeřízneš.“. Attachable určitě využívat nebudu, jen jsem si vzpoměl na tam uvedený příklad s kostičky lega, který bych rád využit v kombinaci drak – mrtvý drak – dračí hlavy.

Stále si mi však nedaří akci s CutWith zdárně doknočit. Spící drak má jediné +, rozumím, že hlavy by měly být definované jako komponenta uvnitř draka, takže definuji:

++ draci_hlavy : Hidden, Component
++ drak_bez_hlavy : Hidden, Immovable

Akci CutWith jsem zkoušel definovat jak u spícího draka, tak u sebe:
    dobjFor(CutWith)
    {
        preCond = []
              verify() {}

            check()
            {
                        if (gIobj != sekera)
                        failCheck('To bude chtít něco jiného. ');
            }

                action()   

                {
                        "Odsekl jsi dračí hlavy od těla. ";
                        spici_drak.moveInto(nil);
              drak_bez_hlavy.discover();
                        draci_hlavy.moveInto(me);
                }
    }

Plus testuji příkaz draci_hlavy.moveInto(me); stejně jako využíváš objekt Syringe u základny, aby se vrátil do hráčová inventáře, po vykonání ovšem získávám:

>prozkoumej hlavy
Dokud byly živé, vypadaly hrozivě.

>vezmi hlavy
Nemůžeš ji vzít, protože je součástí tebe.

>polož hlavy
Hlavy je součástí tebe.

Dračí hlavy definované jako Component hlásí po sebrání hlášky typu „nemůžeš je sebrat, protože jsou součástí místnoti/draka“ a draci_hlavy.moveInto(me).

Tady opravdu metodu dobjFor(CutWith) nechápu, asi potřebuji reálný příklad, hledal jsem ve zdrojácích TADS her, které zde mám fulltextem, Základna, Heidi, Tell, Cloak_of_Darkness, Return to Ditch Day, The Elysium Enigma, The Plant, nikdo řezání něčeho něčím nevyužívá a ani s iobjFor(CutWith) to není jiné, opravdu zvláštní.
Našel jsem jen:

http://tads3.gerynarsabode.org/index.php?title=Fuses_Example_Game&action=edit

zde je příklad s drátem, jehož definice není zrovna to, co potřebuji

a

http://users.ox.ac.uk/~manc0049/TADSGuide/trollbridge2.htm

využívající adv3lite, což nemohu použít.

Koukám na čas, tímhle se trápím už přes 4 hodiny, ufff, musím na vzduch si vydechnout, nabrat síly a zařídit dětské akce. Jestli budeš mít čas a chuť na to juknout, můžeš využít minulý transkript a aktuální zdroják zasílám v příloze. Večer nebo zítra juknu na ty konverzace u psa a dám vědět jak dopadly.

3
1. Dračí hlavy a verify
Jé, tak tady jsem se teda opravdu vyznamenal jako nepozornej študák, já vím, popel na mojí hlavu. Omlouvám se za nepozornost, naštěstí oba pracujeme s dětmi, takže snad jsme zvyklí opakovat několikrát jasné věci, sakra, zrovna před mým dotazem jsem si celou kapitolu Akce ve Tvém návodu prošel. Se začátkem tvorby jsem vůbec netušil, o čem je řeč, teď už konečně vnímám např. rozdíl mezi dobjFor a iobjFor a tato kapitola je jasnější, jenže ouha, stále mi vše kolem akcí nedochází. Pro mě je to tedy ta nejobtížnější část tvorby, verify každopádně popisuješ parádně a příklad jsem upravil dle Tvých doporučení, v mém případě je ideální kombinace prázdného verify, které nepřetěžuji, hlavní podmínku, aby byl drak po smrti, kontroluje check a řezat mohu pouze objekty, které to mají povolené pomocí metody iobjFor(CutWith). Zavolal jsem inherited pro volání zdědeného chování a po projití všech těchto kontrol může action() vykonat to, co má.

Tak a hóóóu, já pořádně zpomalím, už se sice těším, až Exotera dokončím, to ale nemá smysl, protože pokud celou metodiku, kterou je naprogramován nepochopím, u další hry se budu jen zbytečně zasekávat. Také jsem zjistil, že u TADSu bude téměř nemožné zcela opisovat styl tvorby textovky, kde univerzální příkaz použij vše řeší – použiju jehlu na draka, on umře, pak použiju sekeru a useknu mu hlavy, jak krásně jednoduché…

Tady ale přeci nemohu nechat draka jen tak, když mu useknu hlavy, musí se objevit jeho bezhlavá mrtvola, která samozřejmě bude mít atribut Immovable se všemi náležitostmi, na které jsi mě upozornil minule, už je to zařízeno. Další věc mě tu pálí, příkaz uřízni/rozřízni draka sekerou opravdu není něco, co by hráče napadlo, i když si u popisu psa může přečíst že k smrti miluje dračí hlavy. Takže budu potřebovat něco jako „uřízni hlavy sekerou“, díval jsem se na zajímavou konstrukci do souboru roomTunnel.t v Základně, kde dvě vozítka rozlišuješ direktivou
disambigName
ta však rozlišuje dvě stejná vozítka, což není můj případ. Takže jsem to vyřešil jednoduše, manipulace drakem = manipulace dračíma hlavama, drak po uříznutí hlav stejně zmizí, takže vše funguje jak má:

      gcName = 'spící drak, spícímu drakovi, spící drak, spícímu drakovi, spícím drakem, dračí hlava, dračím hlavám, dračí hlava, dračím hlavám, dračíma hlavama'
      gcVocab = 'spícímu spícím spícího dračím dračíma dračí drakovi/drakem/draka/hlavám/hlavama/hlavy'

Tímle malým trikem jsem vše vyřešil, jen příkaz:
>uřízni dračí hlavy

Spícím drakem nic nepřeřízneš.
// to chápu, zde parser myslí, že chci něco přeříznout drakem

>uřízni dračí hlavy sekerou
Odsekl jsi dračí hlavy od těla.
// zde je vše OK

Zde mě tedy jako řešení napadá definovat draka jako kontejner podobně jako u strážce, zde ale pravděpodobně také narazím, protože dračí hlavy nemohou jen tak vypadnout z draka po jeho smrti. Druhá možnost je ta, že draka definuji jako dva samostatné objekty např. „dračí hlavy“ a „drak“, pamatuji si, že něco podobného jsem viděl v Erikově manuálu u příkladu s třídou Attachable – jednalo se o kostičky různých barev, které se na sebe skládají jako lego, juknu na ně a zkusím vymyslet vhodnější řešení.

A poslední věc je zabití draka jehlou, zde bych rád také příkaz píchni draka jehlou. Ten ve slovníku zaveden není, přidáním:
VerbRule(pichni_koho)
    ('píchni' | 'píchnout') singleDobj singleIobj
     : AttackWithAction
    verbPhrase = 'píchnout/pích{áš}/píchnul{a} (koho) (čím)'
    askDobjResponseProd = onSingleNoun
    askIobjResponseProd = singleNoun
;

mohu využít „píchni draka jehlou“.

Ha, mohlo by zde třeba být i zrcadlo, do kterého se drak dívá, když si zkouší ty svoje zářící šperky nebo čarovné zbraně a hra by mohla simulovat jak v něm vypadá, když chrní nebo když už je bez hlav plus třída Vaporous bude krásně popisovat ty spráné odlesky od šupin, to si ale opravdu už nechám na příští hru, která se těmito věcmi bude jen hemžit.

2. Pes – příkazy Give to a topic
Aha, nečekal jsem, že příkaz Giveto je spojen s konverzačními tématy, jak vidno, mám dost potíží pochopit akce, upřímně řečeno hovor s postavami jsem chtěl řešit až ve své další hře. To ale nevadí, naštujuji vše už teď.
Ano, už první příklad „Vem Borisův kafovak“ jasně dává najevo, že zde nejde jen o témata rozhovoru, ale o mnohem více. Také s CurState jsem se u postav samozřejmě setkal, netušil jsem, že HermitActorState bude probírán právě v této kapitole, já jsem se k němu dostal přes Erikův manuál… Tak mám dočteno, bezva příklad s tím senilním čarodějem, systém je parádně propracovaný, to jsem ostatně obdivoval už v Základně. Textovkám se přeci jen už v dobách ZX Spektra říkalo konverzační hry, takže toho budu využívat o sto šest. 

Tady musím vše okolo postav pořádně pochopit, v další hře bude klisna, se kterou si chci vysloveně vyhrát, hráč jí bude muset správně vyhřebelcovat, nasedlat, nauzdit a nakonec si s ní i pokecat – možná se z řechtandy vyklube pořádná fešanda, ještě tedy nevím, zda to bude princezna, vědma, stará babička nebo třeba zakletá dračice, určitě ale bude stát za to.

Systém rozhovorů bude nebude tedy o mnoho jednodušší, než akce, ufff, možnosti krásné, ale za jakou cenu. Nyní v T3TourGuide čtu na straně 219 přesně to, o čem píšeš, příkaz iobjFor(GiveTo) není vhodný při interakaci s NPC postavami.
V Learning T3 je poměrně jednoduchý příklad na straně 220, jen u mě bude jeho použití náročnější, protože postřebuji psa, který si vezme otrávené dračí hlavy, zabít. Nejvhodnější mi přijde definice:

+ GiveTopic
     matchObj = draci_hlavy
    topicResponse()
    {
      "Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled. ";
      draci_hlavy.moveInto(nil);
      setCurState(pesDeadState);
    }
;

která ovšem vylučuje použití canObjReachSelf(obj), canObjReachContents(obj) a cannotReachFromOutsideMsg(dest), debugger v takovém případě píše, že „The symbol "canObjReachSelf" is already defined“ a u ostatních rovněž. Pokud tyto tři direktivy vymažu, kompilace proběhne, ale pes o dračí hlavy nejeví zájem „Obrovský pes vypadáš nezaujatě.“.

Příklad včetně transkriptu zasílám v příloze, ještě se juknu na definici GiveTopic do Library, snad zjistím, proč se toto děje, hledal jsem např. situaci, kdy hráč někomu podá jed a NPC jej sní a umře, něco podobného je např. ve hře Trollbridge, její definice mi však nepomohla.

3. Hledání v Library
Ano, nyní vždy budu hledat třídu objektu, o který mám zájem, v levém sloupci jsem si zobrazil Classes a např. Hidden, po kliknutí na odkaz 906 si mohu prohlížet dojb akce. Vidím, že Hidden dědí pouze z Thing a Immovable z NonPortable a ta zase z Thing. Rozkliknul jsem si např. UntakeableActor, který mě zajímá, dědí z Actor a ten z Thing.
U Hidden a Immovable jsem si vyhledal všechny metody dobjFor(PutBehind), vše mě odkazuje do object.t, jasně, Immovable dostane přednost před jakýmkoliv zděděným chováním.

4. Rozbití koule sekerou
Ano, o PreferredIobj jsme se bavili, využil jsem jej u pochodně i křesadla. Nyní jsem předefinoval sekeru a příkaz rozbij sekerou kouli i naopak už parádně funguje. Všechnu naši konverzaci mám uloženou, jak vidno, je nejvyšší čas vypíchnout z ní zajímavé dotazy a odpovědi a vše si vytisknout stejně jako Tvůj manuál a Learning T3, udělám to hned.

5. Jehla
Ano, moje action překrývá standardních chování, já chci, aby stará jehla zmizela a objevila se nová otrávená, kterou hráč musí sebrat. Pokud bych chtěl jehlu nechat v inventáři, vymažu řádky jehla.moveInto(nil), otravena_jehla.discover(); a zavolám inherited pro zdědění standardního chování, jasné.

Nebudu tedy spěchat, ještě si pohraju s drakem a pořádně nastuduji konverzaci s NPC. Dál bych si rád zprovoznil lokální webový server, konečně jsem i v Archu zprovoznil QTADS, stabilní verze s novějším kompilátorem mi nechodí, ale ta z gitu ano, přidám si jeho volání do Creatoru tak jak popisuješ. Díval jsem se na sebové hraní, manuál popisuje umístění binárního t3 souboru nejprve na IFArchive, nalezl jsem odkaz:

https://www.ifarchive.org/cgi-bin/upload.py

a následně prolinkování v mém profilu na IFDB, který jsem si vytvořil. To bude paráda, čeká mě doladění draka a psa, slovníky, překlepy, intro, možná malá nápověda apod., ale také bych rád doplnil komentáře tak jako to máš u Základny. Nakonec si vše rozběhám na lokálním webu a poté vložím do IFArchivu, při tom mohu tvořit nejprve kostru nové hry, ostatně jak píšeš v Tipech pro tvorbu vlastní hry, musím si připravit osnovu a strukturu příběhu a na to si některý ten pátek nechat, to nelze uspěchat. 

4

Nyní pokračuji v tvorbě, hru už lze po sebrání všech čtyř drahokamů a projitím branou dokončit, závěr hry jsem připravil pomocí kombinace TravelMessage a finishGameMsg. Kromě malé bolístky u rozbití koule, kterou jsem popisoval v minulém příspěvku se nyní setkávám s pro mě zatím zvláštním chováním u draka i psa:


1. pokud je drak zabitý pomocí otrávené jehly, vše je OK:

>přeřízni draka
Čím ho chceš uříznout?

>sekerou
Odsekl jsi dračí hlavy od těla.

>vezmi hlavy
Hotovo.


2. pokud drak žije a snažím se použít příkaz přeřízni, zde je zvláštní chyba:

>přeřízni draka
Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Čím ho chceš uříznout?


>přeřízni draka sekerou
Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Řezat spícího draka určitě není dobrý nápad. Odsekl jsi dračí hlavy od těla.

// a hráč získá hlavy, což by neměl


3. pokud je drak správně zabit otrávenou jehlou, odříznu mu hlavy a nabízím je psovi, vše je OK - viz příklad č. 1:

>dej psovi hlavy
Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled.

>v
Opatrně procházíš kolem mrtvého psa dál na východ.


4. pokud drak není správně zabit a tak jako tak seberu dračí hlavy, zde je zvláštní chyba - viz příklad č. 2:

>dej hlavy psovi
Tím se psovi určitě nezavděčíš. Tím se psovi určitě nezavděčíš. Tím se psovi určitě nezavděčíš.
Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled.

>v
Opatrně procházíš kolem mrtvého psa dál na východ.

5. pokud psovi v každém případě dám něco jiného a je jedno, zda v inventáři mám nebo nemám dračí hlavy, je zde také zvláštní chyba:

>dej psovi křesadlo
Tím se psovi určitě nezavděčíš. Pes se lačně vrhl na otrávené dračí hlavy. Na jeho předsmrtnou agánii nebyl pěkný pohled.


Tady pravděpodobně nesprávně definuji ty 2 ify v metodě dobjFor(CutWith) u draka a iobjFor(GiveTo) u psa, vše jsem kontroloval v Library a lze bez chyb přeložil. V příloze zasílám aktuální zdroják včetně transkriptu, který končí severně od místnosti s drakem, můžeš se prosím juknout na mé definice? Nevím, zda ty dva ify jsou správné řešení a také psa nechci zabít, ale odstranit jej pomocí podání otrávených dračích hlav, napadla mě metoda dobjFor(CutWith).

5
1. Ještě jednou k metodikám a rychlým aktualizacím
Tak tady jsem špatně propojil skrumáž s agilním programováním, pokud jej dobře chápu, setkal jsem se právě s agilním stylem u doprogramování modulů IS – systém byl hotov, účetní, logistici apod. měli určité požadavky, které jsem já předával vývojářům a společně s oběma stranami testoval. Na základě této vazby jsme pak klidně změnili zadání, protože ne vždy se účetnímu podařilo správně definovat svůj požadavek.

Na generování dokumentace ze zdrojových kódů jsem se již ptal u TADSu, zde jsi mi potvrdil, že právě Library je takto připravena. HTML dokumentace, o které píšeš, je v takovém případě samoúčelná a zase naplňuje nějaké ty tabulky výkonnosti týmu, ale buďme upřímní – nebyli bychom v práci stejní? Když si vzpomenu na svoje zaměstnanecká léta IT špecialisty, každý den jsem se setkával se záplavou požadavků, co zase nefunguje na stanicích, proč nejede tiskárna, chudákovi manažerovi se jeho nejnovější mobilák nedokáže synchronizovat s Autlukáčem, jaktože najednou nefunguje pdf výstup ze SAPu… Kolega se věčně musel vrtat na linuxovém serveru, protoře požadavky jen pršely a např. po čerstvé instalaci nové verze Oracle musel vychytávat jejich chyby… no a vývojáři eshopu postavené právě nad touto databází si museli užívat to samé, nebyli poté rádi, že si dokumentaci odbyli právě tak zjedodušeně jak píšeš a měli pocit hotové práce? Nevím… já jsem v té době vždy záviděl „starým“ správcům, kteří v devadesátých letech měli na starost jenom kontrolu terminálů připojených k síti starým kulatým ethernetem a hlavní činnost byla denní záloha dosového účetnictví na disketu…

A paradoxně teď, když dělám ouplně jinou práci a na sebe, mám mnohem více času na Linux a konečně už i na to programování, které mě dříve vůbec nechytalo, ale cítil jsem, že už mě jen správa nebaví a rád bych něco vytvořil. Proto díky za TADS a Tvůj čas, baví mě to čím dál tím více a Tvé rady mi připadají jako rady učitele, který nemá v popisu práce jen nějaký teoretický výzkum, ale učí to čerstvé, s čím denně pracuje. Už teď máš u mě pořádnou projížďku na koni, což je alespoň malý revanš za Tvůj čas.
Ha, píšeš o udržování dokumentace QT Creatoru a dere Tě rychlý vývoj – ano, vždy, když jsem nastoupil do nové práce, první činnost bylo projetí dokumentace a její aktualizace plus někdy úsměvná kontrola serverovny a zjištění, co tu za těch X let, kdy se na to nikdo nedíval, vlastně všechno běží… Čím jsem starší, tím dokumentaci beru jako důležitější věc, proto mě ve světě Linuxu moc zaujal Arch, který i přes čerstvé balíčky má opravdu příkladnou wiki. RHEL a SUSE také, ta v Archu je ale dle mého názoru určena spíše pro praktické použití a krásně vysvětluje konkrétní problémy, na které bych se jako uživatel ptal. Klobouk dolů tohle v takové kvalitě udržovat. Tady např. Debian nebo Slackware nemají návody tak dobře zpracované. Otázka zní, zda to tým Archu bude i v budoucnu zvládat, systémy nám stále bobtnají, s čímž se asi nedá nic dělat. Další zajímavost je OpenBSD, zde je mi velmi sympatická jejich snaha nepřidávat bezhlavně nové funkce, ale spíše zeštíhlovat kód a integrovat pouze aplikace podrobně zdokumentované. Prošel jsem si jejich manuálové stránky, na server paráda, pro desktop mi samozřejmě více sednou ty z Archu, což je dáno směrováním obou systémů. Jenomže v OpenBSD nemám Wine a nabídka aplikací je menší plus jejich naprostá ignorace českého jazyka mi zatím nedovoluje s ním aktivně pracovat. Mnoho jejich myšlenek mi ovšem sedne, takže uvidím – naštěstí je zde na výběr a do budoucnosti nevidím a ani nechci.

2. Akce a referenční příručka plus vhodný styl hledání
Ano, určitě souhlasím, že na každou akci bych se měl podívat do Library, to se snažím dělat. Pro mě je zatím největší problém nalézt jak je daná akce pojmenována, pár jich už v paměti držím a další budou přibývat s postupem času, to asi jinak nelze.
Ano, akci PutBehind krásně popisuješ, objekt, který chci za něco umístit, musím držet a protože verify je prázdné, lze tak učinit. Ale každý objekt má implicitně verify nastaven na illogical, které v takovém případě musím potlačit, přesně tak jak jsi psal minule u příkladu se senem. U oblékání musím přetížit verify, které mělo původně implicitně nastavenou hodnotu illogical a ještě musím kontrolovat, zda konkrétní věc na sobě nemám. Teprve poté se může provést akce s oblékáním. A je zde precondition, která je stejná, jako u prvního příkladu PutBehind.

Tak a díky tomuto příkladu už vidím svojí chybu, kterou provádám při hledání v příručce. Dejme tomu, že se potřebuji podívat na definici právě PutBehind:

V Library si klidnu v levém sloupci na P a naleznu řádek PutBehindAction - class in actions.t[1939]. Rozkliknu si PutBehindAction a následně příklad pod číslem 1939. Vidím však jen následující definici:

DefineTIAction(PutBehind)
;

která mi toho opravdu mnoho neřekne, takže začnu laborovat, co s tím. A teď babo raď, jak se mám doklikat k Tebou popisovanému kódu "PutBehind" action? Je mi jasné, že vše naleznu v popisu třídy Thing, to ale vím až teď od Tebe a samotného by mě nenapadlo spávné hledání. OK, zatím si tedy grepnu řetězec "PutBehind" action a nechám se překvapit, co získám. Konečně mě příkaz:

grep -Ri ""PutBehind action"" ./

odkazuje na

www.tads.org/t3doc/doc/libref/source/thing.t.html

Když si nyní v Library rozkliknu vlevo thing.t a následně vpravo source file, Tebou popsaný PutBehind je zde. A jak jsem předpokládal, můj skromný jednořádkový příkaz naleznu také, pokud si vlevo nahoře rozklidnu actions.t .
Takže suma sumárum si také musím zapamatovat, že na akce, které se vážou k předmětu, je nutno juknout se taky do popisu Thing. To je cenná zkušenost, bezva.

3. Kaluž
Právě Immovable mě napadlo jako ideální řešení pro věc, kterou nemohu sebrat. Žádný podobný příklad v referenčních hrách nebo na fóru jsem nenalezl. Bezva nápad s přidáním specialDesc, popis místnosti je hnedle živější, budu jej používat mnohem častěji v další hře. Tak a už se dívám na popis class Immovable: NonPortable a klik na 1998 mě správně odkáže na object.t. A tady v popisu mimo jiné vidím „ The messages to use for the failure messages.“ a hnedle pod tím CustomImmovable přesně tak jak píšeš. Bezva příklad jsem našel i v Základně, soubor regionShip.t – objekt ship: MultiLoc, Fixture. Vše jsem doplnil také ke střepům a senu.
Dokumentace k TADSu je tedy parádní, budu s ní ještě podrobněji pracovat, teď už si v ní připadám skoro jako doma na wiki Archu.

4. Rozbití koule
Ano, tohle také musím prozkoumat v Library. Už se dívám na dobjFor(AttackWith), ano, vidím zde verify() { }, takže akci mohu provést a mažu jej ze své definice. V action zprávu mám, to by mělo být OK. Zde jsem zkoušel různé konstrukce, zatím se mi však nepodařilo zprovoznit jak příkaz „rozbij kouli sekerou“, tak „zaútoč na kouli sekerou“.
Pokusil jsem se dle Tvého doporučení využít:

    dobjFor(AttackWith)
    {
        check()
        {
            if (gIobj != sekera)
                failCheck('Kouli holýma rukama nerozbiješ. ');
        }
        action()
        {
            "Rozbil jsi skleněnou kouli sekerou, kapalina vytekla na zem a všude kolem jsou rozházené střepy. ";
            sklenena_koule.moveInto(nil);
            kaluz.discover();
            strepy.discover();
         }
    }

      dobjFor(Break) asDobjFor(Attack)

Zde ovšem mohu využít pouze příkaz „rozbij kouli sekerou“, jiný nelze.

Nejlépe mým potřebám zatím vyhovuje definice:

    dobjFor(Break)
    {
        verify() {}
        check()
        {
            if (!sekera.isIn(me))
                failCheck('Kouli holýma rukama nerozbiješ. ');
        }
        action()
        {
            "Rozbil jsi skleněnou kouli sekerou, kapalina vytekla na zem a všude kolem jsou rozházené střepy. ";
            sklenena_koule.moveInto(nil);
            kaluz.discover();
            strepy.discover();
         }
    }
      dobjFor(Attack) asDobjFor(Break)

Kde mohu použít „rozbij kouli“ nebo „zaútoč na kouli sekerou“, nefunguje pouze „rozbij kouli sekerou“.
Píšeš ovšem, že definice dobjFor(AttackWith) asDobjFor(Break) není správná, protože melze přesměrovávat akce se dvěma objekty na akci s jedním objektem. Pokud řádek zakomentuji, mohu využít „rozbij kouli“, ovšem „zaútoč na kouli sekerou“ už samozřejmě nefunguje.
Pokud využiji u své konstrukce dobjFor(Break) řádek dobjFor(Attack) asDobjFor(Break), nyní mohu použít „rozbij kouli“ a také „zaútoč na kouli“, jen nesmím vypisovat čím.
Pokud využiji Tvojí konstrukci dobjFor(AttackWith) a řádek dobjFor(Attack) asDobjFor(Break), mohu pouze „zautoc na kouli sekerou“.

Zkoušel jsem definovat nové Verbrule a vyzkoušel u své i Tvé konstrukce:

VerbRule(rozbij_cim)
    ('rozbij' | 'rozbít') singleDobj singleIobj
    | ('rozbij' | 'rozbít') singleIobj singleDobj
    : AttackWithAction
    verbPhrase = 'rozbít/rozbíj{íš}/rozbil{a} (co) (čím)'
    isPrepositionalPhrasing = nil
    omitIobjInDobjQuery = true
    askDobjResponseProd = singleNoun
    askIobjResponseProd = singleNoun
;

Výsledek je trochu jiný, ale stále neuspokojí:

rozbij kouli sekerou
Skleněnou koulí nemůžeš zaútočit.

Zatím tedy ponechám mojí konstrukci dobjFor(Break), která umožňuje rozbít nebo zaútočit na kouli v případě, že má hráč v inventáři sekeru, jen není možné napsat „rozbij kouli sekerou“ nebo „zautoc na kouli sekerou“. Sakra, tohle není sranda, budeš-li mít možnost, prosím jukni na mojí definici.

5. Templates
Výborně, soubor TemplatesQref.PDF se bude hodit, mám uloženo.

6. Seno
Metodu dobjFor(Burn) jsem změnil na dobjFor(BurnWith) a musel jsem trochu upravit definici pochodně. Ano, používat název třídy určitě není vhodné, pojmenoval jsem jí jako pochodeň a přidal PreferredIobj podobně jako u křesadla. Metodu iobjFor(BurnWith) jsem prozkoumal v Library, v tomto případě je na rozdíl od křesadla vhodné použít preCond = [objHeld, objBurning], zkoušel jsem do hranatých závorek „isLit“, to ale není možné a manuál vše krásně popisuje. Díky za upozornění, měl jsem chybu v definici dobjFor(BurnWith) s sena – chybné pochoden.isLit jsem změnil  na !pochoden.isLit a nyní je zapálení sena konečně v suchu.

7. Namočení jehly a VerbRule
V mém případě namáčím co - jehlu, což je dobj kam - do kaluže, což je iobj, jasné. Ano, vím že akce PutIn předmět položí a hráč jej musí zdvihnout, což mi zde nevadí, píšeš, aby mě to u jiných situací nepřekvapilo, myslíš tedy např. tehdy, když budu potřebovat, aby hráč předmět z inventáře nepoložil a po např. po namočení v jedu mu tam zůstal?
Definoval jsem 3 nové VerbRule, nyní mohu využít příkaz „namoč jehlu“, „namoč jehlu v kaluži“ a „namoč jehlu do kaluže “ - jasné, zapomněl jsem definovat prázdnou předložku, kterou si TADS doplní, v a do, upravil jsem i předchozí  VerbRule, které jsem dříve definoval se správnými koncovkami.

Je toho jak vidím ještě stále dosti k dodělání, to ale nevadí, na téhle hře se mnohé naučím a tak to má být.

Krásný víkend přeje Orel

6
Programování / Re: Seriál o programování textových her v TADS 3
« kdy: 29. Listopad 2017 - 18:58 »
1. Metodiky programování
Paráda, rozepsal jsi se zajímavě a podrobně, moc díky za Tvůj čas. Teď už konečně chápu, co to opravdu znamená agilní programování, bude to něco jako tah na branku v požadavcích na firemní uchazeče. Jak vidno, po agilní snídani opravdu netoužím, tfuj… Pokud je metodika TDD vhodnější spíše pro větší týmy, zatím se jí podobněji zabývat nebudu, každopádně testy, které provádíš v QT Creatoru a o kterých jsme se bavili při mých začátcích s TADSem mi připadají komplexní, transskript s úspěchem používám i já a pokud uživatel-tester opravdu Zapne zápis, měli bychom společně odchytit téměř vše. Což jak chápu používáš, uvádíš, že testuješ především při TADS tvorbě. S univerzálními kvalitně napsanými komponenty, které sdílíš s ostatními, zcela souhlasím, zde si představuji např. komponenty starého Delphi a snad i novějšího Lazarusu, díky nimž programátor spoustu času ušetří a měly by být otestovány, vím, že vývojáři účetních programů a prvních IS tento nástroj s úspěchem využívali a někteří si dnes stěžují na Visual Studio, kde jim chybějí.

Máš recht, že takové testování v QT Creatoru, které jsem měl možnost vidět na obrázku v diskuzi, je velmi jednoduché a účinné, unit testy jsou možná pro TADS trochu zbytečné. Ale každopádně je budu využívat u C/C++, takže až dokončím hru, juknu na ně podrobněji a srovnám s těmi céčkovými. Tvrzení, že u jiného SW je takové jednoduché testování nedostažitelné, je velmi zajímavé, opravdu jsi mě překvapil. Hmm, pokud se v TDD netestuje vše potřebné, ale provádí se hlavně proto, aby se naplnily měřitelné parametry testování, nedá se nic dělat, připomíná mi to tzv. timesheety, které jsem denně vyplňoval v práci, ufff, pracovat na sebe má opravdu nesmírné výhody.

Sakra, nesmím to s tím programováním tak přehánět, manželky těchto individuí to opravdu nemají jednoduché… kór když je vývojář ještě nadšený koňák a dříve, než kobylku nauzdí, provádí testy výkonnosti...

2. QT Creator
Super, vše jsi parádně popsal, podařilo se mi naimportovat prázdný projekt, přidal jsem všechny soubory Základny a nastavil sestavení a spuštění. Hru se mi podařilo spustit pomocí interního qtcreator_process_stub. Lokální práce je tedy OK, tímto způsobem si založím nový projekt Špatné noci velmi volně inšpirované Bad Nightem, ještě si výhledově zprovozním lokální webový TADS server, to je myslím dobře popsané v dokumentaci. Zatím tedy budu používat klasický WB debugger, přiznám se, že se bez něj neobejdu s kombinaci s QTC. Důvody, proč QTC používáš, jsou jasné, mě se nejvíce líbí to, že ze mnou známých skutečných IDE, nejen „lepších“ textových editorů, patří mezi ty nejméně paměťově náročné plus je určen pro C a C++, pořádně se na něj juknu. Pokud se příliš živě vyvíjí, nevadí, i Arch je takový, vždy mám možnost výměny za Kdevelop nebo cokoliv jiného, ještě, že máme na výběr. DevC++ si pamatuji před mnoha lety z Windows, naštěstí pod Linuxem je výběr obrovský, zaujal mě např. jednoduchý juCi++, nejedná se ovšem o IDE, které pokud člověk správně uchopí, určitě pomůže.

3. Zapálení sena
Aha, já tušil, že Matchstick a Matchbook jsou předem připraveny pro konkrétní akci, v tomto případě samozápalný objekt, to u sena nevyužiji. Precondition si taky všímat nebudu, automatické akce nechám na později. Metoda dobjFor(Burn) funguje parádně, ještě jsem hráči znemožnil seno vzít, ať hra vypadá trochu reálněji.

4. Skleněná koule
Aha, budu si pamatovat, že k vyřazení akce rozbij je třeba přetížit verify. Použil jsem metodu dobjFor(Break) s tím, že pokud mám sekeru u sebe, hráč automaticky kouli rozbije. Následně se objeví kaluž, u které jsem ještě musel definovat  cannotTakeMsg a protože nebyla vidět, ale šlo jí prozkoumat, ještě bylo třeba isListed = true. Teď celá akce funguje parádně.
Jediná malá bolístka je v tom, že hráč musí napsat „rozbij kouli“, ovšem příkaz „rozbij kouli sekerou“ vrací „Nic takového jako „kouli sekerou“ tu nevidíš.“

Metoda dobjFor(AttackWith) útok sekerou povoluje, „zabij strážce sekerou“ je OK.

U skleněné koule jsem se pokusil použít místo původního
if (!sekera.isIn(me))
příkaz
if (gIobj != sekera)
zde však pohořím:

>rozbij kouli
Kouli holýma rukama nerozbiješ.
>rozbij kouli sekerou
Nic takového jako „kouli sekerou“ tu nevidíš.
>zabij kouli
Kouli holýma rukama nerozbiješ.
>zabij kouli sekerou
Skleněnou koulí nemůžeš zaútočit.
>zaútoč na kouli
Kouli holýma rukama nerozbiješ.
>zaútoč na kouli sekerou
Na ni nemůžeš zaútočit.

Využívám metodu dobjFor(Attack) asDobjFor(Break)

Napadlo mě změnit metodu dobjFor na:
dobjFor(AttackWith) asDobjFor(Break)

poté získávám:
>rozbij kouli
Kouli holýma rukama nerozbiješ.
>rozbij kouli sekerou
Nic takového jako „kouli sekerou“ tu nevidíš.
>rozbij kouli sekera
Nic takového jako „kouli sekera“ tu nevidíš.
>zaútoč na kouli
Na ni nemůžeš zaútočit.
>zaútoč na kouli sekerou
Rozbil jsi skleněnou kouli sekerou, kapalina vytekla na zem.

Jasně, zde je převzata metoda z definice strážce, metoda rozbij je však definována jinak a pokud uvažuji správně, musel bych jí přeprogramovat dle svých potřeb a nazvat jí např. DobjFor(BreakWith).

Ale nebudu situaci komplikovat, asi bude lepší vůbec hráči nedovolit zaútočit na kouli, pouze jí rozbít, takže jsem dobjFor(Attack) asDobjFor(Break) zakomentoval. Napadá mě, že těchto situací si v budoucnu určitě při tvorbě užiji dosytosti, je možné hráči na konkrétní příkaz, např. v mém případě:

rozbij kouli sekerou, rozbij kouli pochodní …

automaticky odpovědět např. textem „To nemůžeš udělat.“ - tedy přepsat standardní knihovní hlášku? Dost by to podobné situace zjednodušilo.

Podobně je to se zapálením sena:
>zapal kupku pochodní
{Tím iobj} nemůžeš nic zapálit.
// to chápu, pochodeň není definována přímo jako věc, která umožňuje něco zapálit
>zapal kupku křesadlem
To není něco, co by mohlo hořet.
>zapal kupku
Zapálil jsi seno. Bylo tak dobře proschlé, že za několik sekund zbyla jen docela malá hromádka popela.

Možná bych využil informace z Tvého manuálu, kde píšeš o Nepřenosných objektech - Fixture představuje pevný objekt, který na pokus o sebrání, pohnutí a položení někam reaguje chybovými zprávami cannotTakeMsg, cannotMoveMsg a cannotPutMsg. Pokud na objektu tyto vlastnosti nenastavíte na svůj jednoduchými uvozovkami ohraničený řetězec, použije se standardní knihovní hláška.
Bylo by možné takové řešení využít?

5. Namočení jehly v kaluži
Chvíli jsem se trápil s namočením jehly v kaluži, hra samozřejmě příkaz namoč nezná a již tradičně jsem žádný vhodný příklad na internetu ani v dostupných hrách nenalezl. Nakonec mě napadlo definovat kaluž jako RestrictedContainer, dlouho jsem uvažoval o vhodné metodě, s dobjFor(PutIn) jsem úspěšný nebyl, iobjFor(PutIn) ale funguje k plné spokojenosti. Uff, tak snad už se konečně do té tvorby dostanu. Definoval jsem také nové slovo „namoč“ pomocí:

VerbRule(namoc)
    ('namoč' | 'namočit')
    dobjList 'do' singleIobj
    | ('namoč' | 'namočit')
    'do' singleIobj dobjList
    : PutInAction
    verbPhrase = 'namočit/namá{číš}/namočil{a} (co) (do čeho)'
    askIobjResponseProd = toSingleNoun
;

a po kompilaci ve WB fungoval příkaz „namoč jehlu v kaluži“ kromě klasického dej nebo polož jehlu do kaluže naprosto bez potíží. Ale ouha, teď jsem překompiloval Exoter.t pomocí t3make a „namoč jehlu v kaluži“ už nefunguje, polož nebo dej naštěstí ano, viz transkript. Setkal jsi se někdy s něčím podobným?

Dokonale jsi mě rozřechtal tou hláškou ...to vyvolalo zmáčknutí klávesy R na ovládacím počítači v základně, kterou se zobrazí reporty o těžbě. - a její kombinací s prostorami hradu, díky, tak krásně už jsem se pár dnů nazasmál.

Draka a psa už mám připravené, nyní mě čeká vymyslet jak mrtvému drakovi useknu hlavy sekerou, dívám se na DefineTIAction(CutWith) a především dobjFor(CutWith) a tyto následně hodím psovi, zde se pokusím využít stejnou definici jako při namočení jehly do kaluže. Prozatím zasílám aktuální zdrojový kód a transkript, zítra nebo pozítří budu vesele pokračovat.

7
Všeobecná diskuse / Re: Textovky.cz
« kdy: 29. Listopad 2017 - 18:54 »
Rád zase nějakou pěknou textovku zrecenzuju, jen mám plné ruce práce s TADSem a pomáhám s testováním Toferunu. Exoter se konečně blíží do konce, už chybí jen pár drobností, pak se vrhnu na textovku mnohem rozsáhlejší a mezi tím určitě bude místo i pro nějakou tu recenzi.

8
Programování / Re: Seriál o programování textových her v TADS 3
« kdy: 28. Listopad 2017 - 09:24 »
Komunikace na fóru funguje bezvadně, od Jeffa jsem získal zajímavé soubory, plánuje třídy pro výuku TADSu jako prvního progracovacího jazyka, což je velmi zajímavé, přečetl jsem si Python for Kids, tvorba textovek mě však samozřejmě zaujala více.

1. Unit testy
Díval jsem se na jeho soubory, pro zajímavost zasílám i v příloze, je zde sada TADS3 Unit Testů, zajímavé, v minulosti jsem se setkal s pojmem Programování řízené testy – TDD, což pokud dobře chápu bude jedna z metod programování podobně jako např. Scrum. Vím jak postupuješ ty pomocí transkriptu hry, využil jsi při své práci také něco podobného od Jeffa nebo Bizzarriho?

2. QT Creator
Fórum jsem trochu procházel, zaujal mě článek, kde krásně popisuješ své prostředí:
https://www.intfiction.org/forum/viewtopic.php?f=10&t=20899&sid=0bc3a9795ccf2d5ffea8ecfd35941195
a vysvětluješ automatické testy. Obrázek QT Creatoru v akci je velmi zajímavý, zkoušel jsem různé editory a IDE a v případě aplikací v prostředí KDE potěší integrovaná podpora syntaxe TADSu v Kwrite i KATE, což se mi opravdu snadno podařilo převést do QT Creatoru. Svojí další hru již plánuji rozdělit na soubory podobně jako u Základny, proto by se vhodné IDE hodilo. Přímá podpora TADS projektu zde samozřejmě není, mohu poprosit o osvětlení jak jsi postupoval u založení projektu – nestačil např. nový projekt v C++ a ručně přidat zdrojové t soubory? Kontrolu nad výstupy máš v tomto IDE parádní, sakra, kdyby byl nějaký programátor ochoten převzít debugger z Workbenche a naroubovat jej na Frobtads, bylo by takové IDE naprosto perfektní a závislost na WINE ukončena.
Také je zvláštní, že projekt KDE má dvě taková prostředí, Kdevelop a QT Creator, na fóru:
http://www.abclinuxu.cz/clanky/srovnani-kdevelop-a-qt-creator
jsem našel sice starší, ale zajímavý článek obě porovnávající a mnoho rozdílů zde není. Každopádně zvýraznění syntaxe funguje pod každým z nich, Kdevelop se zdá být cca o 50MB zabrané paměti úspornější. Tak jako tak je to oproti javovským IDE paráda, na mém ne zrovna výkonném stroji se jedná dosti zásadní rozdíl.
Používáš QT Creator i nyní a jsi s ním spokojen? Nyní mám na svém stroji Arch Linux a Q4OS, v obou tato prostředí parádně fungují a i když mám pod Archem GTKčkové MATE, není s integrací sebemenší problém, obecně mi Arch přijde velmi zajímavý a i přes čerstvé aplikace opravdu stabilní, jeho Rollback Machine jsem už nevyužil, ani nepamatuji.

3. Na fóru mě zaujala ještě jedna zajímavost:
https://github.com/anthonyirwin82/generator-tads
Yeoman Generator for TADS 3
Nevím, zda má pro vývoj smysl automaticky generovat projekty s využitím tohoto nástroje, zaujala mě však podpora node.js, kterou využívají i moderní aplikace pro linuxovou řádku, možná by prospěla budoucnosti TADSu právě s využitím webových technologií.

4. Na a zase zpět k tvorbě
Nyní potřebuji zapálit kupku sena křesadlem nebo pochodní stejně jako v původní hře a po jejím shoření se na zemi objeví jehla.
Již umím zapálit pochodeň, přemýšlel jsem jak nejvhodněji zapálit kupku sena. Napadlo mě využít Matchbook a Matchstick, zkusil jsem definovat právě kupku jako Matchstick a křesadlo Matchbook i obráceně, dostávám však nesmysly typu „zapaluješ kupku kupkou“, tady si nejsem jist, zda kombinaci sirky - krabička od sirek budu moci využít. Plus nesmím zapomenout nadefinovat pochodeň podobně jako křesadlo PreferredIobj s využitím metody iobjFor(BurnWith).
Pokud neuspěju se zápalkami, další možností by mohlo být využití objektu objBurning: PreCondition – jen si nejsem jist, zda není určen k něčemu jinému, v Library píší This can be used for matches, candles, and the like. Budu ještě testovat.

Druhá akce je rozbití skleněné koule sekerou, na zem se rozlije tekutina, do které mohu namočit jehlu a tou odstranit draka.
Zde mi přijde ideální metoda dobjFor(Break), prozkoumal jsem příklady ze Základny, kde jí hojně využíváš, zde jsou však pouze formulace využívající direktivu illogical a popisující, proč hráč něco nemůže rozbít. Ani Library moc nepomohla, je zde pouze:
   /* -------------------------------------------------------------------- */
    /*
     *   "Break" action
     */
    dobjFor(Break)
    {
        preCond = [touchObj]
        verify() { illogical(&shouldNotBreakMsg); }
    }

snažím se využít jednu konstrukci ze Základny:

   dobjFor(Break)
    {
        verify() { }
        action()
        {
            "Nepodařilo se Ti uvolnit jí. ";
            nestedAction(TypeLiteralOn, self, 'R');
        }
    }
    dobjFor(Attack) asDobjFor(Break)

a inspiroval jsem se mnou dříve definovanou metodou dobjFor(CutWith) u mříže. Je mi jasné, že se musím kouknout na strom dědičnosti v Library a využít popsané metody a funkce, právě definice těchto akcí je pro mě v současné chvíli to nejobtížnější, ještě jednou si projedu Tvůj manuál, kde o nich píšeš a také kapitolu 6 – Actions v Ericově manuálu, tohle cítím, že je gró programování obecně a nesmím nic uspěchat, protože bez důkladného pochopení akcí se nikam nedostanu.

Psa i draka už jsem nadefinoval, k jejich eliminaci mi stačí jehla a rozlitý jed, tyto předměty využiji jakmile pohnu s akcemi popsanými výše. Dále jen u brány ukončím hru po sebrání všech 4 drahokamů, doladím ještě pár nesrovnalostí u skloňování některých objektů a tvorba pomalu končí.

9
Programování / Re: Seriál o programování textových her v TADS 3
« kdy: 22. Listopad 2017 - 22:09 »
Ano, s rovnítky taky dosti bojuju, v případě se strážcem potřebuji porovnat hodnoty, to bude stejné asi u každého programovacího jazyka. S rodem u hráče je to jasné, já tak nějak automaticky předpokládal, že hra bere hráče v mužském rodu a zapomněl jsem uvést gender, ve většině českých textovek je hlavní hrdina chlap a vlastně i ten Luxík je ten Luxík plus podobně u jiných potvůrek, proto se přimlouvám za výchozí mužský rod, holt dámy snad prominou a děti zapomenou…

Hmm, vidím, že příkaz prozkoumej stále beru tak jak jej interpretují klasické české textovky, tedy něco jako hlavní rozkoukávající se prostředek, který je často potřeba využít i několikrát, viz např. Kainovy hry ze Středozemě. Příkazu prozkoumání tedy stačí jen prostá viditelnost, jasné. Ano, teď si vzpomínám, že o třídě Hidden/PresentLater píše Eric v příkladě s prstenem pod kobercem, zde podobně jako Ty také nabízí dva způsoby jak situaci řešit.

Mé tři předchozí dotazy:

>vezmi kresadlo
Nepřipadá Ti vhodné dotýkat se mrtvoly!

>vezmi strazce
Strážce je příliš daleko.

Workbench vyhodí chybu Tads runtime – string value required

a Tvé podrobné odpovědi na ně mi tedy daly pořádně zabrat, to, co popisuješ, už je alespoň zatím pro mě velmi obtížné. Každopádně spolu docela souvisí a vše jsem pobral až tehdy, když jsem se je, tedy alespoň druhý a třetí, snažil uchopit v kontextu hry. Práci s
<<ifněco>>text1<<else>>text2<<end>>
už chápu, ano, využil jsem jí také u popisu místnosti a vymazání else v případě, že za ním nic neplánuji, krásně funguje. Také mi dost pomohl přeložený zdroják Heidi, testoval jsem metodu dobjFor(Take) popsanou u ptačíḧo hnízda u mnou využívaných předmětů křesadla a svazku klíčů. Ovšem v mém případě bez výsledku, díky Tvému popisu ale už chápu, proč.

Perfektně popisuješ metodu CanNĚCO, nyní je jasné, že musím definovat cannotReachFromOutsideMsg, abych se vyhnul zpětné zprávě tooDistantMsg. Zase jsem se parádně inspiroval u Heidi, která popisuje cannotReachFromOutsideMsg u příkladu větve na stromě. Jasně, pokud nevracím žádný řetězec, který hra očekává, dojde k chybě, proto ten string = chybějící návratový textový řetězec.
 
Ještě jsem se koukal na fórum TADSu, kde se právě tato dle mého názoru dost obtížná část, přirovnal bych jí k potížím s prací s provazem, řeší:

https://www.intfiction.org/forum/viewtopic.php?f=10&t=17443&start=10

Zde je také vše pěkně vysvětleno s odkazem na Learning TADS 3, strana 185. Ano, tu si pamatuji, právě zde jsem se setkal s popisem smrti Boba a seznámil se s HermitActorState, o čemž jsme si psali v jednom z minulých příspěvků. Autor zde kromě využití třídy OutOfReach u strážce, kterou tam již použitou mám, doporučuje také přidat:

canObjReachContents(obj) { return curState != strazceDeadState; }

nyní tedy využívám:

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

a v Library jsem se dozvěděl:
canObjReachContents - Determine if the given object can reach my contents. 'obj' is the object (usually an actor) attempting to reach my contents from outside of me.
By default, we'll return nil, so that nothing within me can be reached from anyone outside. This can be overridden to allow my contents to become reachable from some external locations but not others; for example, a high shelf could allow an actor standing on a chair to reach my contents.

Paráda, přesně to potřebuji a nyní vše funguje jak má, v příloze zasílám aktuální zdroják a transkript – hláška o tom, že mi živý strážce nedovolí vzít nic, co sám nese, je parádní a pro mé potřeby ideální. Sakra, ještě toho musím stále mnoho pobrat, jen díky Tvému vysvětlení se mi všechny ty třídy a metody začínají pomalu slévat dohromady. Vše, co jsem se naučil u strážce, nyní využiji také u psa a draka, poté ještě naprogramovat ukončení hry plus drobné nedodělky a mohu se vrhnout na závěrečné testování.

Po průzkumu fóra jsem nalezl zajímavý odkaz

https://www.intfiction.org/forum/viewtopic.php?f=10&t=24885

kde autor popisuje možnost využití TADSu jako prvního programovacího jazyka, paráda, pro mě přesně to pravé. Vytvořil prý nějaké výukové třídy vhodné i pro děti i dospěláky, moc rád bych na to juknul, odkaz ale zatím nefunguje – už jsem mu psal, co se s tím dá dělat. Také vyvinul plugin pro editory Atom a Sublime, určitě vyzkouším, časem také ten pro Emacs, když se takové věci dělají, TADS stále žije, hurá…

Ještě zítra a pozítří tu mám lidi na koně, poté bude trochu volněji a mohu vesele pokračovat v tvorbě, už se těším.

10
Programování / Re: Seriál o programování textových her v TADS 3
« kdy: 19. Listopad 2017 - 18:32 »
1. OutOfReach
Aha, takže ideální bude zkombinovat obě. Vyzkoušel jsem a hra správně na hráčovi příkazy tlač, prohledej, vezmi… odpovídá řetězcem „Nepřipadá Ti vhodné dotýkat se mrtvoly!“, výborně, tuhle konstrukci jsem si uložil do poznámek, protože jí rozhodně využiji také u předělávky Bad Night.

2. Hlášení chyb a aktuální stav Frobtads
Skvěle, myslel jsem si, že jakž takž ještě funguje fórum, moc jsi mě potěšil, že Eric i Nikos se stále angažují. Je pravda, že bych nalezené problémy související s programováním nepopsal asi ouplně přesně, lépe to bude od Tebe. Nová verze manuálu by moc pomohla, alespoň ostatní zájemci uvidí, že TADS stále žije a to je hlavní. Práci Mikeho si moc vážím, ano, stačí si jen projít Library a člověk žasne, mě se líbí, že jak to cítím, textovky nestárnou a hra v tomto systému bude stejně bezva hratelná i za deset let. Třeba když uvidí, že uživatelé a dotazy stále jsou, k TADSu se vrátí, necháme se překvapit. Pomoci ale mohu s instalací Frobtads, mám v učebně i virtuálu několik distribucí:

Frobtads funguje v současné době bez problémů v:
Ubuntu 16.04 – binárka je OK a bez problémů funkční
Freebsd 11.1- binárka i kompilace pomocí clang funguje, díval jsem se na jejich fórum a potíž viditelně vyřešili, vše tedy OK

Menší potíž je s Debianem:
Na jejich bugzille se problém s novějším kompilátorem už řešil
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=871215

Pokud se dívám na debianí balíčky:
https://packages.debian.org/search?keywords=frobtads&searchon=names&suite=all&section=all
Zjišťuji, že Debian Jessie je vše OK, balíčky existují ve verzi 1.2.3-1 včetně potřebných závislostí
Debian Stretch – tady balíčky vůbec k dispozici nejsou, řeším to tak, že instaluji z unstable verze Sid – zde je upravená 1.2.3-1+b1, pomocí dpkg -i instaluji balíčky frobtads, tads3-dev a tads3-common, následně je vše plně funkční

Raspbian je to samé, v Jessie je možné balíčky zkompilovat pomocí deb-src, pro Stretch také neexistují a je nutna verze ze Sidu

Největší potíž má Arch Linux vzhledem k aktuálním balíčkům, v současné době s kompilátorem GCC 7.2 - řešení zde však je:
https://aur.archlinux.org/packages/frobtads/

Failed to build with fresh gcc. Fix:
diff --git a/PKGBUILD b/PKGBUILD
index 5c78bee..b1d0ec1 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -17,7 +17,7 @@ md5sums=('c6ed8cd6dac04b3ee6f4422cea688979')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"

- ./configure --prefix=/usr
+ ./configure --prefix=/usr CXXFLAGS="-std=c++03"
make
}

Pokud dobře chápu, je nutno zajistit kompatibilitu se standardem c++2003, poté kompilace proběhne bez problému.

A nakonec můj oblíbený Slackware:
Ve verzi 14. 2 se nachází GCC 5.3, kompilace OK
V current se momentálně nachází GCC 7.2, zde kompilace vypisuje jinou chybu, než Arch:
bash-4.4# make
make  all-am
make[1]: Entering directory '/root/frobtads-1.2.3'
  CXX      tads3/tcprs.o
In file included from tads3/tcprs.cpp:39:0:
tads3/vmbignum.h: In static member function ‘static vm_obj_id_t CVmObjBigNum::create(int, const bignum_t<prec>*)’:
tads3/vmbignum.h:585:45: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
         new (vmg_ id) CVmObjBigNum(vmg_ prec);
                                             ^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In static member function ‘static vm_obj_id_t CVmObjBigNum::create(int, const bignum_t<prec>&)’:
tads3/vmbignum.h:596:45: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
         new (vmg_ id) CVmObjBigNum(vmg_ prec);
                                             ^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In member function ‘virtual void CVmMetaclassBigNum::create_for_image_load(vm_obj_id_t)’:
tads3/vmbignum.h:1640:36: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
         new (vmg_ id) CVmObjBigNum();
                                    ^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In member function ‘virtual void CVmMetaclassBigNum::create_for_restore(vm_obj_id_t)’:
tads3/vmbignum.h:1647:36: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
         new (vmg_ id) CVmObjBigNum();
                                    ^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
make[1]: *** [Makefile:6599: tads3/tcprs.o] Error 1
make[1]: Leaving directory '/root/frobtads-1.2.3'
make: *** [Makefile:3011: all] Error 2
bash-4.4#
Na to se ještě podívám, zde je ale výhoda, že balíček kompilovaný pro starší verzi většinou funguje i v novějším Slacku.

Takže suma sumárum gcc verze 5 a snad i 6 je se současným frobtads 1.2.3 OK, od verze 7 jsou potíže a také u clang byla nutna úprava. Bude paráda, pokud Nikosovi pošleš tyto postřehy, pokud upraví zdrojáky pro aktuální gcc a ideálně i clang, bude to paráda. Plus pokud by se podíval na tu bolístku s utf-8 v konzoli, což zatím řeším pomocí Tebou doporučované volby -i plain -k utf8.

Vím, že je s českými znaky docela potíž, upřímně řečeno jsem plnou češtinu včetně problematických znaků ť, ú nebo ů zprovoznil pouze v příkazové řádce Slackware a Archu. U jinak skvělého a bezproblémového Debianu se zatím vůbec nechytám, ť přes nejrůznější nastavení zatím nerozchodím, ještě si s tím zkusím pohrát, původně funkční návod pro Wheezy mi v aktuální verzi nejede. V Ubuntu a OpenSUSE je zatím nutno ručně po spuštění pouštět příkaz sudo loadkeys cz-us-qwerty nebo sudo loadkeys cz, nepodařilo se mi toto zautomatizovat. BSD systémy na češtinu zvysoka kašlou, jedinou podporu má FreeBSD, ale jeho terminál zatím neumí české uft-8 znaky na konzoli a Open a NetBSD nemá ani české lokalizační balíčky, co se dá dělat.
Dnes už to samozřejmě není nutné, na druhou stranu byl dříve milovníkem GUI, ale nyní se mi vzhledem k práci s armádním notebookem nebo Raspberry hodí co nejméně náročný systém. A zjistil jsem, že většinu práce zvládnu i v příkazové řádce, nyní testuji Slackware v kombinaci s framebufferem, zde rozchodím „grafický“ links nebo netsurf, s nimi vůbec není problém prohlížet moderní web, přehrávat videa včetně youtube lze pomocí mplayer nebo cvlc, procesor Worgrinder dokáže nahradit LO Writer, ještě doladit tabulky a budu tak moci parádně pracovat – v tom by mohl pomoci Emacs, na který se vrhnu vzápětí. No a časem, pokud zvládnu Cčko, bych rád připravil nějaké ncurses aplikace, které by se hodily stejně jako v době DOSu.

No, trochu jsem se rozepsal, nyní je ale snad jasnější, jaký důraz dávám na české znaky a frobtads v konzoli, ostatně stejnou práci s překladem si dáváš i Ty, myslím, že si rozumíme. Na druhou stranu chápu, že nějaký terminál dnes už nefrčí, takže by se autoři mohli více věnovat HTML nebo třeba apk souborům pro Android, sám sice chytrý telefon nepoužívám a v dohledné době nebudu, budoucnost je ovšem právě tam - naštěstí přes prohlížeč by hra měla být hratelná, určitě jí v konečné podobně umístím na IFDB, ve svém manuálu píšeš, že existují veřejné servery, takže nebudu muset konfigurovat vlastní.

3.  curState, mé další postřehy
Paráda, teď už chápu, že konstrukci musím využít u objektu s vhodnou vlastností, v mém případě u strážce. První příklad funguje na jedničku, zkusil jsem stejnou konstrukci využít i v druhém, ale ouha, zde jsem narazil a nefunguje jak má. Trochu jsem laboroval, nakonec jsem z příkladu zde:

https://www.intfiction.org/forum/viewtopic.php?f=10&t=21744&view=previous

zjistil, že musím využít dvě rovnítka, správný příkaz na řádku 260 je tedy:
canTravelerPass(traveler) {return strazce.curState == strazceDeadState; }
Super, tyhle konstrukce si zapamatuji a mohu vesele využívat dále.

Zajímavé je, že u živého strážce: věci, které má viditelně na sobě, mohu prozkoumat, ale příkaz:
>vezmi kresadlo
Nepřipadá Ti vhodné dotýkat se mrtvoly!

Zkusil jsem dočasně zakomentovat řádek :
cannotReachFromOutsideMsg(dest) { return 'Nepřipadá Ti vhodné dotýkat se mrtvoly!'; }

ale ejhle, nyní dostávám příkaz:

>vezmi strazce
Strážce je příliš daleko.

No jo, v prvním případě je to jasné, věci jsou příliš daleko a pokud se jich snažím dotknout, hra vypisuje hlášení za return. Teď mě napadá, chtělo by tam vložit nějaký if – else s kontrolou, je-li strážce naživu.

Konstrukci jsem tedy připravil, se syntaxí jsem se inspiroval Tvým manuálem v sekci Akce bez objektu - modify JumpAction. Vše se zdá OK a překlad v pořádku proběhne, při pokusu o příkaz vezmi kresadlo Workbench vyhodí chybu Tads runtime – string value required a otevře se mi soubor cs_cz.t, kde žlutá šipka ukazuje na řádek match = rexSearch(patSpecial, str, idx);.

S podobnou chybou už jsem se v minulosti setkal, jen si nepamatuji, kde přesně, tehdy jsem ještě nic o systému nevěděl. Mohu poprosit o vysvětlení, nejen, zda je chyba v mé if – else konstrukci, ale také je-li to chyba sémantická nebo syntaktická, pokud se vyjadřuji správně, o těchto jsem v minulosti při svých pokusech s Pascalem slýchal. Transkript a zdroják zasílám v příloze.

Ještě jsem si všiml malé chybky v překladu nebo u mě v deklaraci postavy hráče, pokud tento umírá, objeví se chybný střední rod:
Strážce se na tebe se strašlivým řevem vrhl a celkem snadno ukončil tvůj život.
*** ZEMŘELO JSI ***

11
Programování / Re: Seriál o programování textových her v TADS 3
« 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.

12
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é.

13
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.

14
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.

15
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.

Stran: [1] 2 3 ... 9