#include #include "structs.h" #include "effect.h" /* * A status effect has been added, deleted, or changed; recompute * effects on the monster. */ void effect_recompute(MONST *m) { EFFECT *e; m->speed = m->type->info->basespeed; m->heal = m->type->info->baseheal; m->effflags = 0; for (e=m->effects;e;e=e->link) (*e->ops->apply)(m,e->private); } /* * For all the status effects on the monster, call the death method and * destroy the effect. */ void effect_death(MONST *m) { EFFECT *e; while ((e = m->effects)) { m->effects = e->link; (*e->ops->death)(m,e->private); free(e); } } /* * Add a status effect on a monster, given the effect's private data * and ops vector. */ EFFECT *effect_add(MONST *m, void *priv, EFFECTOPS *ops) { EFFECT *e; e = malloc(sizeof(EFFECT)); e->m = m; e->private = priv; e->ops = ops; e->link = m->effects; m->effects = e; effect_recompute(m); return(e); } /* * Remove a status effect from a monster. Does not make any ops * callbacks; the only side effects are to free the EFFECT itself and * effect_recompute(). */ void effect_remove(MONST *m, EFFECT *earg) { EFFECT **ep; EFFECT *e; ep = &m->effects; while ((e = *ep)) { if (e == earg) { *ep = e->link; free(e); break; } else { ep = &e->link; } } effect_recompute(m); }