23. Září 2018 - 05:14

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] 4 5 ... 11
31
TADS / Re: Seriál o programování textových her v TADS 3
« kdy: 22. Prosinec 2017 - 11:18 »
1. Objekt v TADS
Hmm, velmi zajímavé a srozumitelné to srovnání s legem. To znamená, že vytvořím objekt ve hře, např. koně, který dědí z jedné nebo více tříd a zároveň obsahuje jak píšeš programové objekty, se kterými dále pracuji – tedy např. stav žije/nežije, mluvím s ním na téma/nekonverzuje. Ano, tady musím přesně určit, se kterým objektem chci pracovat, hmm, tohle hlavně u konverzace budu potřebovat. Teď mě napadá, že jsem se u Základny s takovým objektem a programovatelnými objekty setkal nejen u postav, ale také s trezorem, jeho číselníkem a jednotlivými stavy.

2. OutOfReach
Ještě jednou se dívám na její popis v knihovně, píší, že se jedná o mix-in třídu, kterou lze využít u vytvoření objektu a její obsah lze umístit do jeho vlastností – jo, to sedí s Tvým popisem kostiček lega, teď už mi konečně dává smysl, že v TADSu přidání třídy = přidání vlastnosti. Ale nakonec tak tomu bude i v ostatních OOP jazycích, vytvořený objekt má vícenásobnou dědičnost – i když v dokumentaci píšeš, že v TADSu je mnohem menší rozdíl mezi třídou a objektem, než např. v C++ nebo v Javě.
Jasné, proč bych deklaroval canObjReachSelf např. u draka, který by nedědil z OutOfReach, to by nedávalo smysl.

Jen tak mimochodem, na příkladu s kostičkami je mi tento a minulý příklad konečně jasný, kdyby to podobně psali autoři programátorských učebnic, vývojařina by pro mě a věřím, že nejen pro mě byla záživnější, výčet tříd a tvorba objektů na většinou školních příkladech s čísly, rovnicemi a obecně nějakými počty mi k pochopení zrovna nepřidává, Tebou popsané příklady mají hlavu a patu a jsou krásně srozumitelné, neuvažuješ o tvorbě nějaké učebnice? Myslím to vážně, ideálně určené starším dětěm nebo študentíkům např. ve stylu knihy Python for Kids.

3. PreferredIobj
Pro mě opravdu náročnějí definice na pochopení, ale o to důležitější, vzhledem k četnosti využítí jí musím dokonale pobrat. Máš recht, u psa PreferredIobj není třeba, teď jsem jej vymazal a pes je pouze OutOfReach a UntakeableActor, příkaz „dej hlavy psovi“ i „dej psovi hlavy“ funguje, sakra, teď tedy nevím, co jsem minule zkoušel. Ale je to dobře, alespoň budu vědět, že každá postava je automaticky označena jako PreferredIobj. Podíval jsem se do knihovny, kde se s PreferredIobj vůbec nesetkám a celý svůj TADS adresář jsem si tímto výrazem grepnul, používáš jej ve svém překladu, u Základny a já u Exoteru, ano, už si vzpomínám, že jsme se o něm a úpravou Dobj bavili v souvislosti s novou verzí češtiny.

Ano, také mě napadl konflikt, protože sekera se používá více, u zabití strážce, rozbití skleněné koule a sekání dračích hlav.
Diskuzi si právě procházím, sakra, doufám, že někdy vyjde ta hra s japonským nožem a liánou, kdyby byla v TADSu, nezlobil bych se… Vidím, že je to docela oříšek i pro Tebe, když si tyto situace řešil na fóru, překlad celkově určitě nebyl žádný med. Možnost ladění parseru vypadá také zajímavě, to ale minimálně u mě až někdy později. Tekket nůž s třídou PreferredIobj potřeboval použít jako dobj, to je i můj problém. Využij jsem Tebou doporučené řešení a odstranil PreferredIobj z objektu sekery, naopak přidal jsem PreferredDobj ke strážci, skleněné kouli i dračím hlavám. Nyní je v pořádku „zabij strážce sekerou“ i „zabij sekerou strážce“, „rozbij kouli sekerou“ i  „rozbij sekerou kouli“ a „uřízni dračí hlavy sekerou“ i „uřízni sekerou dračí hlavy“ bez problémů fungují a také „dej psovi sekeru“ a „dej sekeru psovi“.

Teď je mi také jasné, že u křesadla a pochodně budou stejné potíže, hned jsem to vyzkoušel a hnedle u zapálení samotné pochodně křesadlem a využití těchto předmětů u psa je to horší:

>zapal pochoden
Čím ji chceš zapálit?
>kresadlem
To není něco, co by mohlo hořet.

>zapal kresadlem pochoden
To není něco, co by mohlo hořet.

>zapal pochoden kresadlem
Zapaluješ pochodeň.

>dej pochoden psovi
Nemůžeš pochodeň nic dát.

>dej kresadlo psovi
Nemůžeš křesadlu nic dát.

Vše jsem vyřešil stejným způsobem, vše funguje krom:
>zapal pochodni seno
{Tím iobj} nemůžeš nic zapálit

Zkoušel jsem ke kupce sena dát dle diskuze s Tekketem direktivu:
preferredIobj = pochoden

ale zatím bez úspěchu, budu na tom ještě pracovat, PreferredDobj u pochodně potřebuji. Jak vidno, tyto předměty budu muset doladit – kombinace křesadlo, pochodeň, zapálení sena a správné hlášky, pokud tyto předměty chci umožnit ve hře cizí postavě dát, není zrovna triviální.

To nám to ale letí, diskuze s Tekketem z roku 2015 a za čtvrt roku to bude už rok, co jsem opravdu začal s TADSem, času ale rozhodně nelituji, teď zpětně vidím, že to byl dobrý tah a programování mě baví čím dál více. Vida jak se vyplatilo umět přehodnotit svůj postoj k tvorbě a nezabývat se jen příběhem. Tak nějak cítím, že dnes už jsou sice textovky na ústupu, tvořit je ale mohu vždy a i kdyby si je zahrál jen jediný člověk, má to smysl, stejně jako má stále smysl vydávat knihy i v dnešní době. A až doladím webový server, viz níže nebo hry jednoduše umístím na IF, není důvod bát se, že si jich nikdo nevšimne.

4. Algoritmus
Super srovnání s tou kuchařkou, deklaruji tedy objekty stejně jako suroviny a postup vaření je algoritmus – v mém případě akce, které s objekty provádím. Mám zde knížku Programování pro úplné začátečníky od Radka Hylmara, právě o BubleSort píše u porovnávání fotbalových hráčů. Mimochodem jeho styl mi také sedí, preferuje stále pro výuku Pascalu před Pythonem, neboť ten prý nemá datové typy, je to asi věc názoru, musím se ale přiznat, že dnešní objektový Pascal využívaný v na prvním pohled velmi zajímavém prostředí Lazarus se asi od toho původního pro prvotní výuku programování dost liší a také pro větší projekty se bude hodit. Díval jsem se na Lazarus, ten se velmi aktivně vyvíjí a vypadá zajímavě, jen pro něj zatím nemám využití - až zmáknu TADS, vrhnu se na C a C++, případný další Python nebo objektový Pascal už nebude takový problém a pokud k tomu přidám i využívané algoritmy, není co řešit.

Jasně, proto existují knihy o algoritmech, chápu to tak, že jich existuje větší množství už vymyšlených, programátor by je měl znát a v dané situaci se rozhodne jaký využít. I Radek Hylmar jich ve své knize pár doporučuje, až skáknu do Prahy, v Luxoru se na některé juknu, tohle budu v budoucnu určitě potřebovat.

Díky za video, Bubble Sort, Shell Sort, Quick Sort a ostatní prozkoumám a je zde krásně vidět jejich porovnání.

5. Zvýraznění
Hm, máš recht, že zdržovat plynulost čtení asi není dobrý nápad. Každopádně hlavní hlášky nebo třeba dobře provedené akce zkusím barevně odlišit, moc se mi líbí např. Kainovy hry ze Středozemě, když se hráči něco podařilo, text byl psán jinou barvou plus získal body, něco takového bude ideálním řešením.

6. TADS Web server
Neodolal jsem a podle návodu Setting up a custom TADS Web server jsem si nainstaloval lokální server s frobem. Po trošce laborování jsem byl úspěšný, v Ubuntu 16.04 je možné pro Apache povolit a2enmod a mohu v prohlížeči spustit t3launch, v Archu už a2enmod není, v souboru .htaccess v podadresáři t3launch stačí zakomentovat všechny 3 řádky a vše je OK. Test, který popisují, proběhne v pořádku, pokud v prohlížeči zadám
http://localhost/t3launch/

dostávám hlášení a dále viz můj dotaz níže:

Missing Parameters
The link you used to reach this page is missing some required information.

Základnu jsem zkompiloval s využitím Makefile.web.t3m a pomocí příkazu:
frob -i plain -p -N 44 asteroid-web.t3
jí mohu spustit bez Apache pouze s využitím vestavěného frobtads serveru nebo:

frob -i plain -k utf8 -p -N 00 -w localhost -W t3launch asteroid-web.t3 -storagesid=t3launch
využívám lokální Apache a vše je OK, Exoter funguje také, je to paráda.

Spustil jsem si Tvojí Základnu na webu Technoplanety a měl bych malý dotaz ohledně funkce na ostrém webu. V konfiguráku config.php jsem nastavil cestu k lokální databázi, využívám mariadb a vytvořeného uživatele t3launch s databází  t3launch a heslem password. Ten se např. pomocí phpmyadmina do databáze dostane, při příkazu uložit se mi ovšem pozice nabídne ke stažení na lokální počítač a v databázi není nic. Obnovení z lokálního SAVE je v pořádku, pouze databáze nějak hapruje, asi jsem něco zapomněl nastavit v jiném konfiguráku uvnitř t3launch.

Také bych rád Exoter nebo Základnu umístil do adresáře s webovými stránkami, u mě srv/http/, kde mám podadresář t3launch a odkazoval se na hru přímo z prohlížeče. Zde ale netuším, zda je to možné, je mi jasné, že vždy budu potřebovat spustit frob a výše popsané volby, v dokumentaci TADSu ani v rozbaleném zdrojáku a textových souborech frob jsem k tomuto více nenašel – přitom právě takto spuštěný frob si představuji podobně jako Webmin, minimální server s definovaným portem, i když jak vidím, každá spuštěná instance frobu volí jiný. Ty máš na ostrém serveru rozhraní, které zadá jméno a heslo nového uživatele do databáze, se kterou pracuje instance spuštěného frobu s adresou např. 127.0.0.1:4417, která je přesměrována na venkovní adresu. Zatím netuším, kam mám např. soubor asteroid-web.t3 umístit unitř srv/http/, v tuto chvíli obě popsané volby využívám s tím, že hra je v mém domovském adresáři.

Reálně mám v adresáři srv/http/t3launch podadresář inc s upraveným config.php a soubory .htaccess, index.html, t3launch.php plus jsem zkusil přidat svůj exoter-web.t3, jen netuším jak se na něj odkázat, aby jej prohlížeč zobrazil přímo, pokud to je takto vůbec možné.
Mimochodem je zde spousta javaskriptu, takže mé oblíbené framebufferové prohlížeče Links2 a Netsurf mají smůlu, tady se alespoň zatím bez Firefoxu neobjedu.

Není to ale nic, bez čeho bych nemohl žít, jen bych si rád zkusil např. na svém Raspberry zprovoznit plnohodnotný TADS server s funkčním ukládáním do databáze, kromě Apache bych zkusil něco trochu méně náročného v kombinaci třeba s SQLite, kterou popisují v dokumentaci. V příloze zasílám svůj upravený t3launch, Makefile a vygenerovaný Exoter.
Ostrou hru po doladění umístím od IFArchive, vidím, že stačí nahrát můj vygenerovaný exoter-web.t3 do https://www.ifarchive.org/cgi-bin/upload.py a pak se na něj odkázat ze svého profilu, který jsem si vytvořil na IFDB, s tímhle snad problém nebude.

7. Dokončování hry
Mám zde seznam věcí, které ve hře musím dokončit stejně jako výše uvedené PreferredIobj, tím se budu zabývat teď. Je zde jeden problém s množným číslem, pak se mi nelíbí, že některé objekty nemají ve hře žádný popis a když zase nevímpokolikáté už čtu Tvůj manuál, krásně vidím direktivu is plural plus píšeš o StairwayUp, což jsem využil u žebříku. Výklenek v místnosti se sekerou jsem prvně chtěl definovat jako Decoration, chybí mi však vhodná zpráva u sebrání, takže si dekoraci nechám jinam a využiji CustomImmovable.

Zajímavá je hláška u dveří, když se např. nacházím v místnosti s prvním drahokamem, získám:
>prozkoumej dveře
Masivní železné dveře. Jsou otevřené.

Jdu-li na sever a dveře zase prozkoumám, dostávám:
>prozkoumej dveře
Je otevřené.

Tady si pořádně nastuduji vše o množném číslu, podobná potíž se vyskytuje také u drahokamů, pokud jich držím více:
>prozkoumej drahokamy
Slovo "drahokamy" v tomto pribehu neni dulezite.

Další zajímavost je mixování mužského a ženského rodu:
>prozkoumej provaz
Je pevný.
>prozkoumej lano
Je pevný.

Namočit jehlu mohu jen příkazem „namoč jehlu v kaluž“, pro využití „v kaluži“ bude určitě vhodné něco jako {komučemu xxx}, to už jsem viděl v Heidi i v Základně.

Vytisknul jsem si kapitolu o překladu, tohle musím pečlivě prozkoumat.

Ve starém Exoteru sice dekorace a možnost prozkoumat to, co zmiňuje popis místnosti nebyly, každopádně pro mě to bude zkouška nových věcí, které TADS nabízí a pro hráče malé zpříjemnění. Vždy když se znovu začtu do Tvého manuálu nebo od Erica, objevím nebo spíše znovuobjevím něco nového, stačí si představit možnosti, které ve hře mohu využít a práce je o to radostnější.

Užij si Vánoční čas, zkoušel jsem posílat své koňské přání na Tvůj kapsový email uvedený v překladu TADSu, ale bez úspěchu, tak to napravuji zde společně s aktuálním zdrojákem a plánovaným webem.

32
TADS / Re: Seriál o programování textových her v TADS 3
« kdy: 19. Prosinec 2017 - 17:28 »
1. Pes
Tak konečně se zase dostávám k tvorbě, mám za sebou Ubuntí školení a už se těším na TADS. Já jsem fakt škeble dubová, nastavit

pes.setCurState(pesDeadState);

mě neťuklo, hmm, nerozpoznal jsem, že u Topicu není metoda změnit stav, na kterou jsem zvyklý u postav. Metody canObjxxx mám nyní umístěné u objektu psa, píšeš, že mají smysl pouze u objektů, které dědí z mix-in OutOfReach, jasné, už se na ní koukám do Library a zkoumám dědičnost.

Direktivu noResponse jsem vymazal, ano, mám GuardState nastaven jako ActorState, aby bylo možné se psem komunikovat. U psa jsem také doplnil OutOfReach stejně jako u strážce, už se koukám na naší starší konverzaci, kde mi toto doporučuješ u draka i psa – sakra, u draka jsem na tuto definici nezapomněl, už ani nevím, proč jsem jí nevyužil také u psa.

Výborně, řešení s mrtvolou psa mi také přijde ideální podobně jako u strážce, možnost reakce hráče na slovo mrtvola se určitě hodí. Takže zde ponechám objekt mrtvola_psa. Otestoval jsem si

{return !pes.location; }

v canTravelerPass a funguje stejně dobře jako moje stávající definice

{return pes.curState == pesDeadState; }

viz aktuální zdroják. Definici gReveal jak vidno hojně využíváš v Základně, použití v kombinaci s isInInitState v roomTunnel.t je dost výmluvné a u pronásledovatelů v canTravelerPass stejné jak nyní popisuješ, paráda.

Psa jsem si ještě označil jako PreferredIobj, aby správně fungoval příkaz „dej hlavy psovi“ i „dej psovi hlavy“, ještě musím doladit „dej sekeru psovi“, který vyhazuje „Nemůžeš sekeře nic dát.“, „dej psovi sekeru“ je OK – zde se pokusím o jiné řešení.
Nyní je tedy vše se psem celkem v pořádku a já si uvědomuji zase další souvislosti plus mám parádně vysvětlený příklad, který využiji i v budoucnu.

2. StringPreParser
Hm, na toto řešení jsem nějak zapomněl, i když jsem Tvůj manuál přečetl několikrát. Vidím jej u podkapitole Předzpracování příkazů, velmi zajímavé, přesně toto bych v budoucnu potřeboval od testerů, zjistit příkazy, které by mě třeba nenapadly a Ty jsi samozřejmě postupoval stejně, "zapni zápis" a případné komentáře po zadání hvězdičky si moc dobře pamatuji. Zrovna zde vidím příklad, já bych např. u psa vždy zadal „dej hlavy“ a parser si sám doplní komu, nenapadlo by mě využít slovo podej, které další člověk ale třeba využije. A jak perfektně uvádíš, potřebuji přepsat hráčem zadaný příkaz ještě dříve, než se k němu dostane parser, tohle v budoucnu určitě využiji, třeba i u nápovědy pro hráče podobně jako v Základně.

3. Zapeklité dračí hlavy
Ano, zase jsem u kontejnerové hierarchie a tentokrát přidáváme Component. Udělal jsem jak radíš a výsledek se konečně dostavil, po zabití draka se nestane nic, protože hlavy už jsou s ním v místnosti a hráč to z popisu draka může zjistit, po zabití draka je možné tyto uříznout a následně mrtvola draka a původní dračí hlavy zmizí a objeví se useknuté dračí hlavy s bezhlavým drakem, podobně jsem situaci řešil u strážce, jen bez Component. Uff, to mi teda dalo práce, ale díky Tvým radám jsem zase dál, hurá.

4. Zdrojáky dalších TADS her
Moc se omlouvám za nepřesnost, ke hře Elysium Enigma opravdu zdrojáky nemám, jen jsem při spuštěném fulltextu hledal i tam a nevšimnul si, že mám pouze t3 soubor. All Hope Abandon a Mrs. Pepper's Nasty Secret jsem si už stáhnul a pořádně prozkoumám, sakra, to už je let ten FbeginnersComp 2008…

5. Algoritmus
Už nějaký čas bych se rád zeptal na algoritmus v programování v podání zkušeného programátora. Vím, že je to vlastně kuchařka, kterou si v hlavě nebo v podobě nějakých postupů či diagramů připravím a dle nich poté zapisuji kód pomocí programovacího jazyka. Existují i knihy věnující se pouze algoritmizaci, jak bychom mohli nejlépe definovat algoritmus v TADSu – v tomto případě se jedná o definici místností, kontejnerové hierarchie a akcí, kterou poté pomocí jazyka implementuji do hry? Nevím, zda se nejedná o hloupou otázku, když už se programováním konečně prokousávám, rád bych se ujistil i v tomto.

6. Závěr hry
Je to neuvěřitelné, ale hra je nyní nahrubo hotová a dohratelná. Ještě, než si zprovozním lokální webový server, kde hru otestuji a vložím do IFDB je ale nutné, abych doladil především gramatické chyby, na které reaguje parser a věci, které zbytečně hru kazí, pro zajímavost zasílám v příloze s aktuálním zdrojákem a transkriptem. Na tyto se zaměřím nyní, věřím, že pomocí dosavadních zkušeností, Tvého překladu a Základny je vyřeším. Poté upravím zdrojový kód tak, aby vše bylo čitelné a sjednotím styl syntaxe plus doplním dokumentaci, která bude lépe vysvětlovat jednotlivé kroky.

Některé akce bych měl barevně nebo jiným písmem zvýraznit, např. informaci o pádu do kupky sena by si nepozorný hráč nemusel všimnout:

Vidis tu truhlu.
>d
Spadl jsi primo doprostred kupky sena, ktera idealne ztlumila tvuj pad.

Severovychodni cast nadvori
Stojis v tmavem koute nadvori. Na severu se do vysky nekolika metru tyci
kamenna vez.

Zkusím něco vymyslet, ideálně vhodného pro řádkového klienta i qtads dohromady plus časem pro webovou hru, to uvádíš i ve svém manuálu.

Jsem strašně rád, že jsem vytrval, hlavně, žes mě furt držel, protože jako neprogramátor musím být hrozný žák… Většinu naučených konstrukcí určitě využiji při další tvorbě a Library mi stále více leze pod kůži, což je paráda. S C++ ještě moment počkám, nejprve vše dokončím a pomocí QT Creatoru vytvořím hru novou, tím si znalosti upevním a učit se dalšímu jazku bude mnohem snažší.

33
TADS / Re: Seriál o programování textových her v TADS 3
« kdy: 15. Prosinec 2017 - 10:11 »
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

34
TADS / 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.

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

36
TADS / Re: Seriál o programování textových her v TADS 3
« kdy: 5. Prosinec 2017 - 12:08 »

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

37
TADS / Re: Seriál o programování textových her v TADS 3
« kdy: 1. Prosinec 2017 - 13:08 »
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

38
TADS / 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.

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

40
TADS / 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čí.

41
TADS / 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.

42
TADS / 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 ***

43
TADS / 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.

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

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

Stran: 1 2 [3] 4 5 ... 11