1. Ještě jednou k metodikám a rychlým aktualizacím
Tak tady jsem špatně propojil skrumáž s agilním programováním, pokud jej dobře chápu, setkal jsem se právě s agilním stylem u doprogramování modulů IS – systém byl hotov, účetní, logistici apod. měli určité požadavky, které jsem já předával vývojářům a společně s oběma stranami testoval. Na základě této vazby jsme pak klidně změnili zadání, protože ne vždy se účetnímu podařilo správně definovat svůj požadavek.
Na generování dokumentace ze zdrojových kódů jsem se již ptal u TADSu, zde jsi mi potvrdil, že právě Library je takto připravena. HTML dokumentace, o které píšeš, je v takovém případě samoúčelná a zase naplňuje nějaké ty tabulky výkonnosti týmu, ale buďme upřímní – nebyli bychom v práci stejní? Když si vzpomenu na svoje zaměstnanecká léta IT špecialisty, každý den jsem se setkával se záplavou požadavků, co zase nefunguje na stanicích, proč nejede tiskárna, chudákovi manažerovi se jeho nejnovější mobilák nedokáže synchronizovat s Autlukáčem, jaktože najednou nefunguje pdf výstup ze SAPu… Kolega se věčně musel vrtat na linuxovém serveru, protoře požadavky jen pršely a např. po čerstvé instalaci nové verze Oracle musel vychytávat jejich chyby… no a vývojáři eshopu postavené právě nad touto databází si museli užívat to samé, nebyli poté rádi, že si dokumentaci odbyli právě tak zjedodušeně jak píšeš a měli pocit hotové práce? Nevím… já jsem v té době vždy záviděl „starým“ správcům, kteří v devadesátých letech měli na starost jenom kontrolu terminálů připojených k síti starým kulatým ethernetem a hlavní činnost byla denní záloha dosového účetnictví na disketu…
A paradoxně teď, když dělám ouplně jinou práci a na sebe, mám mnohem více času na Linux a konečně už i na to programování, které mě dříve vůbec nechytalo, ale cítil jsem, že už mě jen správa nebaví a rád bych něco vytvořil. Proto díky za TADS a Tvůj čas, baví mě to čím dál tím více a Tvé rady mi připadají jako rady učitele, který nemá v popisu práce jen nějaký teoretický výzkum, ale učí to čerstvé, s čím denně pracuje. Už teď máš u mě pořádnou projížďku na koni, což je alespoň malý revanš za Tvůj čas.
Ha, píšeš o udržování dokumentace QT Creatoru a dere Tě rychlý vývoj – ano, vždy, když jsem nastoupil do nové práce, první činnost bylo projetí dokumentace a její aktualizace plus někdy úsměvná kontrola serverovny a zjištění, co tu za těch X let, kdy se na to nikdo nedíval, vlastně všechno běží… Čím jsem starší, tím dokumentaci beru jako důležitější věc, proto mě ve světě Linuxu moc zaujal Arch, který i přes čerstvé balíčky má opravdu příkladnou wiki. RHEL a SUSE také, ta v Archu je ale dle mého názoru určena spíše pro praktické použití a krásně vysvětluje konkrétní problémy, na které bych se jako uživatel ptal. Klobouk dolů tohle v takové kvalitě udržovat. Tady např. Debian nebo Slackware nemají návody tak dobře zpracované. Otázka zní, zda to tým Archu bude i v budoucnu zvládat, systémy nám stále bobtnají, s čímž se asi nedá nic dělat. Další zajímavost je OpenBSD, zde je mi velmi sympatická jejich snaha nepřidávat bezhlavně nové funkce, ale spíše zeštíhlovat kód a integrovat pouze aplikace podrobně zdokumentované. Prošel jsem si jejich manuálové stránky, na server paráda, pro desktop mi samozřejmě více sednou ty z Archu, což je dáno směrováním obou systémů. Jenomže v OpenBSD nemám Wine a nabídka aplikací je menší plus jejich naprostá ignorace českého jazyka mi zatím nedovoluje s ním aktivně pracovat. Mnoho jejich myšlenek mi ovšem sedne, takže uvidím – naštěstí je zde na výběr a do budoucnosti nevidím a ani nechci.
2. Akce a referenční příručka plus vhodný styl hledání
Ano, určitě souhlasím, že na každou akci bych se měl podívat do Library, to se snažím dělat. Pro mě je zatím největší problém nalézt jak je daná akce pojmenována, pár jich už v paměti držím a další budou přibývat s postupem času, to asi jinak nelze.
Ano, akci PutBehind krásně popisuješ, objekt, který chci za něco umístit, musím držet a protože verify je prázdné, lze tak učinit. Ale každý objekt má implicitně verify nastaven na illogical, které v takovém případě musím potlačit, přesně tak jak jsi psal minule u příkladu se senem. U oblékání musím přetížit verify, které mělo původně implicitně nastavenou hodnotu illogical a ještě musím kontrolovat, zda konkrétní věc na sobě nemám. Teprve poté se může provést akce s oblékáním. A je zde precondition, která je stejná, jako u prvního příkladu PutBehind.
Tak a díky tomuto příkladu už vidím svojí chybu, kterou provádám při hledání v příručce. Dejme tomu, že se potřebuji podívat na definici právě PutBehind:
V Library si klidnu v levém sloupci na P a naleznu řádek PutBehindAction - class in actions.t[1939]. Rozkliknu si PutBehindAction a následně příklad pod číslem 1939. Vidím však jen následující definici:
DefineTIAction(PutBehind)
;
která mi toho opravdu mnoho neřekne, takže začnu laborovat, co s tím. A teď babo raď, jak se mám doklikat k Tebou popisovanému kódu "PutBehind" action? Je mi jasné, že vše naleznu v popisu třídy Thing, to ale vím až teď od Tebe a samotného by mě nenapadlo spávné hledání. OK, zatím si tedy grepnu řetězec "PutBehind" action a nechám se překvapit, co získám. Konečně mě příkaz:
grep -Ri ""PutBehind action"" ./
odkazuje na
www.tads.org/t3doc/doc/libref/source/thing.t.htmlKdyž si nyní v Library rozkliknu vlevo thing.t a následně vpravo source file, Tebou popsaný PutBehind je zde. A jak jsem předpokládal, můj skromný jednořádkový příkaz naleznu také, pokud si vlevo nahoře rozklidnu actions.t .
Takže suma sumárum si také musím zapamatovat, že na akce, které se vážou k předmětu, je nutno juknout se taky do popisu Thing. To je cenná zkušenost, bezva.
3. Kaluž
Právě Immovable mě napadlo jako ideální řešení pro věc, kterou nemohu sebrat. Žádný podobný příklad v referenčních hrách nebo na fóru jsem nenalezl. Bezva nápad s přidáním specialDesc, popis místnosti je hnedle živější, budu jej používat mnohem častěji v další hře. Tak a už se dívám na popis class Immovable: NonPortable a klik na 1998 mě správně odkáže na object.t. A tady v popisu mimo jiné vidím „ The messages to use for the failure messages.“ a hnedle pod tím CustomImmovable přesně tak jak píšeš. Bezva příklad jsem našel i v Základně, soubor regionShip.t – objekt ship: MultiLoc, Fixture. Vše jsem doplnil také ke střepům a senu.
Dokumentace k TADSu je tedy parádní, budu s ní ještě podrobněji pracovat, teď už si v ní připadám skoro jako doma na wiki Archu.
4. Rozbití koule
Ano, tohle také musím prozkoumat v Library. Už se dívám na dobjFor(AttackWith), ano, vidím zde verify() { }, takže akci mohu provést a mažu jej ze své definice. V action zprávu mám, to by mělo být OK. Zde jsem zkoušel různé konstrukce, zatím se mi však nepodařilo zprovoznit jak příkaz „rozbij kouli sekerou“, tak „zaútoč na kouli sekerou“.
Pokusil jsem se dle Tvého doporučení využít:
dobjFor(AttackWith)
{
check()
{
if (gIobj != sekera)
failCheck('Kouli holýma rukama nerozbiješ. ');
}
action()
{
"Rozbil jsi skleněnou kouli sekerou, kapalina vytekla na zem a všude kolem jsou rozházené střepy. ";
sklenena_koule.moveInto(nil);
kaluz.discover();
strepy.discover();
}
}
dobjFor(Break) asDobjFor(Attack)
Zde ovšem mohu využít pouze příkaz „rozbij kouli sekerou“, jiný nelze.
Nejlépe mým potřebám zatím vyhovuje definice:
dobjFor(Break)
{
verify() {}
check()
{
if (!sekera.isIn(me))
failCheck('Kouli holýma rukama nerozbiješ. ');
}
action()
{
"Rozbil jsi skleněnou kouli sekerou, kapalina vytekla na zem a všude kolem jsou rozházené střepy. ";
sklenena_koule.moveInto(nil);
kaluz.discover();
strepy.discover();
}
}
dobjFor(Attack) asDobjFor(Break)
Kde mohu použít „rozbij kouli“ nebo „zaútoč na kouli sekerou“, nefunguje pouze „rozbij kouli sekerou“.
Píšeš ovšem, že definice dobjFor(AttackWith) asDobjFor(Break) není správná, protože melze přesměrovávat akce se dvěma objekty na akci s jedním objektem. Pokud řádek zakomentuji, mohu využít „rozbij kouli“, ovšem „zaútoč na kouli sekerou“ už samozřejmě nefunguje.
Pokud využiji u své konstrukce dobjFor(Break) řádek dobjFor(Attack) asDobjFor(Break), nyní mohu použít „rozbij kouli“ a také „zaútoč na kouli“, jen nesmím vypisovat čím.
Pokud využiji Tvojí konstrukci dobjFor(AttackWith) a řádek dobjFor(Attack) asDobjFor(Break), mohu pouze „zautoc na kouli sekerou“.
Zkoušel jsem definovat nové Verbrule a vyzkoušel u své i Tvé konstrukce:
VerbRule(rozbij_cim)
('rozbij' | 'rozbít') singleDobj singleIobj
| ('rozbij' | 'rozbít') singleIobj singleDobj
: AttackWithAction
verbPhrase = 'rozbít/rozbíj{íš}/rozbil{a} (co) (čím)'
isPrepositionalPhrasing = nil
omitIobjInDobjQuery = true
askDobjResponseProd = singleNoun
askIobjResponseProd = singleNoun
;
Výsledek je trochu jiný, ale stále neuspokojí:
rozbij kouli sekerou
Skleněnou koulí nemůžeš zaútočit.
Zatím tedy ponechám mojí konstrukci dobjFor(Break), která umožňuje rozbít nebo zaútočit na kouli v případě, že má hráč v inventáři sekeru, jen není možné napsat „rozbij kouli sekerou“ nebo „zautoc na kouli sekerou“. Sakra, tohle není sranda, budeš-li mít možnost, prosím jukni na mojí definici.
5. Templates
Výborně, soubor TemplatesQref.PDF se bude hodit, mám uloženo.
6. Seno
Metodu dobjFor(Burn) jsem změnil na dobjFor(BurnWith) a musel jsem trochu upravit definici pochodně. Ano, používat název třídy určitě není vhodné, pojmenoval jsem jí jako pochodeň a přidal PreferredIobj podobně jako u křesadla. Metodu iobjFor(BurnWith) jsem prozkoumal v Library, v tomto případě je na rozdíl od křesadla vhodné použít preCond = [objHeld, objBurning], zkoušel jsem do hranatých závorek „isLit“, to ale není možné a manuál vše krásně popisuje. Díky za upozornění, měl jsem chybu v definici dobjFor(BurnWith) s sena – chybné pochoden.isLit jsem změnil na !pochoden.isLit a nyní je zapálení sena konečně v suchu.
7. Namočení jehly a VerbRule
V mém případě namáčím co - jehlu, což je dobj kam - do kaluže, což je iobj, jasné. Ano, vím že akce PutIn předmět položí a hráč jej musí zdvihnout, což mi zde nevadí, píšeš, aby mě to u jiných situací nepřekvapilo, myslíš tedy např. tehdy, když budu potřebovat, aby hráč předmět z inventáře nepoložil a po např. po namočení v jedu mu tam zůstal?
Definoval jsem 3 nové VerbRule, nyní mohu využít příkaz „namoč jehlu“, „namoč jehlu v kaluži“ a „namoč jehlu do kaluže “ - jasné, zapomněl jsem definovat prázdnou předložku, kterou si TADS doplní, v a do, upravil jsem i předchozí VerbRule, které jsem dříve definoval se správnými koncovkami.
Je toho jak vidím ještě stále dosti k dodělání, to ale nevadí, na téhle hře se mnohé naučím a tak to má být.
Krásný víkend přeje Orel