diff --git a/src/battle/battle.c b/src/battle/battle.c index 978faaf..1b09346 100644 --- a/src/battle/battle.c +++ b/src/battle/battle.c @@ -50,6 +50,8 @@ void initBattle(void) app.delegate.draw = &draw; memset(&app.keyboard, 0, sizeof(int) * MAX_KEYBOARD_KEYS); + initEntities(); + initStars(); initBackground(); @@ -376,6 +378,8 @@ void destroyBattle(void) resetMessageBox(); + destroyEntities(); + destroyScript(); destroyGrid(); diff --git a/src/battle/battle.h b/src/battle/battle.h index 3b26ef1..309e959 100644 --- a/src/battle/battle.h +++ b/src/battle/battle.h @@ -45,6 +45,8 @@ extern void blit(SDL_Texture *texture, int x, int y, int centered); extern void initHud(void); extern void initRadar(void); extern void initGalacticMap(void); +extern void initEntities(void); +extern void destroyEntities(void); extern void drawWidgets(char *groupName); extern void selectWidget(const char *name, const char *group); extern Widget *getWidget(const char *name, const char *group); diff --git a/src/battle/entities.c b/src/battle/entities.c index 9feacf4..d6fc3a1 100644 --- a/src/battle/entities.c +++ b/src/battle/entities.c @@ -20,6 +20,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "entities.h" +static Entity deadHead; +static Entity *deadTail; + static void drawEntity(Entity *e); static void doEntity(void); static void alignComponents(void); @@ -29,6 +32,13 @@ static void restrictToGrid(Entity *e); static void drawTargetRects(Entity *e); static int drawComparator(const void *a, const void *b); +void initEntities(void) +{ + memset(&deadHead, 0, sizeof(Entity)); + + deadTail = &deadHead; +} + Entity *spawnEntity(void) { Entity *e = malloc(sizeof(Entity)); @@ -56,7 +66,7 @@ void doEntities(void) for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - if (e->active) + if (e->active && e->alive != ALIVE_DEAD) { addToGrid(e); } @@ -97,7 +107,7 @@ void doEntities(void) break; } - if (e->alive == ALIVE_ALIVE || e->alive == ALIVE_DYING) + if (e->alive != ALIVE_DEAD) { if (e->action != NULL) { @@ -142,7 +152,12 @@ void doEntities(void) cutRope(e); prev->next = e->next; - free(e); + + /* move to dead list */ + e->next = NULL; + deadTail->next = e; + deadTail = e; + e = prev; } } @@ -431,3 +446,17 @@ static int drawComparator(const void *a, const void *b) return e2->type - e1->type; } + +void destroyEntities(void) +{ + Entity *e; + + while (deadHead.next) + { + e = deadHead.next; + deadHead.next = e->next; + free(e); + } + + deadTail = &deadHead; +}