From 3cf174942b5665e408512d7885d26b86be9f5aef Mon Sep 17 00:00:00 2001
From: johns <>
Date: Thu, 6 Apr 2000 22:06:02 +0000
Subject: [PATCH] Old animations removed, now in the UnitType struct.

---
 action/action_die.cpp      |   8 +-
 action/action_minegold.cpp |  12 +-
 action/action_stand.cpp    |  20 ++-
 action/action_still.cpp    | 178 +++----------------------
 include/unittype.h         |   7 +-
 unit/script_unittype.cpp   |  10 +-
 unit/ut_table.cpp          | 261 ++++++++++++++++++++++---------------
 7 files changed, 207 insertions(+), 289 deletions(-)

diff --git a/action/action_die.cpp b/action/action_die.cpp
index 6cb52a4d7..152d165f1 100644
--- a/action/action_die.cpp
+++ b/action/action_die.cpp
@@ -155,6 +155,8 @@ global char UnitCorpse[UnitTypeInternalMax] = {
 
 #endif
 
+extern Animation ** UnitCorpse;
+
 /**
 **	Unit dies!
 **
@@ -180,8 +182,8 @@ global int HandleActionDie(Unit* unit)
 	    break;
 
 	default:
-	    if( type<UnitTypeInternalMax && UnitDie[type] ) {
-		UnitShowAnimation(unit,UnitDie[type]);	      
+	    if( unit->Type->Animations ) {
+		UnitShowAnimation(unit,unit->Type->Animations->Die);
 	    } else {
 		DebugLevel0("FIXME: die animation missing\n");
 		unit->Reset=1;
@@ -201,7 +203,7 @@ global int HandleActionDie(Unit* unit)
 	    return 1;
 	}
 	unit->SubAction=type;
-	unit->Type=&UnitTypes[UnitDeadBody];
+	unit->Type=UnitTypeByIdent("unit-dead-body");
 	unit->Frame=0;
 	unit->State=0;
 	unit->Reset=0;
diff --git a/action/action_minegold.cpp b/action/action_minegold.cpp
index a62215cd5..be1529958 100644
--- a/action/action_minegold.cpp
+++ b/action/action_minegold.cpp
@@ -167,8 +167,10 @@ local int MineInGoldmine(Unit* unit)
 	} else if( unit->Type->Type==UnitPeasant ) {
 	    unit->Type=&UnitTypes[UnitPeasantWithGold];
 	} else {
-	    DebugLevel0("Wrong unit for mining gold %d\n"
-		,unit->Type->Type);
+	    DebugLevel0("Wrong unit (%d,%d) for mining gold %d (%s)\n"
+		,unit->X,unit->Y
+		,unit->Type->Type
+		,unit->Type->Name);
 	}
 	if( UnitVisible(unit) ) {
 	    MustRedraw|=RedrawMap;
@@ -283,8 +285,10 @@ global void HandleActionMineGold(Unit* unit)
 	    } else if( unit->Type->Type==UnitPeasantWithGold ) {
 		unit->Type=&UnitTypes[UnitPeasant];
 	    } else {
-		DebugLevel0("Wrong unit for returning gold %d\n"
-		    ,unit->Type->Type);
+		DebugLevel0("Wrong unit (%d,%d) for returning gold %d (%s)\n"
+		    ,unit->X,unit->Y
+		    ,unit->Type->Type
+		    ,unit->Type->Name);
 	    }
 
 	    if( WAIT_FOR_GOLD<UNIT_MAX_WAIT ) {
diff --git a/action/action_stand.cpp b/action/action_stand.cpp
index b0249561c..b01a6ecaa 100644
--- a/action/action_stand.cpp
+++ b/action/action_stand.cpp
@@ -17,6 +17,10 @@
 
 //@{
 
+/*----------------------------------------------------------------------------
+--	Includes
+----------------------------------------------------------------------------*/
+
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -33,9 +37,9 @@
 #include "sound_server.h"
 #include "missile.h"
 
-#ifndef USE_CCL2
-extern Animation* UnitStillAnimation[UnitTypeInternalMax];
-#endif
+/*----------------------------------------------------------------------------
+--	Functions
+----------------------------------------------------------------------------*/
 
 /**
 **	Unit stands ground!
@@ -60,10 +64,9 @@ global void HandleActionStandGround(Unit* unit)
 	//
 	//	Still animation
 	//
-	DebugCheck( type->Type>=UnitTypeInternalMax
-	    || !UnitStillAnimation[type->Type] );
+        DebugCheck( !type->Animations || !type->Animations->Still );
 
-	UnitShowAnimation(unit,UnitStillAnimation[type->Type]);
+	UnitShowAnimation(unit,type->Animations->Still);
 
 	//
 	//	FIXME: this a workaround of a bad code.
@@ -83,7 +86,7 @@ global void HandleActionStandGround(Unit* unit)
     }
 
     //
-    //	Building:	burning
+    //	Building:	burning FIXME: must moved to general point
     //
     if( type->Building ) {
 	if( unit->HP ) {
@@ -112,6 +115,8 @@ global void HandleActionStandGround(Unit* unit)
 	}
     }
 
+#if 0
+    // JOHNS: critters removed here
     //
     //	Critters:	are moving random around.
     //
@@ -160,6 +165,7 @@ global void HandleActionStandGround(Unit* unit)
 
 	}
     }
+#endif
 
     //
     //	Workers and mage didn't attack automatic
diff --git a/action/action_still.cpp b/action/action_still.cpp
index b67e07026..50dcb8272 100644
--- a/action/action_still.cpp
+++ b/action/action_still.cpp
@@ -17,6 +17,10 @@
 
 //@{
 
+/*----------------------------------------------------------------------------
+--	Includes
+----------------------------------------------------------------------------*/
+
 #include <stdio.h>
 #include <stdlib.h>
 
@@ -33,166 +37,16 @@
 #include "sound_server.h"
 #include "missile.h"
 
-#ifndef USE_CCL2
 /*----------------------------------------------------------------------------
---	Still
+--	Functions
 ----------------------------------------------------------------------------*/
 
-//	Gryphon rider, Kurdan and Sky'ree:
-local Animation GryphonRiderStill[] = {
-    {2, 0, 6, 0},  {2, 0, 6, 5},  {2, 0, 6, 5},  {3, 0, 6, 5}
-};
-
-//	Dragon, Deathwing:
-local Animation DragonStill[] = {
-    {2, 0, 6, 0},  {2, 0, 6, 5},  {2, 0, 6, 5},  {3, 0, 6, 5}
-};
-
-//	GnomishFlyingMachine:
-local Animation GnomishFlyingMachineStill[] = {
-    {2, 0, 1, 0},  {2, 0, 1, 5},  {2, 0, 1, 0},  {3, 0, 1,-5}
-};
-
-//	Daemon:
-local Animation DaemonStill[] = {
-    {2, 0, 4, 0},  {2, 0, 4, 5},  {2, 0, 4, 5},  {3, 0, 4, 5}
-};
-
-//	Default:
-local Animation DefaultStill[] = {
-// FIXME: Reset frame 0, wait 1, than endless wait 5
-    {0, 0, 4, 0}, {3, 0, 1, 0}
-};
-
-/*
-**	Still animation. FIXME: move this to unit-type, CCL configurable
-*/
-global Animation* UnitStillAnimation[UnitTypeInternalMax] = {
-    DefaultStill,		// UnitFootman
-    DefaultStill,		// UnitGrunt
-    DefaultStill,		// UnitPeasant
-    DefaultStill,		// UnitPeon
-    DefaultStill,		// UnitBallista
-    DefaultStill,		// UnitCatapult
-    DefaultStill,		// UnitKnight
-    DefaultStill,		// UnitOgre
-    DefaultStill,		// UnitArcher
-    DefaultStill,		// UnitAxethrower
-    DefaultStill,		// UnitMage
-    DefaultStill,		// UnitDeathKnight
-    DefaultStill,		// UnitPaladin
-    DefaultStill,		// UnitOgreMage
-    DefaultStill,		// UnitDwarves
-    DefaultStill,		// UnitGoblinSappers
-    DefaultStill,		// UnitAttackPeasant
-    DefaultStill,		// UnitAttackPeon
-    DefaultStill,		// UnitRanger
-    DefaultStill,		// UnitBerserker
-    DefaultStill,		// UnitAlleria
-    DefaultStill,		// UnitTeronGorefiend
-    GryphonRiderStill,		// UnitKurdanAndSky_ree
-    DefaultStill,		// UnitDentarg
-    DefaultStill,		// UnitKhadgar
-    DefaultStill,		// UnitGromHellscream
-    DefaultStill,		// UnitTankerHuman
-    DefaultStill,		// UnitTankerOrc
-    DefaultStill,		// UnitTransportHuman
-    DefaultStill,		// UnitTransportOrc
-    DefaultStill,		// UnitElvenDestroyer
-    DefaultStill,		// UnitTrollDestroyer
-    DefaultStill,		// UnitBattleship
-    DefaultStill,		// UnitJuggernaught
-    DefaultStill,		// UnitNothing
-    DragonStill,		// UnitDeathwing
-    DefaultStill,		// UnitNothing1
-    DefaultStill,		// UnitNothing2
-    DefaultStill,		// UnitGnomishSubmarine
-    DefaultStill,		// UnitGiantTurtle
-    GnomishFlyingMachineStill,	// UnitGnomishFlyingMachine
-    DefaultStill,		// UnitGoblinZeppelin
-    GryphonRiderStill,		// UnitGryphonRider
-    DragonStill,		// UnitDragon
-    DefaultStill,		// UnitTuralyon
-    DefaultStill,		// UnitEyeOfKilrogg
-    DefaultStill,		// UnitDanath
-    DefaultStill,		// UnitKorgathBladefist
-    DefaultStill,		// UnitNothing3
-    DefaultStill,		// UnitCho_gall
-    DefaultStill,		// UnitLothar
-    DefaultStill,		// UnitGul_dan
-    DefaultStill,		// UnitUtherLightbringer
-    DefaultStill,		// UnitZuljin
-    DefaultStill,		// UnitNothing4
-    DefaultStill,		// UnitSkeleton
-    DaemonStill,		// UnitDaemon
-    DefaultStill,		// UnitCritter
-    DefaultStill,		// UnitFarm
-    DefaultStill,		// UnitPigFarm
-    DefaultStill,		// UnitBarracksHuman
-    DefaultStill,		// UnitBarracksOrc
-    DefaultStill,		// UnitChurch
-    DefaultStill,		// UnitAltarOfStorms
-    DefaultStill,		// UnitScoutTowerHuman
-    DefaultStill,		// UnitScoutTowerOrc
-    DefaultStill,		// UnitStables
-    DefaultStill,		// UnitOgreMound
-    DefaultStill,		// UnitGnomishInventor
-    DefaultStill,		// UnitGoblinAlchemist
-    DefaultStill,		// UnitGryphonAviary
-    DefaultStill,		// UnitDragonRoost
-    DefaultStill,		// UnitShipyardHuman
-    DefaultStill,		// UnitShipyardOrc
-    DefaultStill,		// UnitTownHall
-    DefaultStill,		// UnitGreatHall
-    DefaultStill,		// UnitElvenLumberMill
-    DefaultStill,		// UnitTrollLumberMill
-    DefaultStill,		// UnitFoundryHuman
-    DefaultStill,		// UnitFoundryOrc
-    DefaultStill,		// UnitMageTower
-    DefaultStill,		// UnitTempleOfTheDamned
-    DefaultStill,		// UnitBlacksmithHuman
-    DefaultStill,		// UnitBlacksmithOrc
-    DefaultStill,		// UnitRefineryHuman
-    DefaultStill,		// UnitRefineryOrc
-    DefaultStill,		// UnitOilPlatformHuman
-    DefaultStill,		// UnitOilPlatformOrc
-    DefaultStill,		// UnitKeep
-    DefaultStill,		// UnitStronghold
-    DefaultStill,		// UnitCastle
-    DefaultStill,		// UnitFortress
-    DefaultStill,		// UnitGoldMine
-    DefaultStill,		// UnitOilPatch
-    DefaultStill,		// UnitStartLocationHuman
-    DefaultStill,		// UnitStartLocationOrc
-    DefaultStill,		// UnitGuardTowerHuman
-    DefaultStill,		// UnitGuardTowerOrc
-    DefaultStill,		// UnitCannonTowerHuman
-    DefaultStill,		// UnitCannonTowerOrc
-    DefaultStill,		// UnitCircleofPower
-    DefaultStill,		// UnitDarkPortal
-    DefaultStill,		// UnitRunestone
-    DefaultStill,		// UnitWallHuman
-    DefaultStill,		// UnitWallOrc
-    DefaultStill,		// UnitDeadBody
-    DefaultStill,		// Unit1x1DestroyedPlace
-    DefaultStill,		// Unit2x2DestroyedPlace
-    DefaultStill,		// Unit3x3DestroyedPlace
-    DefaultStill,		// Unit4x4DestroyedPlace
-    DefaultStill,		// UnitPeonWithGold
-    DefaultStill,		// UnitPeasantWithGold
-    DefaultStill,		// UnitPeonWithWood
-    DefaultStill,		// UnitPeasantWithWood
-    DefaultStill,		// UnitTankerHumanFull
-    DefaultStill,		// UnitTankerOrcFull
-};
-#endif
-
 /**
 **	Unit stands still!
 */
 global void HandleActionStill(Unit* unit)
 {
-    UnitType* type;
+    const UnitType* type;
     Unit* goal;
 
     DebugLevel3(__FUNCTION__": %Zd\n",UnitNumber(unit));
@@ -208,10 +62,9 @@ global void HandleActionStill(Unit* unit)
 	//
 	//	Still animation
 	//
-        DebugCheck( type->Type>=UnitTypeInternalMax
-            || !UnitStillAnimation[type->Type] );
+        DebugCheck( !type->Animations || !type->Animations->Still );
 
-	UnitShowAnimation(unit,UnitStillAnimation[type->Type]);
+	UnitShowAnimation(unit,type->Animations->Still);
 
 	//
 	//	FIXME: this a workaround of a bad code.
@@ -226,12 +79,12 @@ global void HandleActionStill(Unit* unit)
 
     }
 
-    if( !unit->Reset ) {		// animation can't be aborted
+    if( !unit->Reset ) {		// animation can't be aborted here
 	return;
     }
 
     //
-    //	Building:	burning
+    //	Building:	burning FIXME: must moved to general point
     //
     if( type->Building ) {
 	if( unit->HP ) {
@@ -274,9 +127,15 @@ global void HandleActionStill(Unit* unit)
     //
     //	Critters:	are moving random around.
     //
+    // FIXME: critters: skeleton and daemon are also critters??????
     if( type->Critter ) {
-	// FIXME: critters: skeleton and daemon are also critters??????
-	if( type->Type==UnitCritter ) {
+	static const UnitType* critter;
+
+	if( !critter ) {
+	    // FIXME: remove or move the by ident, it is to slow!
+	    critter=UnitTypeByIdent("unit-critter");
+	}
+	if( type==critter ) {
 	    int x;
 	    int y;
 	
@@ -306,6 +165,7 @@ global void HandleActionStill(Unit* unit)
 	    }
 	    if( x!=unit->X || y!=unit->Y ) {
 		// FIXME: Don't use pathfinder for this.
+		// FIXME: atleast prove the field is free.
 		unit->Command.Action=UnitActionMove;
 		unit->Command.Data.Move.Fast=1;
 		unit->Command.Data.Move.Goal=NoUnitP;
diff --git a/include/unittype.h b/include/unittype.h
index 7193e7e9d..1797f81f9 100644
--- a/include/unittype.h
+++ b/include/unittype.h
@@ -341,14 +341,9 @@ struct _unit_type_ {
 ----------------------------------------------------------------------------*/
 
 extern char	UnitTypeType[];			/// unit type type
+// FIXME: this limit must be removed!
 extern UnitType UnitTypes[UnitTypeInternalMax];	/// all unit types
 
-#ifdef USE_CCL2
-extern Animation ** UnitDie;
-extern Animation ** UnitCorpse;
-extern Animation ** UnitStillAnimation;
-#endif
-
 /*----------------------------------------------------------------------------
 --	Functions
 ----------------------------------------------------------------------------*/
diff --git a/unit/script_unittype.cpp b/unit/script_unittype.cpp
index 596bf62e4..c2061d35b 100644
--- a/unit/script_unittype.cpp
+++ b/unit/script_unittype.cpp
@@ -650,9 +650,7 @@ local Animation * GetSingleAnimation(SCM list){
 
 }
 
-global Animation ** UnitDie;
 global Animation ** UnitCorpse;
-global Animation ** UnitStillAnimation;
 
 /**
  ** Get animation data
@@ -682,16 +680,17 @@ local SCM CclAnimType(SCM list)
     
     switch( type ){
     case 0:
-      UnitStillAnimation = whole_animation;
       for( i=0; i<UnitTypeInternalMax; ++i ) {
 	unittype=UnitTypeByWcNum(i);
 	if( !unittype->Animations ) {
 	    unittype->Animations=calloc(sizeof(*unittype->Animations),1);
 	}
+	// FIXME: animations are shared?
 	CclFree(unittype->Animations->Still);
         unittype->Animations->Still=whole_animation[i];
       }
       DebugLevel2("Loading UnitStillAnimation\n");
+      free(whole_animation);
       break;
     case 1:
       for( i=0; i<UnitTypeInternalMax; ++i ) {
@@ -703,9 +702,9 @@ local SCM CclAnimType(SCM list)
 	unittype->Animations->Move=whole_animation[i];
       }
       DebugLevel2("Loading UnitMoveAnimation\n");
+      free(whole_animation);
       break;
     case 2:
-      UnitDie = whole_animation;
       for( i=0; i<UnitTypeInternalMax; ++i ) {
 	unittype=UnitTypeByWcNum(i);
 	if( !unittype->Animations ) {
@@ -715,6 +714,7 @@ local SCM CclAnimType(SCM list)
 	unittype->Animations->Die=whole_animation[i];
       }
       DebugLevel2("Loading UnitDie\n");
+      free(whole_animation);
       break;
     case 3:
       UnitCorpse = whole_animation;
@@ -737,9 +737,11 @@ local SCM CclAnimType(SCM list)
 	unittype->Animations->Attack=whole_animation[i];
       }
       DebugLevel2("Loading UnitAttack\n");
+      free(whole_animation);
       break;
     default:
       DebugLevel1(__FUNCTION__":Unknown unit-type %d\n",type);
+      free(whole_animation);
       break;
     }
     return list;
diff --git a/unit/ut_table.cpp b/unit/ut_table.cpp
index 6bbf4fb80..6b4b0ea9e 100644
--- a/unit/ut_table.cpp
+++ b/unit/ut_table.cpp
@@ -84,7 +84,7 @@ local ButtonConfig _FootmanButtons[] = {
 #define _KurdanAndSky_reeButtons	NULL
 #define _DentargButtons			NULL
 #define _KhadgarButtons			NULL
-#define _GnomHellscreamButtons		NULL
+#define _GromHellscreamButtons		NULL
 #define _TankerHumanButtons		NULL
 #define _TankerOrcButtons		NULL
 #define _TransportHumanButtons		NULL
@@ -182,12 +182,36 @@ local ButtonConfig _FootmanButtons[] = {
 --	Animations
 ----------------------------------------------------------------------------*/
 
-///	Default:
-local Animation _DefaultStill[] = {
+/*----------------------------------------------------------------------------
+--	Still
+----------------------------------------------------------------------------*/
+
+//	Default:
+local Animation DefaultStill[] = {
 // FIXME: Reset frame 0, wait 1, than endless wait 5
     {0, 0, 4, 0}, {3, 0, 1, 0}
 };
 
+//	Gryphon rider, Kurdan and Sky'ree:
+local Animation GryphonRiderStill[] = {
+    {2, 0, 6, 0},  {2, 0, 6, 5},  {2, 0, 6, 5},  {3, 0, 6, 5}
+};
+
+//	Dragon, Deathwing:
+local Animation DragonStill[] = {
+    {2, 0, 6, 0},  {2, 0, 6, 5},  {2, 0, 6, 5},  {3, 0, 6, 5}
+};
+
+//	GnomishFlyingMachine:
+local Animation GnomishFlyingMachineStill[] = {
+    {2, 0, 1, 0},  {2, 0, 1, 5},  {2, 0, 1, 0},  {3, 0, 1,-5}
+};
+
+//	Daemon:
+local Animation DaemonStill[] = {
+    {2, 0, 4, 0},  {2, 0, 4, 5},  {2, 0, 4, 5},  {3, 0, 4, 5}
+};
+
 /*----------------------------------------------------------------------------
 --	Move Table
 ----------------------------------------------------------------------------*/
@@ -705,7 +729,7 @@ local Animation DestroyedWaterSiteDie[] = {
 #define FootmanAnimations		GruntAnimations
 ///	Footman,Grunt,Grom Hellscream,Danath,Korgath Bladefist
 local Animations GruntAnimations[] = {
-{   _DefaultStill,
+{   DefaultStill,
     GruntMove,
     GruntAttack,
     GruntDie,
@@ -715,7 +739,7 @@ local Animations GruntAnimations[] = {
 #define PeasantAnimations		PeonAnimations
 //	Peon, Peasant, Attacking Peon, Attacking Peasant.
 local Animations PeonAnimations[] = {
-{   NULL,
+{   DefaultStill,
     PeonMove,
     PeonAttack,
     PeonDie,
@@ -723,7 +747,7 @@ local Animations PeonAnimations[] = {
 };
 
 local Animations BallistaAnimations[] = {
-{   NULL,
+{   DefaultStill,
     BallistaMove,
     BallistaAttack,
     NULL,
@@ -731,7 +755,7 @@ local Animations BallistaAnimations[] = {
 };
 
 local Animations CatapultAnimations[] = {
-{   NULL,
+{   DefaultStill,
     CatapultMove,
     CatapultAttack,
     NULL,
@@ -739,49 +763,49 @@ local Animations CatapultAnimations[] = {
 };
 
 local Animations KnightAnimations[] = {
-{   NULL,
+{   DefaultStill,
     KnightMove,
-    NULL,
+    KnightAttack,
     KnightDie,
     NULL	}
 };
 
 local Animations OgreAnimations[] = {
-{   NULL,
+{   DefaultStill,
     OgreMove,
-    NULL,
+    OgreAttack,
     OgreDie,
     NULL	}
 };
 
 local Animations ArcherAnimations[] = {
-{   NULL,
+{   DefaultStill,
     ArcherMove,
-    NULL,
+    ArcherAttack,
     ArcherDie,
     NULL	}
 };
 
 local Animations AxethrowerAnimations[] = {
-{   NULL,
+{   DefaultStill,
     AxethrowerMove,
-    NULL,
+    AxethrowerAttack,
     AxethrowerDie,
     NULL	}
 };
 
 local Animations MageAnimations[] = {
-{   NULL,
+{   DefaultStill,
     MageMove,
-    NULL,
+    MageAttack,
     MageDie,
     NULL	}
 };
 
 local Animations DeathKnightAnimations[] = {
-{   NULL,
+{   DefaultStill,
     DeathKnightMove,
-    NULL,
+    DeathKnightAttack,
     DeathKnightDie,
     NULL	}
 };
@@ -790,17 +814,17 @@ local Animations DeathKnightAnimations[] = {
 #define OgreMageAnimations		OgreAnimations
 
 local Animations DwarvesAnimations[] = {
-{   NULL,
+{   DefaultStill,
     DwarvesMove,
-    NULL,
+    DwarvesAttack,
     DwarvesDie,
     NULL	}
 };
 
 local Animations GoblinSappersAnimations[] = {
-{   NULL,
+{   DefaultStill,
     GoblinSappersMove,
-    NULL,
+    GoblinSappersAttack,
     GoblinSappersDie,
     NULL	}
 };
@@ -813,43 +837,43 @@ local Animations GoblinSappersAnimations[] = {
 
 #define AlleriaAnimations		ArcherAnimations
 #define TeronGorefiendAnimations	DeathKnightAnimations
-#define KurdanAndSky_reeAnimations	NULL
-#define DentargAnimations		NULL
-#define KhadgarAnimations		NULL
-#define GnomHellscreamAnimations	NULL
+#define KurdanAndSky_reeAnimations	GryphonRiderAnimations
+#define DentargAnimations		OgreAnimations
+#define KhadgarAnimations		MageAnimations
+#define GromHellscreamAnimations	GruntAnimations
 
 #define TankerHumanAnimations		TankerOrcAnimations
 local Animations TankerOrcAnimations[] = {
-{   NULL,
+{   DefaultStill,
     TankerMove,
-    NULL,
+    TankerAttack,
     TankerDie,
     NULL	}
 };
 
 #define TransportHumanAnimations	TransportOrcAnimations
 local Animations TransportOrcAnimations[] = {
-{   NULL,
+{   DefaultStill,
     TransportMove,
-    NULL,
+    TransportAttack,
     TransportDie,
     NULL	}
 };
 
 #define ElvenDestroyerAnimations	TrollDestroyerAnimations
 local Animations TrollDestroyerAnimations[] = {
-{   NULL,
+{   DefaultStill,
     DestroyerMove,
-    NULL,
+    DestroyerAttack,
     DestroyerDie,
     NULL	}
 };
 
 #define BattleshipAnimations		JuggernaughtAnimations
 local Animations JuggernaughtAnimations[] = {
-{   NULL,
+{   DefaultStill,
     BattleshipMove,
-    NULL,
+    BattleshipAttack,
     BattleshipDie,
     NULL	}
 };
@@ -862,41 +886,41 @@ local Animations JuggernaughtAnimations[] = {
 
 #define GnomishSubmarineAnimations	GiantTurtleAnimations
 local Animations GiantTurtleAnimations[] = {
-{   NULL,
+{   DefaultStill,
     SubmarineMove,
-    NULL,
+    SubmarineAttack,
     SubmarineDie,
     NULL	}
 };
 
 local Animations GnomishFlyingMachineAnimations[] = {
-{   NULL,
+{   GnomishFlyingMachineStill,
     GnomishFlyingMachineMove,
-    NULL,
+    GnomishFlyingMachineAttack,
     GnomishFlyingMachineDie,
     NULL	}
 };
 
 local Animations GoblinZeppelinAnimations[] = {
-{   NULL,
+{   DefaultStill,
     GoblinZeppelinMove,
-    NULL,
+    GoblinZeppelinAttack,
     NULL,
     NULL	}
 };
 
 local Animations GryphonRiderAnimations[] = {
-{   NULL,
+{   GryphonRiderStill,
     GryphonRiderMove,
-    NULL,
+    GryphonRiderAttack,
     GryphonRiderDie,
     NULL	}
 };
 
 local Animations DragonAnimations[] = {
-{   NULL,
+{   DragonStill,
     DragonMove,
-    NULL,
+    DragonAttack,
     DragonDie,
     NULL	}
 };
@@ -904,9 +928,9 @@ local Animations DragonAnimations[] = {
 #define TuralyonAnimations		KnightAnimations
 
 local Animations EyeOfKilroggAnimations[] = {
-{   NULL,
+{   DefaultStill,
     EyeOfKilroggMove,
-    NULL,
+    EyeOfKilroggAttack,
     NULL,
     NULL	}
 };
@@ -922,81 +946,106 @@ local Animations EyeOfKilroggAnimations[] = {
 #define Nothing4Animations		NULL
 
 local Animations SkeletonAnimations[] = {
-{   NULL,
+{   DefaultStill,
     SkeletonMove,
-    NULL,
+    SkeletonAttack,
     SkeletonDie,
     NULL	}
 };
 
 local Animations DaemonAnimations[] = {
-{   NULL,
+{   DaemonStill,
     DaemonMove,
-    NULL,
+    DaemonAttack,
     DaemonDie,
     NULL	}
 };
 
 local Animations CritterAnimations[] = {
-{   NULL,
+{   DefaultStill,
     CritterMove,
-    NULL,
+    CritterAttack,
     CritterDie,
     NULL	}
 };
 
-#define FarmAnimations			NULL
-#define PigFarmAnimations		NULL
-#define BarracksHumanAnimations		NULL
-#define BarracksOrcAnimations		NULL
-#define ChurchAnimations		NULL
-#define AltarOfStormsAnimations		NULL
-#define ScoutTowerHumanAnimations	NULL
-#define ScoutTowerOrcAnimations		NULL
-#define StablesAnimations		NULL
-#define OgreMoundAnimations		NULL
-#define GnomishInventorAnimations	NULL
-#define GoblinAlchemistAnimations	NULL
-#define GryphonAviaryAnimations		NULL
-#define DragonRoostAnimations		NULL
-#define ShipyardHumanAnimations		NULL
-#define ShipyardOrcAnimations		NULL
-#define TownHallAnimations		NULL
-#define GreatHallAnimations		NULL
-#define ElvenLumberMillAnimations	NULL
-#define TrollLumberMillAnimations	NULL
-#define FoundryHumanAnimations		NULL
-#define FoundryOrcAnimations		NULL
-#define MageTowerAnimations		NULL
-#define TempleOfTheDamnedAnimations	NULL
-#define BlacksmithHumanAnimations	NULL
-#define BlacksmithOrcAnimations		NULL
-#define RefineryHumanAnimations		NULL
-#define RefineryOrcAnimations		NULL
-#define OilPlatformHumanAnimations	NULL
-#define OilPlatformOrcAnimations	NULL
-#define KeepAnimations			NULL
-#define StrongholdAnimations		NULL
-#define CastleAnimations		NULL
-#define FortressAnimations		NULL
-#define GoldMineAnimations		NULL
-#define OilPatchAnimations		NULL
-#define StartLocationHumanAnimations	NULL
-#define StartLocationOrcAnimations	NULL
-#define GuardTowerHumanAnimations	NULL
-#define GuardTowerOrcAnimations		NULL
-#define CannonTowerHumanAnimations	NULL
-#define CannonTowerOrcAnimations	NULL
-#define CircleofPowerAnimations		NULL
-#define DarkPortalAnimations		NULL
-#define RunestoneAnimations		NULL
-#define WallHumanAnimations		NULL
-#define WallOrcAnimations		NULL
-#define DeadBodyAnimations		NULL
-#define Destroyed1x1PlaceAnimations	NULL
-#define Destroyed2x2PlaceAnimations	NULL
-#define Destroyed3x3PlaceAnimations	NULL
-#define Destroyed4x4PlaceAnimations	NULL
+local Animations BuildingAnimations[] = {
+{   DefaultStill,
+    NULL,
+    NULL,
+    NULL,
+    NULL	}
+};
+
+local Animations GuardTowerAnimations[] = {
+{   DefaultStill,
+    NULL,
+    GuardTowerAttack,
+    NULL,
+    NULL	}
+};
+
+local Animations CannonTowerAnimations[] = {
+{   DefaultStill,
+    NULL,
+    CannonTowerAttack,
+    NULL,
+    NULL	}
+};
+
+#define FarmAnimations			BuildingAnimations
+#define PigFarmAnimations		BuildingAnimations
+#define BarracksHumanAnimations		BuildingAnimations
+#define BarracksOrcAnimations		BuildingAnimations
+#define ChurchAnimations		BuildingAnimations
+#define AltarOfStormsAnimations		BuildingAnimations
+#define ScoutTowerHumanAnimations	BuildingAnimations
+#define ScoutTowerOrcAnimations		BuildingAnimations
+#define StablesAnimations		BuildingAnimations
+#define OgreMoundAnimations		BuildingAnimations
+#define GnomishInventorAnimations	BuildingAnimations
+#define GoblinAlchemistAnimations	BuildingAnimations
+#define GryphonAviaryAnimations		BuildingAnimations
+#define DragonRoostAnimations		BuildingAnimations
+#define ShipyardHumanAnimations		BuildingAnimations
+#define ShipyardOrcAnimations		BuildingAnimations
+#define TownHallAnimations		BuildingAnimations
+#define GreatHallAnimations		BuildingAnimations
+#define ElvenLumberMillAnimations	BuildingAnimations
+#define TrollLumberMillAnimations	BuildingAnimations
+#define FoundryHumanAnimations		BuildingAnimations
+#define FoundryOrcAnimations		BuildingAnimations
+#define MageTowerAnimations		BuildingAnimations
+#define TempleOfTheDamnedAnimations	BuildingAnimations
+#define BlacksmithHumanAnimations	BuildingAnimations
+#define BlacksmithOrcAnimations		BuildingAnimations
+#define RefineryHumanAnimations		BuildingAnimations
+#define RefineryOrcAnimations		BuildingAnimations
+#define OilPlatformHumanAnimations	BuildingAnimations
+#define OilPlatformOrcAnimations	BuildingAnimations
+#define KeepAnimations			BuildingAnimations
+#define StrongholdAnimations		BuildingAnimations
+#define CastleAnimations		BuildingAnimations
+#define FortressAnimations		BuildingAnimations
+#define GoldMineAnimations		BuildingAnimations
+#define OilPatchAnimations		BuildingAnimations
+#define StartLocationHumanAnimations	BuildingAnimations
+#define StartLocationOrcAnimations	BuildingAnimations
+#define GuardTowerHumanAnimations	GuardTowerAnimations
+#define GuardTowerOrcAnimations		GuardTowerAnimations
+#define CannonTowerHumanAnimations	CannonTowerAnimations
+#define CannonTowerOrcAnimations	CannonTowerAnimations
+#define CircleofPowerAnimations		BuildingAnimations
+#define DarkPortalAnimations		BuildingAnimations
+#define RunestoneAnimations		BuildingAnimations
+#define WallHumanAnimations		BuildingAnimations
+#define WallOrcAnimations		BuildingAnimations
+
+#define DeadBodyAnimations		BuildingAnimations
+#define Destroyed1x1PlaceAnimations	BuildingAnimations
+#define Destroyed2x2PlaceAnimations	BuildingAnimations
+#define Destroyed3x3PlaceAnimations	BuildingAnimations
+#define Destroyed4x4PlaceAnimations	BuildingAnimations
 
 #define PeasantWithGoldAnimations	PeasantAnimations
 #define PeonWithGoldAnimations		PeonAnimations
@@ -1948,7 +1997,7 @@ global UnitType UnitTypes[] = {
 	,DEFAULT
 	,DEFAULT }
     , 72, 72			// graphic size
-   ,GnomHellscreamAnimations	// animations
+   ,GromHellscreamAnimations	// animations
    ,{ "icon-grom-hellscream" }
    ,{ "missile-none" }		// Missile
    ,CorpseHuman