23. Leden 2018 - 20:53

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 ... 10
1
Konečně po všech perepetiích člověka jen málo políbeného vejvojařinou mohu představit předělávku staré známé textovky do systému TADS. Nakonec se mi jí podařilo dokončit podle představ a je maximálně věrná původní verzi. Díky TADSu je zde však mnohem zajímavější a bohatší parser, který mě tak okouzlil u Základny.

V příloze zasílám zdrojový soubor Exoter.t, který můžete prozkoumat a klidně využít při vlastní tvorbě, doplnil jsem komentáře ke všem akcím, které nejsou zrovna triviální. K případným úpravám a kompilaci doporučuji fórum zde:

http://textovky.panprase.cz/index.php?topic=226.0

a stránky:

http://tads.cz/cs/preklad-tads-3-do-ceskeho-jazyka

Chcete-li si rovnou zahrát, jsou zde 3 možnosti:

1. ve Windows stačí spustit instalátor Exoter.exe, výsledek vypadá na pohled velmi pěkně a s příjemným ovládáním.
2. dle mého názoru asi ideální pro Windows, Linux či BSD představuje QTADS:

http://qtads.sourceforge.net/

který má velmi příjemné rozhraní, můžete si nastavit barvy podle svých představ a vesele hrát. Ukládání pozic je u obou možností samozřejmostí.

3. trochu archaická možnost v příkazové řádce Linuxu nebo BSD je instalace balíčku frobtads a spuštění pomocí:
frob Exoter.t3
- zde však v rozhraní ncurses není funkční čeština

frob -i plain -k utf8 Exoter.t3
- zde se jedná o klasický řádkový režim s plně funkční češtinou, pokud Vám jí správně zobrazuje klasická konzole, velmi doporučuji, člověk se opravdu cítí jako za prehistorickým terminálem, kde místo úpravy konfiguráků mastí textovku

Každého zájemce prosím o zaslání zkušeností s hrou, měla by být plně dohratelná, pokud se však objeví jakékoliv chyby, sem s nimi. Ideální pro testování je při spuštěné hře zapnout ukládání hráčových příkazů pomocí volby:

Zapni zápis

vše, co hráč zadá, se bude ukládat do zvoleného textového souboru. Pokud zde potřebujete zaslat nějaký komentář, lze tak učinit pomocí znaku * a psaní svého komentáře, toto pomůže pro zpětnou vazbu, ladění chyb i popsání průběhu hry.


A až Vás omrzí Exoter, můžete se těšit na úplně novou hru velmi lehce inspirovanou mým oblíbeným Bad Nightem:

http://www.textovky.cz/navody/bad-night-recenze-a-navod-na-textovou-hru-od-palase/

jmenuje se Otěžemi zimní noci a s využitím všech nabraných zkušeností na ní právě teď pracuji. Nápady mám a chuť tvořit také, takže není co řešit, chci si zde vyzkoušet ty parádní pokročilé konstrukce, které jsem si užíval u Základny. Nebude to jen klasická textovka z hradu, i když i ten se zde určitě objeví, rád bych využil i venkovní lokace divoké severské noční zimní přírody, nechte se překvapit. Pro nedočkavce zde zveřejňuji úvod do příběhu, ten se samozřejmě ještě může změnit:

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Vítej, hráči, v textové konverzační hře Otěžemi zimní noci.

Temná ranně březnová noc. Večer štiplavý mráz a ve dne čvachtající břečka pod nohama, ne, to jistě není dobrý čas na cestování. Ale co naplat, myšlenky Ti letí hlavou jako hvízdající vítr a uklidnit jejich dravý tok je nemožné. Jenomže měl jsi na výběr? Chudý rytíř Česlav z Krašova patřící do malého bezvýznamného rodu žijící v ne zrovna výstavné tvrzi se může spolehnout možná na svůj úsudek a meč, ale jinak na máloco jiného. Takový člověk opravdu může být skromný a bez ambicí, ovšem chyba lávky, jiní a mocnější právě toto chování mohou pochopit špatně a poté se dějí věci nevídané. Jen matně si vzpomínáš na začátek dnešní noci, se svojí milovanou Kaškou jste šli spát brzy s tím, že si uprostřed noci dáte svojí oblíbenou číši rudého vína pod svitem měsíce, ale ouha, vypili jste jí opravdu nebo to byl jen sen? "Odcházím směrem půlnočním..." točí se Ti stále v hlavě, zdála se Ti tak slova nebo ne? Probudil Tě právě jejich šepot nebo spíše otevřené okno noční jizby? Co se vůbec stalo? Úplně omámen jsi popadl jen to nejnutnější, žena na tvrdé zmrzlé zemi pod oknem naštěstí nebyla... a hnal se jako vítr naznačeným směrem, bez koně, pořádné výbavy, ale vlastně kam? Noční chlad Tě trochu uklidnil, ale zároveň si uvědomuješ, že Ti začíná být opravdu zima a k tomu se stále více a častěji ozývá vytí vlků. Pchá, to, že žerou lidi, jsou jen povídačky pro malé děti a hlupáky... ale najednou si uvědomuješ, že v takovém nečase, venku a především pod studeným svitem měsíce může být na těch hloupostech třeba i špetka pravdy...
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Moc děkuji Gaspodovi za jeho nekonečnou trpělivost u mých nekonečných otázek, začít s OOP pomocí TADSu bylo pro mě sice těžké, ale nesmírně zábavné.

Takže vesele testujte, po Otěžích notně předělám první díl Kroužícího orla a připravím další dva, poté bych rád nějaký příběh z aztéckého, mongolského a sibiřského prostředí, určitě nebude chybět ani něco z válek, třeba ta ruská občanská mě opravdu láká, není kam spěchat, textovky nestárnou a díky takovým bezva systémům, mezi něž určitě patří i TADS, je bude možno tvořit vždy.

2
Zdravím do nového týdne,

tak konečně jsem problém s dveřmi vyřešil, trošku mě zmátla definice u Heidi, kde se používají mezi místností venku a místností uvnitř chaty, nyní se již dveře chovají správně, mohu je prvotně odemknout a následně zamyklat a otevírat dle libosti, množné číslo se také ukazuje správně.

Doplnil jsem komentáře k různým akcím, které jsme společně řešili a myslím, že čas uzrál pro konečné testování. Pokud budeš mít čas a chuť, prosím o projití hry, ještě poprosím svého kamaráda a Thoorina s využitím Zapni zápis plus pokud se na fóru najde další zájemce, je vítán. Také si jsem vložil hru na IFarchiv:

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

a zatím čekám na schválení do adresáře unprocessed, případných dalších úprav snad již nebude mnoho.

A nyní je čas na hru novou, opravdovou, začínám na ní pracovat a pokusím se využít všechny zkušenosti, které jsem od Tebe získal, moc moc se těším. Budu využívat QT Creator, ať si zvyknu na větší IDE, až při tvorbě zjistím, zda mi více vyhovuje nebo bude vhodnější investovat čas do VIMu či EMACSu, ideální bude pár dní vyzkoušet všehny tři možnosti.

3
Nové textové hry / Re: Kroužící orel
« kdy: 22. Leden 2018 - 10:57 »
Přesně ten samý problém jsem měl ve WINE a vypadá to, že ani třetí verze na tom nebude lépe. Je super, že na tom pracuješ, až bude nová verze, sem s ní a moc rád vyzkouším pod aktuálním Debianem a Archem.

4
Krásné ráno přeji,
zase se dostávám k tvorbě a dokončuji dokumentaci a úpravu systaxe zdrojáku. Ještě bych se vrátil k webovému hraní, nevím, zda mám nastavené něco špatně, zkoušel jsem rozchodit gameserver pod Archem i Debianem a nyní těsně před spuštěním dostávám chyby.

Pod Archem využívám jako úložiště sqlite a pod Debianem mariadb. V prvním případě dostávám při spuštění např. pomocí:

http://localhost/t3launch/t3launch.php?storyfile=http%3A%2F%2Flocalhost%2Fasteroid-web.t3
- inspiroval jsem se Tvojí minulou odpovědí a např. url Heidi:
http://gs1.tads.cz/t3launch.php?storyfile=http%3A%2F%2Ftads.cz%2Fheidi.t3&key=8e6dec6f9554e0b1e4eaaf02c86ebcc9

chybové hlášení:

PHP Fatal error:  Uncaught Error: Call to a member function bindValue() on boolean in /srv/http/t3launch/t3launch.php:293\nStack trace:\n#0 /srv/http/t3launch/t3launch.php(54): fetchGame('http://localhos...')\n#1 {main}\n  thrown in /srv/http/t3launch/t3launch.php on line 293

U Debianu s mariadb:

Error
An error occurred starting the game.
Try again
Error details: The game displayed the following message(s) before it exited:

Warning: -webhost mode specified, but couldn't read web config file "/usr/games/tadsweb.config"
frob: http://localhost/asteroid-web.t3: file not found.

Note that the game must be designed for Web play to run properly with this service. Standard TADS games won't work on this system. IFDB home page

To samé u Archu s mariadb, zkusil jsem oba systémy, abych vyloučil novější verze serverových démonů. Warning je OK, stačí vytvořit tadsweb.config.

Horší je to s druhou hláškou, pokud zadám http://localhost/asteroid-web.t3, soubor mohu bez problémů stáhnout.

Také příkaz
frob -i plain -p -N 44 asteroid-web.t3

umožňuje po zadání do prohlížeče:

http://localhost:54055/?TADS_session=2524812e-ad34-2a9b-866e7cdd40c7-e8cc

hru hrát.

Problémy s právy v adresářích, kam vidí Apache, určitě nejsou, vyzkoušel jsem i jiné webové aplikace. Všechna nastavení včetně apačích access a error logů zasílám v příloze. Prozkoumal jsem i diskuzi na IFDB, ovšem ani Error copying resource file when compiling for Web play, Is there a Javascript Interpreter for TADS that I can run on my website nebo TADS 3 - IFComp entry online play nepomohly.

Dokument Setting up a custom TADS Web server určitě není aktuální, rád bych ale vše zprovoznil na dnešních linuxech a připravil dokumentaci pro ostatní, která skutečně funguje. Samozřejmě to není nutné, pro svůj Exoter využiji IFDB, TADS se ale stal mým oblíbencem a rád bych, aby vše fungovalo jak má, tak parádní systém si to určitě zaslouží a vidina serveru běžícího nad RPi je stále lákavá.

Pokud najdeš chvilku, prosím o kontrolu, není to ale nic zásadního.

Krásný víkend přeje
Orel

5
Krásné ráno přeji po Novém roce,
nic se neděje, nastavení kapsy naprosto chápu, se spamem bojujeme všichni, až budu příště něco posílat, tedy raději dvakrát. Hlavně, že jsi přání dostal, to je důležité, řechtavá banda už zase řádí u balíku.
S tou učebnicí mě to fakt mrzí, těšil jsem se, že něco parádního sesmolíš, ale neva, až – jestli – kdovíkdyazdavůbec ze mě bude programátor, vrhnu se na to s radostí sám.

1. Pochodeň, křesadlo, seno a pes
Ano, je to řetězová závislost, se kterou jsem se zatím nesetkal. Vše jsem nastavil jak píšeš a zapálení pochodně je už v pořádku. Kupka sena je také v pohodě, zapálit jí pochodní i křesadlem není  problém. U psa je také vše OK, zkusil jsem křesadlo a pochodeň dát i drakovi, dostávám:

>dej drakovi kresadlo
Pokud ho probudíš, se zlou se potážeš.
>dej kresadlo drakovi
Nemůžeš křesadlu nic dát.

U draka mám direktivu PreferredDobj. Pokud jí vymažu, příklady výše jsou OK, ale:

>pichni draka jehlou
Píchl jsi draka jehlou. Drak překvapeně otevřel oči, pak sebou však několikrát škubnul a bylo po něm.
>pichni jehlou draka
Spícím drakem nemůžeš zaútočit.

Jasně, otrávenou jehlu musím označit jako PreferredIobj a draka ani PreferredIobj, ani PreferredDobj, poté vše krásně funguje.

A dobře, že se to stalo, nyní vidím stejný problém i u strážce. Ten je také označen jako PreferredDobj:

>dej strazci sekeru
Chystá se zabít tě.
>dej sekeru strazci
Nemůžeš sekeře nic dát.

Vymazání PreferredDobj vše řeší, jsem rád, že jsem si s tím tak dlouho hrál, protože zde je opravdu rozdíl mezi kvalitním parserem, který tak obdivuji u Základny a předem nalajnovaným. Dal jsem si tu práci a draka i jehlu postupně označoval jako Iobj, Dobj i nic z toho, abych si vyzkoušel všechny možnosti a na nich si vše vyzkoušel, hurá.

Nová verze české knihovny tedy funguje parádně, je super, že mohu alespoň malinko přispět k jejímu zlepšování.

Setkal jsi se a potrápil s tímto typem řetězení i u Základny?

2. Výklenek
Ten výkenek je opravdu zajímavý, moc díky za upřesnění, CustomFixture bude vhodnějí. A samozřejmě neodolal jsem, juknul na Return of the Ditch Day a v souborech bridge.t a intro.t našel dva zajímavé příklady, o kterých píšeš. To mě také donutilo vyzkoušet si příkaz stoupni a stoupni na, který jsem předtím netestoval, to určitě využiji v další hře. Nyní mám:
+
 maly_vyklenek : CustomFixture, Platform
 
a mohu:

>stoupni na
(na malý výklenek)
Fajn, teď stojíš na malému výklenku.
>stoupni si do výklenku
Už stojíš na malému výklenku.
Popis místnosti: Ve výklenku (stojíš na malému výklenku)

Autor dle zdrojáku využívá i něco jako schovej se ve výklenku, tohle jako milovník příběhů o zlodějích prostě nemohu nevyužít. Vidím, že hra zatím příkaz schovej se nezná, zatím si to nechám jako věc, kterou budu řešit hnedle při další tvorbě.

Úžasné, jak člověk stále něco nového objevuje, ten TADS je prostě systém s velikým eS, dokážu jsi představit jak jsi musel být příjemně překvapený možnostmi, když jsi tvořil Základnu, píšeš to i v jejích komentářích, např. střepy v zadku při rvačce v kosmickém baru…

3. Dveře
Ano, zde mě zmátlo fungující „Jsou otevřené.“ z jedné strany a „Je otevřené.“ ze strany druhé. Sákryš, samozřejmě, že isPlural = true znám, vždyť jej mám u dveří na konci chodby, doplnil jsem je ještě ke dveřím druhým a tady k dračím hlavám.
 
Potíž ovšem stále přetrvává, je zajímavé, že z jedné strany vše funguje jak má a ze druhé nikoliv – nejde jen o množné číslo, ale právě z jedné strany je lze otevřít i zavřít, po zavření pokud chci projít parser automaticky doplní otevření dveří. Ze strany druhé ovšem nikoliv – množné číslo je i přes direktivu isPlural špatné a mohu projít i při zavřených dveřích, aniž by se parser o cokoliv pokusil.

V Základně jsem se se zamčenými dveři nesetkal, právě se dívám na zdroják k české Heidi a zdá se mi, že mám dveře i průchody nastaveny správně. V příloze zasílám zdroják i transkript, kde jsou všechny dveřní operace zaznamenány, mohu poprosit o kontrolu, kde dělám chybu?

4. Množné číslo, mixování mužského a ženského rodu a kaluž
V Základně vidím pěkný příklad množného čísla v souboru roomAlien a příklad s přihrádkami. Zkusil jsem přidat „*drahokamy“ ke všem čtyřem kouskům, příkaz „prozkoumej drahokamy“ už funguje tak jak má.

Synonyma v jiném rodu jsem v naší komunikaci nenašel, ale vůbec nevadí, zase vidím parádní příklad v Základně, soubor regionShip obsahuje changeGender = 'plavi:4, trup:2' a vyzkoušel jsem jej u svého lana.

U kaluže jsem měl skutečně v gcVocab čárky místo lomítka a to samé u střepů, již jsem opravil a vše krásně fungue, uff, pamatuji se, že jsem se tam také dlouho zasekl a pak dělám takovéhle špeky.

5. Webový server
Super, je paráda, že t3launch mám nastavený správně, jen potřebný parametr ?storyfile jsem nikde nedohledal. Dokument Setting up a custom TADS Web server holt už není nejnovější, viz mé menší potíže s Archem a právě jeden dotaz na storyfile jsem našel v diskuzním fóru, kde nabízíš svojí emailovou pomoc. Gameserver nyní funguje parádně, databázi tedy momentálně ani nepotřebuji, jak píšeš, slouží jen ke kešování. Mě to zajímá hlavně z technického hlediska, samozřejmě jsem si mnohem jistější administrací linuxu, než programováním a po dokončení hry jí určitě umístím na IFDB a využiji jejich storage server.

Každopádně Tvé technoplaneťácké řešení je perfektní v tom, že si můžeš hostovat hry nezávisle, to se mi strašně líbí a vidím v tom přínos, protože TADS se teď zrovna moc nevyvíjí. Je mi jasné, že jsi si s tím dal kopu práce a nebude sranda vše dát dohromady pro obecné využití, každopádně minimálně za mě se ke zveřejnění, až budeš mít čas a chuť, moc moc přimlouvám a s radostí pomohu třeba s dokumentací, hnedle si game i storage server nainstaluji na více distribucích a vše zdokumentuji, v TADSu je vše otevřené a pokud bych tímto způsobem mohl pomoci, budu strašně rád. Malé Raspberry bude k hostování TADSu jako stvořené.
Pokud mají mít textovky budoucnost, tak to vypadá, že na webu a čím více serverů bude k dispozici, tím lépe.

6. Co ještě zbývá na Exoterovi
Nyní tedy snad již poslední bolest představují ty dveře. Dívám se na svůj soubor věcí k dodělání, mám zde ještě kromě slova uřízni k doplnění usekni a u kaluže slova kapalina, louže - to nebude problém. Plus lze prozkoumat mrtvolu psa pomocí „prozkoumej mrtvolu“, protože jsem jej definoval jako samostatný objekt jak jsi mi doporučil, u draka ani strážce toto možné není, zde bych pravděpodobně musel postupovat stejně.
Ještě dodělám skóre, ať je hráč více motivován a teď se vrhnu na sjednocení zdrojového kódu, juknu na Základnu a Heidi a určím si svůj styl odsazení, kterého se budu držet. Znovu si projedu naši komunikaci a do zdrojáku doplním věci, které mi nebyly jasné stejně jako v Základně.

6
Nové textové hry / Re: Winter Of The Bomia
« kdy: 3. Leden 2018 - 11:29 »
Paráda, zkusil jsem plnou verzi hry a je v pohodě dohratelná, nakonec jsem našel recept i na toho závěrečného potvoráka, jen se mi po boji s ním docela klíží voči...

Ve WINE je hra dost pomalá, WinXP a určitě i novější verze hru zvládají v pohodě, o důvod víc, proč jej alespoň na jednom harddisku ponechat.

Těším se na další rozšíření hry a samozřejmě na Toferun, zatím budu pokračovat v dalším studiu TADSu.

7
Nové textové hry / Re: Kroužící orel
« kdy: 3. Leden 2018 - 10:48 »
Paráda, moc díky za aktuální engine, jsem moc rád, že se stále vyvíjí. A ještě více mě potěšil Tvůj web, kde jej testuješ na Linuxu pod WINE a ReactOS. Všechny Tvé hry na linuxu parádně frčí, jen se někdy stane, že po minimalizaci okna se toto tak zmenší, že není nic vidět a aplikaci je nutno ukončit, třeba pomůže třetí verze, která tady bude co nevidět.

Já jsem se vrhnul na velezajímavý TADS a díky neustálé podpoře Gaspody už s ním alespoň trochu umím pracovat plus začínám chápat objektový model, který použiji při svém dalším studiu linuxu pomocí C++, Pythonu a nezapomenu ani na klasické Cčko.

Díval jsem se i na zdrojáky Syrečků, zatím jen uloženo a prozkoumám výhledově, teď se zase vrhnu na TADS a dokončení Exotera. Poté přijde už mnohem rozsáhlejší středověká hra malinko inspirovaná Bad Nightem a nakonec se vrhnu i na Kroužícího Orla včetně jeho druhého dílu, tak se konečně snad naučím doopravdy programovat a třeba časem zmáknu i Tvůj engine postavený na SDL2.

8
Programování / 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.

9
Programování / 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žší.

10
Programování / 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

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

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

13

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

14
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

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

Stran: [1] 2 3 ... 10