diff --git a/README.md b/README.md index 0595634..d958f40 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,9 @@ CC BY-NC-SA 3.0, with the following attribution: Copyright 2015-2016, Stephen J * 251431__onlytheghosts__fusion-gun-flash0-by-onlytheghosts.ogg - fusion-gun_flash0_by_OnlyTheGhosts.wav, by OnlyTheGhosts - https://freesound.org/people/OnlyTheGhosts/sounds/251431/ * 172591__timbre__zapitydooda.ogg - d1clsstf.wav, by wildweasel - https://freesound.org/people/wildweasel/sounds/39030/ * 39030__wildweasel__d1clsstf.ogg - push_button_switch_07.wav, by joedeshon - https://freesound.org/people/joedeshon/sounds/139061/ +* 254174__kwahmah-02__s.ogg - s.wav, by kwahmah_02 - https://freesound.org/people/kwahmah_02/sounds/254174/ +* 172870__escortmarius__carbidexplosion.ogg - carbidexplosion.wav, by escortmarius - https://freesound.org/people/escortmarius/sounds/172870/ + ### MUSIC diff --git a/gfx/entities/mineWarning.png b/gfx/entities/mineWarning.png new file mode 100644 index 0000000..8b78308 Binary files /dev/null and b/gfx/entities/mineWarning.png differ diff --git a/sound/172870__escortmarius__carbidexplosion.ogg b/sound/172870__escortmarius__carbidexplosion.ogg new file mode 100644 index 0000000..e65522f Binary files /dev/null and b/sound/172870__escortmarius__carbidexplosion.ogg differ diff --git a/sound/254174__kwahmah-02__s.ogg b/sound/254174__kwahmah-02__s.ogg new file mode 100644 index 0000000..8ef31a6 Binary files /dev/null and b/sound/254174__kwahmah-02__s.ogg differ diff --git a/src/battle/effects.c b/src/battle/effects.c index f3684e8..330fc7a 100644 --- a/src/battle/effects.c +++ b/src/battle/effects.c @@ -312,6 +312,26 @@ void addMineExplosion(void) e->x -= e->size / 2; e->y -= e->size / 2; } + + e = malloc(sizeof(Effect)); + + memset(e, 0, sizeof(Effect)); + battle.effectTail->next = e; + battle.effectTail = e; + + e->type = EFFECT_HALO; + e->x = self->x; + e->y = self->y; + e->size = 32; + e->scaleAmount = 2; + e->texture = haloTexture; + + e->r = 255; + e->g = 255; + e->b = 255; + e->a = 128; + + e->health = 128; } void addLargeExplosion(void) diff --git a/src/battle/mine.c b/src/battle/mine.c index 0100c23..6d4403f 100644 --- a/src/battle/mine.c +++ b/src/battle/mine.c @@ -23,6 +23,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. static void think(void); static void die(void); static void lookForFighters(void); +static void doSplashDamage(void); + +static SDL_Texture *mineWarning; +static SDL_Texture *mineNormal; Entity *spawnMine(void) { @@ -30,16 +34,22 @@ Entity *spawnMine(void) mine->type = ET_MINE; mine->health = mine->maxHealth = 1; + mine->systemPower = SYSTEM_POWER; mine->texture = getTexture("gfx/entities/mine.png"); mine->action = think; mine->die = die; - mine->flags = EF_TAKES_DAMAGE+EF_SHORT_RADAR_RANGE; + mine->flags = EF_TAKES_DAMAGE+EF_SHORT_RADAR_RANGE+EF_NO_TARGET; + + mineNormal = getTexture("gfx/entities/mine.png"); + mineWarning = getTexture("gfx/entities/mineWarning.png"); return mine; } static void think(void) { + self->texture = mineNormal; + self->angle += 0.1; if (self->angle >= 360) @@ -48,13 +58,13 @@ static void think(void) } lookForFighters(); -} - -static void die(void) -{ - addMineExplosion(); - self->alive = ALIVE_DEAD; + if (self->systemPower < SYSTEM_POWER && SDL_GetTicks() % 150 < 75) + { + playBattleSound(SND_MINE_WARNING, self->x, self->y); + + self->texture = mineWarning; + } } static void lookForFighters(void) @@ -62,13 +72,63 @@ static void lookForFighters(void) Entity *e, **candidates; int i; + candidates = getAllEntsWithin(self->x - (self->w / 2) - DAMAGE_RANGE, self->y - (self->h / 2) - DAMAGE_RANGE, self->w + DAMAGE_RANGE, self->h + DAMAGE_RANGE, self); + + for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) + { + if (e->health > 0 && e->type == ET_FIGHTER && getDistance(self->x, self->y, e->x, e->y) <= TRIGGER_RANGE) + { + self->systemPower--; + + if (self->systemPower <= 0) + { + self->health = 0; + } + + return; + } + } + + self->systemPower = SYSTEM_POWER; +} + + +static void die(void) +{ + addMineExplosion(); + + doSplashDamage(); + + playBattleSound(SND_EXPLOSION_5, self->x, self->y); + + self->alive = ALIVE_DEAD; +} + +static void doSplashDamage(void) +{ + Entity *e, **candidates; + int i, dist; + float damage, percent; + candidates = getAllEntsWithin(self->x - (self->w / 2), self->y - (self->h / 2), self->w, self->h, self); for (i = 0, e = candidates[i] ; e != NULL ; e = candidates[++i]) { - if (e->health > 0 && e->type == ET_FIGHTER && getDistance(self->x, self->y, e->x, e->y) <= 128) + if (e->health > 0 && e->type == ET_FIGHTER) { - self->health = 0; + dist = getDistance(self->x, self->y, e->x, e->y); + + if (dist <= DAMAGE_RANGE) + { + percent = dist; + percent /= DAMAGE_RANGE; + percent = 1 - percent; + + damage = 100; + damage *= percent; + + damageFighter(e, damage, 0); + } } } } diff --git a/src/battle/mine.h b/src/battle/mine.h index 2eef022..71299db 100644 --- a/src/battle/mine.h +++ b/src/battle/mine.h @@ -20,10 +20,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "../common.h" +#define TRIGGER_RANGE 150 +#define DAMAGE_RANGE 255 +#define SYSTEM_POWER 75 + extern Entity *spawnEntity(void); extern SDL_Texture *getTexture(char *filename); extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore); extern int getDistance(int x1, int y1, int x2, int y2); extern void addMineExplosion(void); +extern void damageFighter(Entity *e, int amount, long flags); +extern void playBattleSound(int id, int x, int y); extern Entity *self; diff --git a/src/battle/player.c b/src/battle/player.c index a47e192..221326a 100644 --- a/src/battle/player.c +++ b/src/battle/player.c @@ -480,7 +480,7 @@ static void selectTarget(void) for (e = battle.entityHead.next ; e != NULL ; e = e->next) { - if (e->active && e != player && (e->flags & EF_TAKES_DAMAGE) && e->side != player->side && e->alive == ALIVE_ALIVE && e->systemPower > 0 && i < MAX_SELECTABLE_TARGETS) + if (e->active && e != player && (e->flags & EF_TAKES_DAMAGE) && (!(e->flags & EF_NO_TARGET)) && e->side != player->side && e->alive == ALIVE_ALIVE && e->systemPower > 0 && i < MAX_SELECTABLE_TARGETS) { dist = getDistance(self->x, self->y, e->x, e->y); if (dist < closest) diff --git a/src/defs.h b/src/defs.h index a9bad27..605874b 100644 --- a/src/defs.h +++ b/src/defs.h @@ -98,6 +98,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EF_ROPED_ATTACHED (2 << 15) #define EF_NO_KILL_INC (2 << 16) #define EF_SHORT_RADAR_RANGE (2 << 17) +#define EF_NO_TARGET (2 << 18) #define AIF_NONE 0 #define AIF_FOLLOWS_PLAYER (2 << 0) @@ -228,6 +229,7 @@ enum SND_EXPLOSION_2, SND_EXPLOSION_3, SND_EXPLOSION_4, + SND_EXPLOSION_5, SND_GET_ITEM, SND_MISSILE, SND_INCOMING, @@ -238,6 +240,7 @@ enum SND_POWER_DOWN, SND_BOOST, SND_RADIO, + SND_MINE_WARNING, SND_GUI_CLICK, SND_GUI_SELECT, SND_GUI_CLOSE, diff --git a/src/system/sound.c b/src/system/sound.c index 3b122b2..a2c68d3 100644 --- a/src/system/sound.c +++ b/src/system/sound.c @@ -112,11 +112,13 @@ static void loadSounds(void) sounds[SND_EXPLOSION_2] = loadSound("sound/207322__animationisaac__short-explosion.ogg"); sounds[SND_EXPLOSION_3] = loadSound("sound/254071__tb0y298__firework-explosion.ogg"); sounds[SND_EXPLOSION_4] = loadSound("sound/47252__nthompson__bad-explosion.ogg"); + sounds[SND_EXPLOSION_5] = loadSound("sound/172870__escortmarius__carbidexplosion.ogg"); sounds[SND_JUMP] = loadSound("sound/276912__pauldihor__transform.ogg"); sounds[SND_ECM] = loadSound("sound/251431__onlytheghosts__fusion-gun-flash0-by-onlytheghosts.ogg"); sounds[SND_MAG_HIT] = loadSound("sound/172591__timbre__zapitydooda.ogg"); sounds[SND_POWER_DOWN] = loadSound("sound/39030__wildweasel__d1clsstf.ogg"); sounds[SND_SELECT_WEAPON] = loadSound("sound/329359__bassoonrckr__reed-guillotine.ogg"); + sounds[SND_MINE_WARNING] = loadSound("sound/254174__kwahmah-02__s.ogg"); sounds[SND_GUI_CLICK] = loadSound("sound/257786__xtrgamr__mouse-click.ogg"); sounds[SND_GUI_SELECT] = loadSound("sound/321104__nsstudios__blip2.ogg");