diff --git a/src/weapon.c b/src/weapon.c index 0d742d2..0a8885a 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -67,20 +67,22 @@ void weapon_minimap(double res, double w, double h) { // Update all weapons in the layer. void weapons_update(const double dt, WeaponLayer layer) { Weapon** wlayer; - int nlayer; + int* nlayer; switch(layer) { case WEAPON_LAYER_BG: wlayer = wbackLayer; - nlayer = nwbackLayer; + nlayer = &nwbackLayer; break; case WEAPON_LAYER_FG: wlayer = wfrontLayer; - nlayer = nwfrontLayer; + nlayer = &nwfrontLayer; break; } int i; - for(i = 0; i < nlayer; i++) { + Weapon* w; + for(i = 0; i < (*nlayer); i++) { + w = wlayer[i]; switch(wlayer[i]->outfit->type) { case OUTFIT_TYPE_BOLT: if(SDL_GetTicks() > (wlayer[i]->timer + 1000*(unsigned int) @@ -93,6 +95,8 @@ void weapons_update(const double dt, WeaponLayer layer) { break; } weapon_update(wlayer[i], dt, layer); + // If the weapon has been deleted we are going to have to hold back one. + if(w != wlayer[i]) i--; } } @@ -111,7 +115,7 @@ static void weapon_render(const Weapon* w) { static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) { int i; for(i = 0; i < pilots; i++) { - if((w->parent != pilot_stack[i]->id) && + if((w->parent != pilot_stack[i]->id) && // The pilot hasn't shoot it. (DIST(w->solid->pos, pilot_stack[i]->solid->pos) < (PILOT_SIZE_APROX * w->outfit->gfx_space->sw/2. + pilot_stack[i]->ship->gfx_space->sw/2.))) { pilot_hit(pilot_stack[i], w->outfit->damage_shield, w->outfit->damage_armor); @@ -145,6 +149,7 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir, const Vec2* w->solid = solid_create(mass, rdir, pos, &v); break; default: + w->solid = solid_create(mass, dir, pos, vel); break; } return w; @@ -184,7 +189,7 @@ void weapon_add(const Outfit* outfit, const double dir, const Vec2* pos, const V else { // Need to allocate more memory. switch(layer) { case WEAPON_LAYER_BG: - curLayer = wbackLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon)); + curLayer = wbackLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon*)); break; case WEAPON_LAYER_FG: curLayer = wfrontLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon*)); @@ -211,6 +216,7 @@ static void weapon_destroy(Weapon* w, WeaponLayer layer) { } for(i = 0; wlayer[i] != w; i++); // Get us to the current posision. weapon_free(wlayer[i]); + wlayer[i] = NULL; (*nlayer)--; for(; i < (*nlayer); i++)