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 }