Skriptování: Porovnání verzí
(uprava formatovani) |
|||
Řádka 42: | Řádka 42: | ||
<pre> | <pre> | ||
if (<eval src.qtag(q001_borek)> == 0) | if (<eval src.qtag(q001_borek)> == 0) | ||
− | </pre> Tento kód by byl '''bez''' použití volání <code>eval</code> nekorektní, protože volání <code><src.qtag(q001_borek)></code> nad hráčem, který daný tag vůbec nemá, vrátí prázdný string, tedy žádnou hodnotu. Sphere by tím pádem po vyhodnocení levé strany rovnosti porovnávala kód:<pre> | + | </pre> Tento kód by byl '''bez''' použití volání <code>eval</code> nekorektní, protože volání <code><src.qtag(q001_borek)></code> nad hráčem, který daný tag vůbec nemá, vrátí prázdný string, tedy žádnou hodnotu. Sphere by tím pádem po vyhodnocení levé strany rovnosti porovnávala kód: |
+ | <pre> | ||
if ("" == 0) | if ("" == 0) | ||
− | </pre> což je zcela nevalidní podmínka a takový běh vyhodí ERROR. Volání funkce <code>eval</code> na prázdný string ovšem vrátí nulu, což je již korektní podmínkou. Takto bude sphere postupovat ve vyhodnocování výrazu s <code>eval</code>em:<pre> | + | </pre> |
+ | což je zcela nevalidní podmínka a takový běh vyhodí ERROR. Volání funkce <code>eval</code> na prázdný string ovšem vrátí nulu, což je již korektní podmínkou. Takto bude sphere postupovat ve vyhodnocování výrazu s <code>eval</code>em: | ||
+ | <pre> | ||
1. if (<eval ""> == 0) | 1. if (<eval ""> == 0) | ||
− | 2. if (0 == 0)</pre> | + | 2. if (0 == 0) |
+ | </pre> | ||
=== OR Operátor @||@ === | === OR Operátor @||@ === |
Verze z 2. 2. 2021, 16:29
Na této stránce naleznete nějaká doporučení a informace o skriptování, která se snažíme dodržovat. Pokud se chystáte provádět nějaké změny, ujistěte se, že znáte i Scripting standard.
Doporučuji si projít stránku Skripty - názvosloví, kde jsou uvedeny některé běžně používané termíny.
Obsah
Na co si dát pozor
Linkování
Ukládání UID předmětu do proměnné LINK pevně sváže existenci cílového předmětu s předmětem, který má LINK uložený. To znamená, že pokud cílový předmět zmizí (je na hráči a ten si smaže postavu, smaže se chybným scriptováním při timeru nebo jiné akci), pak objekt s LINK proměnnou na toto UID se smaže také!
Best practice
- Pro linkování objektů používejte raději tagy vhodného jména, aby bylo jasné, za jakým účelem a co se v dané proměnné drží.
- Vždý, když vytváříte odkaz (ať už tagem, nebo linkem), ujistěte se, že linkee vždýcky smaže z linkeru referenci na sebe. V žádném případě nesmí nikdy nic odkazovat na UID, které se již smazalo! Toto UID může ve velmi krátkém sledu dostat naprosto jiný objekt a tím zcela randomizovat chování (kontrola na type nebo ID odkazovaného předmětu není dostatečnou náhradu za nedůsledné odmazávání odkazů)
- Pro odkazování skupiny předmětů používejte funkce:
f_customLink_add f_customLink_remove f_customLink_target
, případně pro dialogy:
f_item_linkAdder f_item_LinkRemover f_dialog_LinkWriter
Vyhodnocování podmínek
Pořadí vyhodnocení
Sphere vyhodnocuje argumenty podmínek zleva. Výraz IF (f_one && f_two)
tedy nejprve vyhodnotí f_one
a poté f_two
Eval - magické slovo
Ve spoustě podmínek a vyhodnocení výpočtů se používá klíčové slovo eval
. Co ale znamená a kdy ho (ne)použít?
Eval
je zkrácením anglického evaluate = vyhodnotit/ohodnotit. Výsledkem operace eval je vždycky decimální neprázdná hodnota. Použití tohoto klíčového slova je tedy vhodné na místech, kde sphere
- sama nedokáže rozhodnout, že se má zadaný výraz vyhodnotit jako číslo
- vyhodnocení výrazu může vést k prázdnému stringu, který by v testech vedl k chybě (ERROR). Příklad:
if (<eval src.qtag(q001_borek)> == 0)Tento kód by byl bez použití volání
eval
nekorektní, protože volání <src.qtag(q001_borek)>
nad hráčem, který daný tag vůbec nemá, vrátí prázdný string, tedy žádnou hodnotu. Sphere by tím pádem po vyhodnocení levé strany rovnosti porovnávala kód:
if ("" == 0)
což je zcela nevalidní podmínka a takový běh vyhodí ERROR. Volání funkce eval
na prázdný string ovšem vrátí nulu, což je již korektní podmínkou. Takto bude sphere postupovat ve vyhodnocování výrazu s eval
em:
1. if (<eval ""> == 0) 2. if (0 == 0)
OR Operátor @||@
Vyhodnotí se, pokud je alespoň jedna strana operátoru pravdivá. Vzhledem k pořadí vyhodnocení, použití tohoto operátoru svádí ke klasickému využití línému vyhodnocování. ANI HOVNO přátelé. Sphere vždy vyhodnotí funkce na obou stranách operátoru, a až když má výsledky, vyhodnotí výsledek OR operátoru.
Z výše zmíněného, následující nelze použít:
if (!act || act.isitem) // pokud je act 0 vyhodi ERROR kvuli nemoznosti vyhodnotit 'isitem' nad null objektem act.color=012 act.name=nove jmeno endif
Podmínku je tedy nutné vyřešit nadmíru hnusně a perverzně, jako správné kodérské prase! Ale protože jsme vzdělaná prasata, stejný kód v podmínce alespoň zabalíme do funkce:
... if (!act) // pokud je act 0 vleze do podminky act.f_manipulateAct elseif (act.isitem) // uz vime, ze act neni 0, takze volani je bezpecne act.f_manipulateAct endif // the function is called upon the ACT // takes NO arguments [function f_manipulateAct] color=012 name=nove jmeno
Kontrola Syntaxe
Pro kontrolu syntaxe máme k dispozici vlastní Analyzer skriptů, který provede statickou analýzu.