diff --git a/src/main.c b/src/main.c index 27e304c..98a6696 100644 --- a/src/main.c +++ b/src/main.c @@ -264,6 +264,7 @@ int main(int argc, char** argv) { } // Unload data. + weapon_exit(); // Destroy all active weapons. space_exit(); // Clean up the universe!!! pilots_free(); // Free the pilots, they where locked up D: ships_free(); diff --git a/src/outfit.c b/src/outfit.c index a70d521..a8367b3 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -88,8 +88,10 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) { tmp->speed = (double)atoi((char*)node->children->content); else if(strcmp((char*)node->name, "delay")==0) tmp->delay = atoi((char*)node->children->content); + else if(strcmp((char*)node->name, "range")==0) + tmp->range = atof((char*) node->children->content); else if(strcmp((char*)node->name, "accuracy")==0) - tmp->accuracy = atof((char*)node->children->content)*M_PI/180.; // to rad. + tmp->accuracy = atof((char*)node->children->content); else if(strcmp((char*)node->name, "gfx")==0) { snprintf(str, strlen((char*)node->children->content)+sizeof(OUTFIT_GFX), OUTFIT_GFX"%s", (char*)node->children->content); @@ -106,9 +108,11 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) { } } #define MELEMENT(o,s) if((o) == 0) WARN("Outfit '%s' missing '"s"' element", tmp->name) - MELEMENT(tmp->speed, "speed"); MELEMENT(tmp->accuracy, "tech"); MELEMENT(tmp->delay, "delay"); + MELEMENT(tmp->speed, "speed"); + MELEMENT(tmp->range, "range"); + MELEMENT(tmp->accuracy, "accuracy"); MELEMENT(tmp->damage_armor, "armor' from element 'damage"); MELEMENT(tmp->damage_shield, "shield' from element 'damage"); #undef MELEMENT diff --git a/src/pilot.c b/src/pilot.c index 7a9b057..b30667f 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -53,7 +53,7 @@ void pilot_shoot(Pilot* p, int secondary) { if(outfit_isWeapon(p->outfits[i].outfit) || // Is a weapon or launch? outfit_isLauncher(p->outfits[i].outfit)) // Ready to shoot again. - if((SDL_GetTicks()-p->outfits[i].timer) > p->outfits[i].outfit->delay) + if((SDL_GetTicks()-p->outfits[i].timer) > (p->outfits[i].outfit->delay/p->outfits[i].quantity)) // Different weapons have different behaviours. switch(p->outfits[i].outfit->type) { case OUTFIT_TYPE_BOLT: diff --git a/src/rng.h b/src/rng.h index d45ac03..a6aeb51 100644 --- a/src/rng.h +++ b/src/rng.h @@ -1,7 +1,7 @@ #pragma once #include -#define RNG(L,H) (rand()%(H-L+1)+L) +#define RNG(L,H) (rand()%(int)(H-L+1)+L) void rng_init(void); diff --git a/src/ship.c b/src/ship.c index 5afec1e..1bdd616 100644 --- a/src/ship.c +++ b/src/ship.c @@ -97,10 +97,10 @@ static Ship* ship_parse(xmlNodePtr parent) { else if(strcmp((char*)node->name, "outfits")==0) { cur = node->children; while((cur = cur->next)) { - if(strcmp((char*)cur->name, "outfit")==0) + if(strcmp((char*)cur->name, "outfit")==0) { otmp = MALLOC_L(ShipOutfit); otmp->data = outfit_get((char*)cur->children->content); - xstr = xmlGetProp(cur, (xmlChar*)"qunatity"); + xstr = xmlGetProp(cur, (xmlChar*)"quantity"); if(!xstr) WARN("Ship '%s' is missing tag 'quantity for outfit '%s'", tmp->name, otmp->data->name); otmp->quantity = atoi((char*)xstr); @@ -115,6 +115,7 @@ static Ship* ship_parse(xmlNodePtr parent) { } } } + } tmp->thrust *= tmp->mass; // Helps keep number sane. @@ -138,6 +139,7 @@ static Ship* ship_parse(xmlNodePtr parent) { DEBUG("Loaded ship '%s'", tmp->name); return tmp; + } int ships_load(void) { @@ -178,10 +180,17 @@ int ships_load(void) { } void ships_free(void) { + ShipOutfit* so, *sot; int i; for(i = 0; i < ships; i++) { - if((ship_stack+i)->name) + if((ship_stack+i)->name) // Free the name. free((ship_stack+i)->name); + so = (ship_stack+i)->outfit; + while(so) { // free the ship outfit. + sot = so; + so = so->next; + free(sot); + } gl_freeTexture((ship_stack+i)->gfx_ship); } free(ship_stack); diff --git a/src/weapon.c b/src/weapon.c index 6e2bb2b..e3199fc 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -6,6 +6,7 @@ #include "physics.h" #include "main.h" #include "log.h" +#include "rng.h" #include "weapon.h" typedef struct Weapon { @@ -33,6 +34,7 @@ static Weapon* weapon_create(const Outfit* outfit, const double dir, static void weapon_render(const Weapon* w); static void weapon_update(Weapon* w, const double dt); +static void weapon_destroy(Weapon* w, WeaponLayer layer); static void weapon_free(Weapon* w); // Update all weapons in the layer. @@ -51,8 +53,20 @@ void weapons_update(const double dt, WeaponLayer layer) { break; } int i; - for(i = 0; i < nlayer; i++) + for(i = 0; i < nlayer; i++) { + switch(wlayer[i]->outfit->type) { + case OUTFIT_TYPE_BOLT: + if(SDL_GetTicks() > (wlayer[i]->timer + 1000*(unsigned int) + wlayer[i]->outfit->range/wlayer[i]->outfit->speed)) { + weapon_destroy(wlayer[i],layer); + continue; + } + break; + default: + break; + } weapon_update(wlayer[i], dt); + } } // Render the weapons. @@ -68,8 +82,7 @@ static void weapon_render(const Weapon* w) { // Update the weapon. static void weapon_update(Weapon* w, const double dt) { - if(w->think) - (*w->think)(w); + if(w->think) (*w->think)(w); (*w->solid->update)(w->solid, dt); weapon_render(w); @@ -137,6 +150,29 @@ void weapon_add(const Outfit* outfit, const double dir, const Vec2* pos, const V } } +// Destroy the weapon. +static void weapon_destroy(Weapon* w, WeaponLayer layer) { + int i; + Weapon** wlayer; + int* nlayer; + switch(layer) { + case WEAPON_LAYER_BG: + wlayer = backLayer; + nlayer = &nbackLayer; + break; + case WEAPON_LAYER_FG: + wlayer = frontLayer; + nlayer = &nfrontLayer; + break; + } + for(i = 0; wlayer[i] != w; i++) // Get us to the current posision. + weapon_free(wlayer[i]); + (*nlayer)--; + + for(; (*nlayer); i++) + wlayer[i] = wlayer[i+1]; +} + // Clear the weapon. static void weapon_free(Weapon* w) { solid_free(w->solid); @@ -149,10 +185,14 @@ void weapon_clear(void) { for(i = 0; i < nbackLayer; i++) weapon_free(backLayer[i]); nbackLayer = 0; - backLayer = NULL; for(i = 0; i < nfrontLayer; i++) weapon_free(frontLayer[i]); nfrontLayer = 0; - frontLayer = NULL; +} + +void weapon_exit(void) { + weapon_clear(); + free(backLayer); + free(frontLayer); } diff --git a/src/weapon.h b/src/weapon.h index 6d6df73..eb5cf2b 100644 --- a/src/weapon.h +++ b/src/weapon.h @@ -9,3 +9,6 @@ void weapon_add(const Outfit* outfit, const double dir, void weapons_update(const double dt, WeaponLayer layer); +void weapon_clear(void); +void weapon_exit(void); +