// ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ void InitFSM () { FSM.Condition cond_isPlayerInAttackRange = new Condition_isPlayerInAttackRange(this,60.0f,1.5f); FSM.Condition cond_isAttacking = new Condition_isAttacking(this); FSM.Condition cond_noHP = new Condition_noHP(this.zombieInfo); // ======================================================== // setup states // ======================================================== // seekPlayers FSM.State state_seekPlayers = new FSM.State( "SeekPlayers", new Action_PlayAnim(this.anim,"walk"), new Action_MoveToNearestAlivedPlayer(0.01f,this), new Action_StopMoving(this) ); // attack FSM.State state_attack = new FSM.State( "Attack", new Action_Attack(this), null, null ); // dead FSM.State state_dead = new FSM.State( "Dead", new Action_ActOnDead(this), null, null ); // ======================================================== // setup transitions // ======================================================== // seek to ... state_seekPlayers.AddTransition( new FSM.Transition( state_dead, cond_noHP, null ) ); state_seekPlayers.AddTransition( new FSM.Transition( state_attack, cond_isPlayerInAttackRange, null ) ); // attack to ... state_attack.AddTransition( new FSM.Transition( state_dead, cond_noHP, null ) ); state_attack.AddTransition( new FSM.Transition( state_seekPlayers, new FSM.Condition_not(cond_isAttacking), null ) ); // fsm.init(state_seekPlayers); }
// ------------------------------------------------------------------ // Desc: // ------------------------------------------------------------------ void InitFSM () { // ======================================================== // setup states // ======================================================== // idle FSM.State state_idle = new FSM.State( "Idle", new Action_OnIdle(this), new Action_RandomAnim(4.0f, 4.0f, this.anim, new string[]{"idle1","idle2"} ), null ); // seekPlayers FSM.State state_seekPlayers = new FSM.State( "SeekPlayers", new Action_PlayAnim(this.anim,"moveForward"), new Action_MoveToNearestAlivedPlayer(0.5f,this), new Action_StopMoving(this) ); // attack FSM.State state_attack = new FSM.State( "Attack", new Action_Attack(this.anim), null, null ); // get hit FSM.State state_onStun = new FSM.State( "OnStun", new Action_ActOnStun(this), null, null ); // on dead FSM.State state_onDead = new FSM.State( "OnDead", new Action_ActOnDead(this), null, // TODO: dead clean up null ); // dead FSM.State state_dead = new FSM.State( "Dead", new Action_CleanDeadBody(this.gameObject), null, null ); // ======================================================== // condition // ======================================================== FSM.Condition cond_isPlayerInAttackRange = new Condition_isPlayerInAttackRange(this,30.0f,this.attackDistance); FSM.Condition cond_isAttacking = new Condition_isAttacking(this); FSM.Condition cond_isOnStun = new Condition_isOnStun(this); FSM.Condition cond_noHP = new Condition_noHP(this.zombieInfo); // TODO: FSM.Condition cond_isStunning = new Condition_isStunning(this); // ======================================================== // setup transitions // ======================================================== // idle to ... state_idle.AddTransition( new FSM.Transition( state_onDead, cond_noHP, null ) ); state_idle.AddTransition( new FSM.Transition( state_onStun, cond_isOnStun, null ) ); state_idle.AddTransition( new FSM.Transition( state_seekPlayers, new Condition_playerInRange( this.transform, 20.0f ), null ) ); // seekPlayers to ... state_seekPlayers.AddTransition( new FSM.Transition( state_onDead, cond_noHP, null ) ); state_seekPlayers.AddTransition( new FSM.Transition( state_onStun, cond_isOnStun, null ) ); state_seekPlayers.AddTransition( new FSM.Transition( state_attack, cond_isPlayerInAttackRange, null ) ); state_seekPlayers.AddTransition( new FSM.Transition( state_idle, new FSM.Condition_not( new Condition_playerInRange( this.transform, 40.0f ) ) , null ) ); // attack to ... state_attack.AddTransition( new FSM.Transition( state_onDead, cond_noHP, null ) ); state_attack.AddTransition( new FSM.Transition( state_onStun, cond_isOnStun, null ) ); state_attack.AddTransition( new FSM.Transition ( state_idle, new FSM.Condition_not(cond_isAttacking), null ) ); // on hit to ... state_onStun.AddTransition( new FSM.Transition( state_onDead, cond_noHP, null ) ); state_onStun.AddTransition( new FSM.Transition ( state_idle, new FSM.Condition_not(new Condition_isStunning(this) ), null ) ); state_onStun.AddTransition( new FSM.Transition ( state_onStun, cond_isOnStun, null ) ); // on dead to ... state_onDead.AddTransition( new FSM.Transition( state_dead, new FSM.Condition_waitForSeconds(this.deadBodyKeepTime), null ) ); // init fsm fsm.init(state_idle); }