1. OutOfReach
Aha, takže ideální bude zkombinovat obě. Vyzkoušel jsem a hra správně na hráčovi příkazy tlač, prohledej, vezmi… odpovídá řetězcem „Nepřipadá Ti vhodné dotýkat se mrtvoly!“, výborně, tuhle konstrukci jsem si uložil do poznámek, protože jí rozhodně využiji také u předělávky Bad Night.
2. Hlášení chyb a aktuální stav Frobtads
Skvěle, myslel jsem si, že jakž takž ještě funguje fórum, moc jsi mě potěšil, že Eric i Nikos se stále angažují. Je pravda, že bych nalezené problémy související s programováním nepopsal asi ouplně přesně, lépe to bude od Tebe. Nová verze manuálu by moc pomohla, alespoň ostatní zájemci uvidí, že TADS stále žije a to je hlavní. Práci Mikeho si moc vážím, ano, stačí si jen projít Library a člověk žasne, mě se líbí, že jak to cítím, textovky nestárnou a hra v tomto systému bude stejně bezva hratelná i za deset let. Třeba když uvidí, že uživatelé a dotazy stále jsou, k TADSu se vrátí, necháme se překvapit. Pomoci ale mohu s instalací Frobtads, mám v učebně i virtuálu několik distribucí:
Frobtads funguje v současné době bez problémů v:
Ubuntu 16.04 – binárka je OK a bez problémů funkční
Freebsd 11.1- binárka i kompilace pomocí clang funguje, díval jsem se na jejich fórum a potíž viditelně vyřešili, vše tedy OK
Menší potíž je s Debianem:
Na jejich bugzille se problém s novějším kompilátorem už řešil
https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=871215Pokud se dívám na debianí balíčky:
https://packages.debian.org/search?keywords=frobtads&searchon=names&suite=all§ion=allZjišťuji, že Debian Jessie je vše OK, balíčky existují ve verzi 1.2.3-1 včetně potřebných závislostí
Debian Stretch – tady balíčky vůbec k dispozici nejsou, řeším to tak, že instaluji z unstable verze Sid – zde je upravená 1.2.3-1+b1, pomocí dpkg -i instaluji balíčky frobtads, tads3-dev a tads3-common, následně je vše plně funkční
Raspbian je to samé, v Jessie je možné balíčky zkompilovat pomocí deb-src, pro Stretch také neexistují a je nutna verze ze Sidu
Největší potíž má Arch Linux vzhledem k aktuálním balíčkům, v současné době s kompilátorem GCC 7.2 - řešení zde však je:
https://aur.archlinux.org/packages/frobtads/Failed to build with fresh gcc. Fix:
diff --git a/PKGBUILD b/PKGBUILD
index 5c78bee..b1d0ec1 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -17,7 +17,7 @@ md5sums=('c6ed8cd6dac04b3ee6f4422cea688979')
build() {
cd "${srcdir}/${pkgname}-${pkgver}"
- ./configure --prefix=/usr
+ ./configure --prefix=/usr CXXFLAGS="-std=c++03"
make
}
Pokud dobře chápu, je nutno zajistit kompatibilitu se standardem c++2003, poté kompilace proběhne bez problému.
A nakonec můj oblíbený Slackware:
Ve verzi 14. 2 se nachází GCC 5.3, kompilace OK
V current se momentálně nachází GCC 7.2, zde kompilace vypisuje jinou chybu, než Arch:
bash-4.4# make
make all-am
make[1]: Entering directory '/root/frobtads-1.2.3'
CXX tads3/tcprs.o
In file included from tads3/tcprs.cpp:39:0:
tads3/vmbignum.h: In static member function ‘static vm_obj_id_t CVmObjBigNum::create(int, const bignum_t<prec>*)’:
tads3/vmbignum.h:585:45: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
new (vmg_ id) CVmObjBigNum(vmg_ prec);
^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In static member function ‘static vm_obj_id_t CVmObjBigNum::create(int, const bignum_t<prec>&)’:
tads3/vmbignum.h:596:45: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
new (vmg_ id) CVmObjBigNum(vmg_ prec);
^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In member function ‘virtual void CVmMetaclassBigNum::create_for_image_load(vm_obj_id_t)’:
tads3/vmbignum.h:1640:36: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
new (vmg_ id) CVmObjBigNum();
^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
tads3/vmbignum.h: In member function ‘virtual void CVmMetaclassBigNum::create_for_restore(vm_obj_id_t)’:
tads3/vmbignum.h:1647:36: error: exception cleanup for this placement new selects non-placement operator delete [-fpermissive]
new (vmg_ id) CVmObjBigNum();
^
<built-in>: note: ‘void operator delete(void*, unsigned int)’ is a usual (non-placement) deallocation function in C++14 (or with -fsized-deallocation)
make[1]: *** [Makefile:6599: tads3/tcprs.o] Error 1
make[1]: Leaving directory '/root/frobtads-1.2.3'
make: *** [Makefile:3011: all] Error 2
bash-4.4#
Na to se ještě podívám, zde je ale výhoda, že balíček kompilovaný pro starší verzi většinou funguje i v novějším Slacku.
Takže suma sumárum gcc verze 5 a snad i 6 je se současným frobtads 1.2.3 OK, od verze 7 jsou potíže a také u clang byla nutna úprava. Bude paráda, pokud Nikosovi pošleš tyto postřehy, pokud upraví zdrojáky pro aktuální gcc a ideálně i clang, bude to paráda. Plus pokud by se podíval na tu bolístku s utf-8 v konzoli, což zatím řeším pomocí Tebou doporučované volby -i plain -k utf8.
Vím, že je s českými znaky docela potíž, upřímně řečeno jsem plnou češtinu včetně problematických znaků ť, ú nebo ů zprovoznil pouze v příkazové řádce Slackware a Archu. U jinak skvělého a bezproblémového Debianu se zatím vůbec nechytám, ť přes nejrůznější nastavení zatím nerozchodím, ještě si s tím zkusím pohrát, původně funkční návod pro Wheezy mi v aktuální verzi nejede. V Ubuntu a OpenSUSE je zatím nutno ručně po spuštění pouštět příkaz sudo loadkeys cz-us-qwerty nebo sudo loadkeys cz, nepodařilo se mi toto zautomatizovat. BSD systémy na češtinu zvysoka kašlou, jedinou podporu má FreeBSD, ale jeho terminál zatím neumí české uft-8 znaky na konzoli a Open a NetBSD nemá ani české lokalizační balíčky, co se dá dělat.
Dnes už to samozřejmě není nutné, na druhou stranu byl dříve milovníkem GUI, ale nyní se mi vzhledem k práci s armádním notebookem nebo Raspberry hodí co nejméně náročný systém. A zjistil jsem, že většinu práce zvládnu i v příkazové řádce, nyní testuji Slackware v kombinaci s framebufferem, zde rozchodím „grafický“ links nebo netsurf, s nimi vůbec není problém prohlížet moderní web, přehrávat videa včetně youtube lze pomocí mplayer nebo cvlc, procesor Worgrinder dokáže nahradit LO Writer, ještě doladit tabulky a budu tak moci parádně pracovat – v tom by mohl pomoci Emacs, na který se vrhnu vzápětí. No a časem, pokud zvládnu Cčko, bych rád připravil nějaké ncurses aplikace, které by se hodily stejně jako v době DOSu.
No, trochu jsem se rozepsal, nyní je ale snad jasnější, jaký důraz dávám na české znaky a frobtads v konzoli, ostatně stejnou práci s překladem si dáváš i Ty, myslím, že si rozumíme. Na druhou stranu chápu, že nějaký terminál dnes už nefrčí, takže by se autoři mohli více věnovat HTML nebo třeba apk souborům pro Android, sám sice chytrý telefon nepoužívám a v dohledné době nebudu, budoucnost je ovšem právě tam - naštěstí přes prohlížeč by hra měla být hratelná, určitě jí v konečné podobně umístím na IFDB, ve svém manuálu píšeš, že existují veřejné servery, takže nebudu muset konfigurovat vlastní.
3. curState, mé další postřehy
Paráda, teď už chápu, že konstrukci musím využít u objektu s vhodnou vlastností, v mém případě u strážce. První příklad funguje na jedničku, zkusil jsem stejnou konstrukci využít i v druhém, ale ouha, zde jsem narazil a nefunguje jak má. Trochu jsem laboroval, nakonec jsem z příkladu zde:
https://www.intfiction.org/forum/viewtopic.php?f=10&t=21744&view=previouszjistil, že musím využít dvě rovnítka, správný příkaz na řádku 260 je tedy:
canTravelerPass(traveler) {return strazce.curState == strazceDeadState; }
Super, tyhle konstrukce si zapamatuji a mohu vesele využívat dále.
Zajímavé je, že u živého strážce: věci, které má viditelně na sobě, mohu prozkoumat, ale příkaz:
>vezmi kresadlo
Nepřipadá Ti vhodné dotýkat se mrtvoly!
Zkusil jsem dočasně zakomentovat řádek :
cannotReachFromOutsideMsg(dest) { return 'Nepřipadá Ti vhodné dotýkat se mrtvoly!'; }
ale ejhle, nyní dostávám příkaz:
>vezmi strazce
Strážce je příliš daleko.
No jo, v prvním případě je to jasné, věci jsou příliš daleko a pokud se jich snažím dotknout, hra vypisuje hlášení za return. Teď mě napadá, chtělo by tam vložit nějaký if – else s kontrolou, je-li strážce naživu.
Konstrukci jsem tedy připravil, se syntaxí jsem se inspiroval Tvým manuálem v sekci Akce bez objektu - modify JumpAction. Vše se zdá OK a překlad v pořádku proběhne, při pokusu o příkaz vezmi kresadlo Workbench vyhodí chybu Tads runtime – string value required a otevře se mi soubor cs_cz.t, kde žlutá šipka ukazuje na řádek match = rexSearch(patSpecial, str, idx);.
S podobnou chybou už jsem se v minulosti setkal, jen si nepamatuji, kde přesně, tehdy jsem ještě nic o systému nevěděl. Mohu poprosit o vysvětlení, nejen, zda je chyba v mé if – else konstrukci, ale také je-li to chyba sémantická nebo syntaktická, pokud se vyjadřuji správně, o těchto jsem v minulosti při svých pokusech s Pascalem slýchal. Transkript a zdroják zasílám v příloze.
Ještě jsem si všiml malé chybky v překladu nebo u mě v deklaraci postavy hráče, pokud tento umírá, objeví se chybný střední rod:
Strážce se na tebe se strašlivým řevem vrhl a celkem snadno ukončil tvůj život.
*** ZEMŘELO JSI ***