aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/esieequest/controller/GameEngine.java10
-rw-r--r--src/esieequest/model/Player.java1
-rw-r--r--src/esieequest/model/characters/FollowingCharacter.java52
-rw-r--r--src/esieequest/model/characters/MovingCharacter.java67
-rw-r--r--src/esieequest/model/characters/Sumobot.java4
-rw-r--r--src/esieequest/model/characters/WanderingCharacter.java52
6 files changed, 150 insertions, 36 deletions
diff --git a/src/esieequest/controller/GameEngine.java b/src/esieequest/controller/GameEngine.java
index 8326607..ae76059 100644
--- a/src/esieequest/controller/GameEngine.java
+++ b/src/esieequest/controller/GameEngine.java
@@ -77,20 +77,16 @@ public class GameEngine {
77 77
78 final String argument = input.getArgument(); 78 final String argument = input.getArgument();
79 79
80 this.executePreRoutines();
81 command.execute(argument, this.game, this.view); 80 command.execute(argument, this.game, this.view);
82 this.executeAfterRoutines(); 81 this.executeRoutines();
83 } 82 }
84 83
85 /** 84 /**
86 * Performs routine actions executed every time a Command is entered. 85 * Performs routine actions executed every time a Command is entered.
87 */ 86 */
88 private void executePreRoutines() { 87 private void executeRoutines() {
89 MovingCharacter.moveAll();
90 }
91
92 private void executeAfterRoutines() {
93 this.checkStalemate(); 88 this.checkStalemate();
89 MovingCharacter.moveAll(this.game);
94 } 90 }
95 91
96 private void checkStalemate() { 92 private void checkStalemate() {
diff --git a/src/esieequest/model/Player.java b/src/esieequest/model/Player.java
index e9c3c7f..c06f5b2 100644
--- a/src/esieequest/model/Player.java
+++ b/src/esieequest/model/Player.java
@@ -36,6 +36,7 @@ public class Player implements SerialisableObject {
36 private Room currentRoom; 36 private Room currentRoom;
37 37
38 private static final String PREVIOUS_ROOMS_LABEL = "H"; 38 private static final String PREVIOUS_ROOMS_LABEL = "H";
39 @Getter
39 private final Stack<Room> previousRooms; 40 private final Stack<Room> previousRooms;
40 41
41 private static final String CURRENT_DIRECTION_LABEL = "D"; 42 private static final String CURRENT_DIRECTION_LABEL = "D";
diff --git a/src/esieequest/model/characters/FollowingCharacter.java b/src/esieequest/model/characters/FollowingCharacter.java
new file mode 100644
index 0000000..ab1a62e
--- /dev/null
+++ b/src/esieequest/model/characters/FollowingCharacter.java
@@ -0,0 +1,52 @@
1package esieequest.model.characters;
2
3import java.util.Stack;
4
5import esieequest.model.Game;
6import esieequest.model.map.Direction;
7import esieequest.model.map.Room;
8
9/**
10 * A MovingCharacter that follows the Player.
11 *
12 * @author Pacien TRAN-GIRARD
13 */
14public abstract class FollowingCharacter extends MovingCharacter {
15
16 /**
17 * Instantiates a FollowingCharacter.
18 *
19 * @param name
20 * the name
21 * @param room
22 * the initial Room
23 * @param direction
24 * the initial Direction
25 */
26 public FollowingCharacter(final String name, final Room room, final Direction direction) {
27 super(name, room, direction);
28 }
29
30 @Override
31 public void move(final Game game) {
32 if (!this.isMobile()) {
33 return;
34 }
35
36 final Stack<Room> playerHistory = game.getPlayer().getPreviousRooms();
37
38 if (playerHistory.size() < 2) {
39 return;
40 }
41
42 final Room previousRoom = playerHistory.elementAt(playerHistory.size() - 1);
43 final Room previousPreviousRoom = playerHistory.elementAt(playerHistory.size() - 2);
44
45 if (previousPreviousRoom == this.getCurrentRoom()) {
46 return;
47 }
48
49 this.changePosition(previousRoom, game.getPlayer().getCurrentDirection().getOpposite());
50 }
51
52}
diff --git a/src/esieequest/model/characters/MovingCharacter.java b/src/esieequest/model/characters/MovingCharacter.java
index 94aeaf1..2304f94 100644
--- a/src/esieequest/model/characters/MovingCharacter.java
+++ b/src/esieequest/model/characters/MovingCharacter.java
@@ -2,7 +2,6 @@ package esieequest.model.characters;
2 2
3import java.util.ArrayList; 3import java.util.ArrayList;
4import java.util.List; 4import java.util.List;
5import java.util.Random;
6 5
7import lombok.Getter; 6import lombok.Getter;
8import lombok.Setter; 7import lombok.Setter;
@@ -10,6 +9,7 @@ import net.pacien.util.CleanJSONObject;
10 9
11import org.json.simple.JSONObject; 10import org.json.simple.JSONObject;
12 11
12import esieequest.model.Game;
13import esieequest.model.map.Direction; 13import esieequest.model.map.Direction;
14import esieequest.model.map.Room; 14import esieequest.model.map.Room;
15 15
@@ -29,16 +29,18 @@ public abstract class MovingCharacter extends SimpleCharacter {
29 /** 29 /**
30 * Moves all the MovingCharacter in the map. 30 * Moves all the MovingCharacter in the map.
31 */ 31 */
32 public static void moveAll() { 32 public static void moveAll(final Game game) {
33 for (final MovingCharacter movingCharacter : MovingCharacter.instances) { 33 for (final MovingCharacter movingCharacter : MovingCharacter.instances) {
34 movingCharacter.move(); 34 movingCharacter.move(game);
35 } 35 }
36 } 36 }
37 37
38 private static final String CURRENT_ROOM_LABEL = "C"; 38 private static final String CURRENT_ROOM_LABEL = "C";
39 @Getter
39 private Room currentRoom; 40 private Room currentRoom;
40 41
41 private static final String CURRENT_DIRECTION_LABEL = "D"; 42 private static final String CURRENT_DIRECTION_LABEL = "D";
43 @Getter
42 private Direction currentDirection; 44 private Direction currentDirection;
43 45
44 private static final String MOBILE_LABEL = "M"; 46 private static final String MOBILE_LABEL = "M";
@@ -66,38 +68,49 @@ public abstract class MovingCharacter extends SimpleCharacter {
66 } 68 }
67 69
68 /** 70 /**
69 * Moves the MovingCharacter to a randomly chosen adjacent Room, if he can 71 * Changes the position of the MovingCharacter.
70 * move and if the destination Room is not currently occupied by another 72 *
71 * Character. 73 * @param room
74 * the new Room
75 * @param direction
76 * the new Direction
72 */ 77 */
73 public void move() { 78 public void changePosition(final Room room, final Direction direction) {
74 if (!this.mobile) { 79 if (room.getSide(direction).hasCharacter()) {
75 return;
76 }
77
78 final List<Direction> possibleDirections = this.currentRoom.listExitsDirections();
79
80 if (possibleDirections.size() < 1) {
81 return;
82 }
83
84 final int randomIndex = (new Random()).nextInt(possibleDirections.size());
85 final Direction direction = possibleDirections.get(randomIndex);
86 final Room destination = this.currentRoom.getSide(direction).getDoor().getDestination();
87
88 if (destination.getSide(direction).hasCharacter()) {
89 return; 80 return;
90 } 81 }
91 82
92 this.currentRoom.getSide(this.currentDirection).setCharacter(null); 83 this.currentRoom.getSide(this.currentDirection).setCharacter(null);
84 this.currentRoom = room;
85 this.currentDirection = direction;
86 this.currentRoom.getSide(this.currentDirection).setCharacter(Character.getCharacter(this));
87 }
88
89 /**
90 * Changes the Room of the MovingCharacter.
91 *
92 * @param room
93 * the Room
94 */
95 public void changeRoom(final Room room) {
96 this.changePosition(room, this.currentDirection);
97 }
93 98
94 final Direction newDirection = direction.getOpposite(); 99 /**
95 final Character character = Character.getCharacter(this); 100 * Changes the Direction of the MovingCharacter.
96 destination.getSide(newDirection).setCharacter(character); 101 *
97 this.currentRoom = destination; 102 * @param direction
98 this.currentDirection = newDirection; 103 * the Direction
104 */
105 public void changeDirection(final Direction direction) {
106 this.changePosition(this.currentRoom, direction);
99 } 107 }