Skriptování
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:
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:if ("" == 0)
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