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
Někteří asi víte, že Základna na asteroidu je naprogramovaná trochu jinak, než je u českých textových her zvykem. Vznikla v systému TADS 3, který jsem přeložil do českého jazyka. TADS je jeden ze dvou nejpropracovanějších systémů pro tvorbu interaktivní fikce ovládané příkazovým řádkem a jeho historie sahá až do roku 1988, kdy se objevila první verze, trojka je však zcela přepracovaná a slouží od roku 2006.

Když už jsem se do tak rozsáhlého projektu pustil, měl jsem od počátku v plánu víc, než jen naprogramovat textovou hru. Rád bych českým autorům přiblížil svět novodobé interaktivní fikce, která se na anglicky hovořící scéně rozvinula, a protože jsem především programátor, snažím se především pootevřít dveře k modernějšímu způsobu programování. Na serveru textovy.cz dnes začal vycházet seriál o programování textových her v TADS 3, který vás provede tím nejdůležitějším, s čím se při tvorbě her budete setkávat. V jeho sedmi dílech vydávaných zhruba po čtrnácti dnech se postupně podíváme na jednotlivé problémy, jako tvorba místností, předmětů, zpracování akcí a programování postav ve hře.

Seriál si určitě neklade za cíl stát se dokonale podrobnou učebnicí, na to máme k dispozici řadu knih, ale určitě získáte poměrně dobrou představu, jak se věci v TADSu řeší. V diskusi rád odpovím na jakékoliv dotazy, které by vás mohly napadnout, budete-li chtít vědět o některém tématu více, můžeme na něj navázat podrobnějším vysvětlením nebo dalšími příklady. Na konci seriálu pak dojde na (snad) největší lákadlo, chystám se vydat kompletní zdrojové kódy své hry pro zájemce, kteří by do nich chtěli nahlédnout a prozkoumat, jak je hra udělaná.


pedromagician

  • Globální Moderátor
  • Starší člen
  • *****
    • Příspěvků: 309
    • Zobrazit profil
    • Pedro - blog
ty ma chces silou mocou dokopat k zverejneniu svojho enginu :-D

super už sa teším, večer si prečítam. klobúk dole pred takým projektom a ešte k tomu aj úspešne dotiahnutým do konca :-)
pedro.pohroma.de
txt.pohroma.de


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Chci cokoliv, o co bude zájem.

Chci ukázat problematiku z malinko jiného úhlu pohledu, možná trochu inspirovat nebo třeba i jen vyvolat zajímavou diskusi. Zkrátka chci trochu rozvířit stojaté vody! A když Pavel Tišnovský nezvedl hozenou rukavici a psal na rootu jen o Informu, tak jako kontrast chci ukázat ten druhý velký systém, který je úplně jiný, než Inform, a přitom se v obou tvoří velice podobně fungující hry.

Možná někde ve skrytu duše chci i trochu zaprovokovat, ale to spíš v reakci na adentův článek, který tu před časem odkazoval. Přišlo mi škoda, že je tak povrchní, že mluví jen o tom nejjednodušším způsobu programování, a ještě ho ani neukáže konkrétně, takže těm, kterým byl určený, asi moc nepomohl. A diskuse, zda předmět mimo mapu označovat -1 nebo 255, je o ničem. Přitom by se dalo diskutovat o spoustě zajímavých problémů, o programování parseru, o konverzačních systémech, o odvíjení příběhu atp.

Hlavně ale chci dát větší přidanou hodnotu zdrojovým kódům Základny a dopředu trochu vysvětlit, co v nich lidé uvidí, aby to pro ně bylo pak více přínosné, než kdyby do nich nakoukli bez jakékoliv předchozí znalosti.


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Tak to sa tesim aj ja. Dufam ze ta nalada na pisanie clankov neopusti a dokoncis to cim skor tym lepsie :).

Jedna zvedava otazka k tomu TADS3. To je IDE kde sa pise cisto len kod a kompiluje alebo sa tam daju naklikavat jednotlive objekty, miestnosti, akcie a k nim sa riesi kod? Nemal som este cas sa do toho poriadne pozriet tak aspon informativne pre moju predstavu. Dik.
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Nemusíš se bát, já ve skutečnosti mám už připravených pět dílů ze sedmi (asi z 95 %), musím jen dopsat výživný díl o NPC postavách a závěr, ty jsem ještě nezačal. Chci to ale pouštět ven postupně, protože přeci jen je to poměrně dlouhé a náročné čtení, a pokud vzniknou otázky, tak bude lepší si nechat časový prostor a nemíchat jednotlivá témata dohromady, aby se udrželo soustředění. A pak to zajistí textovkám.cz trošku živosti po celý podzim.

TADS přistupuje k programování textových her (na rozdíl třeba od Inform 7) opravdu z čistě programátorského pohledu, takže i jeho vývojové prostředí se velice podobá vývojovým prostředím pro profesionální programátory. Základem je tedy textový editor, který zvýrazňuje syntaxi a má spoustu různých vymožností (záložky, hledání, skládání kódu, automatické odsazování atp.), debugger umožňující krokovat kód, vkládat breakpointy a prohlížet aktuální stav proměnných, objektů atp., správce a navigátor v projektu a také obsahuje integrovanou veškerou dokumentaci. Pár obrázků, jak prostředí vypadá, je na http://tads.org/ov_tools.htm.

Opravdu se tedy nejedná o naklikávání objektů, žádné vyplňování dialogů či průvodců, je to čistokrevné programování, kde výsledkem je zdrojový kód v textové podobě, jak bys ho vytvořil i bez jakéhokoliv vývojového prostředí. Já sám pracuji na Linuxu, takže Workbench používám jen zřídka, když potřebuji debugger, a celou Základnu jsem napsal ve svém olíbeném IDE pro C++ (v Qt Creatoru).

V prvním dílu jsem si zatím jen připravoval půdu pod nohami, ale už v příštím článku uvidíš reálné příklady, jak se vytvářejí místnosti ve hře a jak se spojují do mapy, a uvidíš, že to není zase až tak strašidelné. Vlastně možná budete překvapeni, že s barvičkami a hezkým odsazením zdrojáku to je i docela přehledné a hlavně hodně stručné, prim hraje skutečný obsah hry, tedy texty k zobrazení.
« Poslední změna: 19. Září 2015 - 11:14 od gaspoda »


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Parada, je sa teda na co tesit. Zima je uz coskoro pred dverami tak bude aj viac casu straveneho u PC.
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Uz lamem TADS3 cez koleno. Objavuju sa prve zaciatocnicke problemy. Trebars tento kus kodu ukazuje chybu aj ked by mal byt spravny (sudim podla manualu a podla ineho tutorialu kde je to presne rovnake len iny nazov objektu)

Kód: [Vybrat]
pants: Wearable
    vocabWords = 'brown pants*pants clothes'
    name = 'brown pants'
    desc = "Pair of brown pants with pockets on the sides."
    location = room03
    dobjFor(Doff)
    {
        check()
        { // - tu hlasi chybu ze vyzaduje ; ale preco by tu mala byt?
            failCheck('You decided to leave them on yourself for now.');
        }
    }
;

Citace
Expected a semicolon ';' but found "{".  Please add the required semicolon.  If
a semicolon is already present, check for unbalanced parentheses or other
expression errors.

PS:Zapis sa da skratit ja viem. Tento sposob sa mi ale paci viac. Tu dobjFor cast nechce skompilovat IDE, je to divne. V com by mohol byt problem?
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Ten kousek kódu, co jsi přiložil, je naprosto v pořádku (za předpokladu, že existuje někde room03, pokud by neexistovala, napsalo by to jiné varování). Myslím, že problém bude někde jinde ve zdrojáku, třeba někde ještě dříve. Zkontroloval bych, zda složené závorky jdou všude do páru atp.

Kdybys na to jó nemohl přijít, tak mi pošli mailem celý zdroják, já se ti na něj podívám. Můj mail je na úvodní stránce tads.cz dole.


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Vsetko ostatne ale funguje akonahle tu cast kodu zakomentujem

Kód: [Vybrat]
dobjFor(Doff)
    {
        check()
        { // - tu hlasi chybu ze vyzaduje ; ale preco by tu mala byt?
            failCheck('You decided to leave them on yourself for now.');
        }
    }

Ak tam v src toto nieje tak normalne spusti hru. Som v miestnosti. Mozem sa hybat do inej miestnosti. A vidim na zemi svoje 2 predmety s ktorymi mozem manipulovat. Tam fakt ine zatvorky navyse niesu. :-/
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Já jsem si celý ten tvůj kousek hodil do svého zdrojáku a fungoval úplně v pořádku, takže kdo ví. Člověk pak podezírá, zda sis tam třeba nezkopíroval nějakou neviditelnou typografickou značku, pokud jsi základ bral z nějakého tutoriálu, či něco takového, co pak já ve fóru nevidím. Proto jsem nabízel, že mi můžeš poslat celý ten zdroják mailem (nejlépe v zipu), samotný úryvek je v pořádku. A nebo je opravdu něco nad tím.


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Uz som prisiel na problem. Je to tym ze som si rozdelil subory na viacero casti. Chcel som to tak ze v main subore su len definicie ohladom hry, pociatocnej pozicii, intro atd. A v ostatnych suboroch by bola mapa rozdelena na mensie kusy koli prehladnosti.

Problem sa vyriesil ked som do dalsieho suboru kde bola hlasena chyba vlozil riadok na zaciatok pre kniznicu #include <adv3.h>, pre istotu tam necham aj #include <en_us.h>

Code completition to IDE nema ze? To by sa zislo ako sol :-/.

Dalsi problem na ktory som narazil je ako obliect hlavnej postave nohavice hned od zaciatku. Ak definujem u nohavic vlastnost wornBy = me (je to vsade v manuali takto) tak engine sa sprava divne. Ako keby to bolo oblecene na postave ale zaroven to pri zobrazeni inventara nevidno zeby som to mal oblecene. Najlepsie mozno pochopit celu situaciu z logu kde mam dva predmety. Nohavice su wearable a wornBy = me, tricko je wearable a je len v miestnosti na zemi.

Citace
You see a brown pants (being worn) and a green shirt here.

>i
You are empty-handed.

>wear shirt
(first taking the green shirt)
Okay, you’re now wearing the green shirt.

>i
You are carrying nothing, and are wearing a green shirt.
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
No vida! Já věděl, že je problém někde jinde, než v tom kousku, který jsi posílal.

Rozdělení projektu na více souborů je naprosto v pořádku, já mám dokonce každou místnost a každou postavu v samostatném souboru, aby se mi v tom lépe hledalo. Na začátku každého soubou vždy uveď definici kódové stránky (#charset "windows-1250" apod.) i oba #include, bez nich by to nemohlo fungovat, každý soubor se totiž kompiluje zvlášť a potřebuje všechny definice všech maker, které se v souboru pak používají.

Konkrétně v tomto případě byla chyba nahlášena v daném místě proto, že hlavičkový soubor zavádí takzvané "propertyset", to je právě ta vymoženost zápisu dobjFor(Doff) { check() { ... }}. Interně se to totiž transformuje na méně přehledné, ale pro kompilátor stravitelnější definice samostatných funkcí, v tomto případě checkDobjDoff { ... }.

A teď ke tvé otázce s oblečením. Trochu předbíháš, ve čtvrtém dílu budu podrobně mluvit o kontejnerové hierarchii, takže nyní jen stručně. U objektu, který chceš, aby postava nesla, nastav location = me. Pokud je to oblečení (Wearable) a má ho mít postava obléknuté, nastav kromě location i wornBy = me, tedy obě(!) vlastnosti. Zkrátka oblečené olečení musí být také v inventáři postavy.
« Poslední změna: 22. Září 2015 - 10:29 od gaspoda »


Sylfir

  • Mladší člen
  • **
    • Příspěvků: 74
    • Zobrazit profil
Dik to je ono. Este ma napada jedna vec ci si to neriesil nahodou. Mas rozne objekty napr postel a tricko. Napisem prikaz wear all a logicky tym myslim len tie objekty ktore sa daju obliect. Hra ale zacne prechadzat aj postel a vypisovat "That isn’t something you can wear". Nejde tam prepnut aby tieto objekty proste ignorovalo a nevypisovalo? Obdobne je to u prikazov take, open, close, lock, unlock.
-::<< Programator TextGame2 enginu v jave (R.I.P.). >>::-
a StoryPlayeru v lua/love2D
a najnovsi je ABEL engine v lua/love2D


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Ano, jde to, ale dá to trochu práci, takže se to vyplatí dělat jen tam a jen s těmi akcemi, kde to hráč nejpravděpodobněji bude zkoušet. Třeba v mé hře bylo několik kousků oblečení v úvodní lokaci, tak v ní (a ne jinde) jsem měl u ostatních objektů, jako třeba u dveří přidanou metodu hideFromAll, která právě řeší, zda se ten konkrétní objekt má ukrýt před kvantifikátorem "vše" v příkazu:

Kód: [Vybrat]
    hideFromAll(action)
    {
        return action.ofKind(WearAction)
            || action.ofKind(DoffAction)
            || inherited(action);
    }

Metoda má vrátit true, pokud má být objekt vynechán z "vše". Tedy v tomto případě jsem ukrýval dveře před "oblékni vše" a "svlékni vše". U jiných typů akcí se pak použilo výchozí zacházení, proto to inherited(action).


gaspoda

  • Plný člen
  • ***
    • Příspěvků: 141
    • Zobrazit profil
Zítra ráno vyjde druhý díl na téma programování lokací, tj. místností ve hře, jejich spojování do mapy ať už přímo nebo prostřednictvím dveří či jiných konektorů, programování bariér zabraňujících pohybu postavy konektorem a tvorbě atmosférických hlášek, které oživují hru.