diff --git a/dat/outfit.xml b/dat/outfit.xml index 83da37a..c306f39 100644 --- a/dat/outfit.xml +++ b/dat/outfit.xml @@ -9,6 +9,7 @@ <specific type="1"> <gfx>lasergreen</gfx> <sound>laser</sound> + <spfx>ExpS</spfx> <delay>500</delay> <speed>550</speed> <range>300</range> @@ -39,6 +40,7 @@ <specific type="6"> <gfx>missile</gfx> <sound>missile</sound> + <spfx>ExmM</spfx> <duration>5</duration> <thrust>1200</thrust> <turn>200</turn> diff --git a/gfx/spfx/expl.png b/gfx/spfx/expl.png new file mode 100644 index 0000000..f6d2d46 Binary files /dev/null and b/gfx/spfx/expl.png differ diff --git a/gfx/spfx/expm.png b/gfx/spfx/expm.png new file mode 100644 index 0000000..9686080 Binary files /dev/null and b/gfx/spfx/expm.png differ diff --git a/src/outfit.c b/src/outfit.c index 282ed0d..386ffaf 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -7,6 +7,7 @@ #include "log.h" #include "pack.h" #include "xml.h" +#include "spfx.h" #include "outfit.h" #define outfit_setProp(o,p) ((o)->properties |= p) @@ -110,6 +111,8 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) { snprintf(str, strlen(xml_get(node))+sizeof(OUTFIT_GFX)+4, OUTFIT_GFX"%s.png", xml_get(node)); tmp->gfx_space = gl_newSprite(str, 6, 6); } + else if(xml_isNode(node, "spfx")) + tmp->spfx = spfx_get(xml_get(node)); else if(xml_isNode(node, "sound")) tmp->sound = sound_get(xml_get(node)); else if(xml_isNode(node, "damage")) { @@ -167,6 +170,8 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) { OUTFIT_GFX"%s.png", xml_get(node)); tmp->gfx_space = gl_newSprite(str, 6, 6); } + else if(xml_isNode(node, "spfx")) + tmp->spfx = spfx_get(xml_get(node)); else if(xml_isNode(node, "sound")) tmp->sound = sound_get(xml_get(node)); else if(xml_isNode(node, "damage")) { diff --git a/src/outfit.h b/src/outfit.h index 7649e36..b27233d 100644 --- a/src/outfit.h +++ b/src/outfit.h @@ -48,6 +48,7 @@ typedef struct Outfit_ { glTexture* gfx_space; ALuint sound; // Sound to play. + int spfx; // Special effect on hit. }; struct { // Launcher. //unsigned int delay; // Delay between shots. diff --git a/src/spfx.c b/src/spfx.c index 4478673..e8872cc 100644 --- a/src/spfx.c +++ b/src/spfx.c @@ -66,9 +66,20 @@ static void spfx_base_free(SPFX_Base* effect) { if(effect->gfx) gl_freeTexture(effect->gfx); } +int spfx_get(char* name) { + int i; + for(i = 0; i < spfx_neffects; i++) + if(strcmp(spfx_effects[i].name, name)==0) + return i; + WARN("SPFX '%s' not found!", name); + return 0; +} + // Load/Unload. int spfx_load(void) { - spfx_base_load("ExpS", 600, "exps.png", 6, 5); + spfx_base_load("ExpS", 400, "exps.png", 6, 5); + spfx_base_load("ExpM", 450, "expm.png", 6, 5); + spfx_base_load("ExpL", 500, "expl.png", 6, 5); return 0; } diff --git a/src/spfx.h b/src/spfx.h index c8fd61f..920a556 100644 --- a/src/spfx.h +++ b/src/spfx.h @@ -4,10 +4,12 @@ #define SPFX_LAYER_FRONT 0 #define SPFX_LAYER_BACK 1 +// Stack manipulation. +int spfx_get(char* name); void spfx_add(const int effect, const Vec2* pos, const Vec2* vel, const int layer); -// Stack manipulation functions. +// Stack mass manipulation functions. void spfx_update(const double dt); void spfx_render(const int layer); void spfx_clear(void); diff --git a/src/weapon.c b/src/weapon.c index 7f7c568..80b1f13 100644 --- a/src/weapon.c +++ b/src/weapon.c @@ -239,9 +239,9 @@ static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer) { // Someone should let the ai know it's been attacked. if(!pilot_isPlayer(p)) { ai_attacked(p, w->parent); - spfx_add(0, &w->solid->pos, &p->solid->vel, SPFX_LAYER_BACK); + spfx_add(w->outfit->spfx, &w->solid->pos, &p->solid->vel, SPFX_LAYER_BACK); } else - spfx_add(0, &w->solid->pos, &p->solid->vel, SPFX_LAYER_FRONT); + spfx_add(w->outfit->spfx, &w->solid->pos, &p->solid->vel, SPFX_LAYER_FRONT); if(w->parent == PLAYER_ID) // Make hostile to player. pilot_setFlag(p, PILOT_HOSTILE);