//=============================================================================
// snake.
// todo: expand collision when standing up instead of large collision?
//=============================================================================
class snake expands FsPawn;

#exec MESH IMPORT MESH=snake ANIVFILE=MODELS\snake\snake_a.3d DATAFILE=MODELS\snake\snake_d.3d X=0 Y=0 Z=0
#exec MESH ORIGIN MESH=snake X=0 Y=0 Z=70 YAW=128

#exec MESH SEQUENCE MESH=snake SEQ=All     STARTFRAME=0 NUMFRAMES=52
#exec MESH SEQUENCE MESH=snake SEQ=ATTACK  STARTFRAME=0 NUMFRAMES=8  RATE=17  Group=Attack
#exec MESH SEQUENCE MESH=snake SEQ=CURL    STARTFRAME=8 NUMFRAMES=10 RATE=5 
#exec MESH SEQUENCE MESH=snake SEQ=DIE     STARTFRAME=18 NUMFRAMES=12  RATE=27
#exec MESH SEQUENCE MESH=snake SEQ=FIGHTER STARTFRAME=30 NUMFRAMES=9  RATE=10 //needs update: wrong animation imported
#exec MESH SEQUENCE MESH=snake SEQ=IDLE1   STARTFRAME=39 NUMFRAMES=1
#exec MESH SEQUENCE MESH=snake SEQ=TRAVEL  STARTFRAME=40 NUMFRAMES=12  RATE=6

#exec TEXTURE IMPORT NAME=Jsnake1 FILE=MODELS\snake\snake1.PCX GROUP=Skins FLAGS=2 // 3 - Default

#exec MESHMAP NEW   MESHMAP=snake MESH=snake
#exec MESHMAP SCALE MESHMAP=snake X=0.086 Y=0.1 Z=0.2
//#exec MESHMAP SCALE MESHMAP=snake X=0.07 Y=0.1 Z=0.2 old scale

#exec MESHMAP SETTEXTURE MESHMAP=snake NUM=1 TEXTURE=Jsnake1

//-----------------------------------------------------------------------------
// Pupae variables.

// Attack damage.
var() byte BiteDamage;		// Basic damage done by bite.
var(Sounds) sound bite;
 
//-----------------------------------------------------------------------------
// Pupae functions.

function PostBeginPlay()
{
	Super.PostBeginPlay();
	MaxDesiredSpeed = 0.7 + 0.1 * skill;
}

function SetMovementPhysics()
{
	SetPhysics(PHYS_Falling); 
}

function eAttitude AttitudeToCreature(Pawn Other)
{
	if ( Other.IsA('Snake') )
		return ATTITUDE_Friendly;
	else if ( Other.IsA('Manta')) //maybe relative?
		return ATTITUDE_Friendly;
	else if ( Other.IsA('ScriptedPawn') )
		return ATTITUDE_Hate;
}

function PlayWaiting()
{
	LoopAnim('idle1', 0.1 + 0.3 * FRand());
}

function PlayPatrolStop()
{
	PlayWaiting();
}

function PlayWaitingAmbush()
{
	PlayWaiting();
}

function PlayChallenge()
{
	if ( FRand() < 0.3 )
		PlayWaiting();
	else
		PlayAnim('Fighter');
}

function TweenToFighter(float tweentime)
{
	TweenAnim('Fighter', tweentime);
}

function TweenToRunning(float tweentime)
{
	if ( (AnimSequence != 'Travel') || !bAnimLoop )
		TweenAnim('Travel', tweentime);
}

function TweenToWalking(float tweentime)
{
	TweenAnim('Travel', tweentime);
}

function TweenToWaiting(float tweentime)
{
	TweenAnim('idle1', tweentime);
}

function TweenToPatrolStop(float tweentime)
{
	TweenAnim('idle1', tweentime);
}

function PlayRunning()
{
	LoopAnim('Travel', -4.0/GroundSpeed,,0.4);
}

function PlayWalking()
{
	LoopAnim('Travel', -4.0/GroundSpeed,,0.4);
}

function PlayThreatening()
{
	PlayWaiting();
}

function PlayTurning()
{
	TweenAnim('Travel', 0.3);
}

function PlayDying(name DamageType, vector HitLocation)
{
	PlaySound(Die, SLOT_Talk, 4 * TransientSoundVolume);
	PlayAnim('Die', 0.7, 0.1);
}

function PlayTakeHit(float tweentime, vector HitLoc, int damage)
{
	PlayAnim('Fighter');
}

function PlayVictoryDance()
{
	PlayAnim('Fighter', 1.0, 0.1);
}

function PlayMeleeAttack()
{
	local float decision;

	if (Physics == PHYS_Falling)
		decision = 1.0;
	if (Target == None)
		decision = 1.0;

	else
	{
  		PlaySound(Bite, SLOT_Interact);
  		PlayAnim('Attack');
		MeleeDamageTarget(BiteDamage, vect(0,0,0));
	}		
}

state MeleeAttack
{
ignores SeePlayer, HearNoise;

	singular function Bump(actor Other)
	{
		Disable('Bump');
		if ( (Other == Target) && (AnimSequence == 'Attack') )
			PlaySound(Bite, SLOT_Interact);
	}
}		

auto state StartUp
{
	function SetMovementPhysics()
	{
		SetPhysics(PHYS_None); // don't fall at start
	}
}


state Waiting
{
TurnFromWall:
	if ( NearWall(70) )
	{
		PlayTurning();
		TurnTo(Focus);
	}
Begin:
	TweenToWaiting(0.4);
	bReadyToAttack = false;
	if (Physics != PHYS_Falling) 
		SetPhysics(PHYS_None);
KeepWaiting:
	NextAnim = '';
}

defaultproperties
{
    Land=None
    BiteDamage=4
    Bite=Sound'FsPack.Predator.bite2'
    CarcassType=Class'SnakeCarcass'
    Aggressiveness=1.00
    Acquire=None
    Fear=None
    Roam=None
//    Roam=Sound'FsPack.Spinner.amb1' -looping, need fix!
    Threaten=Sound'FsPack.Predator.threat3'
    bCanStrafe=True
    MeleeRange=40.00
    GroundSpeed=140.00
    WaterSpeed=100.00
    JumpZ=1.00
    Visibility=50
    SightRadius=1500.00
    PeripheralVision=-0.40
    Health=35
    Intelligence=BRAINS_None
    HitSound1=None
    HitSound2=None
    Die=Sound'FsPack.Spinner.die2'
    CombatStyle=1.00
    DrawType=DT_Mesh
    Mesh=LodMesh'snake'
    CollisionRadius=28.00
    CollisionHeight=15.00
    Mass=80.00
    RotationRate=(Pitch=0, Yaw=50000, Roll=0)
}