Diskuze o textových hrách

Zobrazit příspěvky

Tato sekce Vám umožňuje zobrazit všechny příspěvky tohoto uživatele. Prosím uvědomte si, že můžete vidět příspěvky pouze z oblastí Vám přístupných.


Příspěvky - gaspoda

Stran: 1 2 3 ... 10
1
TADS / Re: TADS 3 Language Server
« kdy: 30. Srpen 2021 - 10:41 »
Napiš mi mailem kontakt...

2
TADS / Re: Kroužící orel 2
« kdy: 11. Únor 2021 - 16:05 »
Dobře, jsem rád, že zaujalo. Příště si můžeme probrat, jak se po TADSovské hře šíří smrad :-)

3
TADS / Re: Kroužící orel 2
« kdy: 11. Únor 2021 - 09:30 »
0: Objekt nevydává vůbec žádné světlo.
1: Objekt je sám vidět, ale neosvítí nic jiného.
2: Objekt vydává trochu světla, takže osvítí sebe i blízké věci, ale jen málo. Dost abys je viděl v hrubých obrysech, ale ne dost na některé akce typu čtení, které vyžadují více světla. Také neprojde přes překážku, resp. médium, které světlo snižuje.
3: Objekt vydává střední množství světla, takže se dá i číst, ale světelné překážky redukují na úroveň 2.
4: Objekt vydává silné světlo. Překážky snižují osvětlení na 3.

4
TADS / Re: Kroužící orel 2
« kdy: 10. Únor 2021 - 23:22 »
Co znamena noc? npr. nevidi predmety?

Nemohu mluvit za Orla, co přesně má za záměr. Někdy stačí zmínit podmínky jen ve vyprávění, někdy udělat nějaké dekorace,...

Ale když odpovím obecně o TADSu a z té technicistní stránky, tak rozlišuje několik úrovní světla, která vydává objekt (0-4).  Třeba pokud je v místnosti tma (např. sklep), tak aby sis mohl rozsvítit baterkou ev. abys mohl schodišti, po kterém jsi přišel, říci, že je ve tmě vidět, i když jiné předměty ne apod.

On TADS má poměrně dost těchhle nástrojů, které pro někoho až moc detailně simulují "fyziku světa", ale v konečném výsledku nejde o to hráče ohromit, co všechno jak detailně se simuluje, ale naopak se prostě jen chovat přirozeně, tj. tak, jak hráč čeká, tedy vyhnout se zjevně nesmyslným reakcím typu že by hra řekla, že nic nevidíš a když řekneš prozkoumej, tak jsi mohl prozkoumat cokoliv nebo že by hra řekla, že se ocitl v temné místnosti a ty se nemohl vrátit. Pro programátora to znamená, že dá místnosti jas 0, schodišti 1 a baterce 3, o zbytek se postará knihovna automaticky.

5
TADS pošle webevent na frame, kde to Javascript v dalším iframu přepošle přes GET na PHP server..  Bezpečnost je teda prakticky nulová

Jsou v tom dvě rizika - jednak to uživatel může zablokovat, když to jde z jeho prohlížeče, s tím nic moc neuděláš, druhak ti může poslat schválně něco jiného (např. nekonečno bodů :-)) a to bys vyřešil tím, kdybys požadavek podepisoval, tedy posílal s ním nějaký klíč, který je vygenerován na základě obsahu požadavku a který umí udělat jen hra a pro hráče je neznámý. Např. jednoduchý hash z dat + tajný klíč.

6
Ještě k Workbenchi a češtině - je to mrzutá situace, naštěstí jde používat externí editor..  Workbench sice neumí české znaky, ale aspoň nic nerozbije a to ani při úpravách přímo uvnitř  -  např. při chybách při komplilaci, se dá nějaká ta závorka opravit rovnou a po uložení se české znaky nerozhážou. Horší je to neustálé padání..

Trochu jsem si hrál, abych viděl, co zhruba je možné, ale je to značně nekompletní. Zkus na http://tads.cz/wide/ zmáčknout ikonu otevřít a napsat klíč "asteroid". Ikonou konsole se otevře prostor, kde jsou sem tam vidět chybové hlášky a pomocí ikonky play se spustí. Je potřeba povolit otevření vyskakovacího okna/záložky. Není tam autosave, každý soubor se musí uložit ikonou či ctrl+s.

7
Na tohle už jsem trochu koukal, ale je tam problém, že nedokážu zjistit, jak velké okno s textem vlastně je, ani kolik textu to vlastně vypíše - tzn. jak poznat, že už je text mimo viditelný frame.

Aha, to jsme se úplně nepochopili. To, co jsem psal, tak je myšlené na dramatickou pauzu v určité situaci v příběhu, ne na automatické pozastavování výpisu při dlouhém textu, to by se muselo asi dělat na klientu JavaScriptem, tam teprve máš nějaký přístup k metrice vyrenderovaného textu a scrollingu. Očekáváš takové situace běžně, protože ti jde o malý displej mobilu?

To ale půjde vyřešit s použitím Inputmanageru..

Ano, je potřeba to dělat přes inputManager, protože funkce, které jsi zmínil, jsou nízkoúrovňovým API a nepočítají s bufferování textu. V http://tads.org/t3doc/doc/techman/t3inout.htm je to více rozebrané, je to očekávané chování, nízkoúrovňové funkce nemá používat programátor přímo.

naivně si myslím, že to půjde udělat tak, že ven bude komunikovat přímo vložená html stránka, která IFDB servery "obejde"

To asi ano, i když teď z paměti si nejsem jistý, jak je to content security policy, ale minimálně vkládat odkaz na obrázek s daty v cestě by mělo jít.

Ještě k Workbenchi a češtině - je to mrzutá situace, naštěstí jde používat externí editor..  Workbench sice neumí české znaky, ale aspoň nic nerozbije a to ani při úpravách přímo uvnitř  -  např. při chybách při komplilaci, se dá nějaká ta závorka opravit rovnou a po uložení se české znaky nerozhážou. Horší je to neustálé padání..

Já už jsem kolikrát přemýšlel, jestli by nejlepší nebyla cesta, kdyby někdo udělal jednoduché vývojové prostředí na webu - třeba monaco editor plus panýlek s nabídkou souborů, ukládání do gitu, playtest přímo přes webui, postranní browser skrz dokumentaci, nějaká sdílená databáze pro ukázky řešení běžných problémů... Ale asi by to i tak bylo hodně práce.

8
Díky moc za češtinu - muselo to dát hrozně práce a musím říct, že jsem ani nečekal, že to může takhle dobře fungovat.

Hm, docela dalo, ale právě mě motivovalo, že jsem viděl, jak dobře to může fungovat pro hráče, a říkal jsem si, že by byla škoda potenciálu nevyužít.

1) TADS Workbench + WebUI + moderní windows  -  opravdu velice často to padá

No jo, o tom se ví - něco je i v gitu opravené, ale nová verze nevyšla, Mike si dává od TADSu oraz. Jestli někdy nabere síly a opraví chyby nikdo neví. On celý workbench je vlastně doslova letitý a má i problém s tím, že nepodporuje UTF-8, to je slabina.

2) Android + WebUI  -  hry puštěné přes tads.org relativně fungují i na mobilních zařízení, ale jsou tam velké nedostatky ohledně formátování textu a podobných detailů

No, na mobily to bohuzel nikdo nevyladil, trochu práce by to dalo. Ale u textovek se hodně píše, myslím, že mobily jsou snažší pro hraní gamebooků.

3) Windows Interpreter pro WebUI - jediné co to zvládne je pravděpodobně HTML Tads, kde je ale velký problém s chováním prohlížeče - používá nějaký prehistorický Explorer, takže nejdou testovat zvuky atd.. Javascript je taky hodně na hraně - opět neexistuje něco lepšího?

Já Windows ani Workbench nepoužívám, tak nevím přesně, jak se to tam nastavuje. Princip je ale takový, že ten interpret ve webovém režimu prostě otevře server a vypíše adresu, tak to dělá frobtads na linuxu a tu adresu si pak otevřu v jakémkoliv prohlížeči. Jak ale přesvědčit Workbench, že to má otevřít v něčem modernějším, z paměti nevím.

Lepšího? No prostě to hostovat na veřejném serveru a pustit to v normálním prohlížeči, to je jasné. To je právě ta hlavní síla WebUI, že by mohla poskytnou vše, co moderní prohlížeče umí. Ale fakt nevím, jak si to rozdejchat lokálně při vývoji na Windows. Umím to jen na Linuxu s Frobtadsem.

4) Jak je vlastně složitá migrace z WebUI na obyčejný TADS - na to téma jsou nějaké návody, podle všeho to nebude tak strašné, když oželím grafiku a ostatní.. Pletu se hodně? :)

Záleží, co použiješ. Když budeš používat základní obyčejné věci, tak hra bude obojetná. Tedy ze stejného zdrojáku půjde zkompilovat hra pro normální interpret a pro webUI pouhou změnou několika řádek v makefile. Podrobněji je to rozebrané v:

http://tads.org/t3doc/doc/sysman/webui.htm

Třeba konkrétně Základna jde zkompilovat pro tradiční interpret, jen se z ní vynechají vlastnosti související s multiplayer hraním a online bodováním. Kdybys ale použil Banner API či zvuky v normálním interpretu či naopak ve webovém upravit Javascriptový frontend, tak pak seš s interpretem svázaný. Podobně se trochu liší možnosti HTML značek.

Obrázky používat můžeš, ale musí se ukládat do nějaké složky, kterou ve webovém interpretru povolíš ke stahování, viz http://tads.org/t3doc/doc/sysman/webui.htm#resfiles

5) MORE prompt

inputManager.pauseForMore(true);

A k tomu se ještě váží blízké funkce, jako:

inputManager.getKey(nil, nil);
inputManager.getInputLine(nil, nil);
cls();

6) Vlastní hosting - nevím jak moc se dá spolehnout na tads.org . Zahlédl jsem i nějaké návody jak rozchodit vlastní server.

Herní servery provozuje několik lidí, jsou zapojeny do "cloudu" kolem ifdb a může je využít kdokoliv - ty servery nespouští jen hry hostované na ifdb (byť v tom případě pokud člověk se člověk přihlásí, tak mu to ukládá savy do jeho účtu), ale ty servery dokážou pustit jakýkoliv herní soubor, který se někde nachází na HTTP adrese na internetu (ne https). Spolehlivé podle mě jsou, přímo je nemám nijak vyzkoušené, ale provozuje je úžší skupina lidí, kteří se kolem TADSu motají a ti celkem vědí, co dělají. Určitě není důvod se tím trápit sám, veřejné servery jsou tu právě proto, aby je lidé mohli využívat a nemuseli se patlat s provozem vlastního serveru, zvlášť pokud to není jejich parketa.

- HINT - podle dokumentace se HINTy tváří, že fungují na bázi samostatného menu - rád bych to měl "uvnitř" hry - tzn. na příkaz HINT by se napsala kontextová nápověda přímo do hry.

Myslím, že Eric Eve měl v nějaké hře příkazy "think" a "think harder" (popravdě nevím, jestli to byla hra v TADSu či Informu), ale je pochopitelně možnost udělat si svůj zjednodušený hint systém, který nebude využívat menu. Koneckonců vlastně Boris v Základně na asteroidu sloužil trochu jako hintsystém, "rád" poradil s opravou, což může být také přístup.

Ale to hintmenu radím vyzkoušet, abys věděl, jak funguje, jak se menu proměňuje v praxi v různých okamžicích. Pointa je ve dvou věcech. Jednak skutečně se jedná o kontextově senzitivní systém, tedy s přispěním programátora nabízí jen ty nápovědy, které jsou zrovna relevantní, jenže to v každém okamžiku hry může být celkem dost různých věcí zároveň a jen hráč ví, o čem zrovna přemýšlí. Vem si, že můžeš vykrádat trezor i ovládat robota nebo luštit papírky a s každou akcí seš jinak daleko, proto má TADS na hinty menu, ve kterém si vybereš kapitolu a v každé kapitole nějaké téma, o kterém byses potřeboval poradit. A v tom přijde ten druhý moment, že nápovědový systém umožňuje nápovědy k jedné věci dávkovat po malých krocích a nechat hráči, aby si vybral, jak silnou nápovědu chce. Aby mu to pomohlo, ale nezkazilo všechnu radost a zároveň když by byl beznadějně zaseklý, aby si mohl nechat napovědět víc. Tohle nejde dost dobře udělat bez menu.

hodilo by se možná mít dostupný klikací slovník přímo ve hře. [...] Opět líný dotaz - nezahlédl jste někdo knihovnu co to už řeší?

Tohle je určitě složitější a ne, nevím o žádné hotové knihovně. Jednoduše se dají dělat odkazy, na které když klikneš, tak přenesou příkaz do řádky a spustí ho, ale takové, které tam přenesou jen část příkazu, to bys musel jít hodně do hloubky. Sám nevím, jak bych to dělal, musel bych to podrobně načís a zkoušet, řešení z rukávu nevysypu. Určitě by to ale bylo odlišné pro tradiční interpret a webUI, určitě se dá kompletně otesat JavaScript toho WebUI a udělat doslova cokoliv, když umíš JavaScript (já s ním poněkud válčím), ale už je to složitější. Nicméně abych byl trochu pozitivní, tak jeden maník udělal ukázku, co se také ve WebUI dá udělat, protože ho zatím moc lidí moc nevyužilo, což je docela škoda, za mě je to jedna z nejvíce podceněných věcí v TADSu ze strany komunity:

https://intfiction.org/t/tads-3-webui-demo-game-and-mini-guide/41491

líbila by se mi online highscore tabulka - umím si technicky představit jak to vyřešit, ale nenapadá mě vlastně, kde to hostovat

Něco takového jsem měl udělané a technicky je to skutečně celkem jednoduché. Kde to hostovat nevím, asi na každém rohu, PHP umí každý, k tomu se vyjadřovat nechci. Chtěl jsem spíš upozornit na některé důsledky, které to má. Abys mohl z hry v TADSu posílat online něco někam, tak to musí skutečně být hra založená na WebUI, tradiční interpret by to nezvládl mj. z toho důvodu, že tradiční interpretry fungují jako sandbox, který běžící hru kompletně izoluje od okolního prostředí počítače z bezpečnostních důvodů. Ale i u toho WebUI je v tom háček, veřejné servery dokážou hostovat hry (i cizí), ale jen takové ty běžně se chovající. Právě z důvodů bezpečnosti je myslím na veřejných serverech síťová komunikace zakázaná. Pro mě to nebyl problém, protože si hostuji komplet svůj server, mám i udělaný storage server a celkem v tom umím chodit, ale pro běžného uživatele TADSu to může být docela překážka.

9
TADS / Re: Kroužící orel 2
« kdy: 14. Květen 2020 - 21:03 »
Jasně, držím palce! A už jsem alespoň v té fázi posledních 20 % programování, které trvá 80 % času?

10
TADS / Re: Kroužící orel 2
« kdy: 22. Duben 2020 - 23:38 »
He, he, to jsi mě pobavil, na WTF momenty jako začátečník narážím ve všech jazycích, vím ale, že jsme se v minulosti o tomto bavili a doporučoval jsi začít nějakým neskriptovacím.

Můj poslední WTF v Pythonu byl, když jsem si udělal dvě úplně stejné globální proměnné (byly to kurzory mysqldb) a když jsem je použil úplně stejným způsobem z funkce, tak jeden fungoval a druhý mi řekl, že používám nedeklarovanou lokální proměnnou.

Měl bych dotaz na Klub Kapsa, je na něj odkaz z tads.cz a už dříve jsem jeho stránky prozkoumal. Fungujete stále (teď třeba vzdáleně) s využitím C++ a grafických knihoven s IDE QT Creator? Teď jsem zjistil, že je k mání i kroužek Pythonu pro mladší účastníky. Mě by zajímaly reakce dětí, jak se na tyto jazyky dívají a zda se pro výuku osvědčily? Dříve jsem na táborech dětem také v učebně ukazoval něco v linuxu a počítačovém mapování, teď už sotva stíháme program venku a u koní, takže jsem počítadla zcela vyškrtnul, proto by mě zajímaly Tvé zkušenosti.

No, teď je činnost kvůli zákazu vycházení pozastavená, ale já se přesto snažím kroužek i tak učit online formou, což je pochopitelně o dost složitější. Zítra budeme mít hodinu s letošníma začátečníkama a sešla se docela dobrá parta, někteří se spolu dokonce znají, což je víc motivuje. Kroužek C++ je můj, Python učí kolega. On to má postavené pro ty mladší kolem 6. třídy, takže na to jde pomalejš a dělají více izolovaných příkladů, u mě začínají zpravidla tak osmáci a jdeme postupně spíš do větší práce, kterou společně tvoříme a přitom se učíme nové věci. Moc je nešetřím, leccos si musí vydedukovat. Co na to říkají nevím, nemají čas moc mluvit, ale jestli chceš, tak se jich přijď zeptat (napiš do mailu).

Ne vážně, na programovacím jazyku tolik nezáleží, já to C++ mám poměrně rád, protože se s ním dají celkem dobře dělat jednoduché hry, ale ve výsledku učím dost osekanou podmnožinu a kolikrát mi jde víc o pochopení toho, jak to funguje na pozadí, než abych je naučil nějakou finesu jazyka samotného. Ty širší souvislosti jsou pro mě důležitější.

11
TADS / Re: Kroužící orel 2
« kdy: 20. Duben 2020 - 22:18 »
Moc děkuji za velmi rychlou odpověď, upřímně řečeno nešlo mi o povolení příkazu "podívej se do", ale kontejnerová hierarchie mě napadla hnedle poté, co jsem potřeboval postupně odhalovat nové objekty.

Asi to můžeš řešit i pomocí kontejnerové hierarchie, jen mi v tomto případě přišlo trochu nadbytečné. Určitě by kontejnery byly na místě, pokud bys měl třeba písek a stopy v písku nebo stopy na něčem, pak TADS umí chápat, že něco je v něčem (viz i příklad s prstenem v hnízdě) a třeba se ptát ">prozkoumej stopy / A které stopy máš na mysli, stopy v písku nebo stopy na mostě?" apod. Ve tvém příkladu ale jsou spíš tak jako vedle sebe, jen prozkoumáním jedněch si všimneš druhých.

PresentLater by fungoval, i kdyby objekty nebyly v sobě, jde jen o to na jaký příkaz pak pověsíš zviditelnění. Jediné co, že kontejner má povolený (verify) příkaz na podívej se do, takže to nemusíš dělat a napíšeš jen action(), tak ušetříš jeden řádek.

Ještě bych si také dával trochu pozor na slovník. Máš tam vidět objekt otisky, ale v popisu říkáš "i mohutných těžkých stop.". Zde prozrazuješ slovo "stopa" dřív, než hráč objeví zvláštní stopu a to může trochu zmást, protože se hráč může pokusit prozkoumat stopu dřív, než ji zviditelníš. Je dobré si trochu hlídat, jaká podstatná a přídavná jména v popisech píšeš.

Zatímco v Javě je mi rozdíl mezi třídou, objektem a metodou jasný, v Pythonu se...

V Pythonu je spousta WTF momentů... Ale jsem rád, že tě to baví.

12
TADS / Re: Kroužící orel 2
« kdy: 19. Duben 2020 - 23:02 »
příkazu "koukni se do otisků" (koukni se na otisky nelze využít, protože parser příkaz pochopí jako prozkoumej otisky) naleznu zvláštní stopu.

A nemáš to už trochu překombinované? Určitě by to chtělo takový příkaz hráče předem naučit a asi s nějakým synonymem, osobně bych doporučil třeba spíš vyjít z Readable a tedy příkaz "přečti stopy" a doplnit ho o synonyma a různá přeměrování, ale asi by mě nenapadlo to dávat do sebe jako kontejnery, to mi připadá zbytečné. (Asi jsi to udělal, abys měl povolený "podívej se do", ale to můžeš udělat i bez kontejneru.)

Tu definuji stejně jako otisky s tím, že po příkazu koukni se do stopy by se mělo objevit houští. I přes definici stejné metody dobjFor(LookIn) , která funguje v předchozím případě se tak ale nestane a získávám stejnou odpověď, jako bych se již do stop díval, ale houští nevidím.

Toto chování je mi zatím nepochopitelné, když jediný rozdíl mezi objekty otiskyKonskychKopyt a zvlastniStopa je ten, že zvlastniStopa představuje PresentLater a stejně tak houští. Využívám zde kontejnerovou hierarchii a hra se v pořádku zkompiluje, výsledek je však následující:

V TADSu jsou dvě třídy pro realizaci skrytých objektů. Hidden a PresentLater. Každá funguje trochu jinak a PresentLater funguje tím způsobem, že hra objekt přesune při kompilaci pryč (zvlastniStopa.location bude nil) a v okamžiku přesunutí zvlastniStopa.makePresent(); se vráti zpět. Jenže v ten okamžik se nemůžeš ptát if(zvlastniStopa.moved), protože jsi ji právě přesunul. Nechtěl ses ptát na housti.moved?

Také jsem si všimnul, že pokud objekt definuji jako Immovable, CustomImmovable nebo Fixture, v textu nebo po příkazu "rozhlédni se" se nezobrazí, ale bez tohoto označení ano. Byl bych rád, aby byl vždy objekt, který hráč nalezl, viditelný, ale nebylo jej možné sebrat, zde se ještě zkusím juknout do knihovny, proč se tak děje.

Ano, to tak je, protože se to předpokládá jako obvykle žádoucí, samozřejmě jde změnit nastavením nekteré z uvedených vlastností na true:

Kód: [Vybrat]
class NonPortable: Thing
    /*
     *   An immovable objects is not listed in room or container contents
     *   listings.  Since the object is immovable, it's in effect a
     *   permanent feature of its location, so it should be described as
     *   such: either directly as part of its location's description text,
     *   or via its own specialDesc. 
     */
    isListed = nil
    isListedInContents = nil
    isListedInInventory = nil

Pokud to uděláš, vylistuje se podobně, jako bežné položené předměty (vidíš tu...) Ale jak se praví v popisku, většinou spíš budeš chtít buď zapracovat popis stop přímo do popisu místnosti, nebo pokud se o nich chceš zmínit ve výpisu místnosti prominentně, tak nastav u stop specialDesc a z toho se pak udělá samostatný odstavec.

13
TADS / Re: Kroužící orel 2
« kdy: 8. Březen 2020 - 22:27 »
Pro úspěšný lov potřebuji mít v ruce nůž a návnadu. I přes můj kód však stačí mít jen jediný předmět, např. nůž

Ty tam máš podmínku:

Kód: [Vybrat]
  if(!navnada.isIn(me) && !nuz.isIn(me))
ale to není správně utvořená negace. Ty říkáš, že potřebuješ nůž A ZÁROVEŇ návnadu. Co je tedy opakem, kdy akci nedovolíš? Když nemáš nůž NEBO nemáš návnadu. Zapoměl jsi prohodit tu logickou spojku. Je to stejné, jako když řeknu, že půjdu ven, když budu mít čas A ZÁROVEŇ bude hezky. Čili nepůjdu ven, pokud buď nebudu mít čas, NEBO bude ošklivě. Říká se tomu DeMorganovy zákony a dají se zapsat jako !(A * B) = !A + !B či !(A + B) = !A * !B (hvězdička značí logický součin, tedy "a zároveň", plusko logický součet, tedy "nebo" a vykřičník je negace). Měl bys tedy napsat:

Kód: [Vybrat]
  if(!navnada.isIn(me) || !nuz.isIn(me))
a ještě se text opakuje, místo aby hra zobrazila blok uvedený v else. Předměty typu PresentLater se v pořádku objeví:

Ty tam říkáš:

Kód: [Vybrat]
  if(!moved)
Ale dej si pozor, koho se ptáš. Protože píšeš přímo vlastnost moved bez určení objektu, tak se ptáš objektu, ve kterém je napsaný if() a to jsou jámy, které se nikdy nepohnou. Možná bys měl testovat např. orliMaso.moved, potom to bude zabírat, dokud se maso nepohne, čili než ho sebereš. (Teď jsi nejsem jistý, jestli makePresent způsobí pohnutí masa, ale myslím, že ano - záleží, jestli chceš změnit text po objevení nebo až po sebrání a podle toho přizpůsobit podmínku. Můžeš také zkoušet testovat if(orliMaso.location != nil))

V referenční knihovně si vyhledám Akce a rozkliknu LieOnAction, pokud dobře chápu, zjišťuji, že se jedná o třídu dědící od tříd TAction a Action a také od BasicProd a Resolver

Ano, od TAction a BasicProd přímo a ty zase od Action a Resolver.

(které jsou však označeny jako objekty, i když po rozkliknutí jako třídy

Třídy poznáš, že zpravidla začínají velkým písmenkem a objekty malým. Nicméně klíčové slovo "object", které v manuálu vidíš napsané poblíž BasicProd a Resolver neznamená, že BasicProd je objekt, je to třída, ale dědí od speciální třídy nazvané "object", což je označení, že třída nemá žádné předky v knihovně, od kterých by dědila vlastnosti.


Citace
   An object must always have at least one superclass, but you can use the special class name "object" if you want a generic object that is not based on another object that your program defines.

V sumáři vlastností a metod třídy LieOnAction vidím několik akcí xxx dobj xxx (snad se vyjadřuji přesně), nikoliv však akci s názvem dobjFor
(LieOn), kterou potřebuji použít.

V prvé řadě dobjFor(LieOn) bys měl hledat na herním objektu (potomku Thing), kde se definuje chování akce. Třída LieOnAction se přímo o konkrétní chování nestará, všechny akční třídy jsou součastí parseru, starají se o rozpoznání akce v příkazu hráče a pro samotné vykonání pak zavolají preCond, verify, check a nakonec action na herním objektu.

Zde mě zaráží, že jsem nedohledal žádné propojení s třídou LieOnAction, tady něco chápu špatně.

Potřebuji pracovat s věcmi v inventáři, takže se juknu blíže na aplikaci této metody ve spojení s třídou Thing a dostávám předpis:

Kód: [Vybrat]
    dobjFor(LieOn)
    {
        preCond = [touchObj]
        verify() { illogical(&cannotLieOnMsg); }
    }

Já se však ve svém kódu snažím využít nikoliv preCond a verify (mohu je chápat jako atributy metody?),

Zápis s dobjFor() samo o sobě ještě není ani metoda, ani vlastnost, ale taková zkratka v zápisu, aby vypadal více hierarchicky a méně se opakovalo psaní. Říká se tomu propertyset a je to specialita TADSu. To, co takhle napíšeš, tak se změní na metodu (verify, action,...) či vlastnost (preCond) tak, že se název zkombinuje z obou částí:

Kód: [Vybrat]
    preCondDobjLieOn = [touchObj]
    verifyDobjLieOn() { illogical(&cannotLieOnMsg); }

Ale jinak ano, teď už hledáš na správném místě. V těchto místech se skrývá chování, které chceš ovlivnit.

ale verify, check a action společně s podmínkou začínající příkazem if a končící else, nakonec se snažím
umožnit hráči nejen si s potřebnými předměty lehnout do jámy, ale také při položení obou věcí dosáhnout
téhož pomocí dobjFor(PutIn) asDobjFor(LieOn).

Tak to ale pozor, o jakou akci se jedná. Když se snažíš jednu akci přesměrovat na jinou, nesmíš míchat různé druhy akcí dohromady. Jednak bys nemohl přesměrovávat akci, co žádné objekty nebere na akci, co bere jen přímý objekt a podobně akci, co bere přímý objekt na akci, která používá přímý i nepřímý objekt. To není kompatibilní. Ve tvém příadě LieOn je akce, kde hráč ulehá na objekt a to není kompatibilní s akcí, kdy objekt se položí na jiný objekt. I když nemůžeš použít asDobjFor, tak můžeš obě možnosti naprogramovat velmi podobně, ale zvlášť.

Pokud dobře chápu, potřebuji rozšířit funkcionalitu metody dobjFor(LieOn) tak, abych mohl využít atributů
verify, check a action. Je nepříjemné, že můj zápis hra nebere jako chybu (syntaktická to pro kompilátor
není, sémantická však ano, pokud dobře rozumím, i tak je chování zvláštní, neměl by TADS při překladu zařvat,
že se snažím volat neexistující atributy?).

Neměl by řvát, je to obráceně. Ty je nevoláš, ty je vytváříš (a máš možnost vytvořit jakoukoliv metodu či proměnnou chceš), volá je akce v knihovně. A nebo pokud se spleteš a nepojmenuješ metodu správně nebo z jiného důvodu ji nikdo nechce, tak ji holt nikdo nezavolá.

Zde se ale už dostáváme dost do teorie a možná většina tvých problémů zmizí, když vyřešíš ty drobné chybky v logice ifů zmíněné na začástku
mé odpovědi.

Něco mi holt uniká, nechápu zatím propojení mezi třídou LieOnAction a metodou dobjFor(LieOn), tuším, že zde
takové propojení bude např. přes třídu Thing a její metody.

Ze strany akční třídy se spouští vykonání akce, např. kdyby sis našel ve třídě TAction metodu verifyAction(), tak tam uvidíš, jak zde akce volá tu verifyDobjLieOn tvé jámy. Ale pointa je, že kód LieOnAction bys ani neměl číst, to jsou ty nízkoúrovňové věci, které sice tvoří jádro zpracování, ale jako autor hry tu nic užitečného nenajdeš.

14
TADS / Re: Kroužící orel 2
« kdy: 31. Leden 2020 - 22:10 »
Je možné při této struktuře docílit funkčnosti příkazu "jdi to týpí"? Pokud to nebude možné, nezbývá mi vše předělat tak jak popisuje manuál a je vyřešeno např. u chaty v Heidi.

Myslíš bez použití EntryPortalu? No zkusil jsem níže uvedené a zdálo se mi, že to funguje bez problému, tedy že jsem enterable přesměroval na cílovou lokaci, takže se zdá, že není potřeba směrovat na místní objekt představující dveře, který směruje na protilehlou lokaci, ale jde směrovat rovnou na cíl.

Kód: [Vybrat]
+ typiBystrehoRysa : Enterable, CustomImmovable -> mistnostTypiBystrehoRysa 'týpí' 'týpí' *4

15
TADS / Re: Kroužící orel 2
« kdy: 20. Prosinec 2019 - 21:52 »
Ahoj, přeji pohodové vánoce a gratuluji, že ses na programování nevykašlal, ale jdeš si za svým cílem! Popravdě jsem si nebyl jistý, protože mi přišlo, že o tom nedokážeš nemluvit a dlouho o tobě nebylo vidu ani slechu ;-) Přeji mnoho úspěchů a těším se :-)

Stran: 1 2 3 ... 10