JARDARŮV PŘÍKLAD POUŽITÍ PROMĚNNÝCH VE FGBE
Optimalizováno pro rozlišení min. 1024x768, verze 1.2 (pro novější
verze kontrolujte na
http://textovky.webpark.cz
sekci vývoj)
Předpokládám, že máte pořádně prostudovaný manuál FGBE.
V první části návodu zopakuju obecné informace o proměnných a
podmínkách. Jejich použití ukážu na jednoduchých (někdy i na první
pohled nesmyslných) příkladech. Druhá část návodu je věnována
konkrétním řešení daných situací.
Velmi důležitá poznámka: Zapisujte si nejlépe do
samostatného souboru každou proměnnou, kterou jste použili a k jakému
účelu. Snáze se pak hledají případné chyby.
1. část - podmínky a proměnné
2. část - řešení situací
3. část - složité podmínky a "bitové proměnné"
4. část - podmínky, cykly a "proměnná v proměnné"
1. ČÁST - PODMÍNKY A PROMĚNNÉ
Proměnnou můžeme použít např. pro zaznamenání nějaké
"abstraktní" události (hráč něco objevil, slyšel atd.), hráč si vybral
určité povolání apod. Možností použití je spoustu. Pomocí
zaznamenaných proměnných pak můžeme reagovat na hráčovu akci (akce
-> reakce).
Hodnota uložená v proměnné v ní zůstane až do konce hry, pokud ji
nezměníte. Všechny proměnné mají při spuštění nové hry nulovou hodnotu.
Základy použítí podmínek a proměnných
Příklad: hráč navštívil poprvé kováře, promluvil s ním a
dozvěděl se jeho jméno. Při další návštěvě u kováře změníme text.
<10>
<text obsah="Vešel jsi do kovárny.">
[promenna 1="1"] další vstupy
<text obsah="Vidíš Helgona.">tento text se zobrazí, je-li proměnná 1 rovna 1
...
[/]
[promenna 1="0"] první vstup
<text obsah="Vidíš kováře.">text se zobrazí, je-li proměnná 1 rovna 0
...
[/]
<promenna 1="1">nastavení proměnné 1. Musí být až za podmínkami!
...
Nastavení proměnné musí být až za rozhodovacími pomínkami. FGBE
vykonává jednotlivé tagy postupně za sebou. Pokud bychom proměnnou
nastavili hned na začátku, podmínka "první vstup" by nikdy nebyla
splněná.
Příklad: Hráč má na začátku možnost si zvolit speciální
schopnost obchodník nebo gambler. Když si vybere obchodníka, zvýší se
jeho schopnost smlouvání v obchodech a dostane za věci lepší cenu.
Pokud si vybere gamblera, bude mu více nakloněná štěstěna.
<1>
<text obsah="Výběr schopnosti.">
<menu odkaz="2" popis="Obchodník">
<menu odkaz="3" popis="Gambler">
<2>
<text obsah="Zvolil jsi obchodník. Tvá schopnost obchodování je vyšší.">
<promenna 1="1">
<menu odkaz="4" popis="Dál">
<3>
<text obsah="Zvolil jsi gambler. Tvé štěstí je vyšší.">
<promenna 1="2">
<menu odkaz="4" popis="Dál">
...
Na začátku byla provedena volba schopnosti. Pro pozdější určení, co si
hráč zvolil, jsem použil proměnnou 1. Když si vybral obchodníka, do
proměnné se uložila hodnota 1. Když si vybral gamblera, do proměnné se
uložila hodnota 2.
Nyní hráč dorazil do obchodu a chce prodat získané věci.
[promenna 1="1"] = obchodník
<prodej typ="predmety" procent="50"> vykoná se, pokud si hráč vybral obchodníka
[/]
[promenna 1="2"] = gambler
<prodej typ="predmety" procent="30"> vykoná se, pokud si hráč vybral gamblera
[/]
Když si hráč vybral obchodníka, dostane za prodávané věci 50 procent z
nákupní ceny. Když si zvolil gamblera, dostane jen 30 procent.
Teď opačně něco ke štěstí.
<text obsah="Jdeš po cestě a nedáváš pozor. Zakopnul jsi o kámen.">
[promenna 1="1"] = obchodník
<text obsah="Při pádu ses poranil. Na cestě leží vyvrácený kámen."> vykoná se, pokud si hráč vybral obchodníka
<zivoty minus="2">
[/]
[promenna 1="2"] = gambler
<text obsah="Pod vyvráceným kamenem jsi našel 5 zlatých."> vykoná se, pokud si hráč vybral gamblera
<penize plus="5">
[/]
Když si hráč zvolil gamblera, měl štěstí, nic se mu nestalo a navíc
našel 5 zlatých. Když si hráč zvolil obchodníka, zranil se a nic
nenašel.
Použití stavu/vlastnosti postavy v podmínkách
Podle vlastnosti postavy potřebujeme provést nějakou akci.
Příklad: vykopnutí dveří, závisí na síle postavy, jestli se to
podaří.
[sila 111<"5"]
<text obsah="Dveře tvému kopu odolaly."> = síla je menší než 5, nepovede se to
...
[/]
[sila 1>"4"]
<text obsah="Kopem jsi rozrazil dveře."> = síla je větší než 4, povede se to
...
[/]
Na hodnotě čísla v první části podmínky (před znakem porovnání)
nezáleží, může tam být jakékoliv číslo. Doporučuju si zvyknout na jednu
hodnotu, nejlépe 1 a tu pak používat stále. Číslo tam být musí pro
zachování kompatibility s ostatními typy podmínek.
Příklad: Podle typu zbraně, kterou postava má v ruce, se provede
odlišná akce.
[cislozbrane 1="1"]
Postava má v ruce zbraň číslo 1
<text obsah="Ve světle zbraně jdeš širokou chodbou na jih, na stěnách jsou různé výjevy ze života domorodců.">
...
[/]
[cislozbrane 1>"1"]
Postava má jinou zbraň než 1
<text obsah="Jdeš po tmě na jih. Chodba je široká. Budeš se držet při stěně po tvé pravé ruce nebo po levé?">
...
[/]
Příklad: Podle množství peněz, které hráč má u sebe, mu bude
nabídnuto několik možností.
<text obsah="Dar chrámu - kolik stříbrňáků dáš?">
[penize 1>"9"]
Má víc než 9 stříbrňáků
<menu odkaz="269" popis="10">
[/]
[penize 1>"99"]
Má víc než 99 stříbrňáků
<menu odkaz="270" popis="100">
[/]
<menu odkaz="267" popis="nic">
Proměnné a speciální proměnné s uvozujícím znakem $ (s prefixem $)
Proměnnou s prefixem $ můžeme použít ve všech tagech, kde je
vyžadován číselný parametr.
Příklad: trochu modifikuju předchozí příklad s volbou schopnosti
obchodník a gambler
<1>
<text obsah="Výběr schopnosti.">
<menu odkaz="2" popis="Obchodník">
<menu odkaz="3" popis="Gambler">
<2>
<text obsah="Zvolil jsi obchodník. Tvá schopnost obchodování je vyšší.">
<promenna 1="50">
<menu odkaz="4" popis="Dál">
<3>
<text obsah="Zvolil jsi gambler. Tvé štěstí je vyšší.">
<promenna 1="30">
<menu odkaz="4" popis="Dál">
...
Začátek zůstal podobný jako předtím, pouze jsem do proměnné 1 uložil
procenta pro tag prodej. Když si hráč vybral obchodníka, do proměnné 1
se uložila hodnota 50. Když si vybral gamblera, do proměnné 1 se
uložila hodnota 30.
Nyní hráč dorazil do obchodu a chce prodat získané věci.
<prodej typ="predmety" procent="$1">
Původní dvě podmínky se "smrskly" na jeden řádek. Do procent FGBE
doplní hodnotu proměnné 1, to určuje právě prefix $.
Další část příkladu zůstane v tomto případě stejná jako dřív, pouze se
změní hodnota v podmínkách.
<text obsah="Jdeš po cestě a nedáváš pozor. Zakopnul jsi o kámen.">
[promenna 1="50"] = obchodník
<text obsah="Při pádu ses poranil. Na cestě leží vyvrácený kámen."> vykoná se, pokud si hráč vybral obchodníka
<zivoty minus="2">
[/]
[promenna 1="30"] = gambler
<text obsah="Pod vyvráceným kamenem jsi našel 5 zlatých."> vykoná se, pokud si hráč vybral gamblera
<penize plus="5">
[/]
Příklad: hráč může najít kožený oblek, ten ho trochu ochrání
před následky putování divočinou
<promenna 1="2"> = oblek snižuje způsobené zranění o 2
...
<50>
<text obsah="Cesta pokračuje dál trnitým houštím">
<vzorec 2="3-$1">trnité houští způsobí zranění -3 životy
pokud má hráč oblek, utrpí menší zranění, sníží se o hodnotu proměnné 1
<zivoty minus="$2"> = hodnota životů se sníží o hodnotu proměnné 2, tj. o 1 (s oblekem) nebo o 3 životy (bez obleku)
Jestliže hráč dříve našel oblek, do proměnné 1 byla uložena hodnota 2.
Vzorcem vypočítáme výsledné zranění, proměnná 2 = 3 - hodnota proměnné
1 (<vzorec 2="3-$1">). Výsledek pak odečtemě od životů (
<zivoty
minus="$2">).
Proměnnou s prefixem $ můžeme použít i v podmínkách
Příklad: Potřebujeme porovnat množství dvou předmětů, které má
hráč v inventáři, a podle toho rozhodnout co dál.
<pocetpredmetu 10="1"> do proměnné 10 uloží počet předmětů 1 - předmět 1 je malina
<pocetpredmetu 11="2"> do proměnné 11 uloží počet předmětů 2 - předmět 2 je sklenice
[promenna 11<"$10"]
<text obsah="Můžeš vyrobit pouze $11 malinových zavařenin. Máš málo sklenic.">
...
[/]
[promenna 11="$10"]
<text obsah="Můžeš vyrobit $11 malinových zavařenin.">
...
[/]
[promenna 11>"$10"]
<text obsah="Můžeš vyrobit pouze $10 malinových zavařenin. Máš málo malin.">
...
[/]
Speciální proměnné s prefixem $
Ve FGBE jsou definovány speciální proměnné jako jsou vlastnosti
postavy, penize, zkušenosti apod., které můžeme použít pro různé účely.
Vlastnosti postavy jsou $zivoty, $maxzivoty, $mana, $maxmana,
$sila, $obratnost, $rychlost, $energie, k nim existují ekvivalenty
$cistyVlastnost (bez účinků zbraní a zbrojí) a $startVlastnost
(vlastnosti na počátku hry, případně od posledního volání funkce
ulozpocatecnivlastnosti).
<promenna 1="$sila"> do proměnné 1 uložíme velikost síly
<promenna 2="$cistymaxzivoty"> do proměnné 2 uložíme počet maximálních životů
<promenna 3="$penize"> do proměnné 3 uložíme počet peněz
<promenna 4="$zkusenosti"> do proměnné 4 uložíme počet zkušeností
<promenna 5="$vysledeksouboje"> do proměnné 5 uložíme výsledek souboje, jestliže měl parametr neumírej
S takto uloženými speciálními proměnnými můžeme dál pracovat (odložit
si stav, modifikovat hodnotu atd.).
Příklad: Ukážu na příkladu se soubojem v aréně. Po souboji bude
mít hráč stejné množství životů jako před ním. Obrana trenéra se bude
odvíjet od vaší síly. Představte si to jako situaci - bojový výcvik v
aréně.
<promenna 1="$zivoty"> odložíme si před soubojem životy
<vzorec 2="$sila + 2"> do proměnné 2 uložím sílu
a zvyším hodnotu promenne 2 o 2 - ztížím tím souboj
<souboj jmeno="Trenér" utok="2k5+0" poskozeni="0" obrana="$2" tvrdost="0" zivoty="40" xp="0" neumirej="1">
Obrana trenéra se bude zvyšovat se vzrůstající sílou postavy
<zivoty je="$1"> po souboji obnovíme původní životy
<promenna 20="$vysledeksouboje">
[PROMENNA 20="0"]
<text obsah="Prohráls">
[/]
[PROMENNA 20="1"]
<text obsah="Remíza!">
[/]
[PROMENNA 20="2"]
<text obsah="Vyhráls!">
<sila plus="1">
[/]
2. ČÁST - ŘEŠENÍ SITUACÍ
Všechny dále uvedené příklady jsou pouze návodem, jak danou situaci
řešit. V příkladech používám kouzla a předměty nadefinované v .gbs
souborech z mojí hry "Čarodějný soumrak". A k čemu se proměnné dají
použít?
Vyhodnocení náhody
Náhoda může ovlivňovat hru. Jakým způsobem? Ukážu pár příkladů.
1. herní situace - zakopli jste a zranili jste se
<nahoda 1="1k2+1"> = do proměnné 1 se uloží výsledek náhody - hodnota 2 nebo 3
<zivoty minus="$1"> = počet životů se sníží o výsledek náhody.
<text obsah="Zakopl jsi o kořen a upadl. Ztratil jsi $1 životy.">
V textu nemusí být nutně informace o ztracených životech. Vypisuje se ve stavovém okně hry. Může se to ale někdy hodit.
2. herní situace - trháte plody trnitého keře
<text obsah="Otrhal jsi zelené bobule, je jich 10 hrstí.">
<predmet 1="10">
<nahoda 1="1k6"> = do proměnné 1 se uloží výsledek náhody - hodnota 1 až 6
[promenna 1<"4"]
Je-li výsledek náhody menší než 4, ztratíte 2 životy
<text obsah="Byl jsi nepozorný a zranil ses o ostré trny, ztrácíš 2 body života.">
<zivoty minus="2">
[/]
3. herní situace - rozhodli jste se jít podél hluboké propasti
po tmě
<1>
<nahoda 1="1k6"> = do proměnné 1 se uloží výsledek náhody - hodnota 1 až 6
[promenna 1<"3"]
Je-li výsledek náhody menší než 3, máte smůlu
<text obsah="Setmělo se a nevidíš na cestu. Najednou jsi ztratil půdu pod nohama. Zřítil ses do Propasti!">
<zivoty je="0"> = SMRT
[/]
[promenna 1>"2"]
Je-li výsledek náhody větší než 2, máte štěstí
<text obsah="Setmělo se a nevidíš na cestu. Musíš si ustlat tam, kde jsi.">
<menu odkaz="2" popis="Jdeš spát">
[/]
<2>
...
4. herní situace - rozhodli jste se jít po tmě podél hluboké
propasti, máte amulet ochrany
Popis: Ve hře můžete najít amulet ochrany. Pokud ho vlastníte,
amulet ovlivní výsledek náhody ve váš prospěch tak, že k výsledku
náhody se přičte hodnota 2. Jsou dvě možná řešení: rozhodováním pomocí
podmínek nebo pomocí jednoduché operace s proměnnou. Ukážu obě varianty
na příkladu.
Řešení pomocí rozhodovací podmínky - nevýhodou je použití podmínky u
každé náhody. Prodlužuje se a znepřehledňuje se tím zdrojový kód hry.
<50>
<objekt 1="1" jmeno="Amulet ochrany" popis="Chrání svého vlastníka">
...
<100>
<nahoda 2="1k6"> = do proměnné 2 se uloží výsledek náhody - hodnota 1 až 6
[objekt 1>"0"] = zjištění vlastnictví amuletu
<zvyspromennou 2="2">
[/]
[promenna 2<"3"]
Je-li výsledek náhody menší než 3, máte smůlu
<text obsah="Setmělo se a nevidíš na cestu. Najednou jsi ztratil půdu pod nohama. Zřítil ses do Propasti!">
<zivoty je="0"> = SMRT
[/]
[promenna 2>"2"]
Je-li výsledek náhody větší než 2, máte štěstí
<text obsah="Setmělo se a nevidíš na cestu. Musíš si ustlat tam, kde jsi.">
<menu odkaz="101" popis="Jdeš spát">
[/]
<101>
...
Řešení pomocí proměnné - výsledek náhody se ovlivní přičtením
(odečtením) hodnoty proměnné 1. Proměnná 1 má hodnotu 0. Pokud najdete
amulet, nastaví se do proměnné 1 hodnota 2 (účinek amuletu).
<50>
<objekt 1="1" jmeno="Amulet ochrany" popis="Chrání svého vlastníka">
<promenna 1="2"> = našli jste amulet, do proměnné 1 se nastaví hodnota 2
...
<100>
<nahoda 2="1k6+$1"> = do proměnné 2 se uloží výsledek náhody - hodnota 1 až 6
a zároveň, jestliže máte amulet, se přičte hodnota 2 uložená v proměnné 1, jinak 0 (nic)
[promenna 2<"3"]
Je-li výsledek náhody menší než 3, máte smůlu
<text obsah="Setmělo se a nevidíš na cestu. Najednou jsi ztratil půdu pod nohama. Zřítil ses do Propasti!">
<zivoty je="0"> = SMRT
[/]
[promenna 2>"2"]
Je-li výsledek náhody větší než 2, máte štěstí
<text obsah="Setmělo se a nevidíš na cestu. Musíš si ustlat tam, kde jsi.">
<menu odkaz="2" popis="Jdeš spát">
[/]
<2>
...
Souboj
V některých případech, kdy nevíte v jakém okamžiku hry hráč danou
lokaci navštíví, je potřeba upravit vlastnosti nepřítele podle
schopností postavy. Může se to za určitých okolností hodit. Osobně
radím používat této možnosti s rozvahou.
1. herní situace - v zákoutí vás přepadně vrah
Popis: Působilo by divně, kdyby vrahovy vlastnosti byly tak
nízké, že ho snadno porazíte nebo naopak vrah by porazil snadno vás a
vy byste neměli žádnou šanci.
Je potřeba si trochu vyhrát s nastavením atributů, nejlépe je vyzkoušet
ve hře.
určení atributů protivníka
<promenna 32="$obratnost">
<vzorec 33="$sila+4"> = souboj trochu ztížím o 4
<vzorec 34="$maxzivoty+5"> = souboj trochu ztížím o 5
definování souboje
<souboj jmeno="vrah" utok="1k6+$32" poskozeni="2" obrana="$33" tvrdost="2" zivoty="$34" xp="200">
Poznámka: Vysoké atributy nepřítele se dají také
využít k zabránění pokračování v cestě hráči. Např. situace: hráč
přijde na rozcestí. Může se vydat na východ nebo na západ. Když půjde
na západ, narazí na draka, na kterého je ještě příliš slabý. Může jít
tedy jen na východ.
Použití u kouzel
Vaše postava umí na začátku hry několik kouzel. Ale určitá kouzla
účinkují na živé, jiná na nemrtvé. Dále účinek kouzel vzrůstá časem,
jak postava nabývá zkušeností.
Kouzla máte nadefinovaná v souboru kouzla.gbs.
...
4,"Roj","Na nepřítele se vrhne roj much, nepříteli se sníží obrana o 1, neúčinkuje proti nemrtvým",5,nobrana-1
5,"Roj","Na nepřítele se vrhne roj vos, nepříteli se sníží obrana o 2, neúčinkuje proti nemrtvým",5,nobrana-2
6,"Roj","Na nepřítele se vrhne roj sršňí, nepříteli se sníží obrana o 3, neúčinkuje proti nemrtvým",5,nobrana-3
...
14,"Léčení","Vyléčí ti až 3 životy",2,zivoty+3
15,"Léčení","Vyléčí ti až 4 životy",2,zivoty+4
16,"Léčení","Vyléčí ti až 5 životů",2,zivoty+5
17,"Léčení","Vyléčí ti až 6 životů",2,zivoty+6
18,"Léčení","Vyléčí ti až 7 životů",2,zivoty+7
19,"Svatá píseň","Zazní nebeská hudba, působí pouze proti nemrtvým, ubere jim 10 životů",10,nzivoty-10,energie-5
20,"Svatá píseň","Zazní nebeská hudba, působí pouze proti nemrtvým, ubere jim 15 životů",10,nzivoty-15,energie-5
21,"Svatá píseň","Zazní nebeská hudba, působí pouze proti nemrtvým, ubere jim 20 životů",10,nzivoty-20,energie-5
22,"Nebeský štít","Zvýší tvoji obranu o 1 a uzdraví tě o 10 životů",10,zivoty+10,obrana+1
Asi vás napadne otázka, proč jsou jednotlivá kouzla nadefinovaná
několikrát. Jak postava získává zkušenosti, sílí i její magický
potenciál. Po dosažení určité úrovně účinek kouzel zesílí, např.
postava bude umět místo kouzla 4 (roj) kouzlo 5 (roj - silnější).
Nejprve je třeba provést předpřípravu. Důkladně si promyslete svůj
systém kouzel. Pozdější změny jsou potom příliš pracné (z vlastních
zkušeností :-( ). Kouzlu, které budete ve hře povyšovat, přidělte
proměnnou, totéž platí pro kouzla, která mají účinkovat pouze na určité
tvory.
A to takhle:
- proměnná 204 - kouzlo Roj
- proměnná 214 - kouzlo Léčení
- proměnná 219 - kouzlo Svatá píseň
- kouzlu Nebeský štít proměnnou nepřidělím, není to potřeba,
postava se ho naučí a bude ho umět do konce hry beze změny
Pro přehlednost a snazší orientaci doporučuji přidělit proměnné tak,
aby se dalo snadno určit, o které kouzlo se jedná. Já jsem použil
způsob proměnná 200 + index kouzla v souboru kouzla.gbs. V celé hře
potom budete používat takto přidělené proměnné k daným kouzlům. K čemu
to je, ukážu na příkladech.
1. herní situace - umíte kouzla Roj, Léčení a Svatá píseň
Popis: Před soubojem s živým nepřítelem musíte kouzlo Roj
postavu "naučit" a pak zase "odnaučit". U souboje s nemrtvým je postup
analogický s kouzlem Svatá píseň. Kouzlo Léčení umí postava stále bez
ohledu na nepřítele.
<1>
začátek hry - nadefinování kouzel, věcí a zbraní
...
<promenna 204="4"> index kouzla Roj - účinkuje na živé
<kouzlo umime="14"> naučíme kouzlo Léčení
<promenna 214="14"> index kouzla Léčení
<promenna 219="19"> index kouzla Svatá píseň - účinkuje na nemrtvé
<menu odkaz="2" popis="Dál">
<2>
<text obsah="Ze stínu náhle vyskočila postava - kostlivec s mečem.">
<menu odkaz="3" popis="Bojuj">
<3> Souboj s nemrtvým
<vypniinfo> = je vhodné vypnout zobrazení informace v okně zprávy
<kouzlo umime="$219"> = před začátkem souboje naučíme kouzlo Svatá píseň
<zapniinfo>
<souboj jmeno="kostlivec" utok="1k5+1" poskozeni="1" obrana="5" tvrdost="0" zivoty="25" xp="50">
<vypniinfo>
<kouzlo neumime="$219"> = po souboji odnaučíme kouzlo Svatá píseň
<zapniinfo>
<text obsah="Když se kostlivec rozpadl na prach, chtěl si sebrat jeho meč, ale ozvalo se temné zavrčení.">
<text obsah="Kostlivec nebyl sám, proti tobě stojí vlk.">
<menu odkaz="4" popis="Bojuj">
<4> Souboj s živým
<vypniinfo>
<kouzlo umime="$204"> = před začátkem souboje naučíme kouzlo Roj
<zapniinfo>
<souboj jmeno="vlk" utok="1k5+2" poskozeni="3" obrana="4" tvrdost="2" zivoty="20" xp="50">
<vypniinfo>
<kouzlo neumime="$204"> = po souboji odnaučíme kouzlo Roj
<zapniinfo>
<text obsah="Po souboji sis otřel zpocené čelo a ostražitě ses rozhlédl kolem.">
...
2. herní situace - dosáhli jste třetí úrovně magie
Popis: V magické škole postoupíte na vyšší úroveň a naučíte se
silnější varianty kouzel.
Jak jsem výše uvedl, proměnná zůstává stále stejná pro dané kouzlo.
Pouze se mění index kouzla uložený v proměnné.
<1>
začátek hry - nadefinování kouzel, věcí a zbraní
...
<promenna 204="4"> index kouzla Roj
<kouzlo umime="14"> naučíme kouzlo Léčení
<promenna 214="14"> index kouzla Léčení
<promenna 219="19"> index kouzla Svatá píseň
<menu odkaz="2" popis="Dál">
<2>
...
<500>Jste v magické škole
<text obsah="Po třech týdnech intenzivní výuky jsi dostal výuční list mistra">
<vypniinfo>
<kouzlo neumime="$214"> = odnaučíme kouzlo Léčení
<promenna 204="5"> silnější kouzlo Roj
<promenna 214="16"> silnější kouzlo Léčení
<promenna 219="20"> silnější kouzlo Svatá píseň
<kouzlo umime="$214"> = naučíme silnější kouzlo Léčení
<zapniinfo>
<info obsah="Síla tvých kouzel se zvýšila" barva="aqua">
....
Větvení cest
V každém gamebooku se cesty rozcházejí a pak se opět setkávají.
Potřebujete vědět, kterou cestou se hráč vydal. Nejjednodušší způsob,
jak to zjistit, je použití proměnné.
1. herní situace - dorazili jste na rozcestí, obě vedou ke
stejnému cíli.
Pokud se vydáte hlavní cestou, nenajdete nic. Pokud půjdete pěšinou,
uvidíte zvláštní byliny.
<1>
<text obsah="Cesta vede mezi pastvinami na nichž se pasou stáda ovcí. Z široké cesty se odděluje pěšina.">
<menu odkaz="2" popis="Vydáš se pěšinou">
<menu odkaz="3" popis="Půjdeš dál po cestě">
<2>
<text obsah="Podél pěšiny kvetou zvláštní byliny, které jsi nikdy předtím neviděl.">
<promenna 1="1">Vydali jste se pěšinou
<menu odkaz="3" popis="Půjdeš dál">
<3>
<text obsah="Cesta rychle ubíhá, dorazil jsi do vesnice.">
<text obsah="Na návsi k tobě přišel stařík.">
<text obsah="Vidím, že máš mladé nohy, měl bych k tobě prosbu. Jsem alchymista a nohy už mi tolik neslouží.">
<text obsah="Potřeboval bych pár bylin. Byliny rostou ve vrchovině nad vesnicí podél cest, přišel jsi odtamtud.">
<text obsah="Stařík ti ukázal obrázek. Přines je, prosím, do mé laboratoře na návsi, dám ti odměnu.">
<menu odkaz="4" popis="Pokračování...">
<4>
[promenna 1="1"]
Šli jste pěšinou
<text obsah="Vzpomínáš si na byliny u pěšiny. Jdeš pro ně a ukládáš je do torny.">
<objekt 1="1" jmeno="Zvláštní byliny" popis="Byliny od cesty">
<menu odkaz="10" popis="Doneseš je alchymistovi">
[/]
[promenna 1="0"]
Šli jste po cestě
<text obsah="Vyrážíš hledat byliny. Do vrchoviny nad vsí vedou tři cesty. Po pravé jsi přišel, byliny tam nerostly.">
<text obsah="Kterou cestou se vydáš?">
<menu odkaz="5" popis="levou cestou">
<menu odkaz="6" popis="prostřední cestou">
[/]
...
Opakované používání jedné lokace
Máte nadefinováno několik hospod (jídlo, nocleh, nápoje), škol (výuka),
obchodů atd. na různých místech hry. Některé akce jsou stejné. Pokaždé
by je bylo nutné vytvořit znovu nebo zkopírovat (a tím nadělat chyby se
zapomenutými odkazy). Později se rozhodnete něco přidat nebo změnit.
Změnu musíte potom provést ve všech takových lokacích.
Jak ale volat lokaci opakovaně a vyřešit návrat zpět do potřebné
lokace? Použití tagu <zpet> nemusí být vždy dostačující.
Lze to vyřešit pomocí proměnné.
1.herní situace: Ve dvou vsích je hospoda se stejnou nabídkou
služeb.
<82> náves vsi Ztracená varta
<text obsah="Stojíš na návsi vesnice. V okolních staveních je hostinec, řemesla a stáje.">">
...
<94> hospoda ve Ztracené vartě
<text obsah="Jsi ve venkovské hospodě. Vidíš hrubě stlučené stoly a lavice. Přichází k tobě hostinský.">
<text obsah="»Co si budeš přát?«" barva="aqua">
<text obsah="">
<text obsah="Na vývěsce je nabídka" podtrzene="ano" >
<text obsah="Pivo - 5 stříbrňáků">
<text obsah="Jídlo - 10 stříbrňáků">
<text obsah="Nocleh se snídaní - 15 stříbrňáků">
<promenna 40="82"> nastavení návratové proměnné na náves u hospody
<menu odkaz="9211" popis="Pivo">
<menu odkaz="9203" popis="Jídlo">
<menu odkaz="9204" popis="Nocleh">
<menu odkaz="82" popis="Odejdeš">
<95>
...
<1000> náves vsi Běloves
<text obsah="Stojíš na návsi vesnice. V okolních staveních je hostinec, obchod, kovář a stáje.">">
...
<1010> hospoda v Bělovsi
<text obsah="Jsi ve venkovské hospodě. Jako lavice a stoly slouží prkna umístěná na různě vysokých špalcích.">
<text obsah="">
<text obsah="Na vývěsce je nabídka" podtrzene="ano" >
<text obsah="Pivo - 5 stříbrňáků">
<text obsah="Jídlo - 10 stříbrňáků">
<text obsah="Nocleh se snídaní - 15 stříbrňáků">
<promenna 40="1000"> nastavení návratové proměnné na náves u hospody
<menu odkaz="9211" popis="Pivo">
<menu odkaz="9203" popis="Jídlo">
<menu odkaz="9204" popis="Nocleh">
<menu odkaz="1000" popis="Odejdeš">
<1011>
...
<9203>;==========Dobré výživné jídlo v hospodě==================================
[penize 1<"10"]
<text obsah="Nemáš dost peněz.">
[/]
[penize 1>"9"]
<text obsah="Sedáš si na volné místo. Hostinský ti přinesl hromadu jídla a korbel piva.">
...
<penize minus="10">
[/]
<zpet> tohle je jednoduchá situace, tady si vystačíme s tagem <zpet>
<9204>;=========Nocleh v hospodě se snídaní=====================================
[penize 1<"15"]
<text obsah="Nemáš dost peněz.">
<zpet> hráč má málo peněz, tady stačí <zpet>
[/]
[penize 1>"14"]
<text obsah="Ráno tě hostinský probudil, po snídani jsi vyrazil.">
...
<menu odkaz="$40" popis="Odcházíš..."> po odchodu nebudete v hospodě, ale na návsi
<penize minus="15">
[/]
<9205>
...
<9211>;==========Pivo v hospode na vesnici================================
Určil jsem, že tři vypitá piva způsobí opilost, po pěti pivech hráč usne.
[penize 1<"5"]
<text obsah="Máš málo peněz.">
<zpet> hráč má málo peněz, tady opět stačí <zpet>
[/]
[penize 1>"4"]
<text obsah="Hospodský ti přinesl korbel dobrého piva.">
<zvyspromennou 104="1"> počítání piv
[promenna 104>"2"][promenna 104<"5"]
<text obsah="Jsi opilý."> tři až čtyři piva - opilost
... nadefinování nějakého trestu - třeba snížení obratnosti
[/][/]
[promenna 104="5"]
<text obsah="Usínáš opřený o stůl.">
<menu odkaz="9212" popis="Pokračování..."> po pěti pivech je hráč vyhozen na náves
[/]
[promenna 104<"5"]
<zpet> do pěti piv, může hráč sám odejít, tady stačí <zpet>
[/]
<penize minus="5">
[/]
<9212>;==========Probuzeni pred hospodou================================
<text obsah="Probouzíš se s bolestí hlavy v prachu za hospodou.">
...
<menu odkaz="$40" popis="Odejdeš"> hráč bude ráno na návsi před hospodou
<9213>
...
Opakované navštívení jedné lokace
Hráč má možnost opakovaně navštívit místo, kde už byl. Takže musíte
pozorně ošetřit všechny možné stavy, které z toho plynou. Ukážu to na
jednotlivých příkladech.
1. herní situace: Objevili jste zajímavou knihu, po jejím prvním
přečtení získáte zkušenosti. Po dalším už ne.
Popis: Po nalezení knihy si ji hráč může přečíst kolikrát chce.
Musí se ošetřit stav, aby zkušenosti nepřibývali stále s
každým dalším přečtením knihy.
<1>
<text obsah="Před tebou leží kniha.">
<menu odkaz="2" popis="Přečteš si ji">
<menu odkaz="3" popis="Podíváš se jinam">
<2>
[promenna 1="0"]
Pouze při prvním přečtení knihy přibydou zkušenosti
<text obsah="Přečetl sis zajímavou knihu a něco ses z ní naučil.">
<zkusenosti plus="500">
[/]
[promenna 1="1"]
Další čtení knihy
<text obsah="Přečetl sis zajímavou knihu.">
[/]
<promenna 1="1"> = Nastavení proměnné 1 na hodnotu 1, kniha byla minimálně jednou přečtená
<zpet>
<3>
<text obsah="Odcházíš.">
...
2. herní situace: Hráč navštívil lokaci, otrhal keř (nebo něco
sebral atd.) a pak se vrátil zpět.
Popis: Potom, co hráč otrhal keř s malinami, se vrátil zpět na
břeh potoka.
Maliny na keři už tedy nejsou.
TIP: Je také vhodné změnit i znění textu, působilo by
to divně, kdyby hráč k tomu potoku znovu přicházel.
<1>
[promenna 1="0"]
Po vstupu do lokace se vykoná tato podmínka.
<text obsah="Přicházíš k zurčícímu potůčku. Vedle na pasece rostou keře obsypané zralými malinami.">
<menu odkaz="2" popis="Sníš maliny">
[/]
[promenna 1="1"]
Po otrhání malin se vykoná tato podmínka.
<text obsah="Stojíš na břehu zurčícího potoka. Vedle na pasece rostou keře.">
[/]
<menu odkaz="3" popis="Půjdeš dál">
<2>
<text obsah="Nasytil ses malinami.">
<promenna 1="1"> = nastavení proměnné 1
<zpet>
<3>
<text obsah="Pokračuješ v cestě.">
...
3. herní situace - Hráč navštívil lokaci, postupně otrhal dva
keře (nebo sebral dvě věci apod.) a pak se vrátil zpět.
Předchozí situaci jsem rozšířil o další keř. Hráč má možnost si
zvolit otrhání obou keřů v libovolném pořadí.
Popis: Danou situaci je možné řešit pomocí dvou proměnných za
využití kombinovaných podmínek. Výsledkem jsou čtyři možné kombinace.
Ukážu možné řešení pouze s jednou proměnnou za pomoci "logického"
součtu. Teď trocha matematiky. Protože hráč může oba keře otrhat v
libovolném pořadí, proměnná může nabýt čtyř hodnot (2
2).
Bobulím přidělím hodnotu 1 (2
0). Malinám přidělím hodnotu 2
(2
1).
<1>
[promenna 1="0"]
Po vstupu do lokace se vykoná tato podmínka.
<text obsah="Přicházíš k potoku. Na břehu stojí trnitý keř s bobulemi. Vedle na pasece rostou keře obsypané malinami.">
<menu odkaz="2" popis="Natrháš bobule.">
<menu odkaz="3" popis="Sníš maliny">
[/]
[promenna 1="1"]
Po otrhání bobulí se vykoná tato podmínka.
<text obsah="Stojíš na břehu potoka. Na břehu stojí trnitý keř. Vedle na pasece rostou keře obsypané malinami.">
<menu odkaz="3" popis="Sníš maliny">
[/]
[promenna 1="2"]
Po otrhání malin se vykoná tato podmínka.
<text obsah="Stojíš na břehu potoka. Na břehu stojí trnitý keř s bobulemi. Vedle na pasece rostou keře.">
<menu odkaz="2" popis="Natrháš bobule">
[/]
[promenna 1="3"]
Po otrhání malin a bobulí se vykoná tato podmínka.
<text obsah="Stojíš na břehu potoka. Na břehu stojí trnitý keř. Vedle na pasece rostou keře.">
[/]
<menu odkaz="4" popis="Půjdeš dál">
<2>
<text obsah="Natrhal jsi bobule, je jich pět hrstí.">
<zvyspromennou 1="1"> = zvýšení proměnné o 1, logický součet
<predmet 1="5">
<zpet>
<3>
<text obsah="Nasytil ses malinami.">
<zvyspromennou 1="2"> = zvýšení proměnné o 2, logický součet
<zpet>
<4>
<text obsah="Pokračuješ v cestě.">
...
Varování: Tento způsob použití kombinace podmínek a
proměnných je pro více než 3 věci zcela nevhodný. Pro 3 věci je to osm
kombinací (2
3), pro 4 věci je to už šestnáct kombinací (2
4)
atd.
4. herní situace: Přišli jste ke stolu, sebrali lektvary a
prozkoumali svitek na stole.
Rozvinu předchozí situace a trochu je spojím dohromady. Tady už
jedna proměnná nestačí.
Popis: Po prvním příchodu leží všechny věci před tebou na stole.
Lektvary můžete sebrat. Svitek po přečtení vrátíte na stůl. Z toho
plynou tři různé možné stavy:
- Na stole je všechno - příchod, proměnná 1 má v tu chvíli hodnotu
0, pak se nastaví na 1.
- Na stole je svitek a neznámý lektvar - přečtení svitku a vrácení
zpět na stůl. Neznámý lektvar je stále na stole. Hodnota proměnné 1 se
nezmění.
- Na stole je svitek - po sebrání neznámý lektvaru hodnota proměnné
1 bude 2
Svitek je výukový, po jeho prvním přečtení se naučíte nové kouzlo. Po
dalším přečtení se nestane nic. Nastaví se druhá proměnná.
<1> lokace 1
<smazatinfo>
[promenna 1="2"] = Stav 3
po sebrání neznámého lektvaru
<text obsah="Na stole leží svitek.">
[/]
[promenna 1="1"] = Stav 2
neznámý lektvar je stále na stole
<text obsah="Na stole leží svitek a neznámý lektvar.">
[/]
[promenna 1="0"] = Stav 1
Tato podmínka se vykoná po prvním vstupu do lokace.
<text obsah="Na stole leží svitek a lahvičky s léčivým a magickým lektvarem a jedna s neznámou tekutinou.">
<text obsah="Bereš léčivý a magický lektvar a ukládáš do torny." barva="*00d0d0d0" kurziva="ano">
<predmet 3="1">
<predmet 4="1">
<promenna 1="1"> = Nastavení proměnné 1 na hodnotu 1
Nastavení proměnné 1 musí být poslední akcí v tomto podmínkovém bloku. FGBE vyhodnotí neplatnost podmínky.
<promenna 3="1"> = Tohle se již nevykoná (pouze pro ilustraci)
[/]
<menu odkaz="2" popis="svitek">
[promenna 1<"2"]
Neznámý lektvar je stále ještě na stole a lze ho tedy sebrat
<menu odkaz="3" popis="Neznámý lektvar">
[/]
<menu odkaz="4" popis="Podíváš se jinam">
<2> lokace 2
<text obsah="Držíš výukový svitek s kouzlem - magický šíp!>
[promenna 2="0"]
Tato podmínka se vykoná pouze poprvé.
<text obsah="Naučil ses nové kouzlo - Magická střela!" barva="*00d0d0d0" kurziva="ano">
<kouzlo umime="8">
[/]
<promenna 2="1"> = nastavení proměnné 2 na 1, kouzlo je naučeno
<zpet>
<3> lokace 3
<text obsah="Prohlédl sis lektvar a uložil ho do torny.">
<predmet 5="1">
<promenna 1="2"> = po sebrání lektvaru a návratu nastane stav 3
<zpet>
<4> lokace 4
<text obsah="Odcházíš od stolu">
...
Ve své hře jsem potřeboval pomocné menu (nazvané POMMENU, GAMEMENU
atd.), které by se dalo vyvolat „kdykoliv“ a ve kterém by byly
informace o stavu postavy, moje vlastní kouzla atd. FGBE přímo něco
takového nepodporuje, ale jde to udělat pomocí proměnných a speciální
proměnné $lokace. POMMENU je v podstatě rozšíření předchozích příkladů
„Opakované používání jedné lokace“ a „Opakované navštívení jedné
lokace“.
Při vytváření POMMENU je nutné dát pozor na jednu věc.
Po návratu z POMMENU se daná lokace znovu vykoná, takže je třeba
pozorně ošetřit vyhodnocení či nastavení proměnných, přidávání věcí,
peněz, zkušeností atd. Podle mého názoru je vhodné (ale to samozřejmě
záleží na každém, jak se k tomu postaví) omezit použití POMMENU v
lokacích u soubojů, příp. před bojem a také v lokacích, kde je
nastavováno a vyhodnocováno příliš mnoho podmínek, jejichž ošetření by
bylo příliš pracné.
Nejdříve ukážu, jak vytvořit pomocné menu a pak ukážu některá úskalí
související s jeho použitím.
Příprava: Pro pomocné menu si vyhradíte jednu proměnnou (v příkladu je
to 30), kterou není vhodné používat pro jiné účely. Dále musíte
pamatovat na zásadu, že proměnné, do kterých se v POMMENU zapisuje, by
se neměly používat ve hře také pro zápis a naopak. Tím se předejde
vzniku mnoha chyb způsobených „kolizemi“ proměnných. Já jsem si pro
zjednodušení přidal nastavení proměnné a vložení odkazu na POMMENU do
šablony PsPadu.
Příklad: Vytvoření POMMENU
<17> normální lokace
<text obsah="Přišel jsi ke stromu. Prohledáš jeho vnitřek?">
<menu odkaz="18" popis="Holí">
<menu odkaz="20" popis="Rukou">
<menu odkaz="21" popis="Půjdeš dál">
<promenna 30="$lokace"> vložení čísla lokace pro návrat, je vhodné použít speciální proměnnou $lokace
<menu odkaz="10000" popis="POMMENU" barva="*00909000"> volání POMMENU
<18>
...
<10000> lokace POMMENU
<smazatinfo>
Upozornění pro hráče
<text obsah="Po volbě zpět se vrátíš do stejné situace jako před vstupem sem." barva="*00a0a0a0" kurziva="ano">
Vypsání potřebných informací
<text obsah="ČAS: Je $100 hodin a $101 minut. Putuješ už $103. den." barva="green" tucne="ano">
<text obsah="POSTAVA" barva="yellow" tucne="ano" podtrzene="ano">
<text obsah="SPECIÁLNÍ SCHOPNOSTI:" barva="yellow" kurziva="ano">
<text obsah="lehký krok - schopnost ujít dle povahy terénu velké vzdálenosti bez únavy">
[objekt 2="1"]
<text obsah="ohnivý útok - před počátkem souboje zaútočí dráček na nepřítele">
[/]
.
.
.
[promenna 29="1"]
<menu odkaz="10001" popis="KOUZLO" barva="*00909000">
[/]
<menu odkaz="10050" popis="Úkoly" barva="*00909000">
.
.
.
<menu odkaz="$30" popis="zpět do hry"> návrat do hry
1. herní situace - v lokaci si hráč natrhá maliny a část jich sní
Popis: Po návratu z POMMENU text zůstane stejný, ale předměty
(jídlo) a životy nesmí být znovu přidány.
<43>
<text obsah="Snědl jsi maliny. Malin je tolik, že si nějaké bereš sebou.">
[promenna 30<>"$lokace"] přidání životů a předmětu se vykoná pouze jednou
<zivoty plus="2">
<predmet 2="1">
[/]
<menu odkaz="44" popis="Půjdeš dál">
<promenna 30="$lokace"> číslo kapitoly pro <zpet> z POMMENU
<menu odkaz="10000" popis="POMMENU" barva="*00909000">
<44>
...
2. herní situace: - v lokaci je tag nahoda
Popis: Náhoda se musí vyhodnotit pouze jednou, její výsledek
zůstane uložený v proměnné.
<52>
<text obsah="Prodíráš se porostem, znovu uslyšíš zakvílení a o něco zakopneš.">
[promenna 30<>"$lokace"] náhoda se vyhodnotí pouze jednou
<nahoda 32="1k6">
[promenna 32="1"]
<zivoty minus="1">
[/]
[/]
[promenna 32="1"] výsledek náhody je uložen v proměnné 32, text se zobrazí pokaždé, byla-li náhoda = 1
<text obsah="Při pádu sis odřel koleno!">
[/]
<text obsah="Vidíš liánu. Vypadá pevně, mohla by se hodit.">
<menu odkaz="53" popis="Sebereš liánu">
<menu odkaz="54" popis="Půjdeš dál">
<promenna 30="$lokace"> číslo kapitoly pro <zpet> z POMMENU
<menu odkaz="10000" popis="POMMENU" barva="*00909000">
<53>
...
Po návratu z POMMENU se zobrazí stejný text a životy se už znovu
neodečtou.
3. ČÁST - SLOŽITÉ PODMÍNKY A "BITOVÉ PROMĚNNÉ"
Složité podmínky
Potřeboval jsem realizovat identifikaci lektvaru za těchto podmínek
- identifikovat se smí jen jeden lektvar v jednom "kole"
- musí být na to dost peněz
- některé lektvary vyžadují vyšší znalosti pro identifikaci
V následující ukázce předmět 3 vyjadřuje "Neznámý lektvar", který má
hráč v inventáři. Předměty 7 až 10 a 28 jsou lektvary, které se hráči v
inventáři objeví po úspěšné identifikaci.
Pro určení neznámých lektvarů, které hráč našel, používám proměnné 251
až 255:
- 251 - neznámý lekvar - lektvar života
- 252 - neznámý lektvar - Všelék
- 253 - neznámý lektvar - Hadí krev
- 254 - neznámý lektvar - Dryják
- 255 - neznámý lektvar - Mocný nápoj
V proměnné 39 je úroveň identifikujícího Alchymisty. Proměnné 11 a 40
jsou pomocné.
Příklad: Hráč má 500 peněz. Má tři neznámé lektvary (253=2 a
255=1). Přijde k alchymistovi a chce si nechat lektvary identifikovat.
Postup:
Peněz má dost, takže proběhne zjištění lektvaru, který má. Třetí
podmínka (hadí krev) se vyhodnotí jako platná. Alchymista splňuje
podmínku znalostí.
Odebere se hráči z inventáře jeden neznámý lektvar (předmět 3) a
dostane lektvar Hadí krev (předmět 8). Proměnná 11 se nastaví na
hodnotu 1. Tím se zabrání vyhodnocení dalšího předmětu v tomto "kole".
A sníží se proměnná 253.
Další dva podmínkové bloky se neprovedou. Hráči se na závěr zobrazí
informace o úspěchu identifikace lektvaru.
<100>
<zmenotazku otazka="Identifikovat?" barva="white">
<text obsah="Umím identifikovat lektvary - cena za kus 50 stříbrňáků.">
<promenna 39="5">úroveň alchymisty
[predmet 3>"0"]
<menu odkaz="9490" popis="lektvar">zjištění, jestli má hráč v inventáři neznámý lektvar
[/]
<menu odkaz="99" popis="Nic" barva="white">
<9490>
<text obsah="Alchymista $39. úrovně" barva="*00a0a0a0">
<text obsah="" barva="white">
<promenna 11="0">
[penize 1<"50"]
<text obsah="Nemáš dost peněz, tak nezdržuj.">
<promenna 11="2">Vyhodnocení peněz - pokud jich je málo, zablokují se všechny následující podmínky
[/]
<promenna 40="$11">
Lektvar života
[promenna 40="0"][promenna 251>"0"]
<predmet 28="1"> Vykoná se jen, je-li 11=0 a 251>0,
<odstranpredmet 3="1">tj. hráč má dost peněz (11=0) a lektvar života (251>0)
<promenna 11="1">
<snizpromennou 251="1">
[/][/]
<promenna 40="$11">
Všelék
[promenna 40="0"][promenna 252>"0"][promenna 39>"1"]
<predmet 7="1"> Vykoná se jen, je-li 11=0 a 252>0 a 39>1,
<odstranpredmet 3="1">tj. hráč má dost peněz a nemá předchozí lektvar (11=0) a má Všelék (252>0)
<promenna 11="1"> a znalosti alchymisty jsou min. 2 (39>1)
<snizpromennou 252="1">
[/][/][/]
<promenna 40="$11">
Hadí krev
[promenna 40="0"][promenna 253>"0"][promenna 39>"2"]
<predmet 8="1">
<odstranpredmet 3="1">
<promenna 11="1">
<snizpromennou 253="1">
[/][/][/]
<promenna 40="$11">
Dryják
[promenna 40="0"][promenna 254>"0"][promenna 39>"3"]
<predmet 9="1">
<odstranpredmet 3="1">
<promenna 11="1">
<snizpromennou 254="1">
[/][/][/]
<promenna 40="$11">
Mocný nápoj
[promenna 40="0"][promenna 255>"0"][promenna 39>"4"]
<predmet 10="1">
<odstranpredmet 3="1">
<promenna 11="1">
<snizpromennou 255="1">
[/][/][/]
Závěrečné vyhodnocení
[promenna 11="1"]
<text obsah="Alchymista chvíli něco kutil u své aparatury a pak ti podal identifikovaný lektvar.">
<penize minus="50">;Indentifikace byla úspěšná a provede se odečtení peněz. Hráč je informován o úspěchu.
[/]
[promenna 11="0"]
<text obsah="Na to moje schopnosti bohužel nestačí.">Znalosti alchymisty byly malé.
[/]
<zpet>
Bitové proměnné
Potřeboval jsem osm dvoustavových proměnných (nabývajících pouze
hodnoty 0 nebo 1), různě je nastavovat nebo mazat. Mohl jsem samozřejmě
použít osm různých proměnných. Ale napadlo mě využít bitové
reprezentace čísla.
Proměnná ve FGBE může dosáhnout hodnoty -2147483648 až 2147483647, což
je 32 bitů.
zápis 32 - bitového čísla
1111 1111 1111 1111 1111 1111 1111 1111
| |
nejvyšší bit nejnižší bit
Bitové vyjádření v následující tabulce jsem omezil na 16 bitů, pak již
výsledné dekadické vyjádření dosahuje příliš vysokých čísel a špatně se
s nimi bez kalkulačky počítá.
Vyhodnocení příslušného bitu se dá ve FGBE realizovat pomocí tagu
vzorec (v tabulce je naše proměnná 1, kterou chceme vyhodnotit,
proměnná 2 je pomocná).
Číslo bitu** |
Bitové vyjádření |
Dekadicky |
Vzorec |
Vzorec (od verze FGBE 4.4) |
0 |
0000 0000 0000 0001 |
1 |
<vzorec 2="$1%2">* |
<vzorec 2="$1 A 1"> |
1 |
0000 0000 0000 0010 |
2 |
<vzorec 2="($1/2)%2"> |
<vzorec 2="$1 A 2"> |
2 |
0000 0000 0000 0100 |
4 |
<vzorec 2="($1/4)%2"> |
<vzorec 2="$1 A 4"> |
3 |
0000 0000 0000 1000 |
8 |
<vzorec 2="($1/8)%2"> |
<vzorec 2="$1 A 8"> |
4 |
0000 0000 0001 0000 |
16 |
<vzorec 2="($1/16)%2"> |
<vzorec 2="$1 A 16"> |
5 |
0000 0000 0010 0000 |
32 |
<vzorec 2="($1/32)%2"> |
<vzorec 2="$1 A 32"> |
6 |
0000 0000 0100 0000 |
64 |
<vzorec 2="($1/64)%2"> |
<vzorec 2="$1 A 64"> |
7 |
0000 0000 1000 0000 |
128 |
<vzorec 2="($1/128)%2"> |
<vzorec 2="$1 A 128"> |
8 |
0000 0001 0000 0000 |
256 |
<vzorec 2="($1/256)%2"> |
<vzorec 2="$1 A 256"> |
9 |
0000 0010 0000 0000 |
512 |
<vzorec 2="($1/512)%2"> |
<vzorec 2="$1 A 512"> |
10 |
0000 0100 0000 0000 |
1024 |
<vzorec 2="($1/1024)%2"> |
<vzorec 2="$1 A 1024"> |
11 |
0000 1000 0000 0000 |
2048 |
<vzorec 2="($1/2048)%2"> |
<vzorec 2="$1 A 2048"> |
12 |
0001 0000 0000 0000 |
4096 |
<vzorec 2="($1/4096)%2"> |
<vzorec 2="$1 A 4096"> |
13 |
0010 0000 0000 0000 |
8192 |
<vzorec 2="($1/8192)%2"> |
<vzorec 2="$1 A 8192"> |
14 |
0100 0000 0000 0000 |
16384 |
<vzorec 2="($1/16384)%2"> |
<vzorec 2="$1 A 16384"> |
15 |
1000 0000 0000 0000 |
32768 |
<vzorec 2="($1/32768)%2"> |
<vzorec 2="$1 A 32768"> |
* úplný zápis by byl <vzorec 2="($1/1)%2">, ale je to zbytečné
** Je vhodné si jednotlivé bity pojmenovat a přiřadit k nim hodnotu v konstanty.gbs,
zápis by vypadal např. takto:
BIT00 1
BIT05 32
BIT15 32768
Vyhodnocení bitu (od verze FGBE 4.4 je možné použít druhý způsob)
Potřebuju zjistit stav např. 5.bitu (2
5 = 32) proměnné 1.
1.způsob
<vzorec 2="($1/32)%2">
Proměnnou 1 nejprve vydělím 32 a potom vydělím modulo 2. Jestliže byl
5. bit rovný 0, bude výsledek 0. Jestliže byl nastaven do 1, výsledek
bude 1.
V proměnné 1 mám číslo 164 (binárně 1010 0100). V pomocné proměnné je 1.
V proměnné 1 mám číslo 132 (binárně 1000 0100). V pomocné proměnné je 0.
Vyhodnocení bitu se provede jednoduchou podmínkou otestováním hodnoty
proměnné 2. Jak ale bit nastavím?
Nastavení 5.bitu
<vzorec 2="($1/32)%2">
[promenna 2="0"]; nastav jen, pokud je nulový
<zvyspromennou 1="32">
[/]
Vynulování 5.bitu
<vzorec 2="($1/32)%2">
[promenna 2="1"]; vynuluj jen, pokud je nastavený
<snizpromennou 1="32">
[/]
2.způsob
<vzorec 2="$1 A 32">
Vyhodnocení provedu pomocí logické operace AND, což je logický součin. Mojí proměnnou vynásobím s číslem 32, které odpovídá 5. bitu. Jestliže byl
5. bit rovný 0, bude výsledek 0. Jestliže byl nastaven do 1, výsledek
bude 1.
V proměnné 1 mám číslo 164 (binárně 1010 0100). V pomocné proměnné je 32.
V proměnné 1 mám číslo 132 (binárně 1000 0100). V pomocné proměnné je 0.
Vyhodnocení bitu se provede jednoduchou podmínkou otestováním hodnoty
proměnné 2 s hodnotou 0 nebo větší než 0. Jak ale bit nastavím?
Nastavení 5.bitu na hodnotu 1
<vzorec 1="$1 O 32">
Nastavení příslušného bitu se provede pomocí logické operace OR, což je logický součet. Odpovídající 5.bit tím nastavím do 1.
Vynulování 5.bitu
<vzorec 1=" $1 B 32">
Vynulování příslušného bitu se provede pomocí logické operace NAND, což je negovaný logický součin. Odpovídající 5.bit tím nastavím do 0.
Je samozřejmě možné použít pro vynulování bitu AND, ale pak by výraz musel být "$1 A 4294967263" (což odpovídá bitové reprezentaci čísla 11111111 11111111 11111111 11011111).
<vzorec 1="$1 O 96"> nastav bity 5 a 6 na hodnotu 1
<text obsah="$1" barva="white"> zobrazí se 96, tj. 0110 000
<vzorec 2="$1 A 32"> zjistím stav 5.bitu
<text obsah="$2" barva="white"> zobrazí se 32, tj. 0010 000
<vzorec 1="$1 B 32"> vynuluj 5.bit, tj. 0010 000
<text obsah="$1" barva="white"> zobrazí se 64, tj. 0100 000
<vzorec 2="$1 A 32"> zjistím stav 5.bitu
<text obsah="$2" barva="white"> zobrazí se 0, tj. 0000 000
4. ČÁST - PODMÍNKY, CYKLY A "PROMĚNNÁ V PROMĚNNÉ"
Ve verzi FGBE 4.4 přibyl nový příkaz cyklus a "proměnná v proměnné" v podmínkách.
1. příklad: V několika lokacích jdoucích za sebou vyhodnocuji náhodu a nepotřebuji, aby byla v následující lokaci stejná. Zajistit to lze pomocí cyklů.
<1>
<nahoda 1="1k6">
...
<2>
<nahoda 2="1k6"> do pomocné proměnné nastavíme náhodu
[promenna 1="$2"]
<nahoda 2="1k6">
<cyklus> cyklus se bude provádět dokud bude proměnná 1 rovná proměnné 2
[/]
<promenna 1="$2"> nastavíme proměnnou 1 pro další lokaci
...
<3>
<nahoda 2="1k6">
[promenna 1="$2"]
<nahoda 2="1k6">
<cyklus>
[/]
<promenna 1="$2">
...
<4>
2. příklad: Prostranství je rozděleno na 30 částí. Každá část má přidělenou svoji proměnnou. Když hráč do něho vstoupí, nastaví se do proměnné nějaká hodnota (může být různá). Potřebujeme zjistit, jestli už byl všude a na základě toho provést nějakou akci.
Popis: Můžeme samozřejmě otestovat pomocí podmínek každou proměnnou a sčítat počet navštívených prostranství. Je to ale zdlouhavé na napsání.
Řešení: Tento dlouhý zápis si můžeme zkrátit pomocí cyklů a proměnné v proměnné za předpokladu, že proměnné máme za sebou (nebo v pravidelném intervalu - např. každá druhá). Máme tedy pro ilustraci vymezeny proměnné v rozsahu 50 až 79, tj. 30 proměnných.
Do pomocné proměnné 100 si uložíme číslo 50,tj. první proměnná, která nás zajímá. V proměnné 101 budeme počítat.
... zde máme nadefinované lokace s nastavením proměnných
<250>
<promenna 100="50"> první proměnná, která nás zajímá, je proměnná 50
<promenna 101="0">
[promenna 100<"80"] cyklus skončí po 30 proměnných
[promenna @100>"0"] zjistění zda proměnná 50 až 79 obsahuje hodnotu větší než 0
<zvyspromennou 101="1"> jednoduše spočítáme počet
[/]
<zvyspromennou 100="1">
<cyklus>
[/]
<text obsah="Navštívil jsi dosud $101 prostranství.">
....
<251>