diff --git a/src/bindings/bind_unit.c b/src/bindings/bind_unit.c index ba7b692df..bb1050aa5 100644 --- a/src/bindings/bind_unit.c +++ b/src/bindings/bind_unit.c @@ -464,9 +464,10 @@ static void unit_castspell(unit * u, const char *name) if (sp->sp_function == NULL) { log_error(("spell '%s' has no function.\n", sp->sname)); } else { - castorder *co = new_castorder(u, 0, sp, u->region, sp->level, sp->level, 0, 0, 0); - sp->sp_function(co); - free(co); + castorder co; + create_castorder(&co, u, 0, sp, u->region, sp->level, sp->level, 0, 0, 0); + sp->sp_function(&co); + free_castorder(&co); } } } diff --git a/src/kernel/magic.c b/src/kernel/magic.c index fcfadf2bd..bc4225a6c 100644 --- a/src/kernel/magic.c +++ b/src/kernel/magic.c @@ -2102,7 +2102,7 @@ castorder *new_castorder(void *u, unit * u2, const spell * sp, region * r, { castorder *corder; - corder = calloc(1, sizeof(castorder)); + corder = (castorder*)calloc(1, sizeof(castorder)); corder->magician.u = u; corder->familiar = u2; corder->sp = sp; @@ -2116,6 +2116,29 @@ castorder *new_castorder(void *u, unit * u2, const spell * sp, region * r, return corder; } +castorder *create_castorder(castorder * co, unit *caster, unit * familiar, const spell * sp, region * r, + int lev, double force, int range, struct order * ord, spellparameter * p) +{ + if (!co) co = (castorder*)calloc(1, sizeof(castorder)); + + co->magician.u = caster; + co->familiar = familiar; + co->sp = sp; + co->level = lev; + co->force = force; + co->rt = r; + co->distance = range; + co->order = copy_order(ord); + co->par = p; + + return co; +} + +void free_castorder(struct castorder *co) +{ + free_order(co->order); +} + /* Hänge c-order co an die letze c-order von cll an */ void add_castorder(spellrank * cll, castorder * co) { diff --git a/src/kernel/magic.h b/src/kernel/magic.h index 3e88bba47..d48926499 100644 --- a/src/kernel/magic.h +++ b/src/kernel/magic.h @@ -314,9 +314,13 @@ typedef struct sc_mage { struct castorder **end; } spellrank; - castorder *new_castorder(void *u, struct unit *familiar, const spell * sp, + struct castorder *new_castorder(void *u, struct unit *familiar, const spell * sp, struct region *r, int lev, double force, int distance, struct order *ord, spellparameter * p); + struct castorder *create_castorder(struct castorder * co, struct unit *caster, + struct unit * familiar, const struct spell * sp, struct region * r, + int lev, double force, int range, struct order * ord, struct spellparameter * p); + void free_castorder(struct castorder *co); /* Zwischenspreicher für Zauberbefehle, notwendig für Prioritäten */ void add_castorder(struct spellrank *cll, struct castorder *co); /* Hänge c-order co an die letze c-order von cll an */