aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ch/epfl/xblast/Direction.java19
-rw-r--r--src/ch/epfl/xblast/server/GameState.java18
2 files changed, 27 insertions, 10 deletions
diff --git a/src/ch/epfl/xblast/Direction.java b/src/ch/epfl/xblast/Direction.java
index 030038b..e2df042 100644
--- a/src/ch/epfl/xblast/Direction.java
+++ b/src/ch/epfl/xblast/Direction.java
@@ -68,6 +68,25 @@ public enum Direction {
68 } 68 }
69 69
70 /** 70 /**
71 * T(the current and given Directions are perpendicular).
72 *
73 * @param that a Direction to compare
74 * @return T(the current and given Directions are perpendicular)
75 */
76 public boolean isPerpendicularTo(Direction that) {
77 switch (this) {
78 case N:
79 case S:
80 return that == E || that == W;
81 case E:
82 case W:
83 return that == N || that == S;
84 default:
85 return false;
86 }
87 }
88
89 /**
71 * Returns the x-coordinate of the normed vector representation of the Direction. 90 * Returns the x-coordinate of the normed vector representation of the Direction.
72 * 91 *
73 * @return the x-coordinate 92 * @return the x-coordinate
diff --git a/src/ch/epfl/xblast/server/GameState.java b/src/ch/epfl/xblast/server/GameState.java
index 035493d..d648cef 100644
--- a/src/ch/epfl/xblast/server/GameState.java
+++ b/src/ch/epfl/xblast/server/GameState.java
@@ -167,31 +167,29 @@ public final class GameState {
167 167
168 for (Player player0 : players0) { 168 for (Player player0 : players0) {
169 Optional<Direction> event = speedChangeEvents.get(player0.id()); 169 Optional<Direction> event = speedChangeEvents.get(player0.id());
170 Sq<Player.DirectedPosition> directedPositions1; 170 // By default the path won't change
171 Sq<Player.DirectedPosition> directedPositions1 = player0.directedPositions();
171 172
172 // Get the requested direction 173 // Get the (possibly) requested direction
173 Direction requestedDirection = null; 174 Direction requestedDirection = null;
174 if (event != null) { 175 if (event != null) {
175 requestedDirection = event.orElse(null); 176 requestedDirection = event.orElse(null);
176 } 177 }
177 178
178 // Generate the new Sequence of Directed Positions (kinda ugly right now) 179 // Generate the new Sequence of Directed Positions (kinda ugly right now)
179 if (requestedDirection == null || !player0.lifeState().canMove()) { 180 if (!player0.lifeState().canMove() && requestedDirection != null) { // if the player can't movex
180 // The player does not move
181 directedPositions1 = Player.DirectedPosition.stopped(player0.directedPositions().head()); 181 directedPositions1 = Player.DirectedPosition.stopped(player0.directedPositions().head());
182 } else if (player0.direction() == requestedDirection.opposite() || player0.direction() == requestedDirection) { 182 } else if (player0.direction().isParallelTo(requestedDirection)) { // if the player want to go to a parallel directionx
183 // The player keep its actual position or go to the opposite direction
184 Player.DirectedPosition requestedDirectedPosition = new Player.DirectedPosition(player0.position(), requestedDirection); 183 Player.DirectedPosition requestedDirectedPosition = new Player.DirectedPosition(player0.position(), requestedDirection);
185 directedPositions1 = Sq.constant(requestedDirectedPosition); 184 directedPositions1 = Player.DirectedPosition.moving(requestedDirectedPosition);
186 } else { 185 } else if (player0.direction().isPerpendicularTo(requestedDirection)) { // if the player want to go to a perpendicular direction
187 // The player go to a perpendicular position.
188 Player.DirectedPosition nextCentralSubCell = player0.directedPositions().findFirst(dp -> dp.position().isCentral()); 186 Player.DirectedPosition nextCentralSubCell = player0.directedPositions().findFirst(dp -> dp.position().isCentral());
189 Sq<Player.DirectedPosition> toNextCentralSubCell = player0.directedPositions().takeWhile(dp -> !dp.position().isCentral()); 187 Sq<Player.DirectedPosition> toNextCentralSubCell = player0.directedPositions().takeWhile(dp -> !dp.position().isCentral());
190 Sq<Player.DirectedPosition> pastNextCentralSubCell = Player.DirectedPosition.moving(new Player.DirectedPosition(nextCentralSubCell.position(), requestedDirection)); 188 Sq<Player.DirectedPosition> pastNextCentralSubCell = Player.DirectedPosition.moving(new Player.DirectedPosition(nextCentralSubCell.position(), requestedDirection));
191 directedPositions1 = toNextCentralSubCell.concat(pastNextCentralSubCell); 189 directedPositions1 = toNextCentralSubCell.concat(pastNextCentralSubCell);
192 } 190 }
193 191
194 // Advance of one SubCell on the newly computed path 192 // Advance of one SubCell on the player's path
195 directedPositions1 = directedPositions1.tail(); 193 directedPositions1 = directedPositions1.tail();
196 194
197 // Check possible collisions and update the Sequence if necessary (kinda ugly right now) 195 // Check possible collisions and update the Sequence if necessary (kinda ugly right now)