Beispiele: Buffs


Um einen Buff zu definieren, definieren wir eine Instanz, die sich von der Klasse lCBuff ableitet. Dann habt ihr folgende Eigenschaften zur Verfügung:

Die grundlegende Klasse

class lCBuff {
var string name; // Theoretisch noch ungenutzt
var int bufftype; // BUFF_GOOD / BUFF_NEUTRAL / BUFF_BAD | 1 / 0 / -1
var int targetID; // NPC that is currently affected by this buff
var int durationMS; // full duration until the buff runs out
var int tickMS; // ms between each tick, first tick at tickMS milliseconds.
var int nextTickNr; // e.g. before and during the first tick, this will be 1. READ-ONLY!

var int OnApply;
var int OnTick;
var int OnRemoved;

var string buffTex; // Currently only used for buffs applied on the hero
};

Am Beispiel eines Giftes

Zum Beispiel erstellen wir folgendes Gift:
instance deadly_poison(lCBuff) {
name = "Tödliches Gift";
bufftype = BUFF_BAD;

durationMS = 10*1000; //10 Sekunden lang
tickMS = 1000; // Jede Sekunde

buffTex = "POISON.TGA";
};

Natürlich fehlt an dieserr Stelle noch die eigentliche Logik - irgendwo muss Schaden hinzugefügt werden!Dazu definieren wir eine Funktion, die Schaden am Ziel eines übergebenen Buffs macht:
func void deadly_poison_damage(var int bh) {
var int ptr; ptr = Buff_GetNpc(bh);
if (!ptr) { return; }; // Kann passieren, falls z.B. die Welt gewechselt wurde

var c_npc n; n = _^(ptr);
Npc_ChangeAttribute(n, ATR_HITPOINTS, -3); // 3 Schaden
};


Damit diese jetzt auch passend ausgeführt wird, tragen wir sie im Buff ein. Aus komplizierten, technischen Gründen nutzen wir dazu die Funktion SAVE_GetFuncID anstatt MEM_GetFuncID.instance deadly_poison(lCBuff) {
name = "tödliches Gift";
bufftype = BUFF_BAD;

durationMS = 10*1000; //10 Sekunden lang
tickMS = 1000; // Jede Sekunde

onTick = SAVE_GetFuncID(deadly_poison_damage); // Every second, after 1 second, the damage should be applied
buffTex = "POISON.TGA";
};

Wird dieser Buff jetzt z.B. auf den Helden angewandt mit dem Aufruf Buff_Apply(hero, deadly_poison), verliert er über 10 Sekunden insgesamt 30 HP.