aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ch/epfl/xblast/server/GameStateSerializer.java81
1 files changed, 52 insertions, 29 deletions
diff --git a/src/ch/epfl/xblast/server/GameStateSerializer.java b/src/ch/epfl/xblast/server/GameStateSerializer.java
index 4a133e5..998ff21 100644
--- a/src/ch/epfl/xblast/server/GameStateSerializer.java
+++ b/src/ch/epfl/xblast/server/GameStateSerializer.java
@@ -14,9 +14,11 @@ import java.util.stream.Collectors;
14public final class GameStateSerializer { 14public final class GameStateSerializer {
15 15
16 /** 16 /**
17 * @param painter 17 * Serialize a Board.
18 * @param board 18 *
19 * @return 19 * @param painter the painter used to serialize de board's blocks
20 * @param board the board to be serialized
21 * @return a list of byte corresponding to the blocks' images
20 */ 22 */
21 private static List<Byte> serializeBoard(BoardPainter painter, Board board) { 23 private static List<Byte> serializeBoard(BoardPainter painter, Board board) {
22 return RunLengthEncoder.encode(Cell.SPIRAL_ORDER.stream() 24 return RunLengthEncoder.encode(Cell.SPIRAL_ORDER.stream()
@@ -24,6 +26,13 @@ public final class GameStateSerializer {
24 .collect(Collectors.toList())); 26 .collect(Collectors.toList()));
25 } 27 }
26 28
29 /**
30 * Set the image ID of the explosion on a cell given its neighbors blasts.
31 *
32 * @param blastedCells cells containing a blast
33 * @param cell given cell
34 * @return the block image id related to the given cell
35 */
27 private static byte serializeBlast(Set<Cell> blastedCells, Cell cell) { 36 private static byte serializeBlast(Set<Cell> blastedCells, Cell cell) {
28 return ExplosionPainter.byteForBlast( 37 return ExplosionPainter.byteForBlast(
29 blastedCells.contains(cell.neighbor(Direction.N)), 38 blastedCells.contains(cell.neighbor(Direction.N)),
@@ -32,6 +41,14 @@ public final class GameStateSerializer {
32 blastedCells.contains(cell.neighbor(Direction.W))); 41 blastedCells.contains(cell.neighbor(Direction.W)));
33 } 42 }
34 43
44 /**
45 * Serialize the explosion on a given cell.
46 *
47 * @param bombedCells cells containing a bomb
48 * @param blastedCells cells containing a blast
49 * @param cell cell hosting the explosion
50 * @return the serialized explosion
51 */
35 private static byte serializeExplosion(Map<Cell, Bomb> bombedCells, Set<Cell> blastedCells, Cell cell) { 52 private static byte serializeExplosion(Map<Cell, Bomb> bombedCells, Set<Cell> blastedCells, Cell cell) {
36 if (bombedCells.containsKey(cell)) 53 if (bombedCells.containsKey(cell))
37 return ExplosionPainter.byteForBomb(bombedCells.get(cell)); 54 return ExplosionPainter.byteForBomb(bombedCells.get(cell));
@@ -40,9 +57,11 @@ public final class GameStateSerializer {
40 } 57 }
41 58
42 /** 59 /**
43 * @param bombedCells 60 * Serialize the explosions (Blasts and Bombs).
44 * @param blastedCells 61 *
45 * @return 62 * @param bombedCells cells containing a bomb
63 * @param blastedCells cells containing a blast
64 * @return the serialized explosions
46 */ 65 */
47 private static List<Byte> serializeExplosions(Map<Cell, Bomb> bombedCells, Set<Cell> blastedCells) { 66 private static List<Byte> serializeExplosions(Map<Cell, Bomb> bombedCells, Set<Cell> blastedCells) {
48 return RunLengthEncoder.encode(Cell.ROW_MAJOR_ORDER.stream() 67 return RunLengthEncoder.encode(Cell.ROW_MAJOR_ORDER.stream()
@@ -51,39 +70,43 @@ public final class GameStateSerializer {
51 } 70 }
52 71
53 /** 72 /**
54 * Serialize a whole game state. 73 * Serialize a Player.
55 * 74 *
56 * @param boardPainter board painter related to the actual level 75 * @param player player to be serialized
76 * @param tick tick related to the GameState
77 * @return the serialized player
78 */
79 private static List<Byte> serializePlayer(Player player, int tick) {
80 List<Byte> serializedPlayer = new ArrayList<>();
81
82 serializedPlayer.add((byte) player.lives());
83 serializedPlayer.add((byte) player.position().x());
84 serializedPlayer.add((byte) player.position().y());
85 serializedPlayer.add(PlayerPainter.byteForPlayer(player, tick));
86
87 return serializedPlayer;
88 }
89
90 /**
91 * Serialize a whole GameState.
92 *
93 * @param boardPainter board painter used to serialize the board
57 * @param gameState GameState to be serialized 94 * @param gameState GameState to be serialized
58 * @return the serialized game state 95 * @return the serialized GameState
59 */ 96 */
60 public static List<Byte> serialize(BoardPainter boardPainter, GameState gameState) { 97 public static List<Byte> serialize(BoardPainter boardPainter, GameState gameState) {
61 List<Byte> output = new ArrayList<>(); 98 List<Byte> output = new ArrayList<>();
62 List<Byte> data = new ArrayList<>(); 99 List<Byte> data = new ArrayList<>();
63 100
64 // Board 101 data.addAll(serializeBoard(boardPainter, gameState.board())); // Serialize the Board
65 data.addAll(serializeBoard(boardPainter, gameState.board())); 102 data.addAll(serializeExplosions(gameState.bombedCells(), gameState.blastedCells())); // Serialize Explosions
66
67 // Blasts and Bombs
68 data.addAll(serializeExplosions(gameState.bombedCells(), gameState.blastedCells()));
69
70 // Players
71 for (Player player : gameState.players()) { 103 for (Player player : gameState.players()) {
72 List<Byte> serializedPlayer = new ArrayList<>(); 104 data.addAll(serializePlayer(player, gameState.ticks())); // Serialize each Player
73 serializedPlayer.add((byte) player.lives());
74 serializedPlayer.add((byte) player.position().x());
75 serializedPlayer.add((byte) player.position().y());
76 serializedPlayer.add(PlayerPainter.byteForPlayer(player, gameState.ticks()));
77
78 data.addAll(serializedPlayer);
79 } 105 }
80 106
81 // Ticks 107 data.add((byte) (gameState.remainingTime() / 2)); // Add the state Tick to the data
82 data.add((byte) (gameState.remainingTime() / 2)); 108 output.add((byte) data.size()); // Get the size of the whole data chunk and add it as first element of the output
83 109 output.addAll(data); // Add all the data to the output
84 // Build output
85 output.add((byte) data.size());
86 output.addAll(data);
87 110
88 return output; 111 return output;
89 } 112 }