Coverage Summary for Class: EnemyState (com.mygdx.game.AI)
| Class | Method, % | Line, % |
|---|---|---|
| EnemyState | 66.7% (4/6) | 90.9% (20/22) |
| EnemyState$1 | 100% (3/3) | 100% (4/4) |
| EnemyState$2 | 100% (3/3) | 100% (4/4) |
| EnemyState$3 | 100% (3/3) | 100% (5/5) |
| EnemyState$4 | 100% (1/1) | 100% (1/1) |
| Total | 87.5% (14/16) | 94.4% (34/36) |
1 package com.mygdx.game.AI; 2 3 import com.badlogic.gdx.ai.fsm.State; 4 import com.badlogic.gdx.ai.fsm.StateMachine; 5 import com.badlogic.gdx.ai.msg.Telegram; 6 import com.mygdx.game.Components.Pirate; 7 import com.mygdx.game.Entitys.NPCShip; 8 import com.mygdx.game.Entitys.Ship; 9 10 /** 11 * State machine used for NPC ships' behaviour 12 */ 13 public enum EnemyState implements State<NPCShip> { 14 /** 15 * Picks random pos and travels to it 16 */ 17 WANDER() { 18 @Override 19 public void enter(NPCShip e) { 20 e.stopMovement(); 21 } 22 23 @Override 24 public void update(NPCShip e) { 25 super.update(e); 26 e.circleOrigin(); //Added in Assessment 2 so idle ships would patrol around colleges 27 } 28 }, 29 /** 30 * Tries to get into attack range of the player 31 */ 32 PURSUE() { 33 @Override 34 public void enter(NPCShip e) { 35 e.stopMovement(); 36 e.followTarget(); 37 } 38 39 @Override 40 public void update(NPCShip e) { 41 super.update(e); 42 } 43 }, 44 /** 45 * Attempts to kill the enemy 46 */ 47 ATTACK() { 48 @Override 49 public void enter(NPCShip e) { 50 e.stopMovement(); 51 } 52 53 @Override 54 public void update(NPCShip e) { 55 super.update(e); 56 Ship ship = e.getComponent(Pirate.class).getTarget(); 57 e.attackShip(ship); 58 } 59 }; 60 61 /** 62 * Called every from for every NPC ship (there or there abouts) 63 * @param e the sender 64 */ 65 @Override 66 public void update(NPCShip e) { 67 StateMachine<NPCShip, EnemyState> m = e.stateMachine; 68 Pirate p = e.getComponent(Pirate.class); 69 switch (m.getCurrentState()) { 70 case WANDER: 71 if (p.isAggro()) { 72 m.changeState(PURSUE); 73 } else if (p.canAttack()) { 74 m.changeState(ATTACK); 75 } 76 break; 77 case PURSUE: 78 // if enter attack range attack 79 if (p.canAttack()) { 80 m.changeState(ATTACK); 81 } 82 // if leave detection range wander 83 if (!p.canAttack() && !p.isAggro()) { 84 m.changeState(WANDER); 85 } 86 break; 87 case ATTACK: 88 // if leave attack range pursue 89 if (p.isAggro() && !p.canAttack()) { 90 m.changeState(PURSUE); 91 } 92 // if target dead 93 else if (!p.getTarget().isAlive()) { 94 m.changeState(WANDER); 95 } 96 break; 97 } 98 } 99 100 /** 101 * Called when a state is left 102 * @param e the sender 103 */ 104 @Override 105 public void exit(NPCShip e) { 106 107 } 108 109 /** 110 * Called when a state is entered 111 * @param entity the sender 112 */ 113 @Override 114 public void enter(NPCShip entity) { 115 116 } 117 118 /** 119 * not used 120 */ 121 @Override 122 public boolean onMessage(NPCShip e, Telegram telegram) { 123 return false; 124 } 125 }