diff --git a/src/outfit.c b/src/outfit.c index d7e4bb3..993c16d 100644 --- a/src/outfit.c +++ b/src/outfit.c @@ -110,27 +110,33 @@ char** outfit_getTech(int* n, const int* tech, const int techmax) { return outfitnames; } -void outfit_calcDamage(double* dshield, double* darmour, +/* Give the real shield damage, armour damage and knockback modifier. */ +void outfit_calcDamage(double* dshield, double* darmour, double* knockback, DamageType dtype, double dmg) { switch(dtype) { case DAMAGE_TYPE_ENERGY: (*dshield) = dmg*1.1; (*darmour) = dmg*0.7; + (*knockback) = 0.1; break; case DAMAGE_TYPE_KINETIC: (*dshield) = dmg*0.8; (*darmour) = dmg*1.2; + (*knockback) = 1.; break; case DAMAGE_TYPE_ION: (*dshield) = 0.; (*darmour) = dmg; + (*knockback) = 0.4; break; case DAMAGE_TYPE_RADIATION: (*dshield) = 0.15; /* Still take damage, just very little. */ (*darmour) = dmg; + (*knockback) = 0.8; default: - (*dshield) = (*darmour) = 0.; + WARN("Unknown damage type: %d!", dtype); + (*dshield) = (*darmour) = (*knockback) = 0.; break; } } diff --git a/src/outfit.h b/src/outfit.h index 7b55efe..426420f 100644 --- a/src/outfit.h +++ b/src/outfit.h @@ -121,7 +121,7 @@ typedef struct Outfit_ { } Outfit; /* Misc. */ -void outfit_calcDamage(double* dshield, double* darmour, +void outfit_calcDamage(double* dshield, double* darmour, double* knockback, DamageType dtype, double dmg); /* Get. */ diff --git a/src/pilot.c b/src/pilot.c index d7f3e46..7fb0239 100644 --- a/src/pilot.c +++ b/src/pilot.c @@ -245,12 +245,12 @@ static void pilot_shootWeapon(Pilot* p, PilotOutfit* w, const unsigned int t) { void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter, const DamageType dtype, const double damage) { - double damage_shield, damage_armour, dam_mod; + double damage_shield, damage_armour, knockback, dam_mod; /* Calculate the damage. */ - outfit_calcDamage(&damage_shield, &damage_armour, dtype, damage); + outfit_calcDamage(&damage_shield, &damage_armour, &knockback, dtype, damage); - if(p->shield - damage_shield > 0.) { + if(p->shield - damage_shield > 0.) { /* Shields take the whole blow. */ p->shield -= damage_shield; dam_mod = damage_shield/p->shield_max; } @@ -286,8 +286,8 @@ void pilot_hit(Pilot* p, const Solid* w, const unsigned int shooter, /* Knock back effect is dependent on both damage and mass of the weapon. */ /* should probably turn it into a partial conservative collision.. */ vect_cadd(&p->solid->vel, - w->vel.x * (dam_mod/6. + w->mass/p->solid->mass/6.), - w->vel.y * (dam_mod/6. + w->mass/p->solid->mass/6.)); + knockback * (w->vel.x * (dam_mod/6. + w->mass/p->solid->mass/6.)), + knockback * (w->vel.y * (dam_mod/6. + w->mass/p->solid->mass/6.))); } void pilot_dead(Pilot* p) {