22. Leden 2018 - 01:08

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

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 113
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #120 kdy: 20. Prosinec 2017 - 11:51 »
1. Pes
hmm, nerozpoznal jsem, že u Topicu není metoda změnit stav, na kterou jsem zvyklý u postav.

Jeden fyzický objekt ve hře, jako třeba postava, se může skládat z několika programových objektů, jako třeba samotný actor, jeho jednotlivé stavy, téma konverzace. Když chceš měnit stav, tak to musíš dělat se správným objektem, tedy s postavou a ne s tématem. Je to podobné, jako když se Lego autíčko skládá z několika dílků zacvaknutých do sebe. Když chceš něčím otáčet, tak můžeš otáčet kolečkama, ale ne blatníkem. Každá kostička má svůj jasně daný účel a možnosti manipulace.

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.

OutOfReach žádnou knihovní dědičnost nemá, jde o to, jaký svůj objekt od ní podědíš ty. Když bych se podržel příkladů s kostičkama stavebnice, tak ty si tvoříš svojí kostičku tím, že dědíš od různých tříd a to pak dává kostičce různé vlastnosti, jako třeba barva, velikost atp. Třeba budu hledat červenou kostičku velikosti 2x1. Najdu ji a teď si vzpomenu fajn, ale já ještě chci, aby měla díru. To, že přidáš nějakou třídu je jako když přidáš nějakou vlastnost. Najdu tedy kostičku s dírou a můžu protáhnout hřídelku. Mít objekt bez třídy OutOfReach je jako mít kostičku bez díry, tedy nemá cenu snažit se protáhnout hřídelku / nemá cenu psát vlastnosti canNěco, nemají žádnou funkci.

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

První by mělo fungovat samo, protože u všech konverzačních akcí je automaticky každá postava označena jako preferovaný iobj už v knihovně. (Podobně je u akce prostrč objekt jiným objektem označeno, že NonPortable objekt je ten, skrz který se protlačuje.) Třída PreferredIobj je určená k využití jen u těch akcí, u kterých to nejde takhle předvídat dopředu.

Ve druhé situaci se jedná o konflikt, protože sekera je už z důvodu využití v jiné akci označená jako PreferredIobj a to je pak nevhodné v konverzačních akcích, kde postava má být iobj, tudíž se to pere mezi sebou - máme dva objekty a oba mají nastveno, že jsou iobj. Jedna možnost, jak to řešit je nenastavit sekeru jako PreferredIobj a místo toho nastavit ten druhý objekt v té druhé akci se sekerou jako PreferredDobj. Nevím, co to je za akci, sekání hlav? Pak sekaným hlaván nastavit PreferredDobj.

Úplně obecné řešení jsem rozebíral s Tekketem na pomezí mezi druhou a třetí stránkou této diskuse.

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.

Algoritmus je obecně postup vyřešení nějaké úlohy a vlastně není závislý na konkrétním programovacím jazyce. Když si představíš recept na jídlo v kuchařce, tak algoritmus je ten postup výroby - nejprve oddělíme žloutek od bílku, tohle přidáme do tohohle, mícháme dokud není taková konsistence, pečeme do růžova,... Pouhý výčet surovin v receptu ale algoritmem není, že potřebujeme dvě vajíčka a půl kilo mouky, to je deklarace, ne algoritmus. Algoritmus je postup řešení, to kde říkáš věci jako nejprve tohle, potom tohle. Dokud něco, tak dělej tohle apod.

Takže definice místností, hierarchie objektů, to jsou pouhé deklarace (a tyto deklarace jsou pak nějakým algoritmem v knihovně následně zpracovávány). Algoritmus je až to, kdy píšeš nějaké příkazy, které jsou vykonávány, tedy když píšeš příkazy v nějaké action() apod. A ačkoliv tedy deklarace dat není algoritmem, může být vymyšlení vhdného uspořádání dat kolikrát i důležitější, než vymyšlení algoritmu, který s nimi pracuje.

O algoritmech a algoritmizaci se má cenu bavit tehdy, když jde o nějaký netriviální postup, který lze dělat třeba různými způsoby, např. učebnicový problém je řazení podle velikosti. Mám řadu různě dlouhých tyček a chci je srovnat podle velikosti. Tak jdu z leva do prava a porovnám každé dvě sousední a pokud jsou v nesprávném pořadí, tak je prohodím. Tento celý postup zopakuji tolikrát, kolik je tyček a pak budou srovnané všechny. To je sice docela snadno pochopitelné, ale je to také jeden z nejpomalejších způsobů (Bubble Sort). Jsou i jiné způsoby, ale jejich pochopení je náročnější. Navíc neexistuje jediný správný a nejlepší způsob, trochu se to liší podle vstupních dat - jsou data úplně náhodná? Jsou už trochu srovnaná? Jsou mezi nimy stejné hodnoty, nebo je každá řazená hodnota jiná, než ostatní? https://www.youtube.com/watch?v=ZZuD6iUe3Pc

Algoritmizace je tedy o schopnosti vymýšlet postupy řešení úloh, schopnosti rozpoznat, že pro některý problém se hodí některý ze známých algoritmů a umět jim porozumět a správně vybrat, který je vhodnější v určité situaci, když je více možností.

6. Závěr hry
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.

Lze lecos, třeba i po zobrazení hlášky hru zapauzovat a pokračovat ve výpisu až po stisknutí klávesy, ale osobně to považjí spíše za kontraproduktivní, protože to narušuje plynulost čtení.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 133
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #121 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.

gaspoda

  • Plný člen
  • ***
  • Příspěvků: 113
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #122 kdy: 8. Leden 2018 - 20:19 »
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.

Haha, dobrý vtip.

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

PreferredIobj s velkým P na začátku je mix-in třída, která slouží jen jako označení, je to jen deklarované a pak v jednom ifu.

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

Tady se vytvořila řetězová závislost, kdy křesadlem zapaluješ pochodeň a pochodní zapaluješ seno. Tedy pochodeň je jednou přímým objektem a podruhé je nepřímým. Proto pochodeň nemůžeš označit ani jako PreferredDobj, ani PreferredIobj. Protože je to řetězec jen na tři, tak pochodeň, která je uprostřed, nech bez zakéhokoliv označení (tedy uber PreferredDobj u pochodně), křesadlo označ jako PreferredIobj, protože křesadlo je vždy to, co zapaluje něco jiného a kupku sena označ jako PreferredDobj (to už máš), protože to se vždy nechává zapálit něčím jiným.

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

Tohle opět koliduje s výše uvedeným řešením, ale upavil jsem knihovnu, aby dávala přednost tomu, že pro konverzační akce je Actor před těmi ad hoc vlajkami. Mimochodem ten nedosazený parametr {Tím iobj} jsem v nové verzi překladu také opravil.

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.

Jasně. Ty skripty, které sis nainstaloval slouží ke spuštění webového hraní a fungují jako univerzální gameserver pro TADSové webové hry. Ta chybová hláška znamená, že jsi neřekl, jakou hru chceš spustit. Jako minimum musíš předat parametr storyfile s odkazem na hru. Měl bysis tedy vyrobit třeba nějakou startovací stránku a hru spustit odkazem ve tvaru:

<a href="http://localhost/t3launch/?storyfile=http%3A%2F%2Flocalhost%2Fasteroid-web.t3">spustit základnu</a>

Gameserver je dělaný univerzálně, aby si hru stáhnul z internetu, proto se tam dává HTTP odkaz a ten může věst kamkoliv na internet, kde je soubor se hrou vystavený. Pokud si to chceš hostovat sám, tak si dej soubor se hrou např. do kořenového adresáře webu, tj. zkontroluj si, že když zadáš http://localhost/asteroid-web.t3, tak že ti to nabídne soubor ke stažení a pak bude ten odkaz na t3launch výše fungovat.

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.

Ne, takhle je to v pořádku, skripty t3launch nedělají nic jiného, než spuštění hry a do databáze si zaznamenávají jen jedinou tabulku s informacema o stažených hrách, aby věděly, jestli při příštím stažení mohou použít nakešovanou kopii nebo musí stahovat hru znovu.

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.

To je funkcionalita storage serveru, která je k dispozici na stránkách ifdb.tads.org. Když máš zaregistrovaný účet na IFDB, tak si můžeš spouštět TADSové hry a při ukládání místo aby se nabídl save file ke stažení, tak se pozice uloží online. Tahle funkcionalita je k dispozici pro každého, i ty si můžeš nahrát svou webovou hru na IFDB a vůbec nemusíš řešit vlastní server, protože dobrovolníci provozují několik veřejných TADS gameserverů.

Já jsem si podobnou funkcionalitu vytvořil sám pro sebe, tj. provozuji vastní gameserver i storageserver, takže i když IFDB nevyužívám, mám také možnost ukládání pozic online pod jménem a heslem. Potřeboval jsem to totiž propojit s uživatelskými účty na Technoplanetě a IFDB mi neposkytne tu bezešvou integraci. Navíc jsem měl naprogramováno odesílání událostí ze hry (změna skóre atp.) do online žebříčku a to by na IFDB také nešlo.

Naprogramování a nastavení storage serveru není nikde zdokumentované a zveřejněné a je to už pokročilá záležitost. Možná to někdy zveřejním, ale nebude to brzy, protože bych to musel pořádně dotáhnout a vyseparovat z jiného kódu.

7. Dokončování hry
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.

Může být. Přesnější by bylo CustomFixture než CustomImmovable, liší se to v malém detailu, že Fixture je něco, co je pro hráče zcela evidentně součástí lokace a tudíž nepřenosné, kdežto Immovable se z pohledu hráče nemusí jevit nepřenosně, byť nepřenosné je. Samozřejmě se to dá dál rozvíjet, třeba v Return to ditch day je výklenek součástí jednoho puzzlu. Tam je deklarovaný jako Fixture, Platform, aby se dalo stoupnout do výklenku. Ale to už je vyšší dívčí :-)

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

No musíš si dveře označit isPlural = true, vždyť to víš, jen nesmíš zapomenout.

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.

Stačí přidat množné číslo do slovníku, plurál se odděluje hvězdičkou 'první drahokam*drahokamy', koukni v Základně.

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

No jasně, o tom jsme v tomhle vláknu už také myslím mluvili. Když jsou synonyma, která jsou v jiném rodu, tak se dají ty další rody zadat pomocí vlastnosti changeGender, např. changeGender = 'lan:4'.

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

Příkaz "namoč jehlu v kaluži" řekne, že Slovo „kaluži“ v tomto příběhu není důležité, protože jsi slova v gcVocab objektu kaluz oddělil čárkami, což není správné. Změn to na lomítka gcVocab = 'kaluže/kaluži/kaluží'

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.

Díky, kapsácký mail by měl fungovat normálně, nevím, jestli jsi neposlal moc velkou fotku. Jo a je na něm greylisting, takže poprvé mail od serveru odmítne a pokud to poštovní server za chvíli zkusí znovu, tak mail od něj už přijme. To je obrana proti masovému spamu, ale běžný poštovní server by si s tím měl poradit.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 133
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #123 kdy: 11. Leden 2018 - 11:54 »
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ě.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 133
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #124 kdy: 19. Leden 2018 - 13:47 »
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