/* Generic Ram Behaviour Machine // // This machine should be used through the normal call mechanism // */ machine Ram { state RamStart { action SetRandomTimerBetween(2, 10000.0, 10000.0) transition HasTarget() == false { goto RamExitStart } action SeekTarget(true, false) action StopLook() action SetRand(0, 3) transition GetRand() == 0 { action CreateKnockMusterZoneTarget(true, false) goto RamCheck } transition { goto RamCheck } } state RamCheck { action UpdateFleeSpeed(0.05, false) action LookAtTargetPosition(2.0) transition HasArrived() { ;//direct goto HeadButt ;//goto RamStart goto FacingCheckArrived } ;// transition InTargetProximity(6.0) transition InTargetProximityRadius(1.5, true) { direct goto FacingCheck ;//direct goto HeadButt } } state FacingCheckArrived { transition IsFacingTargetUnit(0.7071) { direct goto HeadButt } transition { action SetRandomTimerBetween(1, 4.0, 5.0) action SetWander() goto FacingFailedWander } } state FacingFailedWander { transition IsTimerUp(1) { goto RamExitStart } } state FacingCheck { transition IsFacingTargetUnit(0.7071) { direct goto HeadButt } transition { goto RamCheck } } state HeadButt { ;// temp check transition IsAnimLoaded("hbut", "st")==true { action PlayAnim("hbut", "st", false) ;//action PlayAnim("shake", "01_lp", false) goto HeadButtWait } transition { direct goto SetParams } } state HeadButtWait { transition IsAnimPlaying("hbut", "st", false) == false { direct goto SetParams } } state SetParams { transition IsTargetDead() { action Print("\ntarget dead, cannot knockover\n") action SetWander() goto RamWait } transition IsTargetFSMRunning(fsm::"KnockOver") ;// check if already knocked over { action Print("\ntarget already knocked out\n") action SetWander() goto RamWait } transition CanKnockTarget(3.0) == false { action Print("\nCan't Knock Target Over\n") action SetWander() goto RamWait } transition IsFacingTargetUnit(0.7071) == false { action Print("\nNot Facing Target\n") action SetWander() goto RamWait } action SetTargetToSlave() action PushTarget() action SetNumPassedParamTarget(1) action SetPassedParamTargetKnockDir(0) action SetTargetsTargetToMe() action SetTargetFSM(fsm::"KnockOver") action SetWander() transition { action SetRandomTimerBetween(2, -1.0, -1.0) goto RamWait } } state RamWait { transition IsAnimStatePlaying("hbut", false) == false { action SetRandomTimerBetween(1, 3.0, 3.0) goto RamPause } } state RamPause { transition IsTimerUp(1) { goto ExpUpdate } } state ExpUpdate { /* transition IsTargetDead() { action AddKillExperience(1, 0.0) goto RamExitStart } */ transition { goto RamExitStart } } ;// ------------------------------------------------------------- Exit States exitstart state RamExitStart { transition IsTimerUp(2) { direct goto ExitExpUpdate } transition { direct goto RamExit } } state ExitExpUpdate { transition IsTargetDead() { action AddKillExperience(1, 0.0) direct goto RamExit } transition { direct goto RamExit } } exitend state RamExit { action UpdateFleeSpeed(1.0, true) } }