[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.
|
// Update all weapons in the layer.
|
||||||
void weapons_update(const double dt, WeaponLayer layer) {
|
void weapons_update(const double dt, WeaponLayer layer) {
|
||||||
Weapon** wlayer;
|
Weapon** wlayer;
|
||||||
int nlayer;
|
int* nlayer;
|
||||||
|
|
||||||
switch(layer) {
|
switch(layer) {
|
||||||
case WEAPON_LAYER_BG:
|
case WEAPON_LAYER_BG:
|
||||||
wlayer = wbackLayer;
|
wlayer = wbackLayer;
|
||||||
nlayer = nwbackLayer;
|
nlayer = &nwbackLayer;
|
||||||
break;
|
break;
|
||||||
case WEAPON_LAYER_FG:
|
case WEAPON_LAYER_FG:
|
||||||
wlayer = wfrontLayer;
|
wlayer = wfrontLayer;
|
||||||
nlayer = nwfrontLayer;
|
nlayer = &nwfrontLayer;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < nlayer; i++) {
|
Weapon* w;
|
||||||
|
for(i = 0; i < (*nlayer); i++) {
|
||||||
|
w = wlayer[i];
|
||||||
switch(wlayer[i]->outfit->type) {
|
switch(wlayer[i]->outfit->type) {
|
||||||
case OUTFIT_TYPE_BOLT:
|
case OUTFIT_TYPE_BOLT:
|
||||||
if(SDL_GetTicks() > (wlayer[i]->timer + 1000*(unsigned int)
|
if(SDL_GetTicks() > (wlayer[i]->timer + 1000*(unsigned int)
|
||||||
@ -93,6 +95,8 @@ void weapons_update(const double dt, WeaponLayer layer) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
weapon_update(wlayer[i], dt, layer);
|
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) {
|
static void weapon_update(Weapon* w, const double dt, WeaponLayer layer) {
|
||||||
int i;
|
int i;
|
||||||
for(i = 0; i < pilots; 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 *
|
(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.))) {
|
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);
|
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);
|
w->solid = solid_create(mass, rdir, pos, &v);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
w->solid = solid_create(mass, dir, pos, vel);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return w;
|
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.
|
else { // Need to allocate more memory.
|
||||||
switch(layer) {
|
switch(layer) {
|
||||||
case WEAPON_LAYER_BG:
|
case WEAPON_LAYER_BG:
|
||||||
curLayer = wbackLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon));
|
curLayer = wbackLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon*));
|
||||||
break;
|
break;
|
||||||
case WEAPON_LAYER_FG:
|
case WEAPON_LAYER_FG:
|
||||||
curLayer = wfrontLayer = realloc(curLayer, (++(*mLayer))*sizeof(Weapon*));
|
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.
|
for(i = 0; wlayer[i] != w; i++); // Get us to the current posision.
|
||||||
weapon_free(wlayer[i]);
|
weapon_free(wlayer[i]);
|
||||||
|
wlayer[i] = NULL;
|
||||||
(*nlayer)--;
|
(*nlayer)--;
|
||||||
|
|
||||||
for(; i < (*nlayer); i++)
|
for(; i < (*nlayer); i++)
|
||||||
|
Loading…
Reference in New Issue
Block a user