Skriptování

Z EreborWiki
Přejít na: navigace, hledá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.

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

  1. 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ží.
  2. 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ů)
  3. 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

  1. sama nedokáže rozhodnout, že se má zadaný výraz vyhodnotit jako číslo
  2. 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:

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