Lephisto/src/explosion.c
2013-11-26 15:07:41 +00:00

88 lines
2.0 KiB
C

/**
* @file explosion.c
*/
#include "lephisto.h"
#include "log.h"
#include "pilot.h"
#include "weapon.h"
#include "spfx.h"
#include "rng.h"
#include "explosion.h"
/**
* @fn void expl_explode(double x, double y, double vx, double vy,
* double radius, DamageType dtype, double damage,
* unsigned int parent, int mode)
*
* @brief
*/
void expl_explode(double x, double y, double vx, double vy,
double radius, DamageType dtype, double damage,
unsigned int parent, int mode) {
int i, n;
double a, d;
double area;
double ex, ey;
double layer;
int efx;
int exp_s, exp_m, exp_l;
/* Standard stuff. */
exp_s = spfx_get("ExpS");
exp_m = spfx_get("ExpM");
exp_l = spfx_get("ExpL");
layer = SPFX_LAYER_FRONT;
/* Number of explosions. */
area = M_PI * pow2(radius);
n = (int)(area / 100.);
/* Create explosions. */
for(i = 0; i < n; i++) {
/* Get position. */
a = RNGF()*360.;
d = RNGF()*(radius-5.) + 5.;
ex = d*cos(a);
ey = d*sin(a);
/* Create explosion. */
efx = (RNG(0,2)==0) ? exp_m : exp_s;
spfx_add(efx, x+ex, y+ey, vx, vy, layer);
}
/* Final explosion. */
spfx_add(exp_l, x, y, vx, vy, layer);
/* Run the damage. */
if(damage > 0.)
expl_explodeDamage(x, y, radius, dtype, damage, parent, mode);
}
/**
* @fn
*
* @brief
*/
void expl_explodeDamage(double x, double y, double radius,
DamageType dtype, double damage,
unsigned int parent, int mode) {
/* Explosion affects ships. */
if(mode & EXPL_MODE_SHIP)
pilot_explode(x, y, radius, dtype, damage, parent);
/* Explosion affects missiles and bolts. */
if((mode & EXPL_MODE_MISSILE) && (mode & EXPL_MODE_BOLT))
weapon_explode(x, y, radius, dtype, damage, parent, mode);
/* Explosion affects missiles. */
else if(mode & EXPL_MODE_MISSILE)
weapon_explode(x, y, radius, dtype, damage, parent, mode);
/* Explosion affects bolts. */
else if(mode & EXPL_MODE_BOLT)
weapon_explode(x, y, radius, dtype, damage, parent, mode);
}