From 382af1c13fdf8a0badb3ee9863d1757ef4b035af Mon Sep 17 00:00:00 2001
From: cade <>
Date: Sat, 1 Jul 2000 23:54:46 +0000
Subject: [PATCH] - added bloodlust

---
 src/include/missile.h        |  6 +----
 src/stratagus/oldmissile.cpp | 52 +++++++++++++++++++++---------------
 src/stratagus/spells.cpp     |  8 +++---
 3 files changed, 35 insertions(+), 31 deletions(-)

diff --git a/src/include/missile.h b/src/include/missile.h
index 7c0782af1..44f3906d5 100644
--- a/src/include/missile.h
+++ b/src/include/missile.h
@@ -92,11 +92,7 @@ typedef struct _missile_ {
     int		Wait;			/// delay
 
     Unit*	SourceUnit;		/// unit that fires (could be killed)
-    UnitType*	SourceType;		/// type of unit that fires
-    UnitStats*	SourceStats;		/// stats of unit that fires
-    Player*	SourcePlayer;		/// player of unit that fires
-
-    Unit* TargetUnit;                   /// target unit, used for spells
+    Unit* 	TargetUnit;             /// target unit, used for spells
 
     int 	Damage;                 /// direct damage that missile applies
     
diff --git a/src/stratagus/oldmissile.cpp b/src/stratagus/oldmissile.cpp
index f43ea1957..045f36308 100644
--- a/src/stratagus/oldmissile.cpp
+++ b/src/stratagus/oldmissile.cpp
@@ -569,9 +569,6 @@ found:
     missile->Wait=1;
 
     missile->SourceUnit=NULL;
-    missile->SourceType=NULL;
-    missile->SourceStats=NULL;
-    missile->SourcePlayer=NULL;
 
     missile->Damage = 0;
     missile->TargetUnit = NULL;
@@ -596,16 +593,25 @@ found:
 **
 **	@param attack_stats	Attacker attributes.
 **	@param goal_stats	Goal attributes.
+**	@param bloodlust	If attacker has bloodlust
 **
 **	@returns	damage produces on goal.
 */
-local int CalculateDamageStats(const UnitStats* attacker_stats
-	,const UnitStats* goal_stats)
+local int CalculateDamageStats( const UnitStats* attacker_stats,
+                                const UnitStats* goal_stats,
+				int bloodlust )
 {
     int damage;
     int basic_damage = attacker_stats->BasicDamage;
     int piercing_damage = attacker_stats->PiercingDamage;
     
+    if (bloodlust)
+      {
+      basic_damage *= 2;
+      piercing_damage *= 2;
+      printf("bloodlust\n");
+      }
+    
     damage=-goal_stats->Armor;
     damage+= basic_damage;
     if( damage<0 ) {
@@ -624,11 +630,14 @@ local int CalculateDamageStats(const UnitStats* attacker_stats
 **
 **	@param attack_stats	Attacker attributes.
 **	@param goal		Goal unit.
+**	@param bloodlust	If attacker has bloodlust
 **	@returns	damage produces on goal.
 */
-local int CalculateDamage(const UnitStats* attacker_stats,const Unit* goal)
+local int CalculateDamage( const UnitStats* attacker_stats,
+                           const Unit* goal,
+                           int bloodlust )
 {
-    return CalculateDamageStats(attacker_stats,goal->Stats);
+    return CalculateDamageStats(attacker_stats,goal->Stats,bloodlust);
 }
 
 /**
@@ -658,11 +667,11 @@ global void FireMissile(Unit* unit)
 		if( HumanWallOnMap(dx,dy) ) {
 		    // FIXME: don't use UnitTypeByIdent here, this is slow!
 		    HitWall(dx,dy,CalculateDamageStats(unit->Stats,
-			    UnitTypeByIdent("unit-human-wall")->Stats));
+			    UnitTypeByIdent("unit-human-wall")->Stats,0));
 		} else {
 		    // FIXME: don't use UnitTypeByIdent here, this is slow!
 		    HitWall(dx,dy,CalculateDamageStats(unit->Stats,
-			    UnitTypeByIdent("unit-orc-wall")->Stats));
+			    UnitTypeByIdent("unit-orc-wall")->Stats,0));
 		}
 		return;
 	    }
@@ -701,7 +710,7 @@ global void FireMissile(Unit* unit)
 	    return;
 	}
 
-	HitUnit(goal,CalculateDamage(unit->Stats,goal));
+	HitUnit(goal,CalculateDamage(unit->Stats,goal,unit->Bloodlust));
 
 	return;
     }
@@ -748,10 +757,7 @@ global void FireMissile(Unit* unit)
     //	Damage of missile
     //
     missile->SourceUnit=unit;
-    // unit->Refs++; Reference currently not used.
-    missile->SourceType=unit->Type;
-    missile->SourceStats=unit->Stats;
-    missile->SourcePlayer=unit->Player;
+    unit->Refs++; 
 }
 
 /**
@@ -819,8 +825,8 @@ global void DrawMissiles(void)
 	    x=missile->X-MapX*TileSizeX+TheUI.MapX;
 	    y=missile->Y-MapY*TileSizeY+TheUI.MapY;
 	    // FIXME: I should copy SourcePlayer for second level missiles.
-	    if( missile->SourcePlayer ) {
-		GraphicPlayerPixels(missile->SourcePlayer
+	    if( missile->SourceUnit && missile->SourceUnit->Player ) {
+		GraphicPlayerPixels(missile->SourceUnit->Player
 			,missile->Type->Sprite);
 	    }
 	    DrawMissile(missile->Type,missile->Frame,x,y);
@@ -1008,7 +1014,8 @@ global void MissileHit(const Missile* missile)
 	mis->Damage = missile->Damage; // direct damage, spells mostly
 	mis->SourceUnit = missile->SourceUnit;
     }
-    if( !missile->SourceType ) {	// no target
+    if( !missile->SourceUnit ) {	// no target
+       //FIXME: should be removed?
 	return;
     }
 
@@ -1027,14 +1034,14 @@ global void MissileHit(const Missile* missile)
                 if ( missile->Damage )
 		  HitWall(x,y,missile->Damage); // direct damage, spells mostly
 		else
-		  HitWall(x,y,CalculateDamageStats(missile->SourceStats,
-			  UnitTypeByIdent("unit-human-wall")->Stats));
+		  HitWall(x,y,CalculateDamageStats(missile->SourceUnit->Stats,
+			  UnitTypeByIdent("unit-human-wall")->Stats,0));
 	    } else {
                 if ( missile->Damage )
 		  HitWall(x,y,missile->Damage); // direct damage, spells mostly
 		else
-		  HitWall(x,y,CalculateDamageStats(missile->SourceStats,
-			  UnitTypeByIdent("unit-orc-wall")->Stats));
+		  HitWall(x,y,CalculateDamageStats(missile->SourceUnit->Stats,
+			  UnitTypeByIdent("unit-orc-wall")->Stats,0));
 	    }
 	    return;
 	}
@@ -1047,7 +1054,8 @@ global void MissileHit(const Missile* missile)
     if ( missile->Damage )
       HitUnit(goal,missile->Damage); // direct damage, spells mostly
     else
-      HitUnit(goal,CalculateDamage(missile->SourceStats,goal));
+      HitUnit(goal,CalculateDamage(missile->SourceUnit->Stats,goal,
+                                   missile->SourceUnit->Bloodlust));
 }
 
 /**
diff --git a/src/stratagus/spells.cpp b/src/stratagus/spells.cpp
index b7746aaad..773e623b2 100644
--- a/src/stratagus/spells.cpp
+++ b/src/stratagus/spells.cpp
@@ -609,8 +609,8 @@ global int SpellCast( int SpellId, Unit* unit, Unit* target, int x, int y )
 	   mis->Damage = BLIZZARD_DAMAGE;
 	   //FIXME: not correct -- blizzard should continue even if mage is 
 	   //       destroyed (though it will be quite short time...)
-	   mis->SourceUnit = unit; 
-	   mis->SourceType = unit->Type;
+	   mis->SourceUnit = unit;
+	   mis->SourceUnit->Refs++;
 	   }
 	   
 	 unit->Mana -= spell->ManaCost;
@@ -681,8 +681,8 @@ global int SpellCast( int SpellId, Unit* unit, Unit* target, int x, int y )
 	                dx*TileSizeX+TileSizeX/2,   
 	                dy*TileSizeX+TileSizeX/2 ); 
 	   
-	   unit->Refs++;
 	   mis->SourceUnit = unit;
+	   mis->SourceUnit->Refs++;
 	   if (target)
 	     {
 	     mis->TargetUnit = target;
@@ -784,7 +784,7 @@ global int SpellCast( int SpellId, Unit* unit, Unit* target, int x, int y )
 	   //FIXME: not correct -- blizzard should continue even if mage is 
 	   //       destroyed (though it will be quite short time...)
 	   mis->SourceUnit = unit; 
-	   mis->SourceType = unit->Type;
+	   mis->SourceUnit->Refs++;
 	   }
 	   
 	 unit->Mana -= spell->ManaCost;