88 lines
2.0 KiB
C
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);
|
|
}
|
|
|