23. Říjen 2017 - 11:51

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

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #75 kdy: 28. Září 2017 - 09:21 »
...nevěděl jsem, že i třída může dědit z jiné třídy.

Že třída může dědit od jiné třídy a ta zase od jiné je úplně běžné, právě tak je vystavený celý strom dědičnosti v knihovně a mají to tak snad všechny objektově orientované jazyky. Co není úplně běžné, je vícenásobná dědičnost, tedy že třída dědí od více než jedné rodičovské třídy. V C++ to možné je, ale např. PHP se tomu zuby nehty brání a zavádí raději interfejsy a traity, které část vlastností vícenásobné dědičnosti přidávají, ale přitom nedávají plnou volnost.

Taky už vidím rozdíl mezi vlastností = statická data a metodou = blok kódu čekající na spuštění

Na slovo "statický" pozor, to má jiný význam. Vlastnost je prostě proměnná - pojmenovaná paměťová buňka, do které se dá uložit nějaká hodnota (a měnit, proto ne statická). Když jsou proměnné a funkce součástí objektu, tak se jim říká vlastnosti a metody, aby se zdůraznila jejich příslušnost k daným objektům. V C++ se používají stejné pojmy, akorát v C++ musíš vždy nejprve udělat třídu a pak teprve vytvořit objekt dané třídy, v TADSu můžeš psát už hotové objekty.

Mimochodem, díval jsem se, že i v C++ se mix-in třídy používají a jak jsem předpokládal, má svojí Standard Library, to mě více, než těší, začít programovat s TADSem mě nenásilnou formou dostane i sem...

To ano, TADS je navržen jako běžný moderní profesionální programovací jazyk. Principy, které si v něm osvojíš, tak jsou přenositelné dál. Tím se liší např. od informu, který je postaven na programování v anglickém jazyce, což je sice na první pohled neotřelé a zajímavé, ale v jiných oblastech jsou tyto znalosti zcela nepoužitelné. A zároveň i od různých klikacích prostředí, kde se dají gamebooky naklikat a sem tam napsat jednoduchý skript, což však je jen velmi omezená podmnožina skutečného programování.

Nevýhodou TADSu je, že právě díky tomu je dost těžký pro neprogramátory. Má strmou křivku učení - první schod, který lidé musejí překonat, je tak trochu jako menší horolezecká stěna. Na druhou stranu až na ní vylezeš, uvidíš mnohem dál.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #76 kdy: 3. Říjen 2017 - 09:15 »
Díky za parádní vysvětlení, já opravdu žil v domění, že třída od třídy nemůže nebo spíše není nutno, aby cokoliv dědila, na to přijdu až s vysvětlením od programátora nebo vlastní praxí. S tou vícenásobnou dědičností je to moc zajímavé, čím dál více se mi líbí kombinace TADS a C++. U PHP chápu, že OOP zde není ještě úplně dozrálé, přeci jen pokud se nepletu, opravdové objekty tam byly až od verze 5, na druhou stranu původní C také nic takového nemělo, jeho následník má ale historii samozřejmě delší.

A sakra, já jsem právě slovo „statický“ převzal z Eveho manuálu, kde na straně 23 vysvětluje rozdíl mezi daty vlastností a blokem kódu uvnitř medoy, jak vidno, definici jsem pochopil nesprávně. Spolu jsme se v minulosti bavili právě o proměnných a funkcích, psal jsi mi, že u OOP se jedná o vlastnosti a metody daného objektu, díval jsem se do historie zpráv.

Ano, četl jsem velmi zajímavé srovnání TADS a Inform, kde právě Tebou popsaný rozdíl v programování autor uvádí. Určitě nebudu spěchat a pořádně si vyzkouším všechny příklady v manuálu, ano, Eve píše, že práce s objekty je u TADSu zjednodušena, na to si v budoucnu u C++ musím dát pozor. Mimochodem velmi mě zaujaly tyto stránky:

http://www.sallyx.org/

Autor zde parádně popisuje začátek v jazyce C, přechod k C++, poté programování v Linuxu a popis mnou velmi oblíbené knihovny ncurses, také Postgresql se bude hodit. Je to spíše věc budoucnosti, pokud bys však měl čas a chuť a v rychlosti se juknul na popsanou látku, můžeš mi jako programátor sdělit svůj názor zda jsou tyto tutoriály vhodné na seznámení s těmito jazyky? Toto ale v žádném případě nespěchá, nejprve musím projet Learning T3, ten se mi jako manuál zdá naprosto parádní. A přečtu si jej několikrát, což dělám právě teď...

Ještě jednou si projedu mnou popisovanou část manuálu, ať je mi vše jasné. Tento víkend jsme jezdili a také tento týden mám téměř celý zaplněn jízdami na koních, takže se k počítači dostanu méně, ve volných chvílích budu dále studovat, OOP není žádná sranda. Už vím jak definovat metodu uvnitř objektu pochodeň, v Library i příkladu s názvem LightFire jsem nalezl vše potřebné plus následná změna názvu po změně stavu se také zadařila, ještě si projedu všechny příklady a příště sem snad už konečně hodím další kus exoteráckého kódu.

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #77 kdy: 3. Říjen 2017 - 20:36 »
Díky za parádní vysvětlení, já opravdu žil v domění, že třída od třídy nemůže nebo spíše není nutno, aby cokoliv dědila

V praxi se poměrně běžně vytvářejí složitější hierarchie dědičnosti tříd. V TADSu to máš třeba právě na příkladu třídy Thing a jejich desítek potomků: http://www.tads.org/t3doc/doc/libref/object/Thing.html#_SubClassTree_ Od Thing dědí Actor, BasicLocation, BulkLimiter, od BasicLocation dědí Room, od ní zase DarkRoom a další. Ale v jiných jazycích a programech to máš také, třeba v Qt knihovně pro tvorbu uživatelského rozhraní zase máš třeba třídu pro Widget, od ní dědí tlačítko atd. (https://wiki.qt.io/Qt_for_Beginners#Qt_class_hierarchy). Představi si to jako podobenství s fylogenetickým stromem živočichů (https://cs.wikipedia.org/wiki/Klasifikace_%C5%BEivo%C4%8Dich%C5%AF#Fylogenetick.C3.A9_stromy), který říká, které druhy živočichů jsou si příbuzné. Třeba člověk a šimpanz mají hodně společného. V programování je podobná motivace - hledat společné vlastnosti a metody a ty pak vkládat do společného předka, odkud jsou zděděny do všech potomků, které je potřebují. Důvod je, aby to společné bylo naprogramováno jen jednou na jednom místě.

A sakra, já jsem právě slovo „statický“ převzal z Eveho manuálu, kde na straně 23 vysvětluje rozdíl mezi daty vlastností a blokem kódu uvnitř medoy, jak vidno, definici jsem pochopil nesprávně. Spolu jsme se v minulosti bavili právě o proměnných a funkcích, psal jsi mi, že u OOP se jedná o vlastnosti a metody daného objektu, díval jsem se do historie zpráv.

Ná já tam nikde slovo statický nevidím, ale já reagoval hlavně na pojem "statická data" a vlastnost, to je vlastně proměnná a může svou hodnotu měnit, takže slovo statický není na místě. Ale to je detail, moc nad tím nespekuluj.

Mimochodem velmi mě zaujaly tyto stránky: http://www.sallyx.org/

Nevím, proč ne. Psal to někdo mladší, kdo se to sám učil, tak třeba ti to bude vyhovovat. Proběhl jsem část o postgresu a přišlo mi to celkem fajn, takový zestručněný manuál. Vytkl bych asi hlavně to, že učí spojování tabulek zápisem s čárkou (kartézský součin) a následnou filtraci ve WHERE místo aby rovnou vysvětlil syntaxi LEFT resp. INNER JOIN ... ON ...  a jaký je mezi tím rozdíl.

O tom céčku je to taky takový docela hezký manuál. Akorát já osobně, když učím, tak kladu menší důraz na šířku znalostí a větší na schopnost porozumět principu a schopnost prakticky znalosti použít a proto se snažím všechno motivovat nějakou praktickou situací. Hlavní je mít nějakou motivaci, nějaký cíl, který chceš dosáhnout a který tě bude pohánět vpřed.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #78 kdy: 9. Říjen 2017 - 07:07 »
Hierarchie dědičnosti tříd:
Ano, právě na třídě Thing je vše parádně ilustrativní, někteří její potomci jsou popisováni v Eveho manuálu a také v návodu od Tebe. Díky za zajímavý odkaz na strom živočichů, ten jsem neznal, přeci jen od školy už mám pár let za sebou, hledání společných vlastností a metody je mi sympatické, tady krásně na konkrétním příkladě vidím výhodu OOP. S podobnou třídou pro Widget jsem se setkal už s GTK tuším v Glade při návrhu uživatelského rozhraní, když jsem si s ním hrál, tehdy jsem ale samozřejmě netušil nic o stromu dědičnosti a nyní je vše mnohem jasnější. Ouplně lituji, že nejsem programátor, TADS potřebuje pořádný moderní workbench pro Windows i Linux, moc dobře se mi pracuje s klasickými DOSovými okny ála Turbo nebo FreePascal IDE, mít takový naprogramovaný v ncurses pro příkazovou řádku a klidně i v GTK a QT pro X nebo Wayland by byla paráda. Ale co naplat, zatím musí stačit Wine.

Programování v C:
Moc díky za reakci, kvalitu tutoriálů zatím nejsem schopen posoudit, takže je paráda, že jsi se na web podíval a zhodnotil, mě zaujal hlavně popis oblastí, které mě nejvíce lákají, především ke knihovně ncurses jsem nenašel v češtině příliš mnoho materiálů. Podobný zajímavý návod nejen na C/C++ jsem nalezl i na webu www.itnetwork.cz a příklady her se zdrojovými kódy mám v plánu pořádně prozkoumat hnedle po zvládnutí TADS. Mám k dispozici i zajímavý úvod do programování v C na Raspberry - Essentials_C_v1.pdf, kde v závěru odkazují na asi tradiční knihu tohoto jazyka s názvem “The C Programming Language” od Kernighana and Ritchieho. Zde se ale právě bojím ztráty motivace a právě proto mě TADS zaujal, protože jeho ovládnutím se mi otevře můj dávný sen naprogramovat textovou hru, motivace je tedy obrovská. A stejně mě láká prozkoumávat linux a bsd, k tomu se dostanu později.

Pokud učíš právě tímto stylem, je to paráda, nakonec, proč bychom se na nějaké výuce nemohli dohodnout, vůbec nejsem proti.

Zapálení pochodně:
Nyní řeším zapálení pochodně. Několikrát jsem si přečetl T3TourGuide od strany 102 do 109 plus pečlivě prozkoumal LightFireSource v Sample Games. Zde jsou popisovány nejrůznější metody kontrolující množství oleje v lampě nebo způsob zapálení dynamitu, prosté zapálení pochodně něčím jiným, než sirkami, jsem však nenalezl. Napadlo mě grepnout metodu "canLightWith" a "canLightWith(obj)" ve všech souborech včetně Základny, které mám na disku, žádný příklad tohoto typu však nebyl k mání. Ani google nepomohl, divím se, že není k nalezení možnost zapálit pochodeň křesadlem, že by něco takového žádný autor pro textovku nepotřeboval?

Zkoušel jsem pomocí tipu na straně 104 v T3TourGuide v souboru LightFireSource ze Sample Games uvedený příklad LIGHT CANDLE FROM TORCH, ten mi úspěšně funguje, ovšem k zapálení předmětu musím mít krom zápalek v takovém případě věc, která již hoří.

Jediné, co mě po několikadenním zkoušení napadlo, bylo využít objekt Matchstick - jen díky němu jsem schopen křesadlem pochodeň zapálit. Zde zasílám transskript hry:

--------------------------------------------------------------------------------------------------------------------------
Vítejte v konverzační hře Exoter, přesněji řečeno v její co nejvěrnější předělávce ze skvělého počítače ZX Spectrum a Didaktik Gama.

Kobka
Jsi v malé kamenné kobce. Je tu cítit mrtvolný zápach. Světlo sem proniká z jediného stropního otvoru, ve kterém je mříž.
Nemůžeš jít nikam.
Vidíš tu mrtvolu.

>koukni se do mrtvoly
Bližší pohled na mrtvolu odhalil šperhák schovaný v záhybech polorozpadlých šatů!

>vezmi sperhak
Hotovo.

>odemkni mriz
(šperhákem)
Hotovo.

>n
(nejprve otevíráš mříž)
Chodba
Stojíš na kamenné dlažbě středověké chodby. Nízká klenba Ti rozhodně nedodává pocit jistoty.
Můžeš jít na východ, na jih, dolů.
Nevidíš nic zvláštního.

>v
Chodba
Jsi v chodbě.
Můžeš jít na východ, na západ.
Vidíš tu pochodeň.

>vezmi pochoden
Hotovo.

>prozkoumej pochoden
Kdyby se Ti jí podařilo zapálit, jistě by vydávala hodně světla.

>v
Chodba
Jsi v chodbě. Vidíš strážce, naštěstí je k Tobě obrácen zády.
Můžeš jít na východ, na západ.
Vidíš tu svazek klíčů a křesadlo.
Strážce tu stojí.

>vezmi kresadlo
Hotovo.

>prozkoumej kresadlo
Snad by se s ním dal rozdělat oheň.

>v
Konec chodby
Jsi na konci chodby. Vidíš dveře.
Můžeš jít na východ, na západ.

>zapal kresadlo
Škrtnutím křesadla zapaluješ malý plamínek.

>i
Neseš šperhák, pochodeň a křesadlo (lit).

>zapal pochoden
(křesadlem)
Zapálená pochodeň příjemně praská a vydává hodně světla.

Křesadlo dohořelo a plamen mizí v obláčku dýmu.

>

- po několika příkazech hra vypíše: "Pochodeň už vyhořela až na konec a zrovna zhasíná.", toto chování předpokládám musím potlačit změnou metody objektu Candle. Právě se koukám do T3TourGuide na stranu 104, kde autor popisuje vytvoření nové třídy RedCandle a právě metoda dobjFor(BurnWith) bude nejspíše ta pravá:

dobjFor(BurnWith)
{
   check()
   {
      if(fuelLevel < 1) // tento if musím potlačit?
        sayBurnedOut;
      else
        inherited; //volání předka tohoto objektu, pokud dobře rozumím?
    }
}

--------------------------------------------------------------------------------------------------------------------------

Křesadlo se stále chová jako sirka, viz "Škrtnutím křesadla zapaluješ malý plamínek." Po zadání i se v inventáři objeví „křesadlo (lit)“, zde asi bude nepřeložený textový řetězec. Následně křesadlo dohoří stejně jako sirka v Sample games - LightFireSource.

Napadlo mě modifikovat jednu z metod objektu Matchstick tak, aby lépe odpovídal křesadlu - je tento mnou zamýšlený postup správný? Pokud ano, pokusím se přijít na to, kterou. Skutečně jsem zatím nepřišel na jinou možnost jak zapálit nehořícím objektem objekt hořící, při vyhledávání na internetu jsem ještě narazil na zjednodušenou knihovnu adv3lite, která pravděpodobně tuto situaci řeší elegantněji:

http://tads3.gerynarsabode.org/index.php?title=Thing_(adv3Lite)

--------------------------------------------------------------------------------------------------------------------------
canBurnWithMe    
Use this property to declare that a player can burn something with the object being defined. The default setting is that one cannot use objects to burn other things with. Can be either true or nil
canBurnWithMe = true
--------------------------------------------------------------------------------------------------------------------------

Rád bych se však alespoň zpočátku naučil knihovnu klasickou, protože výše popsané zjednodušení mi ve výuce programování určitě nepomůže. Dostupná dokumentace je dle mého názoru perfektní, to spíše já zatím ještě neumím dohledat všechny potřebné informace.

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #79 kdy: 9. Říjen 2017 - 19:36 »
...divím se, že není k nalezení možnost zapálit pochodeň křesadlem, že by něco takového žádný autor pro textovku nepotřeboval?

Ono těch různých možných kombinací je hodně, takže TADS nemůže postihnout úplně každý případ a proto dává k dispozici jen obecný rámec, který si musíš podle situace trochu přizpůsobit. Jak jsi asi zjistil, existuje mix-in třída FireSource, která představuje hořící objekt který může něco zapálit. To není úplně tvůj případ, protože chceš křesadlo, které může zapálit, ale samo o sobě nehoří. Nicméně je je docela dobrý nápad se podívat do knihovny na definici třídy FireSource, abys viděl, jak je udělaná. Je v ní akorát definice iobjFor(BurnWith), tedy nepřímého objektu akce zapal (přímý je ten, co bude zapálen a nepřímý ten, který slouží jako pomůcka zapálení).

Pojdme tedy udělat obyčejný objekt (Thing) a dát mu iobjFor(BurnWith), jen ho trochu zjednodušíme, aby křesadlo samo nehořelo. Pochodeň je vzata víceméně ze sample games. PreferredIobje je tam proto, že zapal nepoužívá předložky a tak je pro parser neodhadnutelné, co zapaluješ čím, tak si to sám prohodí tak, aby to dávalo smysl.

Kód: [Vybrat]
+ PreferredIobj, Thing 'křesadlo/křesadla/křesadlu/křesadlem' 'křesadlo' *4
    "Snad by se s ním dal rozdělat oheň. "

    iobjFor(BurnWith)
    {
        preCond = [objHeld]
        verify()
        {
            /* don't allow using me to light myself */
            if (gDobj == self)
                illogicalNow(&cannotBurnDobjWithMsg);

            nonObvious;
        }
    }
;

+ FireSource, Candle 'pochodeň/pochodně/pochodni/pochodní' 'pochodeň' *3
    desc()
    {
        if(isLit)
            "Hoří plápolavým plamenem<<if fuelLevel < 3>>, ale ten už začíná dohasínat<<end>>. ";
        else
            "Kdyby se Ti jí podařilo zapálit, jistě by vydávala hodně světla. ";
    }
    fuelLevel = 7
    brightnessOn = 2

    dobjFor(BurnWith)
    {
        check()
        {
            if(fuelLevel < 1)
                sayBurnedOut;
            else
                inherited;
        }
    }
;

Křesadlo se stále chová jako sirka, viz "Škrtnutím křesadla zapaluješ malý plamínek." Po zadání i se v inventáři objeví „křesadlo (lit)“, zde asi bude nepřeložený textový řetězec. Následně křesadlo dohoří stejně jako sirka v Sample games - LightFireSource.

Napadlo mě modifikovat jednu z metod objektu Matchstick tak, aby lépe odpovídal křesadlu - je tento mnou zamýšlený postup správný?

Matchstick je objekt, který můžeš zapálit sám o sobě, tj. zapálíš a hoří matchstick a od něj můžeš zapálit něco jiného, takže to moc neodpovídá. To (lit) u sebe nemám, možná jsem to někdy přeložil později a není to ve zveřejněné knihovně a nebo je to někde, kde nevím kde. Candle dědí z FueledLightSource, takže časem dohoří. Kdybys to chtěl odrušit, tak viz:

Kód: [Vybrat]
    /*
     *   If the light source can burn forever, simply return nil as the
     *   fuel level. 
     */
    getFuelLevel() { return fuelLevel; }

Rád bych se však alespoň zpočátku naučil knihovnu klasickou, protože výše popsané zjednodušení mi ve výuce programování určitě nepomůže. Dostupná dokumentace je dle mého názoru perfektní, to spíše já zatím ještě neumím dohledat všechny potřebné informace.

Adv3lite má na svědomí Eric Eve. Totiž ono to bylo tak, že po uvedení TADS 3 spousta lidí léta remcala, že to programování je moc těžké a nebyli ochotni přejít z TADS 2 dál. A vznikla taková pověra, že kdyby to programování bylo snazší, že by to umožnilo mnohem snadnější vstup do této oblasti těm, kteří pro domělou snadnost dávají přednost Informu a dalším systémům.

Mike Roberts zkoušel něco udělat, napsal nový trochu jednodušší parser nazvaný Mercury, ale neměl už moc času dotáhnout celou situaci až do stavu alternativní knihovny, která by byla obtížností někde mezi TADS 2 a 3. Eric se toho tehdy ujal a naprogramoval Adv3Lite. Původní idea byla odstranit některé ze složitějších vlastností, které knihovnu komplikují (postoje postav, simulování smyslů, hru v reálném čase, tisk řetězců přes žurnál atp.), ty totiž hodně znesnadňovaly orientaci a málo kdo je využil. Původní plán byl udělat hodně jednoduchou knihovnu, která by sloužila jako mezikrok pro programátory, než se pustí do plnohodnotné Adv3. Skutečnost však šla kousek dál, došlo k mohutné redukci, knihovna má o hodně menší počet tříd, ale zároveň i přidává některé nové vlasntosti, třeba scény, takže nakonec není ani zdaleka tak lite, jak se někteří původně domnívali a remcalové remaci dál...

No z hlediska našeho je hlavní problém v tom, že k ní není k dispozici překlad a nebude.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #80 kdy: 12. Říjen 2017 - 12:27 »
1. Křesadlo a pochodeň
Nádherně vysvětleno, právě se dívám na mix-in třídu FireSource, která má jedinou podtřídu Matchstick a jedinou metodu iobjFor(BurnWith).  A pokud si třídu rozkliknu odkazem 1895, skutečně vidím „We don't provide any action handling - we leave that to the direct object.“ - tady autor přímo nabádá, abych si odvozený objekt upravil, přesně jak píšeš.

S „PreferredIobj“ jsem se zatím nesetkal nebo si jej nevšiml, vidím, že jej používáš ve svém překladu a konkrétně v demonstraci Attachable:

preferredIobj = nil
replace doActionMain()

Dívám se na třídu FueledLightSource, zde je jako jediná podtřída uvedena Candle. Direktivu getFuelLevel() { return fuelLevel; } jsem našel při rozkliknutí odkazu třídy i její podtřídy, odkaz extras.t 2079 i 2205.

Nyní vše v pochodní funguje, viz soubor Exoter_v2.t, jediný problém, který zatím vidím, je příkaz:

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

ale

>zapal pochoden
Čím ji chceš zapálit?

>kresadlem
Zapaluješ pochodeň.

funguje parádně, zatím to tak nechám, tyhle detaily si nechám na později.

Hledání ve třídách, vlastnostech, metodách apod. v knihovně už je mi jasné, teď se mi jen vše musí spojit dohromady, chápu, to chce čas, jo to vlastně „gró“ programování. Místo abych hledal v knihovně, snažil jsem se nalézt co nejvíce v příkladech, což je asi běžný postup programátorů začátečníků. Upřímně řečeno přes obrovský záběr TADSu jsem si ani neuvědomil, že tak triviální věc jako zapálení pochodně křesadlem, troudu ocílkou nebo obyčejné rozdělání ohně něčím jiným, než sirkami, zde není už jako hotové řešení, tady jsem dost ovlivněn našimi textovkami a příkazem použij – je ale jasné, že standardní knihovna bude popisovat jen obecné věci, vše obsáhnout nelze, chápu, že se s tím v budoucnu setkám i v C++ a jiných jazycích, asi proto existují knihovny rozšiřující, které se snaží nějakou konkrétní množinu problémů řešit. Na programátorovi je také to, aby tyto knihovny znal a ve svém projektu je uměl použít plus to, co jinde nenajde, dokončil sám, to mi stále více a více ukazuje praxe.

Teď když už se s Library reference manual více kamarádím a ještě jednou si prohlížím třídu FueledLightSource, napadá mě otázka, co znamená a k čemu slouží soubor  extras.t, na jehož definici se dívám? Když si přeložím popis „This module defines classes for specialized simulation objects. “, vidím, že se jedná o modul, který definuje třídy pro objekty specializující se na konkrétní simulaci. Jedná se tedy o hlavičkový soubor umístěný v podadresáři lib a když rozkliknu odkaz Source file, mimo celého bohatě komentovaného dokumentu vidím, že na začátku obsahuje direktivu:

#include "adv3.h"

To znamená, že odkazuje na standardní knihovnu adv3, okolo které se celý TADS točí, teď už mi to do sebe více zapadá.

Možná bude pro mě lepší, když budu více zkoumat Library reference manual a nejlépe zkoušet dostupné příklady, tak pochopím více, ostatně i Eveho manuál sem mnohokráte odkazuje. Definice místností a objektů je mi již víceméně jasná, rozhovory s NPC postavami si nechám na jindy, nyní mi jde hlavně o akce, o kterých píšeš i ve svém manuálu a k jejich definici potřebuji pořádně pochopit práci s metodami, o nic se, jak překpokládám, dozvím nejvíce zde. 

2. Nepřeložený řetězec "lit"
Ještě jednou jsem si zkusil projet moji původní verzi Exotera, zde se po zapálení pochodně křesadlem s tím, že jej definuji jako Matchstick, viz soubor Exoter_v1.t, objeví toto:

„Neseš šperhák, pochodeň (svítí) a křesadlo (lit).“

Následně jsem to samé zkusil po Tebou navrhované úpravě, viz soubor Exoter_v2.t:

Neseš šperhák, pochodeň (svítí) a křesadlo.

V souborech cs_cz.t a msg_neu.t je dle mého laického pohledu vše v pořádku, zde asi překladač k objektu Matchstick přiřadil chybný textový řetězec nebo je na místě, které jsem zatím nenalezl. Pokud budeš v budoucnu připravovat další verzi češtiny, prosím o kontrolu objektu Matchstick a přidání překladu, snad alespoň tímto svým testováním alespoň trochu pomohu k jeho zlepšení.

3. Knihovna Adv3lite a TADS Workbench
Moc děkuji za parádní popis této knihovny, chápu, proč lidi toužili po něčem jednodušším, upřímně řečeno jsem dle Tvého popisu nabyl dojmu, že TADS2 byl mnohem jednodušší na použití, než třetí verze, já jsem se setkal až s trojkou.
Sakra, nečekal jsem, že tato knihovna přidává i nové vlastnosti, na druhou stranu vidím, že dopadla podobně jako např. Wordpress nebo Nginx, původně štíhlé projekty vesele bobtnají a původní záměr mizí. I proto je mi velmi sympatická knihovna ncurses, mám rád jednoduché řádkové aplikace s rozhraním ála M602 nebo dosedit, které jsou určené k jediné konkrétní činnosti nebo mé oblíbené účetnictví Tichý – Ježek, které i po dvaceti letech zachovává stejné rozhraní a jen upravuje funkcionalitu, dnes podporuje i EET a existuje i snadný krok, jak jej plně integrovat do Linuxu.
Zatím jí tedy nechám na pokoji, pokud neexistuje překlad, není pro mě určena, takže se na ní podívám v budoucnu. Ta klasická mě stále více a více ohromuje tím, co vše dokáže, takové práce, kterou autoři věnují komunitě, si nesmírně vážím.
S tím Informem jsem si také trochu hrál, na root.cz vyšel i český článek tuším o dvou dílech, který základy popisuje, vypadá mnohem jednodušší, ale obávám se, že složitější problémy už nebude taková sranda realizovat a domnělá jednoduchost se rozplyne jak pára nad hrncem. Pro mě je tedy TADS výhodnější,  díky českému překladu a  především jako parádní příprava na C++.

Neodolal jsem a do google jsem zadal „TADS Workbench source“, napadlo mě, když je TADS otevřený, zda jsou i k WB k dispozici zdrojové kódy. V diskuzi:

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

Jeden diskutující píše: „The Workbench source is available as part of the htmltads source release. It's all built directly on Win32 (no MFC or any other Microsoft class libraries are involved).“

Plus zde na github:

https://github.com/uliwitness/TADSWorkbench

Jsou k dispozici nějaké zdrojáky, zběženě jsem je prozkoumal a vypadá to, že jsou určeny pro MAC, ostatně pro něj je k dispozici i starší oficiální verze dostupná na stránkách.  Škoda, linuxový WB by byla paráda plus jak jsem minule psal ta verze ncurses/GTK/QT, jen ty zdrojáky mě zatím opravdu děsí, je jich nějak privela…
Takže zatím zůstanu u kombinace Frobtads/editor českého textu/WB ve Wine, sice trochu krkolomné, ale naštěstí funkční.

4. Lano a attachable obecně
Nyní po vyřešení pochodně bych se rád vrhnul na přivázání lana k temné studni a vše, co s tím souvisí. Využiji všechny dostupné znalosti, jak vidím, attachable je parádně popsaná v manuálu i v Library plus připravil jsi parádní demonstrační hru, pokusím se vše vyřešit sám, jedině tak se dostanu zase o krok dále.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #81 kdy: 12. Říjen 2017 - 12:28 »
... ještě ty přílohy...

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #82 kdy: 12. Říjen 2017 - 23:23 »
1. Křesadlo a pochodeň
Nádherně vysvětleno, právě se dívám na mix-in třídu FireSource, která má jedinou podtřídu Matchstick a jedinou metodu iobjFor(BurnWith).  A pokud si třídu rozkliknu odkazem 1895, skutečně vidím „We don't provide any action handling - we leave that to the direct object.“ - tady autor přímo nabádá, abych si odvozený objekt upravil, přesně jak píšeš.

To není narážka na odvozený objekt, ale na něco trochu jiného. TADS je založený na objektově orientovaném programování a to znamená, že se k herním objektům píší různé metody, které něco dělají. K akcím, které používají dva objekty (přímý a nepřímý), jako zapal koho/co kým/čím, se váží hned dva objekty ve dvou rolích. Přímý objekt, který je manipulován (pochodeň) a nepřímý, který slouží jako pomůcka (křesadlo). Výsledek takové akce se dá naprogramovat na dvou místech. Buď v metodě dobjFor(BurnWith) u pochodně nebo v iobjFor(BurnWith) křesadla.

Na kterém místě reakci naprogramovat je na tvém uvážení. Je to zpravidla jedno. V tom se objektový přístup trochu liší od třeba Informu, který je založen na tabulkách s pravidly. Tam se prostě přidá pravidlo a nemusí se přemýšlet, ke kterému objektu ho přilepit, prostě se hodí na jednu společnou hromadu všech pravidel.

To, co se v manuálu píše tedy říká, že akce bude naprogramovaná u přímého objektu a tady u nepřímého tedy není nic.

S „PreferredIobj“ jsem se zatím nesetkal nebo si jej nevšiml, vidím, že jej používáš ve svém překladu a konkrétně v demonstraci Attachable:

Parser sám neumí poznat, co je přímý a co nepřímý objekt u akcí, které nemají předložku, např. můžeš napsat "podej kafovak Borisovi" i "podej Borisovi kafovak". Proto třída Actor je označkovaná jako PreferredIobj a podle toho, když parser vezme objekty obráceně, tak je před dalším zpracováním prohodím. Je to právě ta situace, kdy by hra řekla, že kafovaku nemůžeš Borise podat. Značka říká, který z objektů je nepřímý, aby se to prohodilo do správného pořadí. U kací s postavou je to automaticky v knihovně, ale u některých akcí nebo nových akcí se to nedá dopředu určit a tak to musí udělat autor hry. Co ještě musím udělat je opačnou variantu, PreferredDobj, protože to u některých akcí je potřeba.

Nyní vše v pochodní funguje, viz soubor Exoter_v2.t, jediný problém, který zatím vidím, je příkaz:

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

ale

>zapal pochoden
Čím ji chceš zapálit?

>kresadlem
Zapaluješ pochodeň.

funguje parádně, zatím to tak nechám, tyhle detaily si nechám na později.

Jo, já se podívám, jaká verze knihovny je zveřejněná a vyzkouším to.

Teď když už se s Library reference manual více kamarádím a ještě jednou si prohlížím třídu FueledLightSource, napadá mě otázka, co znamená a k čemu slouží soubor  extras.t, na jehož definici se dívám?

Knihovna je poměrně velká, čítá téměř 100 tis. řádek a proto je rozdělená do většího množství souborů, je jich kolem čtyřiceti. Snaha je, aby žádný nebyl extrémně velký. Některé třídy, jako např. Thing, které jsou základem všeho, tak jsou už tak dost velké. Zabírají jeden celý velký soubor jen s pár drobnostma navíc (thing.t). Všechny objekty, které od Thing dědí, jsou rozdělené do několika souborů. Většinu najdeš v objects.t (dveře, kontejnery a kde co), ale pár jich je i v souboru extras.t a tam jsou takové ty exotičtější, jako komplexní kontejnery, baťoh, klíč a další. Jsou to věci, které začínající programátor asi hned nepoužije a myslím, že je to taková sbírka kódu, který naprogramovali (nebo navrhli) pro TADS vesměs jiní lidé, když hledali, čím knihovnu ještě obohatit. Myslím, že nebyly součástí TADSu od úplného počátku.

Jedná se tedy o hlavičkový soubor umístěný v podadresáři lib a když rozkliknu odkaz Source file, mimo celého bohatě komentovaného dokumentu vidím, že na začátku obsahuje direktivu:

#include "adv3.h"

Hlavičkové soubory jsou ty s příponou .h a normální zdrojáky mají koncovku .t. Hlavičkový soubor je zjednodušeně něco, co jen učí kompilátor rozumět zdrojovému kódu v .t souboru. Proto se inkludují do každého .t souboru na začátku. Nic co je uvedeno v hlavičkovém souboru se nepřeloží do výsledné hry, nevznikne žádný program. Jsou v nich tedy hlavně definice maker, šablon atp., ale žádný příkaz, žádná proměnná.

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #83 kdy: 14. Říjen 2017 - 21:10 »
Zveřejnil jsem poslední verzi knihovny, kterou mám. Je tam jen pár drobných oprav. To s tím (lit) nevím, já když to vyzkouším u sebe se zdrojákem, který jsi přiložil, tak mi to v inventáři normáně česky píše, že pochodeň (svítí). Nevrtal ses v knihovně sám? Nebo nemáš nějakou jinou verzi TADSu, než já? Já mám normálně TADS 3.1.3, to by měla být poslední zveřejněná verze.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #84 kdy: 16. Říjen 2017 - 11:34 »
1. Přímý a nepřímý objekt

Konečně se zase dostávám k programování, krásné počasí o víkendu jsme celé projezdili. Paráda, teď už je mi
konečně věta we "leave that to the direct object" jasná, s přímými a nepřímými objekty se zde aktivně setkávám právě až u pochodně, Ericův manuál studuji postupně, vidím, že o nich píše v sekci Actions a právě u třídy Attachable, o které se zmíním později. Metodu iobjFor(BurnWith) jsem využil u křesadla, vyzkoušel jsem si i dobjFor(BurnWith) u pochodně, kterou jsem nakonec zakomentoval, k tomuto řešení bych se přiklonil v případě, že bych chtěl řešit její postupné vyhasínání, čímž u Exotera hráče trápit zatím nechci. Vidím, že jsi studoval také Inform, ten jsem zatím nezkoušel, snad časem, ovšem vypadá to, že TADS je tak komplexní, že jeho možnosti ani nebudu schopen využít. Na ten kafovak u Borise se juknu do Tvých zdrojáků, ohledně PreferredIobj není samozřejmě v Learning TADS 3 ani slovo, je mi jasné, že jsi jej potřeboval vytvořit sám při přípravě překladu.

2. Knihovna, hlavičkové soubory, zdrojáky a historie TADS

Podíval jsem se na adresářovou strukturu frobtadsu, nyní je to krásně vidět, hlavičkové soubory vidím v /usr/share/frobtads/tads3/include, vidím, že i u nich existuje vnořené inkludy, např. hned ten první bignum.h inkluduje systype.h . A na stejné úrovni adrsář /lib vidím zdrojáky s příponou .t, jasně, zde je ten obrovský thing.t, objekty, eventy a v neposlední řadě knihovna adv3.h, o které jsme se bavili minule. Napadá mě jak byla vygenerována dokumentace, vím, že např. u Javy nebo PHP lze vygenerovat dokumentaci z komentářů, předpokládám správně, že webová Library reference vznikla podobně?

Dívám se, že zde mám nainstalovanou také starší verzi TADS2 s mnohem skromnější strukturou, jedná se krom dokumentace jen o 3 soubory:
/usr/share/frobtads/tads2/adv.t
/usr/share/frobtads/tads2/gameinfo.t
/usr/share/frobtads/tads2/std.t

jak vidno, posun ve třetí verzi a tedy i složitost, je obrovský.

Právě to mě nejvíce láká, časem díky znalosti jazyka C budu schopen zkoumat tyto soubory a chápat, o čem jsou a jak linux opravdu funguje. Teď se dívám na wikipedii, TADS2 byl psán nebo spíše jeho syntaxe vycházela z C a trochu z Pascalu, zatímco TADS3 je úplně jiný objektový model vycházející z C++ a z Javy plus využití VM, o tom píšeš i Ty ve svém manuálu.

Zdálo by se tedy a někteří diskutující programátoři jsou toho názoru, že učit se staré C je už přežitek stejně jako Pascal, na druhou stranu pokud chci jít do hloubky, bude lépe se věnovat právě starému C a teprve poté C++, cítím, že jedině tak mohu programování opravdu do hloubky pochopit, viz Tvůj názor na prvotní výuku pomocí skriptovacích jazyků. Jen nevím, zda to pro mě nebude trochu obtížné, když se nyní snažím pochopit objektový model a budu se vracet ke strukturovanému, když se ovšem dívám na C++, není to čistě objektový jazyk a některé konstrukce jsou převzané z C, tak to snad půjde. Pascal, i když jeho implementace FreePascal a Lazarus už je objektová, mi dnes asi nic nedá a skutečné využití pro mě nevidím.

3. Attachable a malé rozšíření překladu

Pečlivě jsem prozkoumal popis této třídy v Learning TADS3, T3TourGuide, Tvůj překlad a také knihovnu. A vypadá to, že hurá, pečlivost se vyplatila, vytvořil jsem objekt studna, ke které pomocí metody canAttachTo(obj) lze přivázat provaz. U provazu jsem s definicí jako Attachable pohořel, to jsem ale očekával, manuály popisují, že typický problém, kdy jej přivázaný táhnu sebou celou mapou není tak jednoduché řešit. Napadlo mě použít NearbyAttachable, který tuto bolístku zvládá, nyní vše funguje jak má. U lana a provazu mě první slovo napadne přivaž/odvaž, nikoliv připevni, přidal jsem jej tedy do souboru cs_cz.t z aktuální verze překladu, tam i v budoucnu budu dávat synonyma. Společně s aktuálním zdrojákem a průchodem hrou jej zasílám v příloze, třeba Ti cokoliv z toho pomůže u tvorbě dalších verzí.

Ukončení hry sebráním 4 diamantů už naprogramovat nebude problém, toto popisuje i manuál, nyní musím vyřešit snad již poslední bolístku, což jsou boje se strážcem, drakem a psem. Tady jsem dříve také zuřivě hledal na internetu, teď znovu prozkoumám knihovnu, pokusím se najít obecnou formulaci a vymyslet řešení, bude to podobné jako Tvůj příklad s pochodní a křesadlem. Začíná mě to stále více bavit, což je přesně to, co potřebuji.

4. Nová verze překladu

A vidím, že jsi zveřejnil novou verzi překladu, vše jsem vyzkoušel. Pokud vím, nic kromě souboru cs_cz.t jsem neupravoval a používám skutečně verzi 3.1.3, s tou jsem také před lety začínal. Nyní již je pojem křesadlo(lit) minulostí, tehdy jsem chybně definoval jeho metodu, pochodeň skutečně svítí jak je vidět v přiloženém transskriptu hry.

Zkusil jsem ještě jednou starší verzi definice křesadla:
+ kresadlo : FireSource, Candle 'křesadlo/křesadla/křesadlu/křesadlem' 'křesadlo' *4
a po jeho zapálení je vidět:
 Neseš šperhák, pochodeň (svítí) a křesadlo (svítí).

I tak je tedy vše v pořádku, je ale samozřejmě možné, že jsem si s překladem hrál více, než je zdrávo a upravil něco, co jsem neměl. 

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #85 kdy: 16. Říjen 2017 - 20:36 »
Napadá mě jak byla vygenerována dokumentace, vím, že např. u Javy nebo PHP lze vygenerovat dokumentaci z komentářů, předpokládám správně, že webová Library reference vznikla podobně?

Ano, přesně tak, referenční příručka je generovaná z komentářů v knihovně.

Zdálo by se tedy a někteří diskutující programátoři jsou toho názoru, že učit se staré C je už přežitek stejně jako Pascal, na druhou stranu pokud chci jít do hloubky, bude lépe se věnovat právě starému C a teprve poté C++, cítím, že jedině tak mohu programování opravdu do hloubky pochopit, viz Tvůj názor na prvotní výuku pomocí skriptovacích jazyků. Jen nevím, zda to pro mě nebude trochu obtížné, když se nyní snažím pochopit objektový model a budu se vracet ke strukturovanému, když se ovšem dívám na C++, není to čistě objektový jazyk a některé konstrukce jsou převzané z C, tak to snad půjde.

Abych to upřesnil, můj názor se týkal především skriptovacích jazyků v prostředí webového programování, které  je natolik specifickou doménou, že neposkytuje dobré možnosti pro pochopení základů. Mezi C a C++ bych nutně dělicí čáru nedělal, pochopit OOP je přirozenou součástí. Když budeš o C++ uvažovat tak, že je to Cčko s objektama a pár drobnostma navíc, tak to sice nebude úplně přesné, ale to nevadí. Prostě když se ti bude na něco hodit udělat třídu, tak udělej, když postačí procedurální kód, tak taky dobře.

U lana a provazu mě první slovo napadne přivaž/odvaž, nikoliv připevni, přidal jsem jej tedy do souboru cs_cz.t z aktuální verze překladu, tam i v budoucnu budu dávat synonyma. Společně s aktuálním zdrojákem a průchodem hrou jej zasílám v příloze, třeba Ti cokoliv z toho pomůže u tvorbě dalších verzí.

Jo, synonyma jsem si u sebe přidal. Ale obecně to není správný  způsob, TADS je udělán tak, abys nikdy nemusel do knihoven zasahovat. Cokoliv z knihovny můžeš změnit ve svém vlastním kódu hry. Kdyby ses podíval do zdrojáků Základny, tak podobné změny tam jsou soustředěné v souboru componentMods.t. Všimni si, že každou knihovní třídu můžeš změnit pomocí klíčového slova modify či replace.

A třeba přidání nějakých synonym se dá udělat jednoduše tím, že si patřičnou VerbRule napíšeš u sebe. Buď přidáš další VerbRule ke stejné akci, jako jsem přidával slovo 'bodni' jako synonymum AttachTo v roomControl.t a nebo můžeš existující VerbRule nahradit pomocí klíčového slova replace. Tak jsem třeba v souboru s počeštěním spelling correctoru nahrazoval původní anglické příkazy.

Jo a dej si pozor, máš tam provaz.moveinto(studna), ale mělo by to být s velkým písmenkem moveInto. Při překladu na to dostaneš upozornění, chce ho to číst.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #86 kdy: 19. Říjen 2017 - 14:24 »
1. C a C++
Ano, podobnou definici jsem nalezl i na diskuzních fórech programátorů, tady bude asi jen opravdu malý rozdíl, někteří diskutující srovnávali C++ a Javu s tím, že Java je plně objektová, což asi nebude ve všech případech to pravé, nevím, toto zjistím až s dalšími zkušenostmi. Každopádně jsem si nainstaloval cppreference a cppman a zkouším jejich integraci s různými IDE a VIMem, to jistě využiji u různých tutoriálů, o kterých jsem psal v minulých dílech.

2. synonyma
Jasné, do knihovny raději už zasahovat nebudu, vlastní změny ve svém kódu určitě budou lepší řešení. Prozkoumal jsem componentMods.t a pokoušel se definovat synonymum dle roomControl.t. Ještě předtím jsou použil Tvůj překlad cs_cz.t a přepsal jím svůj upravovaný, jenže ouha, od té doby při hře vidím:

přivaž provaz
K čemu ho chceš připevnit?
>studna
(nejprve dáváš provaz na podlahu, potom ho uvolňuješ od studnu)
Provaz jsi spustil dolů.
>d
Studna je moc hluboká na to, abys do ní skočil jen tak.

a tohoto hlášení se nejsem schopen zbavit, i když jsem mnou upravenou češtinu zase nahrál zpět, hlášení je zde po kompilaci ve WB i Frobtadsu…
Musel jsem nebo možná Workbench nějakým příkazem přepsal definici AttachTo, budu hledat, sakra, tohle jsem nečekal.

3. chybové hlášení
No jo, máš recht, příkazu provaz.moveinto(studna) jsem si opravdu nevšiml, na debug ovšem používám Workbench s výchozím nastavením a o chybě píše pouze Frobtads:
Frobtads:
   compile Exoter.t -> obj/Exoter.t3o
Exoter.t(338): warning: undefined symbol "moveinto" - assuming this is a property name
   link -> Exoter.t3p
   preinit -> Exoter.t3
Errors:   0
Warnings: 1

---

Workbench – příkaz Compile for Debugging i Full Recompile for Debugging:

Tip: you can go to the source location of a compile error
by double-clicking on the error message in this window

----- begin build: Thu Oct 19 13:02:03 2017 -----
>t3make -Fy "Z:\home\wanbli\Plocha\TADS\Exoter\obj" -Fo "Z:\home\wanbli\Plocha\TADS\Exoter\obj" -o "Z:\home\wanbli\Plocha\TADS\Exoter_�s\Makefile_dbg.t3" -D "LANGUAGE=cs_cz" -D "MESSAGESTYLE=neu" -D "INSTRUCTIONS_MENU" -d -statprefix <@> -statpct "system.tl" "adv3\adv3.tl" "Exoter.t" -res
TADS Compiler 3.1.3  Copyright 1999, 2012 Michael J. Roberts
Build successfully completed.
----- end build: Thu Oct 19 13:02:04 2017 -----

Zkusím se poohlédnout po chybě v mém nastavení, s warningy jsem se ovšem v minulosti setkával, je zvláštní, že tuto chybu neodchytil. Také je mi divné, že metoda „moveinto“ projde, v knihovně je opravdu pouze moveInto, tady je asi překladač benevolentní.

Kroužící orel

  • Plný člen
  • ***
  • Příspěvků: 112
    • Zobrazit profil
    • Šťastný statek
Re: Seriál o programování textových her v TADS 3
« Odpověď #87 kdy: 19. Říjen 2017 - 14:29 »
A kruci, ani nevím jak mě napadlo vrátit se zpět a metodu provaz.moveInto přepsat zase zpět na provaz.moveinto a chyba se už neobjevuje…:

>prozkoumej studnu
Hluboká studna, nyní však již zcela vyschlá.
>přivaž provaz ke studni
(nejprve dáváš provaz na podlahu)
Provaz jsi spustil dolů.
>d
Sešplhal jsi dolů za pomoci přivázaného lana.
Ve studni
Jsi na dně studny. Je tu vlhko.
Můžeš jít nahoru.
Vidíš tu druhý drahokam.
>i
Neseš šperhák, pochodeň (svítí), svazek klíčů a křesadlo.
>n
Jihozápadní část nádvoří
Stojíš na nádvoří.
Můžeš jít na sever, na východ, na jih, dolů.
Je tu stará kamenná studna.
Vidíš tu provaz.
>polož pochodeň
Hotovo.
>d
Sešplhal jsi dolů za pomoci přivázaného lana.
Ve tmě
Je tu naprostá tma.
>n
Jihozápadní část nádvoří
Stojíš na nádvoří.
Můžeš jít na sever, na východ, na jih, dolů.
Je tu stará kamenná studna.
Vidíš tu provaz a pochodeň (svítí).
>vezmi pochodeň
Hotovo.
>vezmi provaz
(nejprve uvolňuješ provaz od studnu)
Hotovo.
>d
Studna je moc hluboká na to, abys do ní skočil jen tak.

Uff, tohle opravdu zatím nepobírám, ale nevadí, pořádně si prostuduji Tebou popsané části základny a pokusím se znovu definovat VerbRules.

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #88 kdy: 19. Říjen 2017 - 15:07 »
Exoter.t(338): warning: undefined symbol "moveinto" - assuming this is a property name

Zkusím se poohlédnout po chybě v mém nastavení, s warningy jsem se ovšem v minulosti setkával, je zvláštní, že tuto chybu neodchytil. Také je mi divné, že metoda „moveinto“ projde, v knihovně je opravdu pouze moveInto, tady je asi překladač benevolentní.

Praktický rozdíl mezi warningem a errorem je v tom, že při varování může překlad pokračovat dál. I když kód asi není v pořádku, není to závada tak velká, aby kompilátor zastavila. V případě moveinto s malým písmenkem si všimni, že prohlásí, že to bude asi nějaká zatím nedefinovaná vlastnost a tak s ní i zachází, tj. nezavolá tu správnou metodu.

Protože varování nezastaví překlad a spustitelný soubor se vytvoří, tak opakovaný překlad beze změny ve zdrojáku už pak daný soubor znovu nepřekládá. To bude nejspíš důvod, proč jsi neviděl varování při překladu ve workbenchi, ono se píše, ale ne při opakovaném překladu bez provedení změn, takže ho lze snadno přehlédnout.

Kdyby sis přidal při překladu volbu -we tak se všechna varování převedou na chybu, tj. jakmile na ně kompiler narazí, tak odmítne pokračovat s překladem. Pak budeš donucen takové chyby opravit hned, což by bylo nejlepší.

gaspoda

  • Mladší člen
  • **
  • Příspěvků: 98
    • Zobrazit profil
Re: Seriál o programování textových her v TADS 3
« Odpověď #89 kdy: 19. Říjen 2017 - 15:11 »
Uff, tohle opravdu zatím nepobírám, ale nevadí, pořádně si prostuduji Tebou popsané části základny a pokusím se znovu definovat VerbRules.

Kdyžtak prosím upřesni.