From 10418a5ba9ed5b2f29e321efa9afcca0c9f71450 Mon Sep 17 00:00:00 2001
From: Allanis <allanis@saracraft.net>
Date: Sat, 6 Jul 2013 19:10:34 +0100
Subject: [PATCH] [Change] Knockback is now dependent on DamageType.

---
 src/outfit.c | 10 ++++++++--
 src/outfit.h |  2 +-
 src/pilot.c  | 10 +++++-----
 3 files changed, 14 insertions(+), 8 deletions(-)

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) {