[Fix] Major bug in weapon.c.
-- I believe it is a fix, but as only VLack can create the crash I am just guessing.
This commit is contained in:
parent
5386ad0f82
commit
c15699606b
18
src/weapon.c
18
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++)
|
||||
|
Loading…
Reference in New Issue
Block a user