diff --git a/Makefile b/Makefile
index 84ea8f9..7d7806a 100644
--- a/Makefile
+++ b/Makefile
@@ -1,7 +1,7 @@
CXXFLAGS ?= -O2 -Wall -g
CXXFLAGS += `pkg-config --cflags sdl2 SDL2_image SDL2_mixer`
LIBS = `pkg-config --libs sdl2 SDL2_image SDL2_mixer`
-OBJS = alien.o audio.o bullet.o cargo.o collectable.o explosions.o game.o globals.o graphics.o init.o intermission.o loadSave.o messages.o misc.o missions.o player.o resources.o script.o ship.o shop.o Starfighter.o title.o weapons.o
+OBJS = alien.o audio.o bullet.o cargo.o collectable.o explosion.o game.o globals.o graphics.o init.o intermission.o loadSave.o messages.o misc.o missions.o player.o resources.o script.o ship.o shop.o Starfighter.o title.o weapons.o
VERSION = 1.3.2-dev
PROG = starfighter
diff --git a/src/Starfighter.h b/src/Starfighter.h
index 128506e..53b07dd 100644
--- a/src/Starfighter.h
+++ b/src/Starfighter.h
@@ -40,7 +40,7 @@ along with this program. If not, see .
#include "bullet.h"
#include "cargo.h"
#include "collectable.h"
-#include "explosions.h"
+#include "explosion.h"
#include "game.h"
#include "globals.h"
#include "graphics.h"
diff --git a/src/collectable.cpp b/src/collectable.cpp
index 6752553..19ae2cc 100644
--- a/src/collectable.cpp
+++ b/src/collectable.cpp
@@ -213,7 +213,7 @@ void collectable_explode(collectables *collectable)
audio_playSound(SFX_EXPLOSION, collectable->x);
for (int i = 0 ; i < 10 ; i++)
- addExplosion(collectable->x + rand() % 25 - rand() % 25,
+ explosion_add(collectable->x + rand() % 25 - rand() % 25,
collectable->y + rand() % 25 - rand() % 25, E_BIG_EXPLOSION);
player_checkShockDamage(collectable->x, collectable->y);
diff --git a/src/explosions.cpp b/src/explosion.cpp
similarity index 51%
rename from src/explosions.cpp
rename to src/explosion.cpp
index d4de258..d56eef7 100644
--- a/src/explosions.cpp
+++ b/src/explosion.cpp
@@ -25,7 +25,7 @@ The "type" will actually be used as an explosion frame check.
All explosion types have 4 images. The "thinktime" will be used
to change frames on a 21, 14, 7 basis.
*/
-void addExplosion(float x, float y, int type)
+void explosion_add(float x, float y, int type)
{
object *explosion = new object;
@@ -45,7 +45,7 @@ void addExplosion(float x, float y, int type)
* This very simply just adds a tiny explosion at the coordinate specified.
* It creates a small engine like effect.
*/
-void addEngine(object *craft)
+void explosion_addEngine(object *craft)
{
if (rand() % 2 == 0)
return;
@@ -54,65 +54,5 @@ void addEngine(object *craft)
float y = craft->y + craft->engineY;
y += RANDRANGE(-3, 3);
- addExplosion(x, y, E_TINY_EXPLOSION);
+ explosion_add(x, y, E_TINY_EXPLOSION);
}
-
-static bool isOnScreen(int x, int y, int w, int h)
-{
- return (x + w > 0) && (x < 800) && (y + h > 0) && (y < 600);
-}
-
-/*
-Loops through active explosions and decrements their think time.
-If their thinktime is divisable by 5, then the frame is changed to
-the next one up (for example 0->1->2-3). When their think time is 0,
-the explosion is killed off.
-*/
-void doExplosions()
-{
- object *prevExplosion = engine.explosionHead;
- object *explosion = engine.explosionHead;
- engine.explosionTail = engine.explosionHead;
-
- while (explosion->next != NULL)
- {
- explosion = explosion->next;
-
- if (explosion->active)
- {
- explosion->x += engine.ssx + engine.smx;
- explosion->y += engine.ssy + engine.smy;
-
- if (isOnScreen((int)explosion->x, (int)explosion->y, explosion->image[0]->w, explosion->image[0]->h))
- blit(explosion->image[0], (int)explosion->x, (int)explosion->y);
-
- if(rand() % 7 == 0)
- {
- explosion->thinktime -= 7;
-
- if(explosion->thinktime < 1)
- {
- explosion->active = false;
- }
- else
- {
- explosion->face++;
- explosion->image[0] = shape[explosion->face];
- }
- }
- }
-
- if (explosion->active)
- {
- prevExplosion = explosion;
- engine.explosionTail = explosion;
- }
- else
- {
- prevExplosion->next = explosion->next;
- delete explosion;
- explosion = prevExplosion;
- }
- }
-}
-
diff --git a/src/explosions.h b/src/explosion.h
similarity index 86%
rename from src/explosions.h
rename to src/explosion.h
index 1ae127c..95b80a7 100644
--- a/src/explosions.h
+++ b/src/explosion.h
@@ -20,8 +20,7 @@ along with this program. If not, see .
#ifndef EXPLOSIONS_H
#define EXPLOSIONS_H
-extern void addExplosion(float x, float y, int type);
-extern void addEngine(object *craft);
-extern void doExplosions();
+void explosion_add(float x, float y, int type);
+void explosion_addEngine(object *craft);
#endif
diff --git a/src/game.cpp b/src/game.cpp
index 38d76b0..ae2d89e 100644
--- a/src/game.cpp
+++ b/src/game.cpp
@@ -460,11 +460,11 @@ static void game_doBullets()
if (bullet->id == WT_ROCKET)
{
- addExplosion(bullet->x, bullet->y, E_SMALL_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_SMALL_EXPLOSION);
}
else if (bullet->id == WT_MICROROCKET)
{
- addExplosion(bullet->x, bullet->y, E_TINY_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_TINY_EXPLOSION);
}
if ((bullet->flags & WF_AIMED))
@@ -561,7 +561,7 @@ static void game_doBullets()
bullet->shield = 0;
audio_playSound(SFX_EXPLOSION, bullet->x);
for (int i = 0 ; i < 10 ; i++)
- addExplosion(bullet->x + RANDRANGE(-35, 35),
+ explosion_add(bullet->x + RANDRANGE(-35, 35),
bullet->y + RANDRANGE(-35, 35),
E_BIG_EXPLOSION);
}
@@ -573,9 +573,9 @@ static void game_doBullets()
}
if (bullet->id == WT_ROCKET)
- addExplosion(bullet->x, bullet->y, E_BIG_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_BIG_EXPLOSION);
else
- addExplosion(bullet->x, bullet->y, E_SMALL_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_SMALL_EXPLOSION);
}
}
}
@@ -613,7 +613,7 @@ static void game_doBullets()
bullet->shield = 0;
audio_playSound(SFX_EXPLOSION, bullet->x);
for (int i = 0 ; i < 10 ; i++)
- addExplosion(bullet->x + RANDRANGE(-35, 35),
+ explosion_add(bullet->x + RANDRANGE(-35, 35),
bullet->y + RANDRANGE(-35, 35), E_BIG_EXPLOSION);
}
}
@@ -626,9 +626,9 @@ static void game_doBullets()
audio_playSound(SFX_HIT, player.x);
if (bullet->id == WT_ROCKET)
- addExplosion(bullet->x, bullet->y, E_BIG_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_BIG_EXPLOSION);
else
- addExplosion(bullet->x, bullet->y, E_SMALL_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_SMALL_EXPLOSION);
}
}
}
@@ -643,14 +643,14 @@ static void game_doBullets()
if (collision(bullet, &cargo[j]))
{
bullet->active = false;
- addExplosion(bullet->x, bullet->y, E_SMALL_EXPLOSION);
+ explosion_add(bullet->x, bullet->y, E_SMALL_EXPLOSION);
audio_playSound(SFX_HIT, cargo[j].x);
if (cargo[j].collectType != P_PHOEBE)
{
cargo[j].active = false;
audio_playSound(SFX_EXPLOSION, cargo[j].x);
for (int i = 0 ; i < 10 ; i++)
- addExplosion(cargo[j].x + RANDRANGE(-15, 15),
+ explosion_add(cargo[j].x + RANDRANGE(-15, 15),
cargo[j].y + RANDRANGE(-15, 15),
E_BIG_EXPLOSION);
updateMissionRequirements(M_PROTECT_PICKUP,
@@ -716,7 +716,7 @@ static void game_doBullets()
{
audio_playSound(SFX_EXPLOSION, bullet->x);
for (int i = 0 ; i < 10 ; i++)
- addExplosion(bullet->x + RANDRANGE(-35, 35),
+ explosion_add(bullet->x + RANDRANGE(-35, 35),
bullet->y + RANDRANGE(-35, 35), E_BIG_EXPLOSION);
player_checkShockDamage(bullet->x, bullet->y);
@@ -1008,14 +1008,14 @@ static void game_doAliens()
if ((!(aliens[i].flags & FL_DISABLED)) &&
(aliens[i].classDef != CD_ASTEROID) &&
(aliens[i].classDef != CD_ASTEROID2))
- addEngine(&aliens[i]);
+ explosion_addEngine(&aliens[i]);
if ((!(aliens[i].flags & FL_ISCLOAKED)) || (aliens[i].hit > 0))
blit(shipShape[shapeToUse], (int)aliens[i].x,
(int)aliens[i].y);
if (aliens[i].flags & FL_DISABLED)
{
if ((rand() % 10) == 0)
- addExplosion(aliens[i].x + (rand() % aliens[i].image[0]->w),
+ explosion_add(aliens[i].x + (rand() % aliens[i].image[0]->w),
aliens[i].y + (rand() % aliens[i].image[0]->h),
E_ELECTRICAL);
}
@@ -1032,7 +1032,7 @@ static void game_doAliens()
{
blit(aliens[i].image[aliens[i].face], (int)aliens[i].x,
(int)aliens[i].y);
- addExplosion(aliens[i].x + (rand() % aliens[i].image[0]->w),
+ explosion_add(aliens[i].x + (rand() % aliens[i].image[0]->w),
aliens[i].y + (rand() % aliens[i].image[0]->h),
E_BIG_EXPLOSION);
}
@@ -1293,7 +1293,7 @@ static void game_doPlayer()
}
if ((player.maxShield <= 1) || (player.shield > engine.lowShield))
- addEngine(&player);
+ explosion_addEngine(&player);
shapeToUse = player.face;
@@ -1305,7 +1305,7 @@ static void game_doPlayer()
blit(shipShape[shapeToUse], (int)player.x, (int)player.y);
if ((player.maxShield > 1) && (player.shield <= engine.lowShield) &&
(rand() % 5 < 1))
- addExplosion(player.x + RANDRANGE(-10, 10),
+ explosion_add(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 20), E_SMOKE);
}
else
@@ -1330,7 +1330,7 @@ static void game_doPlayer()
engine.keyState[KEY_UP] = engine.keyState[KEY_DOWN] = engine.keyState[KEY_LEFT] = engine.keyState[KEY_RIGHT] = 0;
if ((rand() % 3) == 0)
- addExplosion(player.x + RANDRANGE(-10, 10),
+ explosion_add(player.x + RANDRANGE(-10, 10),
player.y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
if (player.shield == -99)
game_addDebris((int)player.x, (int)player.y, player.maxShield);
@@ -1415,7 +1415,7 @@ static void game_doDebris()
debris->x += debris->dx;
debris->y += debris->dy;
- addExplosion(debris->x + RANDRANGE(-10, 10), debris->y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
+ explosion_add(debris->x + RANDRANGE(-10, 10), debris->y + RANDRANGE(-10, 10), E_BIG_EXPLOSION);
}
if (debris->thinktime < 1)
@@ -1433,6 +1433,59 @@ static void game_doDebris()
}
}
+/*
+Loops through active explosions and decrements their think time.
+If their thinktime is divisable by 5, then the frame is changed to
+the next one up (for example 0->1->2-3). When their think time is 0,
+the explosion is killed off.
+*/
+void game_doExplosions()
+{
+ object *prevExplosion = engine.explosionHead;
+ object *explosion = engine.explosionHead;
+ engine.explosionTail = engine.explosionHead;
+
+ while (explosion->next != NULL)
+ {
+ explosion = explosion->next;
+
+ if (explosion->active)
+ {
+ explosion->x += engine.ssx + engine.smx;
+ explosion->y += engine.ssy + engine.smy;
+
+ blit(explosion->image[0], (int)explosion->x, (int)explosion->y);
+
+ if(rand() % 7 == 0)
+ {
+ explosion->thinktime -= 7;
+
+ if(explosion->thinktime < 1)
+ {
+ explosion->active = false;
+ }
+ else
+ {
+ explosion->face++;
+ explosion->image[0] = shape[explosion->face];
+ }
+ }
+ }
+
+ if (explosion->active)
+ {
+ prevExplosion = explosion;
+ engine.explosionTail = explosion;
+ }
+ else
+ {
+ prevExplosion->next = explosion->next;
+ delete explosion;
+ explosion = prevExplosion;
+ }
+ }
+}
+
/*
Checked during the main game loop. When the game is paused
it goes into a constant loop checking this routine. If escape is
@@ -1735,7 +1788,7 @@ int mainGameLoop()
game_doPlayer();
game_doCargo();
game_doDebris();
- doExplosions();
+ game_doExplosions();
doInfo();
WRAP_ADD(engine.eventTimer, -1, 0, 60);
diff --git a/src/game.h b/src/game.h
index 17eb3ae..b51ff83 100644
--- a/src/game.h
+++ b/src/game.h
@@ -23,6 +23,7 @@ along with this program. If not, see .
extern Game currentGame;
extern void newGame();
+void game_doExplosions();
extern int mainGameLoop();
#endif
diff --git a/src/script.cpp b/src/script.cpp
index d3664f5..de6b504 100644
--- a/src/script.cpp
+++ b/src/script.cpp
@@ -244,13 +244,13 @@ void doCutscene(int scene)
unBuffer();
getPlayerInput();
doStarfield();
- doExplosions();
+ game_doExplosions();
for (int i = 0 ; i < 15 ; i++)
{
if (aliens[i].active)
{
- addEngine(&aliens[i]);
+ explosion_addEngine(&aliens[i]);
if (scene == 0 && i > 0 && (timer % 15) == i) {
aliens[i].dx += (drand48() - 0.5) * 0.1;
aliens[i].dy += (drand48() - 0.5) * 0.1;
diff --git a/src/ship.cpp b/src/ship.cpp
index da38f4e..7dff728 100644
--- a/src/ship.cpp
+++ b/src/ship.cpp
@@ -155,7 +155,7 @@ void ship_fireRay(object *ship)
}
player.shield--;
- addExplosion(player.x, player.y, E_SMALL_EXPLOSION);
+ explosion_add(player.x, player.y, E_SMALL_EXPLOSION);
audio_playSound(SFX_HIT, player.x);
if (player.shield < 1)
{
diff --git a/src/title.cpp b/src/title.cpp
index 690a8d7..5fb2b9b 100644
--- a/src/title.cpp
+++ b/src/title.cpp
@@ -276,11 +276,11 @@ int doTitle()
now = SDL_GetTicks();
doStarfield();
- doExplosions();
+ game_doExplosions();
for (int i = 0 ; i < 15 ; i++)
{
- addEngine(&aliens[i]);
+ explosion_addEngine(&aliens[i]);
aliens[i].x += aliens[i].dx;
blit(aliens[i].image[0], (int)aliens[i].x, (int)aliens[i].y);
if (aliens[i].x > 830)