RuneI
Class Zombie

source: c:\runehov\RuneI\Classes\Zombie.uc
Core.Object
   |
   +--Engine.Actor
      |
      +--Engine.Pawn
         |
         +--RuneI.ScriptPawn
            |
            +--RuneI.Zombie
Direct Known Subclasses:Zombie2

class Zombie
extends RuneI.ScriptPawn

//============================================================================= // Zombie. //=============================================================================
Variables
 name CrucifiedAnim
 ZombieEye Eyes
 float LungeChance

States
Pain, Fighting, Sarkify

Function Summary
 void AltWeaponActivate()
     
//================================================
//
// AltWeaponActivate
//
// Zombie Breath Attack
//================================================
 void ApplyGoreCap(int BodyPart)
     
//============================================================
//
// ApplyGoreCap
//
//============================================================
 eAttitude AttitudeToCreature(Pawn Other)
     
//------------------------------------------------
//
// AttitudeToCreature
//
//------------------------------------------------
 bool BodyPartCritical(int BodyPart)
     
//============================================================
//
// BodyPartCritical
//
//============================================================
 int BodyPartForJoint(int joint)
     
//=============================================================================
//
// BodyPartForJoint
//
// Returns the body part a joint is associated with
//=============================================================================
 int BodyPartForPolyGroup(int polygroup)
     
//============================================================
//
// BodyPartForPolyGroup
//
//============================================================
 bool BodyPartSeverable(int BodyPart)
     
//============================================================
//
// BodyPartSeverable
//
//============================================================
 bool CanPickup(Inventory item)
     
//================================================
//
// CanPickup
//
// Let's pawn dictate what it can pick up
// Zombies can only use their claws
//================================================
 bool DamageBodyPart(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, name DamageType, int bodypart)
     
//============================================================
//
// DamageBodyPart
//
//============================================================
 void Died(Pawn Killer, name damageType, vector HitLocation)
     
//============================================================
//
// Died
//
//============================================================
 void GlowEyes(bool glow)
 bool JointDamaged(int Damage, Pawn EventInstigator, vector HitLoc, vector Momentum, name DamageType, int joint)
 int JointForBodyPart(int BodyPart)
 void LimbSevered(int BodyPart, vector Momentum)
     
//================================================
//
// LimbSevered
//
//================================================
 void LongFall()
 void MakeTwitchable()
     
//------------------------------------------------------------
//
// MakeTwitchable
//
// TODO: Move to carcass
//------------------------------------------------------------
 EMatterType MatterForJoint(int joint)
     
//============================================================
//
// MatterForJoint
//
// Returns what kind of material joint is associated with
//============================================================
 Texture PainSkin(int BodyPart)
     
//============================================================
//
// PainSkin
//
// returns the pain skin for a given polygroup
//============================================================
 void PlayBackup(optional float)
     
//============================================================
//
// PlayBackup
//
//============================================================
 void PlayBlockHigh(optional float)
 void PlayBlockLow(optional float)
 void PlayBodyHit(optional float)
 void PlayCower(optional float)
 void PlayDeath(name DamageType)
 void PlayDodgeBack(optional float)
 void PlayDodgeBackflip(optional float)
 void PlayDodgeDuck(optional float)
 void PlayDodgeForward(optional float)
 void PlayDodgeLeft(optional float)
 void PlayDodgeRight(optional float)
 void PlayDrownDeath(name DamageType)
 void PlayDrowning(optional float)
 void PlayDyingSound(name damageType)
 void PlayFrontHit(float tweentime)
 void PlayHeadHit(optional float)
 void PlayHuntStop(optional float)
 void PlayInAir(optional float)
 void PlayJumping(optional float)
     
{
	if (bHurrying)
	{
		LoopAnim  ('z_walk',     1.0, tween);
	}
	else
	{
		if (Weapon==None)						LoopAnim  ('z_walk',     1.0, tween);
		else if (Weapon.IsA('Torch'))			LoopAnim  ('z_walk',1.0, tween);
		else									LoopAnim  ('z_walk',     1.0, tween);
	}
}
*/
 void PlayLArmHit(optional float)
 void PlayLLegHit(optional float)
 void PlayLanding(optional float)
 void PlayMeleeHigh(optional float)
 void PlayMeleeLow(optional float)
 void PlayMoving(optional float)
     
/*
 void PlayMoving(optional float)
     
/*
 void PlayRArmHit(optional float)
 void PlayRLegHit(optional float)
 void PlayStrafeLeft(optional float)
     
//============================================================
//
// PlayStrafeLeft
//
//============================================================
 void PlayStrafeRight(optional float)
     
//============================================================
//
// PlayStrafeRight
//
//============================================================
 void PlayTakeHit(float tweentime, int damage, vector HitLoc, name damageType, vector Momentum, int BodyPart)
     
//===================================================================
//
// PlayTakeHit
//
//===================================================================
 void PlayTaunting(optional float)
 void PlayThrowing(optional float)
 void PlayTurning(optional float)
 void PlayWaiting(optional float)
     
//-----------------------------------------------------------------------------
// Animation functions
//-----------------------------------------------------------------------------
 void PostBeginPlay()
     
//============================================================
//
// PostBeginPlay
//
//============================================================
 void SetOnFire(Pawn EventInstigator, int Joint)
 void TweenToHuntStop(float time)
     
           {	TweenAnim ('z_idle',    time);         }
 void TweenToJumping(float time)
 void TweenToJumping(float time)
 void TweenToMeleeHigh(float time)
 void TweenToMeleeHigh(float time)
 void TweenToMeleeLow(float time)
 void TweenToMeleeLow(float time)
 void TweenToMoving(float time)
 void TweenToMoving(float time)
 void TweenToThrowing(float time)
 void TweenToThrowing(float time)
 void TweenToTurning(float time)
 void TweenToTurning(float time)
 void TweenToWaiting(float time)
     
          { TweenAnim ('z_idle',  time);         }
*/
 void TweenToWaiting(float time)
     
          { TweenAnim ('z_idle',  time);         }
*/
 void ZoneChange(ZoneInfo newZone)
     
//============================================================
//
// ZoneChange
//
//============================================================


State Pain Function Summary
 bool BodyPartCritical(int BodyPart)
 void EndState()
 bool JointDamaged(int damage, Pawn EventInstigator, vector HitLoc, vector Momentum, name DamageType, int joint)
 bool CanGotoPainState()
 bool CanPickup(Inventory item)
 void BeginState()
     
//------------------------------------------------------------
//
// Crucified
//
//------------------------------------------------------------
 void EndGetUpEffect()
 void StartGetUpEffect()
 void EndState()
 bool CanGotoPainState()


State Fighting Function Summary
 void CalcJumpVelocity()
 void CalcStrafePosition2()
 void CalcStrafePosition()
 bool InDangerFromAttack()
 bool ShouldDefend()
 void Timer()
     
// Determine AttackAction based upon enemy movement and position
 bool BlockRatherThanDodge()
 void AmbientSoundTimer()
 bool InCombatRange(Actor Other)
     
//============================================================
 void EndState()
 void BeginState()


State Sarkify Function Summary
 void SpawnSark()



Source Code


00001	//=============================================================================
00002	// Zombie.
00003	//=============================================================================
00004	class Zombie expands ScriptPawn;
00005	
00006	const DEFAULT_TWEEN = 0.15;
00007	
00008	var() name CrucifiedAnim;
00009	var() float LungeChance;
00010	var(Sounds) sound DecapitateSound;
00011	var(Sounds) sound GreenPuffSound;
00012	var(Sounds) sound ZombieGetUpSound;
00013	
00014	var ZombieEye Eyes;
00015	
00016	//============================================================
00017	//
00018	// PostBeginPlay
00019	//
00020	//============================================================
00021	
00022	function PostBeginPlay()
00023	{
00024		Super.PostBeginPlay();
00025	
00026		Eyes = Spawn(Class'ZombieEye');
00027		AttachActorToJoint(Eyes, JointNamed('head'));
00028		Eyes.bHidden = true; // ZombieEyes initial are hidden
00029	}
00030	
00031	//------------------------------------------------
00032	//
00033	// AttitudeToCreature
00034	//
00035	//------------------------------------------------
00036	function eAttitude AttitudeToCreature(Pawn Other)
00037	{
00038		if (Other!=None && Other.IsA('Goblin'))
00039			return ATTITUDE_Hate;
00040		else
00041			return Super.AttitudeToCreature(Other);
00042	}
00043	
00044	//================================================
00045	//
00046	// CanPickup
00047	//
00048	// Let's pawn dictate what it can pick up
00049	// Zombies can only use their claws
00050	//================================================
00051	function bool CanPickup(Inventory item)
00052	{
00053		if(item.IsA('Weapon') && (BodyPartHealth[BODYPART_RARM1] > 0) && (Weapon == None))
00054		{
00055			return(item.IsA('ZombieClaw'));
00056	//		return(item.IsA('axe') || item.IsA('hammer') || item.IsA('sword') || item.IsA('ZombieClaw'));
00057		}
00058	}
00059	
00060	
00061	function GlowEyes(bool glow)
00062	{
00063		if(Eyes != None)
00064		{
00065			if(glow)
00066				Eyes.bHidden = false;
00067			else
00068				Eyes.bHidden = true;
00069		}
00070	}
00071	
00072	function PlayDyingSound(name damageType)
00073	{
00074		if (damageType == 'decapitated')
00075			PlaySound(DecapitateSound, SLOT_Talk);
00076		else
00077			Super.PlayDyingSound(damageType);
00078	}
00079	
00080	//===================================================================
00081	//					Localized Damage Functions
00082	//===================================================================
00083	
00084	//============================================================
00085	//
00086	// MatterForJoint
00087	//
00088	// Returns what kind of material joint is associated with
00089	//============================================================
00090	function EMatterType MatterForJoint(int joint)
00091	{
00092		return MATTER_EARTH;
00093	}
00094	
00095	//============================================================
00096	//
00097	// BodyPartSeverable
00098	//
00099	//============================================================
00100	function bool BodyPartSeverable(int BodyPart)
00101	{
00102		switch(BodyPart)
00103		{
00104			case BODYPART_HEAD:
00105				return true;
00106		}
00107		return false;
00108	}
00109	
00110	//============================================================
00111	//
00112	// BodyPartCritical
00113	//
00114	//============================================================
00115	
00116	function bool BodyPartCritical(int BodyPart)
00117	{
00118		return (BodyPart == BODYPART_HEAD);
00119	}
00120	
00121	
00122	//============================================================
00123	//
00124	// DamageBodyPart
00125	//
00126	//============================================================
00127	
00128	function bool DamageBodyPart(int Damage, Pawn EventInstigator, vector HitLocation, vector Momentum, name DamageType, int bodypart)
00129	{
00130		local int PassThrough;
00131		local int SeverDamage;
00132		local int BluntDamage;
00133		local bool bAlreadyDead;
00134		local int AppliedDamage;
00135		local Debris Gib;
00136		local float scale;
00137		local int i, NumChunks;
00138	
00139		local vector AdjMomentum;
00140	
00141		if(!class'GameInfo'.Default.bLowGore)
00142			PainSkin(BodyPart);
00143	
00144		GetDamageValues(Damage, DamageType, BluntDamage, SeverDamage);
00145		Level.Game.ReduceDamage(BluntDamage, SeverDamage, DamageType, self, EventInstigator);
00146		PassThrough = LimbPassThrough(BodyPart, BluntDamage, SeverDamage);
00147	
00148		if (BodyPart != BODYPART_BODY)
00149		{
00150			if (BodyPartSeverable(BodyPart) && (BodyPartHealth[BodyPart] > 0))
00151			{
00152				BodyPartHealth[BodyPart] -= SeverDamage;
00153		
00154				if(BodyPartHealth[BodyPart] <= 0)
00155				{	// Body Part was killed
00156					if (BodyPartCritical(BodyPart))
00157					{
00158						PassThrough = Max(Health, Damage);
00159	
00160						if (EventInstigator != None)
00161						{
00162							EventInstigator.BoostStrength(0.15 * Default.Health);
00163						}
00164	
00165						DamageType = 'decapitated';
00166					}
00167	
00168					// Sever the limb
00169					BodyPartVisibility(BodyPart, false);
00170					BodyPartCollision(BodyPart, false);
00171	
00172					if(!class'GameInfo'.Default.bLowGore )		
00173						LimbSevered(BodyPart, Momentum); // Lop off zombie head
00174				}
00175			}
00176		}
00177	
00178		if (DamageType=='sever' || DamageType=='bluntsever')
00179		{	// spawn chunks
00180			NumChunks = (Damage / 15) + 1;
00181			NumChunks = NumChunks * Level.Game.DebrisPercentage;
00182			for(i = 0; i < NumChunks; i++)
00183			{
00184				Gib = spawn(GibClass,,, HitLocation + VRand() * 2,);
00185				if (Gib != None)
00186				{
00187					Gib.SetSize(RandRange(0.1, 0.4));
00188					Gib.SetMomentum((-0.08 * Momentum));
00189				}
00190			}
00191		}
00192		else if (DamageType == 'crushed')
00193		{	// Force the gib when crushed
00194			PassThrough = Default.Health*3;
00195			bGibbable = true;
00196		}
00197	
00198		// Apply damage to body
00199		if(PassThrough != 0)
00200		{
00201			bAlreadyDead = (Health <= 0);
00202	
00203	//		AppliedDamage = Level.Game.ReduceDamage(PassThrough, DamageType, self, EventInstigator);
00204			AppliedDamage = PassThrough;
00205	
00206			if(DamageType == 'decapitated' || DamageType == 'crushed' || DamageType == 'fire')
00207			{
00208				Health -= AppliedDamage;
00209			}
00210	
00211			if (Health > 0)
00212			{
00213				// Apply momentum
00214				// NOTE:  This code is duplicated in Shield.Active and Shield.Idle states
00215				AdjMomentum = momentum / Mass;
00216				if(Mass < VSize(AdjMomentum) && Velocity.Z <= 0)
00217				{			
00218					AdjMomentum.Z += (VSize(AdjMomentum) - Mass) * 0.5;
00219				}
00220				AddVelocity(AdjMomentum);
00221	
00222				if(CanGotoPainState() && DamageType != 'fire' && FRand() > 0.25)
00223				{ // Only goto the painstate if the pawn allows it 
00224					PlayTakeHitSound(AppliedDamage, DamageType, 1);
00225	
00226					if(PassThrough > 5) // DAMAGE_EPSILON = 5
00227					{ // Only go to the painstate if the damage is over a given level
00228						if (GetStateName() != 'Pain' && GetStateName() != 'pain')
00229						{
00230							NextStateAfterPain = GetStateName();
00231	
00232							// Play pain anim
00233							PlayTakeHit(0.1, AppliedDamage, HitLocation, DamageType, Momentum, BodyPart);
00234							GotoState('Pain');
00235						}
00236					}
00237				}
00238			}
00239			else if (bAlreadyDead)
00240			{	// Twitch corpse or Gib
00241				if(Health < -Default.Health && bGibbable)
00242				{ // Gib if beaten down far enough
00243					SpawnBodyGibs(Momentum);
00244					if (bIsPlayer)
00245						bHidden=true;
00246					else
00247						Destroy();
00248				}
00249			}
00250			else
00251			{ // Kill the creature
00252				AddVelocity(momentum * 2 / Mass);
00253	
00254				if (EventInstigator != self && PlayerPawn(EventInstigator) != None)
00255				{
00256					EventInstigator.BoostStrength(0.15 * Default.Health);
00257				}
00258	
00259				if(Health < -Default.Health && bGibbable)
00260				{ // Gib if beaten down far enough
00261					Died(EventInstigator, 'gibbed', HitLocation);
00262	//				if (bIsPlayer)	// moved to died
00263	//					bHidden=true;
00264	//				else
00265	//					Destroy();
00266				}
00267				else
00268				{
00269					// Apply momentum
00270					Died(EventInstigator, DamageType, HitLocation);
00271				}
00272			}
00273			MakeNoise(1.0);
00274		}
00275	
00276		return(false);
00277	}
00278	
00279	//============================================================
00280	//
00281	// PainSkin
00282	//
00283	// returns the pain skin for a given polygroup
00284	//============================================================
00285	function Texture PainSkin(int BodyPart)
00286	{
00287		return None;
00288	}
00289	
00290	//=============================================================================
00291	//
00292	// BodyPartForJoint
00293	//
00294	// Returns the body part a joint is associated with
00295	//=============================================================================
00296	
00297	function int BodyPartForJoint(int joint)
00298	{
00299		switch(joint)
00300		{
00301			case 2: case 3:				return BODYPART_LLEG1;
00302			case 6: case 7:				return BODYPART_RLEG1;
00303			case 17:					return BODYPART_HEAD;
00304			case 21: case 23:			return BODYPART_LARM1;
00305			case 30: case 32:			return BODYPART_RARM1;
00306			default:					return BODYPART_BODY;
00307		}
00308	}
00309	
00310	function int JointForBodyPart(int BodyPart)
00311	{
00312		switch(BodyPart)
00313		{
00314		case BODYPART_LLEG1:			return(3);
00315		case BODYPART_RLEG1:			return(7);
00316		case BODYPART_HEAD:				return(17);
00317		case BODYPART_LARM1:			return(23);
00318		case BODYPART_RARM1:			return(32);
00319		default:						return(0);
00320		}
00321	}
00322	
00323	//============================================================
00324	//
00325	// BodyPartForPolyGroup
00326	//
00327	//============================================================
00328	function int BodyPartForPolyGroup(int polygroup)
00329	{
00330		switch(polygroup)
00331		{
00332			case 1:	case 3:			return BODYPART_RARM1;
00333			case 2:					return BODYPART_RLEG1;
00334			case 4:					return BODYPART_TORSO;
00335			case 5:					return BODYPART_HEAD;
00336			case 6:					return BODYPART_LLEG1;
00337			case 7:	case 8:			return BODYPART_LARM1;
00338		}
00339		return BODYPART_BODY;
00340	}
00341	
00342	//================================================
00343	//
00344	// SeveredLimbClass
00345	//
00346	//================================================
00347	function class<Actor> SeveredLimbClass(int BodyPart)
00348	{
00349		switch(BodyPart)
00350		{
00351			case BODYPART_LARM1:
00352				return class'ZombieLArm';
00353			case BODYPART_RARM1:
00354				return class'ZombieRArm';
00355			case BODYPART_HEAD:
00356				return class'ZombieHead';
00357				break;
00358		}
00359	
00360		return None;
00361	}
00362	
00363	//============================================================
00364	//
00365	// ApplyGoreCap
00366	//
00367	//============================================================
00368	function ApplyGoreCap(int BodyPart)
00369	{
00370	}
00371	
00372	//================================================
00373	//
00374	// LimbSevered
00375	//
00376	//================================================
00377	function LimbSevered(int BodyPart, vector Momentum)
00378	{
00379		local int joint;
00380		local vector X,Y,Z,pos;
00381		local actor part;
00382		local class<actor> partclass;
00383		
00384		Super.LimbSevered(BodyPart, Momentum);
00385	
00386		ApplyGoreCap(BodyPart);
00387		partclass = SeveredLimbClass(BodyPart);
00388	
00389		part = None;
00390		switch(BodyPart)
00391		{
00392			case BODYPART_HEAD:
00393				joint = JointNamed('head');
00394				pos = GetJointPos(joint);
00395				part = Spawn(partclass,,, pos, Rotation);
00396				if(part != None)
00397				{
00398					part.Velocity = 0.75 * (momentum / Mass) + vect(0, 0, 300);
00399					part.GotoState('Drop');
00400				}
00401				break;
00402			case BODYPART_LARM1:
00403				joint = JointNamed('lshoulda');
00404				pos = GetJointPos(joint);
00405				part = Spawn(partclass,,, pos, Rotation);
00406				if(part != None)
00407				{
00408					part.Velocity = Y * 100 + vect(0, 0, 175);
00409					part.GotoState('Drop');
00410				}
00411				break;
00412			case BODYPART_RARM1:
00413				joint = JointNamed('rshoulda');
00414				pos = GetJointPos(joint);
00415				part = Spawn(partclass,,, pos, Rotation);
00416				if(part != None)
00417				{
00418					part.Velocity = Y * 100 + vect(0, 0, 175);
00419					part.GotoState('Drop');
00420				}
00421				break;
00422		}
00423	}
00424	
00425	//------------------------------------------------------------
00426	//
00427	// MakeTwitchable
00428	//
00429	// TODO: Move to carcass
00430	//------------------------------------------------------------
00431	function MakeTwitchable()
00432	{
00433		local int j;
00434	
00435		// Turn all collision joints accelerative
00436		for (j=0; j<NumJoints(); j++)
00437		{
00438			if ((JointFlags[j] & JOINT_FLAG_COLLISION)==0)
00439				continue;
00440	
00441			switch(j)
00442			{
00443				case 11: case 14: case 2: case 6:
00444					break;
00445				default:
00446					JointFlags[j] = JointFlags[j] | JOINT_FLAG_ACCELERATIVE;
00447	//				SetJointRotThreshold(j, 16000);
00448	//				SetJointDampFactor(j, 0.025);
00449	//				SetAccelMagnitude(j, 8000);
00450					break;
00451			}
00452		}
00453	}
00454	
00455	
00456	function bool JointDamaged(int Damage, Pawn EventInstigator, vector HitLoc, vector Momentum, name DamageType, int joint)
00457	{
00458		local int i;
00459	
00460		if (DamageType == 'fire')
00461		{	// When damaged by fire, let fire spread to other joints
00462			for (i=0; i<NumJoints(); i++)
00463			{
00464				if ( ((JointFlags[i] & JOINT_FLAG_COLLISION)!=0) && JointChild[i] == None)
00465				{
00466					SetOnFire(EventInstigator, i);
00467					break;
00468				}
00469			}
00470		}
00471		return Super.JointDamaged(Damage, EventInstigator, HitLoc, Momentum, DamageType, joint);
00472	}
00473	
00474	function SetOnFire(Pawn EventInstigator, int Joint)
00475	{
00476		Super.SetOnFire(EventInstigator, Joint);
00477	
00478		// Make the zombie go crazy when it's on fire!
00479		GroundSpeed = Default.GroundSpeed * 2;
00480		LungeChance = Default.LungeChance * 3;
00481	
00482		if(Weapon != None)
00483			Weapon.DamageType = 'fire';
00484	}
00485	
00486	
00487	//-----------------------------------------------------------------------------
00488	// Animation functions
00489	//-----------------------------------------------------------------------------
00490	
00491	function PlayWaiting(optional float tween)
00492	{
00493		LoopAnim ('weapon1_idle', 1.0, DEFAULT_TWEEN);
00494	}
00495	
00496	//============================================================
00497	//
00498	// PlayMoving
00499	//
00500	//============================================================
00501	
00502	function PlayMoving(optional float tween)
00503	{
00504		if (bHurrying)
00505		{
00506			LoopAnim('S1_Walk', 0.75, DEFAULT_TWEEN);
00507		}
00508		else
00509		{
00510			LoopAnim('z_walkN', 1.0, DEFAULT_TWEEN);
00511		}
00512	}
00513	
00514	//============================================================
00515	//
00516	// PlayStrafeLeft
00517	//
00518	//============================================================
00519	
00520	function PlayStrafeLeft(optional float tween)
00521	{
00522		LoopAnim('strafeleft', 0.75, DEFAULT_TWEEN);
00523	}
00524	
00525	//============================================================
00526	//
00527	// PlayStrafeRight
00528	//
00529	//============================================================
00530	
00531	function PlayStrafeRight(optional float tween)
00532	{
00533		LoopAnim('straferight', 0.75, DEFAULT_TWEEN);
00534	}
00535	
00536	//============================================================
00537	//
00538	// PlayBackup
00539	//
00540	//============================================================
00541	
00542	function PlayBackup(optional float tween)
00543	{
00544		LoopAnim('weapon1_backup', 0.75, DEFAULT_TWEEN);
00545	}
00546	
00547	/*
00548	function PlayMoving(optional float tween)
00549	{
00550		if (bHurrying)
00551		{
00552			LoopAnim  ('z_walk',     1.0, tween);
00553		}
00554		else
00555		{
00556			if (Weapon==None)						LoopAnim  ('z_walk',     1.0, tween);
00557			else if (Weapon.IsA('Torch'))			LoopAnim  ('z_walk',1.0, tween);
00558			else									LoopAnim  ('z_walk',     1.0, tween);
00559		}
00560	}
00561	*/
00562	
00563	function PlayJumping(optional float tween)    { PlayAnim  ('z_idle',		1.0, tween);   }
00564	function PlayHuntStop(optional float tween)   { LoopAnim  ('z_idle',		1.0, tween);   }
00565	
00566	function PlayMeleeHigh(optional float tween)
00567	{
00568		if(FRand() < 0.3)
00569			PlayAnim('atk_all_attack3_aa0s', 1.0, DEFAULT_TWEEN);
00570		else
00571			PlayAnim('z_breathe', 1.0, DEFAULT_TWEEN);
00572	}
00573	function PlayMeleeLow(optional float tween)
00574	{
00575		PlayAnim  ('atk_all_attack3_aa0s', 1.0, DEFAULT_TWEEN);
00576	}
00577	function PlayTurning(optional float tween)
00578	{
00579													PlayAnim  ('z_idle',		1.0, tween);
00580	}
00581	
00582	function PlayCower(optional float tween)      { LoopAnim  ('z_idle',		1.0, tween);   }
00583	function PlayThrowing(optional float tween)
00584	{	//TODO: Switch weapon type for different throws
00585													PlayAnim  ('z_idle',   1.0, tween);
00586	}
00587	function PlayTaunting(optional float tween)   { PlayAnim  ('z_idle',      1.0, tween);   }
00588	function PlayInAir(optional float tween)
00589	{
00590		LoopAnim  ('z_idle',	1.0, DEFAULT_TWEEN);
00591	}
00592	function LongFall()
00593	{
00594		if (AnimSequence != 'z_idle')
00595			LoopAnim  ('z_idle',	1.0, 0.1);
00596	}
00597	function PlayLanding(optional float tween)
00598	{
00599		if (AnimSequence == 'z_idle')
00600			PlayAnim('z_idle', 1.0, 0.1);
00601		else if (AnimSequence == 'z_idle')
00602			PlayAnim('z_idle', 1.0, 0.1);
00603		else
00604			PlayAnim('z_idle', 1.0, 0.1);
00605	}
00606	
00607	function PlayDodgeLeft(optional float tween)  { PlayAnim  ('z_idle',   1.0, tween);   }
00608	function PlayDodgeRight(optional float tween) { PlayAnim  ('z_idle',   1.0, tween);   }
00609	function PlayDodgeForward(optional float tween){PlayAnim  ('z_idle',   1.0, tween);   }
00610	function PlayDodgeBack(optional float tween)  { PlayAnim  ('z_idle',   1.0, tween);   }
00611	function PlayDodgeBackflip(optional float tween){PlayAnim ('z_idle',   1.0, tween);   }
00612	function PlayDodgeDuck(optional float tween)  { PlayAnim  ('z_idle',   1.0, tween);   }
00613	function PlayBlockHigh(optional float tween)  { LoopAnim  ('z_idle',   1.0, tween);   }
00614	function PlayBlockLow(optional float tween)   { LoopAnim  ('z_idle',  1.0, tween);   }
00615	
00616	function PlayFrontHit(float tweentime){}
00617	function PlayHeadHit(optional float tween)    { /* PlayAnim  ('pain',   1.0, tween); */  }
00618	function PlayBodyHit(optional float tween)    { /*PlayAnim  ('pain',   1.0, tween); */  }
00619	function PlayLArmHit(optional float tween)    { /*PlayAnim  ('pain',   1.0, tween); */  }
00620	function PlayRArmHit(optional float tween)    { /*PlayAnim  ('pain',   1.0, tween); */  }
00621	function PlayLLegHit(optional float tween)    { /*PlayAnim  ('pain',   1.0, tween); */  }
00622	function PlayRLegHit(optional float tween)    { /*PlayAnim  ('pain',   1.0, tween); */  }
00623	function PlayDrowning(optional float tween)   { /*LoopAnim  ('drown',  1.0, tween);	*/}
00624	
00625	function PlayDeath(name DamageType)	          
00626	{ 
00627		PlayAnim('z_deadhead', 1.0, 0.1);
00628	}
00629	
00630	function PlayDrownDeath(name DamageType)      { PlayAnim  ('z_idle', 1.0, 0.1);	}
00631	
00632	/*
00633	// Tween functions
00634	function TweenToWaiting(float time)
00635	{
00636		TweenAnim ('z_idle',          time);
00637	}
00638	function TweenToMoving(float time)
00639	{
00640		TweenAnim('z_walk',   time);
00641	}
00642	function TweenToTurning(float time)           {	TweenAnim ('z_walk',    time);         }
00643	function TweenToJumping(float time)           {	TweenAnim ('z_idle',    time);         }
00644	function TweenToHuntStop(float time)          { TweenAnim ('z_idle',   time);         }
00645	function TweenToMeleeHigh(float time)
00646	{
00647													TweenAnim ('z_idle', time);
00648	}
00649	function TweenToMeleeLow(float time)
00650	{
00651													TweenAnim ('z_idle', time);
00652	}
00653	function TweenToThrowing(float time)          { TweenAnim ('z_idle',  time);         }
00654	*/
00655	
00656	function TweenToWaiting(float time)
00657	{
00658		LoopAnim('weapon1_idle', time);
00659	}
00660	
00661	function TweenToMoving(float time)
00662	{
00663		TweenAnim('S1_Walk', time);
00664	}
00665	
00666	function TweenToTurning(float time)
00667	{ // TODO:  Need turning anims
00668		TweenAnim('weapon1_idle', time);
00669	}
00670	
00671	function TweenToJumping(float time)           {	TweenAnim ('MOV_ALL_jump1_AA0S', time); }
00672	function TweenToMeleeHigh(float time)
00673	{
00674	/*
00675		if (Weapon==None)							TweenAnim ('swipe',     time);
00676		else										TweenAnim ('attackb',   time);
00677	*/
00678	}
00679	function TweenToMeleeLow(float time)
00680	{
00681	/*
00682		if (Weapon==None)							TweenAnim ('swipe',     time);
00683		else										TweenAnim ('attackb',   time);
00684	*/
00685	}
00686	function TweenToThrowing(float time)          { TweenAnim ('throwA',    time);         }
00687	
00688	//===================================================================
00689	//
00690	// PlayTakeHit
00691	//
00692	//===================================================================
00693	
00694	function PlayTakeHit(float tweentime, int damage, vector HitLoc, name damageType, vector Momentum, int BodyPart)
00695	{
00696		PlayAnim('z_knockdown', 1.0, 0.1);
00697	}
00698	
00699	//================================================
00700	//
00701	// AltWeaponActivate
00702	//
00703	// Zombie Breath Attack
00704	//================================================
00705	
00706	function AltWeaponActivate()
00707	{
00708		local actor a;
00709		local rotator r;
00710		local vector l;
00711	
00712		if(Enemy == None)
00713			return;
00714	
00715		r = rotator(Enemy.Location - Location);
00716		l = GetJointPos(JointNamed('head')) + vector(r) * 10;
00717	
00718		a = Spawn(class'ZombieBreath', self,, l, r);
00719		a.Velocity = vector(r) * 100;
00720		a.SetPhysics(PHYS_Projectile);
00721	
00722		PlaySound(GreenPuffSound);
00723	}
00724	
00725	//============================================================
00726	//
00727	// Died
00728	//
00729	//============================================================
00730	
00731	function Died(pawn Killer, name damageType, vector HitLocation)
00732	{
00733		GlowEyes(false);
00734		Super.Died(Killer, damageType, HitLocation);
00735	}
00736	
00737	//============================================================
00738	//
00739	// ZoneChange
00740	//
00741	//============================================================
00742	
00743	function ZoneChange(ZoneInfo newZone)
00744	{
00745		local rotator newRot;
00746	
00747		Super.ZoneChange(newZone);
00748		if(newZone.bLokiBloodZone)
00749		{
00750			GotoState('Sarkify');
00751		}
00752	}
00753	
00754	//================================================
00755	//
00756	// Sarkify
00757	//
00758	// A zombie transforming into a Sark
00759	//================================================
00760	
00761	State Sarkify
00762	{
00763	ignores SeePlayer, EnemyNotVisible, HearNoise, KilledBy, Trigger, Bump, HitWall, HeadZoneChange, FootZoneChange, ZoneChange, Falling, WarnTarget, Died, LongFall, PainTimer, Landed, EnemyAcquired, CheckForEnemies;
00764	
00765		function SpawnSark()
00766		{
00767			local rotator newRot;
00768			local class<ScriptPawn> SarkClass;
00769			local ScriptPawn Sark;
00770			local pawn P;
00771	
00772			SetCollision(false, false, false); // Don't block the incoming Sark
00773			newRot = Rotation * -1;
00774	//		Sark = Spawn(SarkClass,,, Location, newRot);
00775	
00776			SarkClass = class<ScriptPawn>(DynamicLoadObject("RuneI.SarkSpawn", class'Class'));
00777			if(SarkClass != None)
00778				Sark = Spawn(SarkClass,,, Location, newRot);
00779	
00780			if(Sark != None)
00781			{
00782				Sark.Event = Event; // Carry over death event			
00783				Sark.Tag = Tag;
00784	
00785				for(P = Level.PawnList; P != None; P = P.nextPawn)
00786				{
00787					if(P.bIsPlayer)
00788					{
00789						Sark.LookAt(P);
00790						break;
00791					}
00792				}
00793	
00794				// Set the Sark to roam to find the player
00795				Sark.Orders = 'roaming';
00796				Sark.OrdersTag = '';
00797			}
00798		}
00799		
00800	begin:
00801		SetPhysics(PHYS_None);	
00802		bHidden = true; // Hide the zombie for a bit, it will be destroyed after the Sark is created
00803		Spawn(class'ZombieChangeFire',,, Location);
00804		Sleep(1.0 + FRand());
00805		SpawnSark();
00806		Destroy();
00807	}
00808	
00809	//================================================
00810	//
00811	// Fighting
00812	//
00813	//================================================
00814	State Fighting
00815	{
00816	ignores EnemyAcquired;
00817	
00818		function BeginState()
00819		{
00820			bAvoidLedges = true;
00821			LookAt(Enemy);
00822			SetTimer(0.1, true);
00823			AttackAction = AA_LUNGE;
00824			bStopMoveIfCombatRange = true;
00825		}
00826	
00827		function EndState()
00828		{
00829			bAvoidLedges = false;
00830	
00831			bSwingingHigh = false;
00832			bSwingingLow  = false;
00833	
00834			if(Weapon != None)
00835			{
00836				Weapon.FinishAttack();
00837				Weapon.DisableSwipeTrail();
00838			}
00839	
00840			LookAt(None);
00841			SetTimer(1.0, false);
00842		}
00843	
00844		//============================================================
00845		//
00846		// InCombatRange
00847		//
00848		//============================================================
00849	
00850		function bool InCombatRange(Actor Other)
00851		{
00852			if(Other == None)
00853				return(false);
00854	
00855			return (VSize(Location - Other.Location) < CollisionRadius + Other.CollisionRadius + CombatRange);
00856		}
00857			
00858		function AmbientSoundTimer()
00859		{
00860			PlayAmbientFightSound();
00861		}
00862	
00863		function bool BlockRatherThanDodge()
00864		{
00865			if (Shield == None)
00866				return false;
00867	
00868			if (EnemyIncidence != INC_FRONT)
00869				return false;
00870	
00871			return (FRand() < BlockChance);
00872		}
00873	
00874		// Determine AttackAction based upon enemy movement and position
00875		function Timer()
00876		{
00877			GetEnemyProximity();
00878	
00879			LastAction = AttackAction;
00880					
00881			if(EnemyMovement == MOVE_STRAFE_LEFT && FRand() < 0.9)
00882			{
00883				AttackAction = AA_STRAFE_LEFT;
00884			}
00885			else if(EnemyMovement == MOVE_STRAFE_RIGHT && FRand() < 0.9)
00886			{
00887				AttackAction = AA_STRAFE_RIGHT;
00888			}
00889		 	else if(FRand() < 0.5)
00890		 	{
00891		 		if(FRand() < 0.5 && LastAction != AA_STRAFE_RIGHT || LastAction == AA_STRAFE_LEFT)
00892		 		{
00893		 			AttackAction = AA_STRAFE_LEFT;
00894		 		}
00895		 		else if(LastAction != AA_STRAFE_LEFT || LastAction == AA_STRAFE_RIGHT)
00896		 		{
00897		 			AttackAction = AA_STRAFE_RIGHT;
00898		 		}
00899				else
00900				{
00901					AttackAction = AA_WAIT;
00902				}
00903		 	}
00904			else if((EnemyMovement == MOVE_STANDING && FRand() < 0.2) || FRand() < LungeChance)
00905			{
00906				AttackAction = AA_LUNGE;
00907			}		
00908			else
00909			{
00910				AttackAction = AA_WAIT;
00911			}
00912			
00913	/*	
00914			if (ShouldDefend())
00915			{
00916				GotoState('Fighting', 'Defend');
00917			}
00918	*/		
00919		}
00920	
00921		function bool ShouldDefend()
00922		{
00923			return (FRand() > FightOrDefend && InDangerFromAttack());
00924		}
00925		
00926		function bool InDangerFromAttack()
00927		{
00928			if ((!Enemy.bSwingingHigh) && (!Enemy.bSwingingLow))
00929				return false;
00930	
00931			GetEnemyProximity();
00932				
00933			if (EnemyDist>CollisionRadius+Enemy.CollisionRadius+Enemy.MeleeRange)
00934				return false;
00935	
00936			return (EnemyVertical==VERT_LEVEL && EnemyFacing==FACE_FRONT);
00937		}
00938	
00939		function CalcStrafePosition()
00940		{		
00941			local vector V;
00942			local rotator R;
00943			local vector temp;
00944			
00945			V = Location - Enemy.Location;
00946			R = rotator(V);
00947			
00948			R.Yaw += 4000;
00949	
00950			// Strafe using the enemy's XY location, but the viking's location ground plane		
00951			temp = Enemy.Location;
00952			temp.Z = Location.Z;
00953	
00954			Destination = temp + vector(R) * CombatRange;
00955		}
00956		
00957		function CalcStrafePosition2()
00958		{		
00959			local vector V;
00960			local rotator R;
00961			local vector temp;
00962			
00963			V = Location - Enemy.Location;
00964			R = rotator(V);
00965			
00966			R.Yaw -= 4000;
00967	
00968			// Strafe using the enemy's XY location, but the viking's location ground plane		
00969			temp = Enemy.Location;
00970			temp.Z = Location.Z;
00971	
00972			Destination = temp + vector(R) * CombatRange;
00973		}
00974	
00975		function CalcJumpVelocity()
00976		{
00977			local float traj;
00978			local vector adjust;
00979	
00980			traj = (70 + Rand(5)) * 65536 / 360;
00981			adjust = Enemy.Location - Location; // Random adjustment to compensate for perfect accuracy
00982			AddVelocity(CalcArcVelocity(traj, Location, Enemy.Location + adjust));
00983		}
00984	
00985			
00986	Begin:
00987		Acceleration = vect(0,0,0);
00988	
00989		// Turn to face enemy
00990		if(Enemy != None)
00991			DesiredRotation.Yaw = rotator(Enemy.Location-Location).Yaw;
00992	
00993	//	PlayWaiting();
00994	
00995	Fight:
00996		GetEnemyProximity();
00997		
00998		// Attack if close enough
00999		if(Weapon != None && Enemy != None && InMeleeRange(Enemy) || (EnemyMovement == MOVE_CLOSER && EnemyDist < MeleeRange * 2.5))
01000		{
01001			if(FRand() < 0.8)
01002			{
01003				GlowEyes(true);
01004				PlayMeleeHigh(0.1);
01005				FinishAnim();
01006				GlowEyes(false);
01007			}
01008			
01009			Sleep(TimeBetweenAttacks);
01010		}
01011		else if(AttackAction == AA_LUNGE)
01012		{ // Random lunge
01013			bStopMoveIfCombatRange = false;
01014			GlowEyes(true);
01015			PlayAnim('z_attackL', 1.0, 0.1);
01016			Sleep(0.25); // wait for a bit before doing the actual lunge
01017			if(Enemy != None)
01018				AddVelocity(Normal(Enemy.Location - Location) * 325 + vect(0, 0, 200));
01019			FinishAnim();
01020			WaitForLanding();
01021			GlowEyes(false);
01022			Sleep(TimeBetweenAttacks);
01023			bStopMoveIfCombatRange = true;
01024		}
01025		else if(AttackAction == AA_STRAFE_LEFT)
01026		{ // Strafe 
01027			CalcStrafePosition();
01028			PlayStrafeLeft();
01029			bStopMoveIfCombatRange = false;
01030			StrafeFacing(Destination, Enemy);
01031			bStopMoveIfCombatRange = true;
01032		}
01033		else if(AttackAction == AA_STRAFE_RIGHT)
01034		{
01035			CalcStrafePosition2();
01036			PlayStrafeRight();
01037			bStopMoveIfCombatRange = false;
01038			StrafeFacing(Destination, Enemy);
01039			bStopMoveIfCombatRange = true;
01040		}
01041		else if(AttackAction == AA_JUMP)
01042		{
01043			PlayJumping();
01044			CalcJumpVelocity();
01045			WaitForLanding();
01046			FinishAnim();		
01047		}
01048		else
01049		{
01050			PlayWaiting();
01051		}
01052	
01053		if(InCombatRange(Enemy))
01054		{
01055			Sleep(0.05);
01056			Goto('Begin');
01057		}
01058		
01059	BackFromSubState:
01060		GotoState('Charging', 'ResumeFromFighting');
01061	}
01062	
01063	//------------------------------------------------------------
01064	//
01065	// Pain
01066	//
01067	//------------------------------------------------------------
01068	state Pain
01069	{
01070		function bool CanGotoPainState()
01071		{ // Do not allow the actor to enter the painstate when already in pain
01072			return(false);
01073		}
01074	
01075		function EndState()
01076		{
01077			Super.EndState();
01078	
01079			EndGetUpEffect();
01080		}
01081	
01082		function StartGetUpEffect()
01083		{
01084			local vector loc;
01085	
01086			// Spawn semi-magically get-up effect
01087			DesiredColorAdjust.X = 0;
01088			DesiredColorAdjust.Y = 128;
01089			DesiredColorAdjust.Z = 51;
01090	
01091			loc = Location;
01092			loc.Z -= CollisionHeight;
01093			
01094			Spawn(class'GroundDust',,, loc,);
01095	
01096			LightType=LT_Steady;
01097			LightEffect=LE_None;
01098			LightBrightness=230;
01099			LightHue=53;
01100			LightSaturation=20;
01101			LightRadius=10;
01102	
01103			if(Eyes != None)
01104			{
01105				Eyes.bHidden = false;
01106			}
01107	
01108			PlaySound(ZombieGetUpSound, SLOT_Talk);
01109		}
01110	
01111		function EndGetUpEffect()
01112		{
01113			DesiredColorAdjust.X = 0;
01114			DesiredColorAdjust.Y = 0;
01115			DesiredColorAdjust.Z = 0;
01116	
01117			LightType=LT_None;
01118			LightEffect=LE_None;
01119			LightBrightness=0;
01120			LightRadius=0;
01121	
01122			if(Eyes != None)
01123			{
01124				Eyes.bHidden = true;
01125			}
01126		}
01127	
01128	Begin:
01129		bRotateTorso = false;
01130		bRotateHead = false;
01131	
01132		GlowEyes(false);
01133	
01134		if(PainDelay < 0)
01135		{ // If PainDelay is negative, the painstate waits until the anim has completed
01136			FinishAnim();
01137		}
01138		else
01139		{ // Otherwise, just use the PainDelay
01140			Sleep(PainDelay);
01141		}
01142	
01143		Sleep(1 + FRand()); // Lay on the ground for a moment
01144	
01145		bRotateTorso = true;
01146		bRotateHead = true;
01147	
01148		StartGetUpEffect();
01149	
01150		PlayAnim('z_getup', 1.0, 0.1);
01151		FinishAnim();
01152	
01153		GotoState(NextStateAfterPain);
01154	}
01155	
01156	//------------------------------------------------------------
01157	//
01158	// Crucified
01159	//
01160	//------------------------------------------------------------
01161	state() Crucified
01162	{
01163	ignores AddVelocity;
01164	
01165		function BeginState()
01166		{
01167			SetPhysics(PHYS_None);
01168		}
01169	
01170		function bool CanPickup(Inventory item)
01171		{
01172			return false;
01173		}
01174	
01175		function bool CanGotoPainState()
01176		{
01177			return(false);
01178		}
01179	
01180		function bool JointDamaged(int damage, pawn EventInstigator, vector HitLoc, vector Momentum, name DamageType, int joint)
01181		{
01182			if (Health > 10)
01183			{	// Concious
01184				Health -= damage;
01185				GotoState('Crucified', 'InPain');
01186			}
01187			else
01188			{	// Unconcious
01189				Health -= damage;
01190				if (Health <= 0)
01191				{
01192					Health = 1;	// Insure can be killed by final blow so death event fires
01193					if (damage > 10)
01194					{	// Only a big final blow will gib
01195						return Super.JointDamaged(1000, EventInstigator, HitLoc, Momentum, 'gibbed', 0);
01196					}
01197					else
01198					{
01199						return true;
01200					}
01201				}
01202			}
01203	
01204			return false;
01205		}
01206	
01207		function EndState()
01208		{
01209			SetMovementPhysics();
01210		}
01211	
01212		function bool BodyPartCritical(int BodyPart)
01213		{	// Don't flee when arm cut off, die
01214			return true;
01215		}
01216	
01217	InPain:
01218		switch(CrucifiedAnim)
01219		{
01220			case 'CrucifiedAIdle':
01221				PlayAnim('CrucifiedAPain', 1.0, 0.1);
01222				FinishAnim();
01223				break;
01224			case 'CrucifiedBIdle':
01225				PlayAnim('CrucifiedBPain', 1.0, 0.1);
01226				FinishAnim();
01227				break;
01228			case 'CrucifiedC':
01229				break;
01230		}
01231		if (Health > 10)
01232			Goto('Concious');
01233	
01234	Unconcious:
01235		switch(CrucifiedAnim)
01236		{
01237			case 'CrucifiedAIdle':
01238				PlayAnim('CrucifiedA', 1.0, 0.4);
01239				break;
01240			case 'CrucifiedBIdle':
01241				PlayAnim('CrucifiedB', 1.0, 0.4);
01242				break;
01243			case 'CrucifiedC':
01244				break;
01245		}
01246		Goto('Idle');
01247	
01248	Begin:
01249	Concious:
01250		LoopAnim(CrucifiedAnim, 1.0, 0.1);
01251	
01252	Idle:
01253	}
01254	
01255	defaultproperties
01256	{
01257	     LungeChance=0.200000
01258	     DecapitateSound=Sound'CreaturesSnd.Zombie.zombiedecap01'
01259	     GreenPuffSound=Sound'CreaturesSnd.Zombie.zombiepuff01'
01260	     ZombieGetUpSound=Sound'CreaturesSnd.Zombie.zombiegetup01'
01261	     FightOrFlight=1.000000
01262	     FightOrDefend=1.000000
01263	     HighOrLow=1.000000
01264	     LatOrVertDodge=1.000000
01265	     HighOrLowBlock=1.000000
01266	     LungeRange=100.000000
01267	     PaceRange=100.000000
01268	     TimeBetweenAttacks=0.100000
01269	     AcquireSound=Sound'CreaturesSnd.Zombie.zombiesee01'
01270	     AmbientWaitSounds(0)=Sound'CreaturesSnd.Zombie.zombieambient01'
01271	     AmbientWaitSounds(1)=Sound'CreaturesSnd.Zombie.zombieambient02'
01272	     AmbientWaitSounds(2)=Sound'CreaturesSnd.Zombie.zombieambient03'
01273	     AmbientFightSounds(0)=Sound'CreaturesSnd.Zombie.zombieattack01'
01274	     AmbientFightSounds(1)=Sound'CreaturesSnd.Zombie.zombieattack01'
01275	     AmbientFightSounds(2)=Sound'CreaturesSnd.Zombie.zombieattack01'
01276	     AmbientFightSoundDelay=8.000000
01277	     StartWeapon=Class'RuneI.ZombieClaw'
01278	     ShadowScale=1.500000
01279	     A_PullUp=intropullupA
01280	     A_StepUp=pullupTest
01281	     CarcassType=Class'RuneI.ZombieCarcass'
01282	     MeleeRange=60.000000
01283	     CombatRange=140.000000
01284	     GroundSpeed=170.000000
01285	     MaxStepHeight=30.000000
01286	     ClassID=10
01287	     PeripheralVision=-1.000000
01288	     Health=80
01289	     BodyPartHealth(1)=30
01290	     BodyPartHealth(3)=30
01291	     BodyPartHealth(5)=30
01292	     HitSound1=Sound'CreaturesSnd.Zombie.zombiehit01'
01293	     HitSound2=Sound'CreaturesSnd.Zombie.zombiehit02'
01294	     HitSound3=Sound'CreaturesSnd.Zombie.zombiehit03'
01295	     Die=Sound'CreaturesSnd.Zombie.zombiedeath01'
01296	     Die2=Sound'CreaturesSnd.Zombie.zombiedeath02'
01297	     Die3=Sound'CreaturesSnd.Zombie.zombiedeath03'
01298	     FootStepWood(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01299	     FootStepWood(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01300	     FootStepWood(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01301	     FootStepMetal(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01302	     FootStepMetal(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01303	     FootStepMetal(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01304	     FootStepStone(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01305	     FootStepStone(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01306	     FootStepStone(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01307	     FootStepFlesh(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01308	     FootStepFlesh(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01309	     FootStepFlesh(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01310	     FootStepIce(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01311	     FootStepIce(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01312	     FootStepIce(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01313	     FootStepEarth(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01314	     FootStepEarth(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01315	     FootStepEarth(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01316	     FootStepSnow(0)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01317	     FootStepSnow(1)=Sound'CreaturesSnd.Zombie.zombiefoot02'
01318	     FootStepSnow(2)=Sound'CreaturesSnd.Zombie.zombiefoot01'
01319	     CombatStyle=1.000000
01320	     WeaponJoint=rhand
01321	     bCanLook=True
01322	     bHeadLookUpDouble=True
01323	     MaxMouthRot=7000
01324	     MaxMouthRotRate=65535
01325	     LFootJoint=5
01326	     RFootJoint=9
01327	     bLeadEnemy=True
01328	     DrawScale=1.250000
01329	     TransientSoundRadius=1200.000000
01330	     CollisionHeight=51.000000
01331	     RotationRate=(Pitch=0,Roll=0)
01332	     SkelMesh=11
01333	     Skeletal=SkelModel'Players.Ragnar'
01334	     SkelGroupSkins(0)=Texture'Players.Ragnarragd_arms'
01335	     SkelGroupSkins(1)=Texture'Players.Ragnarz_armleg'
01336	     SkelGroupSkins(2)=Texture'Players.Ragnarz_armleg'
01337	     SkelGroupSkins(3)=Texture'Players.Ragnarz_armleg'
01338	     SkelGroupSkins(4)=Texture'Players.Ragnarz_body'
01339	     SkelGroupSkins(5)=Texture'Players.Ragnarz_head'
01340	     SkelGroupSkins(6)=Texture'Players.Ragnarz_armleg'
01341	     SkelGroupSkins(7)=Texture'Players.Ragnarz_armleg'
01342	     SkelGroupSkins(8)=Texture'Players.Ragnarz_armleg'
01343	     SkelGroupSkins(9)=Texture'Players.Ragnarz_head'
01344	     SkelGroupSkins(10)=Texture'Players.Ragnarz_neckgore'
01345	     SkelGroupSkins(11)=Texture'Players.Ragnarragd_arms'
01346	     SkelGroupSkins(12)=Texture'Players.Ragnarragd_arms'
01347	     SkelGroupSkins(13)=Texture'Players.Ragnarragd_arms'
01348	     SkelGroupSkins(14)=Texture'Players.Ragnarragd_arms'
01349	     SkelGroupSkins(15)=Texture'Players.Ragnarragd_arms'
01350	}

End Source Code