/* // Spino Specific Territorial Behaviour // */ ;// param 0: ;// param 1: behaviour, (-1 = init) ;// param 2: fatal sync ;// param 3: string (fatal attack animation state) ;// param 4: string (fatal attack animation name) ;// param 5: string (fatal death animation state) ;// param 6: string (fatal death animation name) ;// param 7: float (req distance between units) ;// param 8: float (actual perfect distance between units) machine SpinoTerritory { default state TerritoryStart { action SetFlockImpulse(false) action StartLook("LookTarget", 0.5) action SetTerritoryScriptRunning(true) action SetAutoMovementBlend(true) action ClearTarget() action SetSpeedModifierWalk(1.0) action SetRunMode(false) action SetNumPassedParam(9) ;// min. same as for SpecAttk.fsm action SetPassedParam(0, 0) action SetPassedParam(1, -1) action SetPassedParam(2, 0) transition { action SetRandomTimerBetween(3, 15.0, 15.0) goto AcquireCompetitor } } state AcquireCompetitor { action AcquireTarget("competitor") transition HasTarget() { action LockTargetTerritoryBhvr(true) action SetRandomTimerBetween(1, 25.0, 30.0) action SetRandomTimerBetween(2, 10.0, 12.0) action SeekTarget(true, false) action SendEnclosureEvent("challenge_rival") goto TempWaitCompetitor } transition IsTimerUp(3) { goto TerritoryExit } } state TempWaitCompetitor { transition IsTimerUp(2) { goto TerritoryExit } transition IsTargetTerritoryScriptRunning() { action SetFatalityAnims() goto FaceCompetitor } } state FaceCompetitor { action SendEnclosureEvent("challenge_rival") transition GetPassedParam(0) == 1 ;// victorious { goto VictoryDance } transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(0) == 1 { action SetRandomTimerBetween(3, 2.0, 3.0) goto RunAway } transition { goto CheckProximity } } state ChooseBehaviour { transition { action SetPassedParam(1, 0) direct goto SyncBehaviour } } state SyncBehaviour { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(1) == 0 { goto StartBehaviour } transition IsTargetTerritoryBhvrLocked() == false { goto TerritoryExit } } state StartBehaviour { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(1) == 0 { direct goto InitiateBehaviour } transition { direct goto ResponseBehaviour } } state InitiateBehaviour { transition IsTimerUp(1) { direct goto TimeOutVictorChoose } action SetRand(0, 10) transition GetRand() < 2 { action SetPassedParam(1, 2) goto Posture } transition GetRand() < 7 { action SetPassedParam(1, 6) action SetPassedParam(2, 0) goto Snap } transition GetRand() < 9 { /*action SetPassedParam(1, 3) ;//goto Snap goto FatalAttack */ direct goto FatalityCheck } transition { action SetPassedParam(1, 1) goto ChangePosition } } state TimeOutVictorChoose { transition CanWinFatality(0.1) { ;// victor action SetPassedParam(0, 1) action SetPassedParam(1, 2) goto Posture } transition { action SetPassedParamTarget(0, 1) action SetPassedParam(1, 5) goto PostureResponse } } state FatalityCheck { transition CanPerformFatality() { direct goto FatalChoose } transition { action SetPassedParam(1, 2) goto Posture } } state FatalChoose { transition CanWinFatality(0.1) { action SetPassedParam(1, 3) action SetPassedParam(2, 0) goto FatalAttack } transition { action SetPassedParam(1, 4) action SetPassedParam(2, 0) goto FatalDeath } } state ResponseBehaviour { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(1) == 0 { direct goto InitiateBehaviour } transition GetPassedParamTarget(1) == 2 { action SetPassedParam(1, 5) goto PostureResponse } transition GetPassedParamTarget(1) == 3 { action SetPassedParam(1, 3) action SetPassedParam(2, 0) goto FatalDeath } transition GetPassedParamTarget(1) == 4 { action SetPassedParam(1, 4) action SetPassedParam(2, 0) goto FatalAttack } transition GetPassedParamTarget(1) == 5 { action SetPassedParam(1, 2) goto Posture } transition GetPassedParamTarget(1) == 6 { action SetPassedParam(1, 6) action SetPassedParam(2, 0) goto SnapResponse } transition { action SetPassedParam(1, 1) goto ChangePosition } } /* ------- change position */ state ChangePosition { action SetRandomTimerBetween(3, 2.0, 3.0) transition { direct goto ChangePositionStart } } state ChangePositionStart { transition SeekPosOffset(15.0, 0.7854, true, false, true) { action SetRandomTimerBetween(3, 4.0, 5.0) goto ChangePositionSeek } transition IsTimerUp(3) { goto FaceCompetitor } } state ChangePositionSeek { transition HasArrived() { goto FaceCompetitor } transition IsTimerUp(3) { goto FaceCompetitor } } /* ------- posture */ state Posture { action StopLook() action SetRand(0, 4) transition GetRand() < 2 { action SetAutoMovementBlend(false) action PlayAnim("idle", "post_lp", false) goto StandOffLoop } transition IsAnimLoaded("call", "01_lp") { action SetAutoMovementBlend(true) action PlayAnim("call", "01_lp", false) goto StandOffLoopAggrCall } transition { action SetAutoMovementBlend(false) action PlayAnim("idle", "post_lp", false) goto StandOffLoop } } state StandOffLoop { transition IsAnimPlaying("idle", "post_lp", false) == false { action SetAutoMovementBlend(true) action StartLook("LookTarget", 0.5) goto StandOffPause } } state StandOffLoopAggrCall { transition IsAnimPlaying("call", "01_lp", false) == false { action StartLook("LookTarget", 0.5) goto StandOffPause } } state StandOffPause { action FaceTarget() action SetRandomTimerBetween(2, 0.5, 0.7) transition { goto StandOffPauseWait } } state StandOffPauseWait { transition IsTimerUp(2) { goto FaceCompetitor } } /* ------- posture response*/ state PostureResponse { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(12.0) transition { action SetRandomTimerBetween(2, 4.0, 5.0) goto PostureResponseLoop } } state PostureResponseLoop { transition IsTimerUp(2) { direct goto PostureResponseEnd } transition HasArrived() { direct goto PostureResponseEnd } transition IsTargetTerritoryScriptRunning() == false { action SetWalkBackMode(false) action SetLockFacing(false) goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { action SetWalkBackMode(false) action SetLockFacing(false) goto TerritoryExit } transition GetPassedParamTarget(1) != 2 { direct goto PostureResponseEnd } } state PostureResponseEnd { action SetRandomTimerBetween(2, 2.0, 3.0) action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() transition { goto PostureResponseEndWait } } state PostureResponseEndWait { transition IsTimerUp(2) { goto FaceCompetitor } } /* ------- Face competitor */ state CheckProximity { action SetPassedParam(1, -1) action SeekTarget(true, true) transition InTargetProximityRadius(10.0, true) { goto StandOffFaceTarget } transition { goto SeekLoop } } state SeekLoop { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition InTargetProximityRadius(10.0, true) { goto StandOffFaceTarget } } state StandOffFaceTarget { action FaceTarget() transition { action SetRandomTimerBetween(2, 10.0, 12.0) goto StandOffFaceTargetWait } } state StandOffFaceTargetWait { transition HasArrived() { action SetStandStill() goto MinDistanceMove } transition IsTimerUp(2) { action SetStandStill() goto MinDistanceMove } } state MinDistanceMove { transition InTargetProximityRadius(6.0, true) { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(12.0) action SetRandomTimerBetween(3, 4.0, 5.0) goto MinDistanceStep } transition { goto ChooseBehaviour } } state MinDistanceStep { transition InTargetProximityRadius(6.0, false) == false { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto ChooseBehaviour } transition IsTimerUp(3) { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto ChooseBehaviour } } /* ------- snap */ state Snap { action SetSpeedModifier(1.0) action SetRunMode(true) action SeekTarget(true, true) transition { goto SnapSeekLoop } } state SnapSeekLoop { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition InTargetProximityRadius(6.0, true) { direct goto SnapSeekFacingCheck } transition HasArrived() { direct goto SnapSeekFacingCheckArrived } } state SnapSeekFacingCheck { transition IsFacingTargetUnit() { direct goto SnapPlay } transition { goto SnapSeekLoop } } state SnapSeekFacingCheckArrived { transition IsFacingTargetUnit() { direct goto SnapPlay } transition { action SeekTarget(true, true) goto SnapSeekLoop } } state SnapPlay { action SendEnclosureEvent("attack_rival") action SetStandStill() action SetRandomTimerBetween(2, 0.7, 0.7) action SetRand(0, 2) transition GetRand() == 0 { action PlayAnim("snap", "md_lp", false) goto SnapWait } transition { action PlayAnim("snap", "lo_lp", false) goto SnapWait } } state SnapWait { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition IsTimerUp(2) { action SetPassedParam(2, 1) action SetRandomTimerBetween(2, 1000.0, 1000.0) goto SnapWait } transition IsAnimStatePlaying("snap", false) == false { action SetSpeedModifierWalk(1.0) action SetRunMode(false) action SetRandomTimerBetween(2, 1.0, 2.0) goto SnapPause } } state SnapPause { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition IsTimerUp(2) { goto FaceCompetitor } } /* ------- snap response */ state SnapResponse { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(1) != 6 { goto FaceCompetitor } transition GetPassedParamTarget(2) != 1 { goto SnapResponse } transition { action SetRandomTimerBetween(2, 1.0, 1.1) action StopLook() action PlayAnim("rcl", "lt", false) action TargetHurtMe(false, 0.3) goto RecoilWait } } state RecoilWait { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(1) != 6 { goto FaceCompetitor } transition IsTimerUp(2) { action StartLook("LookTarget", 0.5) action SetRandomTimerBetween(2, 1.0, 2.0) action PlayAnim("call", "02_lp", false) goto RecoilResponse } } state RecoilResponse { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(9.0) transition { action SetRandomTimerBetween(2, 4.0, 5.0) goto RecoilResponseLoop } } state RecoilResponseLoop { transition IsTimerUp(2) { direct goto RecoilResponseEnd } transition HasArrived() { direct goto RecoilResponseEnd } transition IsTargetTerritoryScriptRunning() == false { action SetWalkBackMode(false) action SetLockFacing(false) goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { action SetWalkBackMode(false) action SetLockFacing(false) goto TerritoryExit } } state RecoilResponseEnd { action SetRandomTimerBetween(2, 2.0, 3.0) action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() transition { goto RecoilResponseEndWait } } state RecoilResponseEndWait { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition IsTimerUp(2) { goto FaceCompetitor } } /* ------- loser */ state RunAway { action SetSpeedModifier(1.0) action SetRunMode(true) action AvoidTarget(50.0, true) transition { action SetRandomTimerBetween(2, 20.0, 25.0) goto RunAwayLoop2 } /* transition SeekTargetOffset(40.0, 0.0, false, false, true) { action SetRandomTimerBetween(2, 10.0, 15.0) goto RunAwayLoop } */ transition IsTimerUp(3) ;// in case unable to seek { goto TerritoryExit } } state RunAwayLoop2 { transition InTargetProximity(48.0) == false { goto TerritoryExit } transition IsTimerUp(2) { goto TerritoryExit } } state RunAwayLoop { transition HasArrived() { goto TerritoryExit } transition IsTimerUp(2) { goto TerritoryExit } } /* ------- winner*/ state VictoryDance { action SetAutoMovementBlend(false) action StopLook() action PlayAnim("idle", "post_lp", false) transition { goto VictoryDanceLoop } } state VictoryDanceLoop { transition IsAnimPlaying("idle", "post_lp", false) == false { action StartLook("LookTarget", 0.5) action SetRandomTimerBetween(2, 3.0, 5.0) action SetAutoMovementBlend(true) goto VictoryDancePause } } state VictoryDancePause { transition IsTimerUp(2) { action AddKillExperience(0, 1.0) goto TerritoryExit } } /* ------- fatal attack */ state FatalAttack { transition { action SetRandomTimerBetween(4, 15.0, 17.0) goto FatalAttackMinDistanceMove } } state FatalAttackMinDistanceMove { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition IsTimerUp(4) { goto TerritoryExit } transition WithinTargetDistanceParam(7, -0.5, true) ;// too close { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(12.0) action SetRandomTimerBetween(3, 6.0, 6.0) goto FatalAttackMinDistanceStep } transition WithinTargetDistanceParam(7, 0.5, true) == false ;// too far { action SetSpeedModifierWalk(1.0) action SetRandomTimerBetween(3, 6.0, 6.0) action SeekTarget(true, true) goto FatalAttackStepForward } transition { goto FatalAttackFaceTarget } } state FatalAttackStepForward { transition WithinTargetDistanceParam(7, 0.5, true) { action SetSpeedDirect(0.0) action SetStandStill() goto FatalAttackMinDistanceMove } transition IsTimerUp(3) { action SetSpeedDirect(0.0) action SetStandStill() goto FatalAttackMinDistanceMove } } state FatalAttackMinDistanceStep { transition WithinTargetDistanceParam(7, -0.5, true) == false { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto FatalAttackStepForward } transition IsTimerUp(3) { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto FatalAttackStepForward } } state FatalAttackFaceTarget { action FaceTarget() action SetRandomTimerBetween(2, 3.0, 3.0) action SetRand(0, 3) transition GetRand() == 0 { action PlayAnim("call", "02_lp", false) goto FatalAttackFaceTargetWait } transition IsAnimLoaded("call", "01_lp") { action PlayAnim("call", "01_lp", false) goto FatalAttackFaceTargetWait } transition IsAnimLoaded("call", "f") { action PlayAnim("call", "f", false) goto FatalAttackFaceTargetWait } transition { goto FatalAttackFaceTargetWait } } state FatalAttackFaceTargetWait { transition IsTimerUp(2) { goto FatalAttackSync } } state FatalAttackSync { action SetPassedParam(2, 1) transition { action SetStandStill() action SetSpeedDirect(0.0) action SetRandomTimerBetween(3, 12.0, 15.0) direct goto FatalSyncWait } } state FatalSyncWait { transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(2) == 1 { direct goto StartFatalAttack } transition IsTimerUp(3) { goto TerritoryExit } } state StartFatalAttack { action SetInterpolation(true) action SetAvoidanceSteer(false) transition IsAnimPlayingParam(3, 4, false) == false { ;// for me action SetAutoMovementBlend(false) action StopLook() action StopAllUserAnimations() ;//action SetAesPosInterp(false) action PlayAnimParam(3, 4, false, 0.0) ;// for target action SetAutoMovementBlendTarget(false) action StopLookTarget() action StopAllUserAnimationsTarget() action PlayAnimParamTarget(5, 6, false, 0.0) goto FatalAttackLoop } transition { goto FatalAttackLoop } } state FatalAttackLoop { transition IsAnimPlayingParam(3, 4, false) == false { action SetRandomTimerBetween(3, 1.0, 1.0) goto FatalPosture } } state FatalPosture { transition IsTimerUp(3) { action SetInterpolation(false) action SetInterpolationTarget(false) action SetAvoidanceSteer(true) action SetTransfromFromLocator("D", true) action StopAnimInstantParam(3, 4) action PlayAnimInstant("idle", "brth_lp", false) action SetStandStill() action SetAutoMovementBlend(true) action SetRandomTimerBetween(3, 1.0, 1.0) goto FatalPostureStartWait } } state FatalPostureStartWait { transition IsTimerUp(3) { action SetAutoMovementBlend(false) action PlayAnimInstant("idle", "post_lp", false) goto FatalPostureWait } } state FatalPostureWait { transition IsAnimPlaying("idle", "post_lp", false) == false { action SetAutoMovementBlend(true) action AddKillExperience(1, 1.0) goto TerritoryExit } } /* ------- fatal death */ state FatalDeath { transition { action SetRandomTimerBetween(4, 15.0, 17.0) goto FatalDeathMinDistanceMove } } state FatalDeathMinDistanceMove { transition IsTargetTerritoryScriptRunning() == false { goto TerritoryExit } transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition IsTimerUp(4) { goto TerritoryExit } transition WithinTargetDistanceParam(7, -0.5, true) ;// too close { action SetSpeedModifierWalk(1.0) action SetWalkBackMode(true) action StepBackFromTarget(12.0) action SetRandomTimerBetween(3, 6.0, 6.0) goto FatalDeathMinDistanceStep } transition WithinTargetDistanceParam(7, 0.5, true) == false ;// too far { action SetSpeedModifierWalk(1.0) action SetRandomTimerBetween(3, 6.0, 6.0) action SeekTarget(true, true) goto FatalDeathStepForward } transition { goto FatalDeathFaceTarget } } state FatalDeathStepForward { transition WithinTargetDistanceParam(7, 0.5, true) { action SetSpeedDirect(0.0) action SetStandStill() goto FatalDeathMinDistanceMove } transition IsTimerUp(3) { action SetSpeedDirect(0.0) action SetStandStill() goto FatalDeathMinDistanceMove } } state FatalDeathMinDistanceStep { transition WithinTargetDistanceParam(7, -0.5, true) == false { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto FatalDeathStepForward } transition IsTimerUp(3) { action SetWalkBackMode(false) action SetLockFacing(false) action SetStandStill() goto FatalDeathStepForward } } state FatalDeathFaceTarget { action FaceTarget() action SetRandomTimerBetween(2, 3.0, 3.0) action SetRand(0, 3) transition GetRand() == 0 { action PlayAnim("call", "02_lp", false) goto FatalDeathFaceTargetWait } transition IsAnimLoaded("call", "01_lp") { action PlayAnim("call", "01_lp", false) goto FatalDeathFaceTargetWait } transition IsAnimLoaded("call", "f") { action PlayAnim("call", "f", false) goto FatalDeathFaceTargetWait } transition { goto FatalDeathFaceTargetWait } } state FatalDeathFaceTargetWait { transition IsTimerUp(2) { goto FatalDeathSync } } state FatalDeathSync { action SetPassedParam(2, 1) transition { action SetStandStill() action SetSpeedDirect(0.0) action SetRandomTimerBetween(3, 15.0, 17.0) direct goto FatalDeathSyncWait } } state FatalDeathSyncWait { transition GetNumPassedParamTarget() != 9 { goto TerritoryExit } transition GetPassedParamTarget(2) == 1 { direct goto StartFatalDeath } transition IsTimerUp(3) { goto TerritoryExit } } state StartFatalDeath { action SetInterpolation(true) action SetAvoidanceSteer(false) transition IsAnimPlayingParam(5, 6, false) == false { ;// for me action SetAutoMovementBlend(false) action StopLook() action StopAllUserAnimations(true) ;//action SetAesPosInterp(false) action PlayAnimParam(5, 6, false, 0.0) action SetLockLastPoseParam(5, 6, true) ;// for target action SetAutoMovementBlendTarget(false) action StopLookTarget() action StopAllUserAnimationsTarget() action PlayAnimParamTarget(3, 4, false, 0.0) goto FatalDeathLoop } transition { action SetLockLastPoseParam(5, 6, true) goto FatalDeathLoop } } state FatalDeathLoop { transition IsAnimPlayingParam(5, 6, false) == false { action SetInterpolation(false) action SetInterpolationTarget(false) action SetAvoidanceSteer(true) action SetVariable("health", 0.0) action SetKillCause("dino") action LockDeadPose() goto TerritoryExitEnd } } ;//----------------------------------------------------------------- exitstart state TerritoryExit { action SetAutoMovementBlend(true) action StopLook() transition { goto TerritoryExitEndSetup } } state TerritoryExitEndSetup { action SetRandomTimerBetween(1, 5.0, 6.0) transition { direct goto TerritoryExitEnd } } exitend state TerritoryExitEnd { action SetInterpolation(false) action SetAvoidanceSteer(true) action SetLockFacing(false) action SetWalkBackMode(false) action UpdateVariable("territory", -1.0) action LockTargetTerritoryBhvr(false) action SetTerritoryScriptRunning(false) action SetFlockImpulse(true) ;//action SetAesPosInterp(true) transition IsTimerUp(1) { action LockTerritoryBhvr(false) action SetRandomTimerBetween(1, 20.0, 25.0) goto TerritoryExitEnd } } }