Diskuze o textových hrách

Seriál o programování textových her v TADS 3

gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
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ů: 205
    • Zobrazit profil
    • Šťastný statek
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ů: 141
    • Zobrazit profil
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ů: 205
    • Zobrazit profil
    • Šťastný statek
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ů: 205
    • Zobrazit profil
    • Šťastný statek
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


Kroužící orel

  • Plný člen
  • ***
    • Příspěvků: 205
    • Zobrazit profil
    • Šťastný statek
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.


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
1. Pochodeň, křesadlo, seno a pes
Jasně, otrávenou jehlu musím označit jako PreferredIobj a draka ani PreferredIobj, ani PreferredDobj, poté vše krásně funguje.

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

Při té poslední úpravě jsem to právě udělal tak, aby Actor mel v konverzačních příkazech přednost. Ne, na základně to bylo docela jednoduché. Ale docela zajímavý problém byl, když jsem se snažil modelovat konverzaci se dvěma postavami zároveň, aby nevypadala jako rozhovor jen s jednou postavou.

2. Výklenek
>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)

Tady by asi bylo vhodnější, aby hra mluvila o to, že stojíš ve výklenku a ne na výklenku. To samozřejmě není problém, podívej se, jak v Základně je nadefinovaný objekt spacáku. Vlastnosti objInPrep, objIntoPrep, objIntoCase a objOutOfPrep definují, jaké předložky a pád použít.

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.

Hele já nevím, které dveře máš na mysli, ale asi to bude u všech stejné a nemyslím, že bys to měl opravené. Níže máš jednu půlku dveří dobře a tu druhou máš úplně bez definice. Ta by měla být stejná, nejen isPlural, ale i keyList a slovník a jakékoliv další vlastnosti. To, že jsou obě půlky mezi seou prolinkované, aby se dalo procházet ještě neznamená, že bys nemusel uvést všechno ostatní.

Kód: [Vybrat]
chodba_se_zeleznymi_dvermi: Room 'Chodba' 'do chodby'
    "Stojíš v chodbě. Na jihu jsou masivní železné dveře. \bMůžeš jít na sever. "
    north = chodba_se_zebrikem
    south = dvere_chodba_se_zeleznymi_dvermi
;

+ dvere_chodba_se_zeleznymi_dvermi : LockableWithKey, Door 'dveře' 'dveře' *3
  "Masivní železné dveře. "

     isPlural = true
     keyList = [svazek_klicu]

     gcName = 'dveří, dveřím, dveře, dveřích, dveřmi'
     gcVocab = 'dveří/dveřím/dveřích/dveřmi'
;

//po použití svazku klíčů od strážce: "Podařilo se ti odemknout železné dveře. "

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

zatuchla_komurka: Room 'Zatuchlá komůrka' 'do zatuchlé komůrky'
    "Nacházíš se v malé zatuchlé komůrce. Na severu jsou vidět masivní železné dveře.
    \bMůžeš jít na sever. "
    north = chodba_se_zeleznymi_dvermi
;

+ dvere_zatuchla_komurka : LockableWithKey, Door -> dvere_chodba_se_zeleznymi_dvermi 'dveře' 'dveře' *3
    // Tady chybí uvést to samé, co u prvních dveří
;


Kroužící orel

  • Plný člen
  • ***
    • Příspěvků: 205
    • Zobrazit profil
    • Šťastný statek
Jů, na konverzaci se dvěma postavami zároveň se docela těším, nevím, jestli jí v Otěžích využiji, každopádně mě čeká pochopit nejprve tu klasickou, bude jí tam požehnaně jak jsem již psal v jednom našem minulém tématu.

S výklenkem máš recht, určitě bude lepší „stojíš ve výklenku“. A už vidím parádní příklad, v roomYourCabin jsem našel definici spacáku a Tebou popisované vlastnosti, už stojím v malém výklenku a dostanu se dolů z malého výklenku, hurá. Tyhle hrátky s češtinou nejsou na první pohled triviální, ale vyplatí se, reakce hry je radost sledovat.

Dveře jsem upravil dle Tvého doporučení, funkcionalita zůstala stejná. Já se inšpiroval právě u Heidi, kde jsou plně definovány také jen na jednom místě, viz cottageDoor na řádku 425 a cottageDoorInside na řádku 706. Budu ale používat syntaxi, kterou uvádíš, určitě je přehlednější.

Když už jsme u těch dveří, podíval jsem se na mříž, která je definována stejně a pokud hráč prolézá nahoru a je otevřená, přidal jsem TravelMessage s popisem, což vypadá zase o chlup reálněji. Jen mě napadá, že po jejím přepilování nemají smysl příkazy otevři/zavři mříž, které sice hráč zapsat může a parser mu odpoví, efekt zde však není žádný a hlášení nevypadá dobře. U jiného objektu, např. Immovable, bych situaci řešil metodami cannotOpenMsg a cannotCloseMsg, dveře však tuto metodu nemají, tak jediné, co mě napadá, je metoda dobjFor(Close).

V Základně jsem našel parádní příklad, regionBase.t definuje IndirectDoor s využitím IndirectLockable a následné direktivy, které jsem si upravil na:

dobjFor(Open) { verify { illogical (cannotOpenMsg); } }
dobjFor(Close) { verify { illogical(cannotCloseMsg); } }
cannotOpenMsg = 'Mříž nedokážeš otevřít. '
cannotCloseMsg = 'Mříž nedokážeš zavřít. '

Toto jsem využil i u mříže a celá akce s ní je nyní mnohem logičtější. A právě zde je třeba všechny metody definovat z obou stran mříže, parádní příklad potvrzující Tebou popsanou definici dveří, toto v Heidi pravděpodobně nebylo potřeba.

Ještě chvíli počkám, zda někdo nebude reportovat další chyby, poté vydám další verzi včetně komentářů nově nabitých zkušeností. Webová verze tentokrát nebude, administrátor IFDB mě upozornil, že pokud hra obsahuje podobný text jako původní Exoter, bylo by to porušení licenčních pravidel. Nechám to tedy tak, nová hra už nic z Bad Nightu využívat nebude, takže no problemo.

Dnes budu mít jen jeden technický dotaz ohledně monitoru vhodného pro programování. Vývojařina samozřejmě unavuje oči, displej na mém armádním notebooku není zrovna dvakrát šetrný. Napadlo mě situaci řešit e-ink displejem, jediný dostupný monitor nabízí Dasung E-Ink PaperLike Pro s šílenou cenou a ne zrovna jednoduchým objednáním z ciziny. Hezky vysvětlené je to na tomto fóru:

https://hardwarerecs.stackexchange.com/questions/2415/e-ink-monitor-display-panel

možná by byl vhodný ten BenQ EW2775ZH s přeci jenom rozumnější cenou. Jaké máš zkušenosti jako vývojář Ty, můžeš mi vhodné zobrazovadlo doporučit?


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Dveře jsem upravil dle Tvého doporučení, funkcionalita zůstala stejná. Já se inšpiroval právě u Heidi, kde jsou plně definovány také jen na jednom místě, viz cottageDoor na řádku 425 a cottageDoorInside na řádku 706. Budu ale používat syntaxi, kterou uvádíš, určitě je přehlednější.

Aha, to bude opomenutí, dveře by měly být skutečně definovány plnohodnotně z obou stran, aby se daly prozkoumat atp.

Když už jsme u těch dveří, podíval jsem se na mříž, která je definována stejně a pokud hráč prolézá nahoru a je otevřená, přidal jsem TravelMessage s popisem, což vypadá zase o chlup reálněji. Jen mě napadá, že po jejím přepilování nemají smysl příkazy otevři/zavři mříž, které sice hráč zapsat může a parser mu odpoví, efekt zde však není žádný a hlášení nevypadá dobře.

Dobrá, ale pak asi nemá cenu modelovat mříž jako dveře, pokud to není taková mříž, která se jako dveře otevírá. Konektorů, které spojují místnosti existuje více. Co kdybys vyzkoušel ThroughPassage, ze které konec konců dveře dědí? Je to podobné, dveře navíc dědí ještě od Openable. Tj. ThoughPassage je něco, skr co se dá projít do jiné místnosti, jako např. díra ve zdi, tunel apod., skrátka cokoliv, u čeho by hráč chtěl zadat příkaz projdi/prolez něčím. Podobně existuje PathPassage, která funguje podobně, ale popisuje pohyb po objekty, tedy např. jdi po cestě apod. Na rozdíl od dveří se tyto objekty nedají zavírat a otevírat, ale stejně jako jiné konektory u nich funguje canTravellerPass/explainTravelBarrier, takže by neměl být problém je použít.
V Základně jsem našel parádní příklad, regionBase.t definuje IndirectDoor s využitím IndirectLockable a následné direktivy, které jsem si upravil na:

Dnes budu mít jen jeden technický dotaz ohledně monitoru vhodného pro programování. Vývojařina samozřejmě unavuje oči, displej na mém armádním notebooku není zrovna dvakrát šetrný. Napadlo mě situaci řešit e-ink displejem, jediný dostupný monitor nabízí Dasung E-Ink PaperLike Pro s šílenou cenou a ne zrovna jednoduchým objednáním z ciziny.

No to teda nevím, na čtečku knih, kde jednou za minutu obrátíš stránku asi ok, ale byl bych hodně skeptický, že by se něco takového dalo použít jako normální monitor...

možná by byl vhodný ten BenQ EW2775ZH s přeci jenom rozumnější cenou. Jaké máš zkušenosti jako vývojář Ty, můžeš mi vhodné zobrazovadlo doporučit?

BenQ patří k lowendu. Panely vždy vyrábí někdo jiný, ale elektronika asi nebude nejkvalitnější. Ale doporučení, to je těžké. No u toho BenQu píší, že to je AMVA+ panel, takže to asi není tak strašlivé, jako TNka, ale zkušenost s tím žádnou nemám. Pokud by byla pravda, že panl je osmibitový a má pozorovací úhlu 178 stupňů a nativní kontrast 3000:1‎, jako píší na http://www.relaxedtech.com/reviews/benq/ew2775zh/1, tak by to nemuselo být až tak zlé, ale na druhou stranu cena je podezřelá - předpokládám, že to má nějaký háček, jak už to tak bývá. Snad jen jedinou poznámku, že když už širokoúhlý, tak programátor ocení spíš 16:10, aby nebyl panel tak ošizený na výšku. Jenže tím se výběr prudce sníží.

Já osobně mám doma ještě dnes už stařičké Eizo S1910, které ve své době stálo asi 19 tisíc. Z dnešního pohledu je to už trochu malé, ale má to SPVA panel, který je docela dobrý kompromis, má dobré úhly, kontrast 1000:1 není největší, ale stačí a sice ne kalibrované, ale docela hezké barvy. Neprojevují se u něj žádné zásadní vady, jako u TN a byl výrazně levnější, než profi IPSka. V práci mám na stole nějaké levné Eizo s TN panelem, které mě děsně štve, protože má šestibitové barvy a ditheruje...


pedromagician

  • Globální Moderátor
  • Starší člen
  • *****
    • Příspěvků: 295
    • Zobrazit profil
    • Pedro - blog
Len k tomu monitoru, toho e-ink u by som sa naozaj bal. Momentalne pouzivam 2x Dell U2415 UltraSharp a je to super. Doma starucky Dell UltraSharp 2209WA to je bieda, ale chcel by som ho vymenit za Dell U2715H UltraSharp. Zalezi kolko chces investovat mne vychadzal pomer cena/vykon najlepsi u tych Dell-ov ale rad si precitam aj ine off topic navrhy :)
pedro.pohroma.de
txt.pohroma.de


Kroužící orel

  • Plný člen
  • ***
    • Příspěvků: 205
    • Zobrazit profil
    • Šťastný statek
Moc díky za rychlou odpověď, já jsem moc rád za to malé opomenutí u dveří, protože mě donutilo definovat obě jejich strany, na základě toho mě napadlo vylepšit mříž a nyní mám možnost podumat i o dalších konektorech, o kterých jsem sice četl, ale v praxi je zatím nepoužil – krásně to vše do sebe zapadá.

1.  ThroughPassage
Právě se dívám na Tvůj manuál a kapitolu Další druhy konektorů. Stairway už jsem využil u žebříku, PathPassage určitě využiji u Otěží, kde cesty lesem osvětlené svitem měsíce takto propojím. A u ThroughPassage uvádíš, že dveře jsou od této třídy odvozené, nelze je zavírat a mohu využít příkaz projdi/prolez, super, vyzkouším. Možnost prolézt do jeskyně, chrámu nebo úzkou šterbinou do hradu využiji velmi brzy, teď názorně vidím jak lze využít bohatou knihovnu na modelování nejrůznějších situací.

Schválně jsem si při současné definici mříže jako dveří vyzkoušel projdi/prolez mříž a perfektně funguje. Díval jsem se na dědičnost tříd u dveří, vidím Openable a Basic Door → ThroughPassage, tady se ještě dozvídám, že mohu využít příkaz „jdi skrz“ (ha, a tady bych pro staré sudeťáky mohl přidat ještě „jdi durch“, ať jim udělám radost, nicht war?).

Takže jdeme na to, juknul jsem se na pěkný příklad v roomControl, mříž jsem definoval jako PreferredDobj, ThroughPassage. U příkladu ze Základny ještě využíváš možnost sightSize, aby nebyla vidět na dálku, to zde nemá smysl, ale pokusím se použít jinde.
Zatím se mi ale nepodařilo definovat objekt třídy ThroughPassage tak, abych jej využil jako bariéru, kterou lze odstranit, v mém případě přeříznout pilníkem. Moje současné definice, viz zdroják v příloze, umožní hráči rovnou projít mříží. Nepodařilo se mi totiž zjistit, jak pomocí canTravelerPass omezit průchod jen rozřezanou mříží, viz řádek:

canTravelerPass(traveler) {return mriz.isCut; }

nepodařilo se mi najít vhodnou direktivu za return. Hledal jsem v Library i v Ericových manuálech, kromě výše uvedeného příkladu v Základně jsem v Learning T3 na straně 53 našel definici tunelu v jeskyně, kde je průchod omezen pomocí

return !bigHeavyBox.isIn(traveler);.

Zatím tedy nevím jak ThroughPassage na mříž využít. Pokud budeš mít chvilku na to juknout, určitě mě toto řešení zajímá, budu ještě hledat, co jsem mohl přehlédnout. Možná by mi pomohl seznam možností které mohu definovat za příkazem return, např. :
{return mriz.isCut/isMoved/isDead...; }

2. Monitor pro vývojáře
Moc děkuji Tobě i Pedrovi za názor ohledně monitorů, od programátorů si nechám rád poradit. Ještě podrobněji vysvětlím, co potřebuji:

Mám armádní notebook Panasonic Toughbook CF-30, výborný odolný stroj, může na něj sněžit, pršet, určitě zvládne i step nebo poušť, časem přejdu na CF-31 nebo rovnou 33, ovšem nespěchám, plně mi vyhovuje. Jen displej je menší a ne moc šetrný k očím. Výkon neřeším, programování v TADS/C/C++/Python o tomhle alespoň zatím pro mě není. Hledal jsem vhodný displej nejen pro Raspberry a k verzi Zero lze sehnat E-inkový Papirus Zero a IPS Joy-IT. První mě oslovil, větší verze, která je např. ve čtečkách Amazon Kindle, by se možná použít dala a pár nadšenců to zkouší. Ovšem uznávám, že pro vývojařinu to asi nebude to pravé, vykreslování nebude nic moc – uvažoval jsem totiž o tom, že bych se z Kindle připojil SSHčkem třeba na Rpi a takto vyvíjel, wi-fi u čtečky je ale pomalá, mikroUSB klávesnice také nebude reagovat rychle plus to překleslování. Proto mě zaujal ten monitor od Dasungu, ovšem kde není konkurence, tam je cena hrozivá. Je to škoda, už jsem si vychytal nenáročnou terminálovou vývojářskou stanici, např. pod Slackwarem jádro a mnohé aplikace ihned podporují framebuffer, takže vyvíjet mohu např. pod Vimem nebo Emacsem a velmi pohodlně surfovat díky grafickému Linksu (links -g) nebo Netsurfu (netsurf-fb), multimedia zvládne řádkový mplayer – tohle hodit např. na Rpi a využít e-ink displej by pro mě bylo ideální řešení.

Ale OK, E-ink zatím asi nebude to pravé, vrátím se na zem a nechám si svůj obrněný stroj, kde v domácnosti není problém připojit jej k vhodnému klasickému monitoru. Ano, přiznám se, že u Benqu mě ta cena také trochu překvapila. Nejsi zdaleka první, kdo mi doporučuje Eizo, mě spíše, než nutně o velikost, jde hlavně o tu minimální únavu očí. A Pedrův Dell také nevypadá špatně. TN bych se rád vyhnul, takže to asi vypadá na nějaké to kvalitnější IPS. Můj notebook má pouze starší DVI rozhraní, s redukcí ale nebude problém a nějaké nižší kvality obrazu jsem si nevšiml. Mimochodem ještě jsem našel podezřele levný Samsung, uff, kdo se v tom má vyznat:

https://www.czc.cz/samsung-s24e650pl-led-monitor-24/174790/produkt

Hezký dotaz jsem našel zde, programátor se ptá na EIZO i Dell:

http://forum.zive.cz/viewtopic.php?f=955&t=1266226

Díval jsem se na ty Delly - Dell U2415 a Dell U2715H vypadají velmi dobře. Profi EIZO je dost drahé, naopak překvapil zase ten
Benq s modelem BenQ PD3200Q, dobře jsem si početl zde:

https://www.czc.cz/recenze-benq-pd3200q-na-praci-i-legraci/clanek
https://www.systemonline.cz/zpravy/recenze-monitoru-benq-pd3200q-z.htm

a u něj už je cena opravdu někde jinde. Dále se mohu poohlédnout po PD2500Q nebo např. PD3200U – u druhého už ale za opravdu dost vysokou cenu.

No, nejlépe asi zatím vypadají ty Delly, našel jsem ještě jeden zajímavý kus Dell P2415Q a také EIZA, např. model FlexScan EV2730Q by určitě stál za to, tam už bych ale vypláznul 22 litrů. Nevím jak jsou na tom levnější EV24XX v porovnání s těmi UltraSharpy, tady bych si ale určitě vybral.

Teď se ještě dívám na Alzu a popis dvou levnějších EIZ:
https://www.alza.cz/24-eizo-ev2450-bk-d2268875.htm?o=1
https://www.alza.cz/24-eizo-flexscan-ev2451-bk-d4725652.htm?o=2

Paper Mode se zdá zajímavý a např. recenze na typ EIZO FlexScan EV2450-BK vypadají velmi, velmi dobře. Tenhle kousek se mi tedy začíná líbit čím dál tím víc.

Každopádně nejlépe udělám, když se zastavím v pražské Alze. Je mi jasné, že rozdíl poznám až po delší práci, určitou představu ale získám a třeba mi pomůže se rozhodnout.

Krásný víkend Vám oběma přeje
Orel


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Teď se ještě dívám na Alzu a popis dvou levnějších EIZ:
https://www.alza.cz/24-eizo-ev2450-bk-d2268875.htm?o=1
https://www.alza.cz/24-eizo-flexscan-ev2451-bk-d4725652.htm?o=2

Paper Mode se zdá zajímavý a např. recenze na typ EIZO FlexScan EV2450-BK vypadají velmi, velmi dobře. Tenhle kousek se mi tedy začíná líbit čím dál tím víc.

V dané cenové kategorii to není špatné, i ty Delly jsou docela fajn. V Kapse máme starší Dell 2412 za cenu těsně přes 6000,- a má eIPS panel. Ty levnější IPS panely jsou myslím jen 6 bitové, ale dobré je, že to na nich kupodivu není znát. Samozřejmě IPS panely trpí na jemné glow v černé obrazovce, mají však velmi slušné pozorovací úhly a barvy neurazí. Osobně je považuji za docela doporučení hodné, pokud nechceš dát více.

Nejlepší je projít si nějaký skutečný test, doporučuji mrknout na:

http://www.tftcentral.co.uk/reviews/eizo_ev2450.htm
http://www.tftcentral.co.uk/reviews/dell_u2715h.htm
http://www.tftcentral.co.uk/reviews/benq_bl3200pt.htm

a porovnat si je. A pokud máš možnost je vidět naživo, tak také, jen je dobré se trochu vyzbrojit zkušenostmi a vědět, co je na těch monitorech potřeba vidět (glow, kontrast, úroveň černé, rovnoměrnost podsvětlení, pohled ze spodu, blikající pwm podsvícení při nižším jasu, jak moc jde jas snížit pro práci po tmě, ghosting při rolování textu nebo obrazu s jemným šedým vzorkem, jemný šedý gradient apod.) To Eizo za osmičku je o trochu lepší. Samozřejmě pak j vyšší cenová kategorie, kde jsou lepší a dražší panely, tuším, že Dell dělal něco lehce přes 12 tis.


panprase

  • Administrátor
  • Superčlen
  • *****
    • Příspěvků: 695
    • Zobrazit profil
Len k tomu monitoru, toho e-ink u by som sa naozaj bal. Momentalne pouzivam 2x Dell U2415 UltraSharp a je to super. Doma starucky Dell UltraSharp 2209WA to je bieda, ale chcel by som ho vymenit za Dell U2715H UltraSharp. Zalezi kolko chces investovat mne vychadzal pomer cena/vykon najlepsi u tych Dell-ov ale rad si precitam aj ine off topic navrhy :)


No ja mam obecne moc rad Delly vydrzej vsechno v podstate a ty 2415 a nebo 2414 sou krasny.

2417 se mi moc nelibej. Ted je mame ve firme a sou vzhedove hnusny.


Sent from my iPhone using Tapatalk
První den přiletěli, druhý den uděřili, třetí den zvítězili


Kroužící orel

  • Plný člen
  • ***
    • Příspěvků: 205
    • Zobrazit profil
    • Šťastný statek
Pánové,

jste super, každého názoru si sakra cením. Pečlivě jsem si pročetl ty recenze na webu tftcentral, sakra, škoda, že u nás nemáme něco podobného i v češtině. Já jsem upřímně řečeno monitorový barbar, vím, že je drobet náročnější pochopit, když si film pustím i na obrazovce svého Panasonicu nebo klidně i na 14 palcovém monitoru, holt ty dokumenty bez rychlých scén mnoho nežádají, a jsem spokojen. Každopádně vidím, že s Eizem nebo Dellem chybu neudělám, 24palců je pro mě až až a zítra nebo nejpozději příští úterý se v Alze zastavím. Cenově jsou oba pro mě pravděpodobně dostačující modely stejné:

https://www.alza.cz/24-eizo-ev2450-bk-d2268875.htm?o=1
https://www.alza.cz/24-dell-u2415-ultrasharp-d2220796.htm?o=1

a myslím si, že dražší nevyužiji. Primárně jde opravdu o to, abych alespoň zčásti snížil únavu očí, nic víc nutně nepotřebuji. Jak Gaspoda píše, rád si oba prohlédnu a nejlepší bude, když si lapnu svůj Panasonic a chvíli vyzkouším práci v černé příkazové řádce i v grafice, úroveň černé, možnost snížení jasu, kontrast apod., to bych si osobně porovnal u obou modelů – ať se prodejce snaží, jesti je co k čemu, dohodnu se s ním. Budou-li obě zobrazovadla na tom podobně, lehce se přikláním k Eizu, ten nezapomíná ani na obstarožní VGA D-SUB konektor, který mám ve svém CF-30 a vzhledem k jeho kvalitám jej v nejbližších letech nebudu nahrazovat. Skvělé je pasivní chlazení a serverové komponenty, také šasi dostalo už pořádný záhul a ani zatím nejaktuálnější vodní úder od malé dcérenky jej z klidu nedostal… Samozřejmě není problém redukce, když to ale půjde takto lehce, proč ne.

Potěšil mě Doug Orleans, ten má na starosti nahrávání her na IFDB, přes prvotní licenční problémy jsme se dohodli, že odkaz na webovou verzi Exoteru přidá ke článku s původní hrou, hurá, už to jede, info ještě hodím ke správnému tématu zde v diskuzi. Tohle posouvá textovky zase o kus dále, zkusil jsem na ženině chytrém telefénu hru spustit a jede parádně, jen to ale bez USB klávesnice není žádná sláva…

Mříž tedy nechám tak jak byla původně definována, konektor ThroughPassage jsem se ještě jednou snažil využít, ale bez úspěchu, ničevó. Hra na IFDB se mi moc líbí, proto se ještě jednou přimlouvám pro juknutí se na ty moje apache logy a třeba porovnání nastavení webserveru s Tvým u Heidi nebo Základny, věřím, že to bude nějaká hloupost a moc se klepu, až na RPi rozchodím TADSí herní server.


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
To Eizo má ještě mj. i zajímavý stojan (myslím, že je to jeden z těch typů umožňující monitor sklopit do polohy jako knížku drženou v rukou) a tradičně pětiletou záruku na rozdíl od tříleté. Na druhou stranu, i když je uvnitř v podstatě ekvivalentní panel od Samsungu (AH IPS), tak u daného Eiza je jen 16:9 a ne 16:10 (Eizo má i druhou variantu, ale stojí kolem 10 tis.).

A pokud se teď vrátíme k topicu, tak na logy jsem se krátce díval a nic mě zatím nenapadlo, bylo to takové matoucí. Já na to myslím, jen teď mám dost málo času :-(