Portál AbcLinuxu, 30. dubna 2025 19:53
WML jazyk Wesnothu je dost podivný, špatně zdokumentovaný a proto obtížně použitelný, je to jen pro silné povahy. Podivná je i práce s proměnnými, které se věnuje tento zápisek. Vzhledem k mlhavým informacím roztroušených náhodně po celé wiki wesnothu se může stát, že zde budu psát bludy.
Proměnnou lze nastavit pomocí elementu [set_variable]. Například to co se v ostatních jazyích udělá takto:
promenna = "hodnota"se ve WML dělá takto:
[set_variable] name=promenna value="hodnota" [/set_variable]
Protože je to dlouhé, existuje i předdefinované makro, které to trochu zjednodušuje. Pomocí makra se to samé udělá takto:
{VARIABLE promenna "hodnota"}
Pozor, nastavení proměnné funguje jen v eventu, jinde se proměnné nastavit nedají. Tahle veledůležitá informace není nikde napsaná, takže klidně strávíte několik hodin rvaním si vlasů, jak to že vám nic nefunguje. Tohle a podobné špeky způsobuje, že se do tohoto obskurního jazyku snažím proniknout už asi po třetí s tím, že se vždycky naštvu, že na tohle nemám nervy a čas se dá ztrácet i příjemnějším způsobem.
Ve WML je možno proměnné jakoby objektově skládat, protože proměnná může fungovat i jako kontejner pro další proměnné. Lze tak mít například proměnou souradnice, která obsahuje proměnné x a y.
[set_variable] name=souradnice.x value=10 [/set_variable] [set_variable] name=souradnice.y value=20 [/set_variable]
Pole je ve WML proměnná, která obsahuje jiné proměnné s číselným indexem, podle kterého pak lze procházet v cyklu. Ukázka definice pole:
[set_variable] name=pole[0].x value=10 [/set_variable] [set_variable] name=pole[1].x value=12 [/set_variable] [set_variable] name=pole[2].x value=14 [/set_variable] [set_variable] name=pole[2].y value=10 [/set_variable]
Pozor, na rozdíl od jiných jazyků pole[1] nemůže obsahovat hodnotu, je to jen kontejner pro jednu nebo více dalších proměnných. Nelze tedy mít jen "name=pole[1]".
Každé pole má speciální atribut lenght, v kterém je uveden počet prvků pole.
Proměnnou je možno měnit, předávat, odstranit a nebo použít její hodnotu.
Proměnná se mění stejně jako se definuje nová.
Proměnnou je možno předat například jako parametr makru nebo některým speciálním atributům pro práci s proměnnou místo její hodnotou. Proměnná se předává svým názvem. Například předání proměnné promenna makru MAKRO:
{MAKRO promenna}
Pro smazání proměnné je k dispozici element [clear_variable]. Protože všechny nesmazané proměnné se musí ukládat do sejvů a zabírají místo v paměti, je velmi vhodné všechny pomocné a dočasné proměnné po použití smazat. Příklad smazání proměnné promenna:
[clear_variable] name=promenna [/clear_variable]
Mimochodem, tohle je i příklad předání proměnné atributu.
K této akci je pro zkrácení zápisu rovněž předdefinováno makro CLEAR_VARIABLE:
{CLAER_VARIABLE promenna}
Obecně se hodnota proměnné získá použitím znaku $. Tedy asi nějak takto:
{VARIABLE text "Hello world!"} [message] speaker=narrator message="Text je $text" [/message] {CLEAR_VARIABLE text}
Použití $ se ve WML také říká substituce. Aby to nebylo jednoduché, WML rozlišuje tři různé druhy substituce. Jaký druh substituce se použije nezávisí na uživateli, ale je dán atributem u kterého se proměnná používá, tudíž je nutno to konkrétně o každém atributu vědět. Tyto tři substituce jsou: literal, simple a complex.
Literal znamená žádná substituce. U takového atributu se proměnná hodnotou nenahradí. Atribut získá hodnotu názvu proměnné i se znakem $, nikoli její hodnotu. Jinými slovy, u takového atributu nejde proměnnou použít.
Tato substituce je použita v elementu [set_variable] u atributu literal.
Simple znamená, že proměnná se rozezná a nahradí hodnotou jen když není v řetězci nebo je na jeho začátku. Tedy znak $ následuje hned za znakem ".
Tato substituce je použita všude, kde se nepoužívá literal ani complex.
Complex znamená, že proměnná se rozezná a nahradí hodnotou kdekoli v řetězci, jako je tomu u výše uvedené ukázky.
Tato substituce se používá:
Je-li u nějakého atributu simple substituce a vy potřebujete complex substituci, pak si musíte vypomoci pomocnou proměnnou vytvořenou pomocí [set_variable] a atributů name a format.
Pokud potřebujete substituovat proměnnou tak, aby za ní mohl hned následovat text, je si možno vypomoci znakem | a ukončit jím název proměnné. Například takto:
[message] message="Pozor, právě jsem zahlédnul $rasa|!" [/message]
Když ho budete používat vždycky, nemusíte se učit pravidla, ktará říkají, kdy ho potřeba je a kdy není, tj. před kterými znaky se rozezná konec proměnné automaticky. S tím souvisí i možnost vloření samotného znaku $ do řetězce, provede se to takto: "Upgrade stojí 100 $|".
WML umožňuje, aby název proměnné byl vytvořen pomocí jiné proměnné. Například mějme proměnné rasa, zlato_elfova a zlato_trpaslici. Pak je možno použít syntaxe "$zlato_$rasa||" k získání obsahu druhé nebo třetí proměnné podle toho, zda proměnná rasa má hodnotu etfove nebo trpaslici.
Procházení polem je trochu složitější, ale naštěstí pro to existují dvě předdefinovaná makra FOREACH a NEXT, která to zjednodušují. S jejich pomocí lze realizovat procházení polem takto:
{FOREACH pole i} [message] message="X a Y je $pole[$i].x $pole[$i].y" [/mesage] {NEXT i}
Nedefinovaná proměnná se rovná nedefinovanné proměné, nebo proměnné s hodnotou prázdný řetězec.
{VARIABLE def_a ""} {VARIABLE def_b 0} # TRUE [if] [variable] name=undef equals=$none [/variable] [then] [message] speaker=narrator message="undef" [/message] [/then] [/if] # TRUE [if] [variable] name=def_a equals=$none [/variable] [then] [message] speaker=narrator message="def_a" [/message] [/then] [/if] # FALSE [if] [variable] name=def_b equals=$none [/variable] [then] [message] speaker=narrator message="def_b" [/message] [/then] [/if]
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.