[ all classes ]
[ it.polimi.ingsw.view.GUI ]
Coverage Summary for Class: Board (it.polimi.ingsw.view.GUI)
Class | Method, % | Line, % |
---|---|---|
Board | 0% (0/ 50) | 0% (0/ 603) |
Board$1 | 0% (0/ 3) | 0% (0/ 14) |
total | 0% (0/ 53) | 0% (0/ 617) |
1 package it.polimi.ingsw.view.GUI;
2
3 import com.google.gson.Gson;
4 import it.polimi.ingsw.utils.Observer;
5 import it.polimi.ingsw.utils.model.ChatMessage;
6 import it.polimi.ingsw.utils.model.Command;
7 import it.polimi.ingsw.view.model.Build;
8 import it.polimi.ingsw.view.model.Cell;
9 import it.polimi.ingsw.view.model.Player;
10 import it.polimi.ingsw.view.model.Swap;
11 import it.polimi.ingsw.view.socket.Chat;
12 import javafx.animation.FadeTransition;
13 import javafx.application.Platform;
14 import javafx.beans.binding.Bindings;
15 import javafx.beans.property.DoubleProperty;
16 import javafx.beans.property.SimpleDoubleProperty;
17 import javafx.fxml.FXML;
18 import javafx.geometry.Insets;
19 import javafx.scene.control.*;
20 import javafx.scene.effect.Glow;
21 import javafx.scene.effect.Lighting;
22 import javafx.scene.image.Image;
23 import javafx.scene.image.ImageView;
24 import javafx.scene.input.MouseEvent;
25 import javafx.scene.layout.Background;
26 import javafx.scene.layout.GridPane;
27 import javafx.scene.layout.Pane;
28 import javafx.scene.text.Text;
29 import javafx.util.Duration;
30
31 import java.util.Arrays;
32 import java.util.List;
33 import java.util.Objects;
34 import java.util.stream.Collectors;
35
36 public class Board implements Controller, Observer<ChatMessage> {
37 @FXML
38 private GridPane gridPane;
39 @FXML
40 private Pane player0, player1, player2, actionBox, pane;
41 private Chat chat;
42 private ImageView[][][] boardImages = new ImageView[5][5][3];
43 private static MainController controller = new MainController();
44 private Pane[] players = new Pane[3];
45 private Cell[][] board = new Cell[5][5];
46 private Swap[][] swaps = new Swap[5][5];
47 private Build[][][] builds = new Build[5][5][2];
48 private Pane[][] map = new Pane[5][5];
49 private Lighting lighting = new Lighting();
50 private Glow glow = new Glow();
51 private boolean setUp = false;
52 private String color, currentPlayer;
53
54 private DoubleProperty height = new SimpleDoubleProperty(720);
55 private DoubleProperty width = new SimpleDoubleProperty(1280);
56
57 @FXML
58 private ImageView cloud, god, backGround, door, turn;
59 @FXML
60 private ListView<String> listView;
61 @FXML
62 private TextField textField;
63 @FXML
64 private Button send;
65 public static void setController(MainController controller) {
66 Board.controller = controller;
67 }
68
69 /**
70 * Message to send
71 */
72 @FXML
73 public void sendMessage() {
74 String message = textField.getText().trim();
75 textField.clear();
76 textField.requestFocus();
77 if (!message.equals(""))
78 chat.sendMessage(message);
79 }
80
81 /**
82 * Set window's dimension
83 */
84 private void setUpDimension() {
85 pane.prefHeightProperty().bind(height);
86 pane.prefWidthProperty().bind(width);
87
88 backGround.fitWidthProperty().bind(width);
89 backGround.fitHeightProperty().bind(height);
90 cloud.fitWidthProperty().bind(width);
91 cloud.fitHeightProperty().bind(height);
92
93 player0.layoutYProperty().bind(height.multiply(25).divide(720));
94 player0.layoutXProperty().bind(width.multiply(30).divide(1280));
95 player1.layoutYProperty().bind(height.multiply(240).divide(720));
96 player1.layoutXProperty().bind(width.multiply(30).divide(1280));
97 player2.layoutYProperty().bind(height.multiply(455).divide(720));
98 player2.layoutXProperty().bind(width.multiply(30).divide(1280));
99
100 Arrays.stream(players).forEach(e -> {
101 ((ImageView) e.getChildren().get(0)).fitHeightProperty().bind(height.multiply(84).divide(720));
102 ((ImageView) e.getChildren().get(0)).fitWidthProperty().bind(width.multiply(150).divide(1280));
103 ((ImageView) e.getChildren().get(1)).fitHeightProperty().bind(height.multiply(150).divide(720));
104 ((ImageView) e.getChildren().get(1)).fitWidthProperty().bind(width.multiply(116).divide(1280));
105 ((ImageView) e.getChildren().get(2)).fitHeightProperty().bind(height.multiply(120).divide(720));
106 ((ImageView) e.getChildren().get(2)).fitWidthProperty().bind(width.multiply(120).divide(1280));
107 ((ImageView) e.getChildren().get(0)).layoutXProperty().bind(width.multiply(20).divide(1280));
108 ((ImageView) e.getChildren().get(0)).layoutYProperty().bind(height.multiply(130).divide(720));
109 ((ImageView) e.getChildren().get(1)).layoutXProperty().bind(width.multiply(30).divide(1280));
110 ((ImageView) e.getChildren().get(1)).layoutYProperty().bind(height.multiply(15).divide(720));
111 ((ImageView) e.getChildren().get(2)).layoutXProperty().bind(width.multiply(120).divide(1280));
112 ((ImageView) e.getChildren().get(2)).layoutYProperty().bind(height.multiply(30).divide(720));
113 });
114 door.fitWidthProperty().bind(width.multiply(70).divide(1280));
115 door.fitHeightProperty().bind(height.multiply(70).divide(720));
116 door.layoutYProperty().bind(height.multiply(650).divide(720));
117 door.layoutXProperty().bind(width.multiply(15).divide(1280));
118
119 actionBox.layoutXProperty().bind(width.multiply(980).divide(1280));
120 actionBox.layoutYProperty().bind(height.multiply(100).divide(720));
121 ((ImageView) actionBox.getChildren().get(0)).layoutYProperty().bind(height.multiply(10).divide(720));
122 ((ImageView) actionBox.getChildren().get(0)).layoutXProperty().bind(width.multiply(10).divide(1280));
123 ((ImageView) actionBox.getChildren().get(1)).layoutYProperty().bind(height.multiply(90).divide(720));
124 ((ImageView) actionBox.getChildren().get(1)).layoutXProperty().bind(width.multiply(10).divide(1280));
125 ((ImageView) actionBox.getChildren().get(2)).layoutYProperty().bind(height.multiply(10).divide(720));
126 ((ImageView) actionBox.getChildren().get(2)).layoutXProperty().bind(width.multiply(140).divide(1280));
127 ((ImageView) actionBox.getChildren().get(3)).layoutYProperty().bind(height.multiply(90).divide(720));
128 ((ImageView) actionBox.getChildren().get(3)).layoutXProperty().bind(width.multiply(140).divide(1280));
129
130 ((ImageView) actionBox.getChildren().get(0)).fitHeightProperty().bind(height.multiply(56).divide(720));
131 ((ImageView) actionBox.getChildren().get(0)).fitWidthProperty().bind(width.multiply(140).divide(1280));
132 ((ImageView) actionBox.getChildren().get(1)).fitHeightProperty().bind(height.multiply(56).divide(720));
133 ((ImageView) actionBox.getChildren().get(1)).fitWidthProperty().bind(width.multiply(140).divide(1280));
134 ((ImageView) actionBox.getChildren().get(2)).fitHeightProperty().bind(height.multiply(56).divide(720));
135 ((ImageView) actionBox.getChildren().get(2)).fitWidthProperty().bind(width.multiply(140).divide(1280));
136 ((ImageView) actionBox.getChildren().get(3)).fitHeightProperty().bind(height.multiply(56).divide(720));
137 ((ImageView) actionBox.getChildren().get(3)).fitWidthProperty().bind(width.multiply(140).divide(1280));
138
139 listView.prefWidthProperty().bind(width.multiply(275).divide(1280));
140 listView.prefHeightProperty().bind(height.multiply(320).divide(720));
141 listView.layoutXProperty().bind(width.multiply(980).divide(1280));
142 listView.layoutYProperty().bind(height.multiply(320).divide(720));
143
144 textField.prefWidthProperty().bind(width.multiply(220).divide(1280));
145 textField.prefHeightProperty().bind(height.multiply(26).divide(720));
146 textField.layoutXProperty().bind(width.multiply(980).divide(1280));
147 textField.layoutYProperty().bind(height.multiply(657).divide(720));
148
149 send.prefWidthProperty().bind(width.multiply(50).divide(1280));
150 send.prefHeightProperty().bind(height.multiply(28).divide(720));
151 send.layoutXProperty().bind(width.multiply(1202).divide(1280));
152 send.layoutYProperty().bind(height.multiply(657).divide(720));
153
154 god.fitWidthProperty().bind(width.multiply(320).divide(1280));
155 god.fitHeightProperty().bind(height.multiply(550).divide(720));
156 god.layoutXProperty().bind(width.multiply(470).divide(1280));
157 god.layoutYProperty().bind(height.multiply(70).divide(720));
158
159 turn.fitWidthProperty().bind(width.multiply(400).divide(1280));
160 turn.fitHeightProperty().bind(height.multiply(200).divide(720));
161 turn.layoutXProperty().bind(width.multiply(450).divide(1280));
162 turn.layoutYProperty().bind(height.multiply(250).divide(720));
163
164 gridPane.prefWidthProperty().bind(width.multiply(460).divide(1280));
165 gridPane.prefHeightProperty().bind(height.multiply(460).divide(720));
166 gridPane.layoutXProperty().bind(width.multiply(402).divide(1280));
167 gridPane.layoutYProperty().bind(height.multiply(128).divide(720));
168
169 for (int i = 0; i < 25; i++) {
170 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(0)).fitWidthProperty()
171 .bind(width.multiply(80).divide(1280));
172 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(0)).fitHeightProperty()
173 .bind(height.multiply(80).divide(720));
174 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(0)).layoutXProperty()
175 .bind(width.multiply(6).divide(1280));
176 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(0)).layoutYProperty()
177 .bind(height.multiply(6).divide(720));
178
179 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(1)).fitWidthProperty()
180 .bind(width.multiply(80).divide(1280));
181 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(1)).fitHeightProperty()
182 .bind(height.multiply(80).divide(720));
183 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(1)).layoutXProperty()
184 .bind(width.multiply(6).divide(1280));
185 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(1)).layoutYProperty()
186 .bind(height.multiply(6).divide(720));
187
188 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(2)).fitWidthProperty()
189 .bind(width.multiply(92.4).divide(1280));
190 ((ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(2)).fitHeightProperty()
191 .bind(height.multiply(92.4).divide(720));
192
193 }
194
195 }
196
197 /**
198 * Set Up the board
199 */
200 private void setUp() {
201 textField.setOnKeyPressed(e -> {
202 if (e.getCode().toString().equals("ENTER")) {
203 sendMessage();
204 }
205 });
206
207 listView.setCellFactory(lv -> new ListCell<String>() {
208 private final Text text;
209
210 {
211 text = new Text();
212 setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
213 setGraphic(text);
214 text.wrappingWidthProperty().bind(Bindings.createDoubleBinding(() -> {
215 Insets padding = getPadding();
216 return getWidth() - padding.getLeft() - padding.getRight();
217 }, widthProperty(), paddingProperty()));
218 }
219
220 @Override
221 protected void updateItem(String item, boolean empty) {
222 super.updateItem(item, empty);
223 if (empty) {
224 text.setText(null);
225 } else {
226 text.setText(item);
227 }
228 }
229 });
230 listView.setVisible(false);
231 listView.setStyle("-fx-control-inner-background: rgba(255,255,255,0);");
232 listView.setMouseTransparent(true);
233 listView.setFocusTraversable(false);
234 }
235
236 /**
237 * Initialize the board
238 */
239 @FXML
240 public void initialize() {
241 turn.setDisable(true);
242 turn.setVisible(false);
243 door.setDisable(false);
244 door.setOnMouseClicked(e -> quit());
245 textField.setFocusTraversable(false);
246 chat = controller.setChat();
247 chat.addObservers(this);
248 gridPane.setVisible(true);
249 god.setVisible(false);
250 god.setDisable(true);
251 cloud.setVisible(false);
252 cloud.setDisable(true);
253 send.setOnAction(e -> sendMessage());
254 for (int i = 0; i < 25; i++) {
255 boardImages[i / 5][i % 5][0] = (ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(0);
256 boardImages[i / 5][i % 5][1] = (ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(1);
257 boardImages[i / 5][i % 5][2] = (ImageView) ((Pane) gridPane.getChildren().get(i)).getChildren().get(2);
258 map[i / 5][i % 5] = (Pane) gridPane.getChildren().get(i);
259 boardImages[i / 5][i % 5][0].setVisible(false);
260 boardImages[i / 5][i % 5][1].setVisible(false);
261 }
262 players[0] = player0;
263 players[1] = player1;
264 players[2] = player2;
265 player0.setVisible(false);
266 player1.setVisible(false);
267 player2.setVisible(false);
268 Platform.runLater(() -> {
269 List<Player> listPlayer = controller.getUserInfo();
270 listPlayer.stream().forEach(e -> {
271 if (e.getUsername().equals(controller.getPlayer())) {
272 player0.setVisible(true);
273 ((Label) player0.getChildren().get(3)).setText(e.getUsername());
274 ((ImageView) player0.getChildren().get(1))
275 .setImage(new Image(ImageEnum.getUrl(e.getGod().toUpperCase() + "_PLAYER")));
276 ((ImageView) player0.getChildren().get(1)).setUserData(e.getGod());
277 ((ImageView) player0.getChildren().get(2)).setVisible(false);
278 } else if (!player1.isVisible()) {
279 player1.setVisible(true);
280 ((Label) player1.getChildren().get(3)).setText(e.getUsername());
281 ((ImageView) player1.getChildren().get(1))
282 .setImage(new Image(ImageEnum.getUrl(e.getGod().toUpperCase() + "_PLAYER")));
283 ((ImageView) player1.getChildren().get(1)).setUserData(e.getGod());
284 ((ImageView) player1.getChildren().get(2)).setVisible(false);
285 } else {
286 player2.setVisible(true);
287 ((Label) player2.getChildren().get(3)).setText(e.getUsername());
288 ((ImageView) player2.getChildren().get(1))
289 .setImage(new Image(ImageEnum.getUrl(e.getGod().toUpperCase() + "_PLAYER")));
290 ((ImageView) player2.getChildren().get(1)).setUserData(e.getGod());
291 ((ImageView) player2.getChildren().get(2)).setVisible(false);
292 }
293 });
294 });
295
296 ((ImageView) actionBox.getChildren().get(0)).setImage(new Image(ImageEnum.getUrl("BLUE")));
297 ((ImageView) actionBox.getChildren().get(1)).setImage(new Image(ImageEnum.getUrl("BROWN")));
298 ((ImageView) actionBox.getChildren().get(2)).setImage(new Image(ImageEnum.getUrl("WHITE")));
299 ((ImageView) actionBox.getChildren().get(0)).setVisible(false);
300 ((ImageView) actionBox.getChildren().get(1)).setVisible(false);
301 ((ImageView) actionBox.getChildren().get(2)).setVisible(false);
302 ((ImageView) actionBox.getChildren().get(3)).setVisible(false);
303
304 reSet();
305 setUp();
306 setUpDimension();
307 }
308
309 /**
310 * To create animation during the game
311 *
312 * @param imageView Background image of animation
313 * @param state visibility
314 * @param fromValue initial opacity value
315 * @param toValue finale opacity value
316 */
317 private void animation(ImageView imageView, boolean state, double fromValue, double toValue) {
318 FadeTransition fade = new FadeTransition();
319 fade.setDuration(Duration.millis(500));
320 if (state) {
321 imageView.setVisible(true);
322 fade.setFromValue(fromValue);
323 fade.setToValue(toValue);
324 } else {
325 fade.setFromValue(fromValue);
326 fade.setToValue(toValue);
327 fade.setOnFinished(e -> imageView.setVisible(false));
328 }
329 fade.setCycleCount(1);
330 fade.setAutoReverse(false);
331 fade.setNode(imageView);
332 fade.play();
333 }
334
335 private void changeTurn(ImageView imageView) {
336 FadeTransition fade = new FadeTransition();
337 fade.setDuration(Duration.millis(500));
338 imageView.setVisible(true);
339 fade.setFromValue(0);
340 fade.setToValue(10);
341 fade.setCycleCount(1);
342 fade.setAutoReverse(false);
343 fade.setNode(imageView);
344 fade.play();
345 fade.setOnFinished(e -> {
346 FadeTransition fade1 = new FadeTransition();
347 fade1.setFromValue(10);
348 fade1.setToValue(0);
349 fade1.setCycleCount(1);
350 fade1.setAutoReverse(false);
351 fade1.setNode(imageView);
352 fade1.play();
353 });
354 }
355
356 /**
357 * Show worker's preview on the board
358 *
359 * @param e mouse event
360 */
361 public void showWorker(MouseEvent e) {
362 ImageView node = (ImageView) e.getSource();
363 int i = Integer.parseInt(node.getUserData().toString());
364 boardImages[i / 5][i % 5][1].setImage(new Image(ImageEnum.getUrl(color.toUpperCase())));
365 boardImages[i / 5][i % 5][1].setVisible(true);
366 boardImages[i / 5][i % 5][1].setOpacity(0.8);
367 }
368
369 /**
370 * Close the showWorker() preview
371 *
372 * @param e mouse event
373 */
374 public void closeWorker(MouseEvent e) {
375 ImageView node = (ImageView) e.getSource();
376 int i = Integer.parseInt(node.getUserData().toString());
377 boardImages[i / 5][i % 5][1].setVisible(false);
378 boardImages[i / 5][i % 5][1].setOpacity(1);
379 }
380
381 /**
382 * After choosing the block, it shows the preview of actions
383 *
384 * @param event mouse event
385 */
386 public void showConsequence(MouseEvent event) {
387 ImageView node = (ImageView) event.getSource();
388 int[] i = new Gson().fromJson(node.getUserData().toString(), int[].class);
389 switch (i[1]) {
390 case 0:
391 List<Integer> x1 = swaps[i[0] / 5][i[0] % 5].getX1();
392 List<Integer> x2 = swaps[i[0] / 5][i[0] % 5].getX2();
393 List<Integer> y1 = swaps[i[0] / 5][i[0] % 5].getY1();
394 List<Integer> y2 = swaps[i[0] / 5][i[0] % 5].getY2();
395 Image x = boardImages[x1.get(0)][x1.get(1)][1].getImage();
396 if (!(y2.get(0) == y1.get(0) && y1.get(1) == y2.get(1))) {
397 boardImages[y2.get(0)][y2.get(1)][1].setImage(boardImages[y1.get(0)][y1.get(1)][1].getImage());
398 boardImages[y2.get(0)][y2.get(1)][1].setOpacity(0.7);
399 boardImages[y2.get(0)][y2.get(1)][1].setVisible(true);
400 }
401 boardImages[x2.get(0)][x2.get(1)][1].setImage(x);
402 boardImages[x2.get(0)][x2.get(1)][1].setOpacity(0.7);
403 boardImages[x2.get(0)][x2.get(1)][1].setVisible(true);
404 break;
405 case 1:
406 List<Integer> position = builds[i[0] / 5][i[0] % 5][0].getPosition();
407 boardImages[position.get(0)][position.get(1)][0]
408 .setImage(new Image(ImageEnum.getUrl(builds[i[0] / 5][i[0] % 5][0].getBlock().toUpperCase())));
409 boardImages[position.get(0)][position.get(1)][0].setOpacity(0.7);
410 boardImages[position.get(0)][position.get(1)][0].setVisible(true);
411 break;
412 case 2:
413 List<Integer> position1 = builds[i[0] / 5][i[0] % 5][1].getPosition();
414 boardImages[position1.get(0)][position1.get(1)][1]
415 .setImage(new Image(ImageEnum.getUrl(builds[i[0] / 5][i[0] % 5][1].getBlock().toUpperCase())));
416 boardImages[position1.get(0)][position1.get(1)][1].setOpacity(0.7);
417 boardImages[position1.get(0)][position1.get(1)][1].setVisible(true);
418 break;
419 }
420 }
421
422 /**
423 * Close the preview of showConsequence()
424 *
425 * @param event mouse event
426 */
427 public void closeConsequence(MouseEvent event) {
428 ImageView node = (ImageView) event.getSource();
429 int[] i = new Gson().fromJson(node.getUserData().toString(), int[].class);
430 switch (i[1]) {
431 case 0:
432 List<Integer> x1 = swaps[i[0] / 5][i[0] % 5].getX1();
433 List<Integer> x2 = swaps[i[0] / 5][i[0] % 5].getX2();
434 List<Integer> y1 = swaps[i[0] / 5][i[0] % 5].getY1();
435 List<Integer> y2 = swaps[i[0] / 5][i[0] % 5].getY2();
436 boardImages[x2.get(0)][x2.get(1)][1].setVisible(false);
437 Image x = boardImages[x2.get(0)][x2.get(1)][1].getImage();
438 if (!(y2.get(0) == y1.get(0) && y1.get(1) == y2.get(1))) {
439 boardImages[y1.get(0)][y1.get(1)][1].setImage(boardImages[y2.get(0)][y2.get(1)][1].getImage());
440 boardImages[y2.get(0)][y2.get(1)][1].setOpacity(1);
441 boardImages[y1.get(0)][y1.get(1)][1].setVisible(true);
442 boardImages[y2.get(0)][y2.get(1)][1].setVisible(false);
443 }
444 boardImages[x1.get(0)][x1.get(1)][1].setImage(x);
445 boardImages[x2.get(0)][x2.get(1)][1].setOpacity(1);
446 boardImages[x1.get(0)][x1.get(1)][1].setVisible(true);
447 break;
448
449 case 1:
450 List<Integer> position = builds[i[0] / 5][i[0] % 5][0].getPosition();
451 boardImages[position.get(0)][position.get(1)][0].setOpacity(1);
452 int size = board[position.get(0)][position.get(1)].getBlocks().size();
453 if (size > 0 && board[position.get(0)][position.get(1)].getBlocks().get(size - 1).getTypeBlock()
454 .equals("WORKER")) {
455 size--;
456 }
457 if (size <= 0) {
458 boardImages[position.get(0)][position.get(1)][0].setVisible(false);
459 } else {
460 boardImages[position.get(0)][position.get(1)][0]
461 .setImage(new Image(ImageEnum.getUrl(board[position.get(0)][position.get(1)].getBlocks()
462 .get(size - 1).getTypeBlock().toUpperCase())));
463 boardImages[position.get(0)][position.get(1)][0].setVisible(true);
464 }
465 break;
466 case 2:
467 List<Integer> position1 = builds[i[0] / 5][i[0] % 5][1].getPosition();
468 boardImages[position1.get(0)][position1.get(1)][1].setVisible(false);
469 boardImages[position1.get(0)][position1.get(1)][1].setOpacity(1);
470 break;
471 }
472 }
473
474 /**
475 * Show god power's image description
476 *
477 * @param event mouse event
478 */
479 @FXML
480 public void showGod(MouseEvent event) {
481 ImageView node = (ImageView) event.getSource();
482 god.setImage(new Image(ImageEnum.getUrl(node.getUserData() + "_DEF")));
483 animation(god, true, 0, 10);
484 }
485
486 /**
487 * Close showGod()
488 *
489 * @param event
490 */
491 @FXML
492 public void closeGod(MouseEvent event) {
493 animation(god, true, 10, 0);
494 }
495
496 /**
497 * Set worker's color and send the choice to server
498 *
499 * @param event mouse event
500 */
501 @FXML
502 public void chooseColor(MouseEvent event) {
503 ImageView node = (ImageView) event.getSource();
504 color = node.getUserData().toString();
505 controller.send(color);
506 }
507
508 /**
509 * Send player's actions to server
510 *
511 * @param event mouse event
512 */
513 @FXML
514 public void chooseAction(MouseEvent event) {
515 ImageView node = (ImageView) event.getSource();
516 node.setDisable(true);
517 String string = node.getUserData().toString();
518 controller.send(string);
519 }
520
521 /**
522 * After choosing the grid on board, shows all available actions for the chosen grid
523 *
524 * @param event mouse event
525 */
526 @FXML
527 public void chooseCell(MouseEvent event) {
528 ImageView node = (ImageView) event.getSource();
529 int i = new Gson().fromJson(node.getUserData().toString(), int.class);
530 if (swaps[i / 5][i % 5] != null) {
531 ((ImageView) actionBox.getChildren().get(0)).setDisable(false);
532 ((ImageView) actionBox.getChildren().get(0)).setEffect(null);
533 ((ImageView) actionBox.getChildren().get(0)).setUserData(new Gson().toJson(new int[]{i, 0}));
534 ((ImageView) actionBox.getChildren().get(0)).setOnMouseClicked(event1 -> {
535 closeConsequence(event1);
536 chooseAction(event1);
537 });
538 } else {
539 ((ImageView) actionBox.getChildren().get(0)).setDisable(true);
540 ((ImageView) actionBox.getChildren().get(0)).setEffect(lighting);
541 }
542 for (int j = 1; j < 3; j++) {
543 if (builds[i / 5][i % 5][j - 1] != null) {
544 ((ImageView) actionBox.getChildren().get(j)).setDisable(false);
545 ((ImageView) actionBox.getChildren().get(j)).setEffect(null);
546 ((ImageView) actionBox.getChildren().get(j)).setUserData(new Gson().toJson(new int[]{i, j}));
547 ((ImageView) actionBox.getChildren().get(j)).setOnMouseClicked(event1 -> {
548 closeConsequence(event1);
549 chooseAction(event1);
550 });
551 } else {
552 ((ImageView) actionBox.getChildren().get(j)).setDisable(true);
553 ((ImageView) actionBox.getChildren().get(j)).setEffect(lighting);
554 }
555 }
556 }
557
558 /**
559 * Receive player's information from server (Current player, player's turn, ecc) and shows to players
560 */
561 private void setPlayerInfo() {
562 if (!controller.getCurrentPlayer().equals(currentPlayer)) {
563 currentPlayer = controller.getCurrentPlayer();
564 Platform.runLater(() -> {
565 if (currentPlayer.equals(controller.getPlayer())) {
566 changeTurn(turn);
567 }
568 Arrays.stream(players).forEach(e -> {
569 if (e.isVisible()) {
570 Label name = ((Label) e.getChildren().get(3));
571 if (name.getText().equals(controller.getCurrentPlayer())) {
572 ((ImageView) e.getChildren().get(0))
573 .setImage(new Image(Objects.requireNonNull(ImageEnum.getUrl("PODIUM_GOLD"))));
574 e.setEffect(glow);
575 } else {
576 ((ImageView) e.getChildren().get(0))
577 .setImage(new Image(Objects.requireNonNull(ImageEnum.getUrl("PODIUM"))));
578 Lighting lighting = new Lighting();
579 e.setEffect(lighting);
580 }
581 }
582 });
583 });
584 }
585 Platform.runLater(() -> {
586 List<Player> listPlayer = controller.getUserInfo();
587 listPlayer.stream().forEach(e -> {
588 if (e.getStatus().equals("LOSE") || e.getStatus().equals("WIN")) {
589 String state = e.getStatus();
590 ((ImageView) Arrays.stream(players)
591 .filter(e1 -> e1.isVisible() && ((Label) e1.getChildren().get(3)).getText().equals(e.getUsername()))
592 .collect(Collectors.toList()).get(0).getChildren().get(2))
593 .setImage(new Image(Objects.requireNonNull(ImageEnum.getUrl(state))));
594 }
595 });
596 });
597 }
598
599 /**
600 * Receive board's information from server and shows to all players
601 */
602 private void setBoard() {
603 try {
604 Platform.runLater(() -> {
605 Cell[][] map = controller.getBoard();
606 for (int i = 0; i < 5; i++) {
607 for (int j = 0; j < 5; j++) {
608 if (!map[i][j].equals(board[i][j])) {
609 if (map[i][j].getBlocks().size() == 0) {
610 if (boardImages[i][j][1].isVisible()) {
611 animation(boardImages[i][j][1], false, 10, 0);
612 }
613 if (boardImages[i][j][0].isVisible()) {
614 animation(boardImages[i][j][0], false, 10, 0);
615 }
616 } else {
617 int size = map[i][j].getBlocks().size();
618 if (map[i][j].getBlocks().get(size - 1).getTypeBlock().toUpperCase().equals("WORKER")) {
619 String url = ImageEnum
620 .getUrl(map[i][j].getBlocks().get(size - 1).getColor().toUpperCase());
621 if (!boardImages[i][j][1].isVisible()
622 || !board[i][j].getBlocks().get(board[i][j].getBlocks().size() - 1).getColor()
623 .equals(map[i][j].getBlocks().get(size - 1).getColor())) {
624 if (boardImages[i][j][1].isVisible()) {
625 animation(boardImages[i][j][1], true, 10, 0);
626 }
627 boardImages[i][j][1].setImage(new Image(url));
628 animation(boardImages[i][j][1], true, 0, 10);
629 }
630 size--;
631 } else if (map[i][j].getBlocks().get(size - 1).getTypeBlock().toUpperCase()
632 .equals("DOME")) {
633 String url = ImageEnum
634 .getUrl(map[i][j].getBlocks().get(size - 1).getTypeBlock().toUpperCase());
635 if (!boardImages[i][j][1].isVisible() || !board[i][j].getBlocks()
636 .get(board[i][j].getBlocks().size() - 1).getTypeBlock()
637 .equals(map[i][j].getBlocks().get(size - 1).getTypeBlock())) {
638 if (boardImages[i][j][1].isVisible()) {
639 animation(boardImages[i][j][1], true, 10, 0);
640 }
641 boardImages[i][j][1].setImage(new Image(url));
642 animation(boardImages[i][j][1], true, 0, 10);
643 }
644 size--;
645 } else {
646 if (boardImages[i][j][1].isVisible()) {
647 animation(boardImages[i][j][1], false, 10, 0);
648 }
649 }
650 if (size > 0) {
651 String url = ImageEnum
652 .getUrl(map[i][j].getBlocks().get(size - 1).getTypeBlock().toUpperCase());
653 String typeBlock;
654 try {
655 typeBlock = board[i][j].getBlocks().get(board[i][j].getBlocks().size() - 1)
656 .getTypeBlock();
657 if (typeBlock.toUpperCase().equals("WORKER")
658 || typeBlock.toUpperCase().equals("DOME")) {
659 typeBlock = board[i][j].getBlocks().get(board[i][j].getBlocks().size() - 2)
660 .getTypeBlock();
661 }
662 } catch (IndexOutOfBoundsException e) {
663 typeBlock = "LEVEL0";
664 }
665
666 if (!boardImages[i][j][0].isVisible()
667 || !typeBlock.equals(map[i][j].getBlocks().get(size - 1).getTypeBlock())) {
668 if (boardImages[i][j][0].isVisible()) {
669 animation(boardImages[i][j][0], true, 10, 0);
670 }
671 boardImages[i][j][0].setImage(new Image(url));
672 animation(boardImages[i][j][0], true, 0, 10);
673 }
674 }
675 }
676 board[i][j] = map[i][j];
677 }
678 }
679 }
680 });
681 } catch (Exception e) {
682 }
683 }
684
685 /**
686 * Receive all available actions from server and shows to all players
687 */
688 private void setAction() {
689 try {
690 Swap[][] swaps1 = new Swap[5][5];
691 Build[][][] builds1 = new Build[5][5][2];
692 int[] count = new int[25];
693 Arrays.stream(count).forEach(e -> e = 0);
694 if (controller.getGamePhase().equals("SET_COLOR")) {
695 setColor();
696 } else if (controller.getGamePhase().equals("SET_WORKERS")) {
697 setWorker(count);
698 } else {
699 List<Command> listCommand = controller.getCommand();
700
701 listCommand.stream().forEach(e -> {
702 if (e.getFuncData() == null) {
703 actionBox.getChildren().get(3).setDisable(false);
704 actionBox.getChildren().get(3).setEffect(null);
705 actionBox.getChildren().get(3).setOnMouseClicked(e1 -> controller.send(null));
706 } else {
707 if (e.getFuncName().equals("chooseWorker")) {
708 int i = Integer.parseInt(e.getFuncData());
709 count[i] = 1;
710 boardImages[i / 5][i % 5][2].setDisable(false);
711 boardImages[i / 5][i % 5][2].setUserData(i);
712 boardImages[i / 5][i % 5][2].setOnMouseClicked(e1 -> chooseAction(e1));
713 } else if (e.getFuncName().equals("chooseAction")) {
714 int[] i = new Gson().fromJson(e.getFuncData(), int[].class);
715 count[i[0]] = 1;
716 boardImages[i[0] / 5][i[0] % 5][2].setDisable(false);
717 boardImages[i[0] / 5][i[0] % 5][2].setUserData(i[0]);
718 boardImages[i[0] / 5][i[0] % 5][2].setOnMouseClicked(e1 -> chooseCell(e1));
719 switch (i[1]) {
720 case 0:
721 swaps1[i[0] / 5][i[0] % 5] = new Gson().fromJson(e.getInfo(), Swap.class);
722 break;
723 case 1:
724 builds1[i[0] / 5][i[0] % 5][0] = new Gson().fromJson(e.getInfo(), Build.class);
725 break;
726 case 2:
727 builds1[i[0] / 5][i[0] % 5][1] = new Gson().fromJson(e.getInfo(), Build.class);
728 break;
729 }
730 }
731 }
732 });
733 }
734 for (int i = 0; i < 25; i++) {
735 int e = count[i];
736 if (e == 1) {
737 if (boardImages[i / 5][i % 5][2].getOpacity() == 0.4) {
738 animation(boardImages[i / 5][i % 5][2], true, 0.4, 0);
739 }
740 } else {
741 if (boardImages[i / 5][i % 5][2].getOpacity() == 0) {
742 animation(boardImages[i / 5][i % 5][2], true, 0, 0.4);
743 }
744 }
745 boardImages[i / 5][i % 5][2].setVisible(true);
746 }
747 swaps = swaps1;
748 builds = builds1;
749 } catch (Exception e) {
750 }
751 }
752
753 /**
754 * Receive available colors for players from server and shows to all players
755 */
756 private void setColor() {
757 setUp = true;
758 Lighting lighting = new Lighting();
759 List<Command> listCommand = controller.getCommand();
760
761 ((ImageView) actionBox.getChildren().get(0)).setDisable(true);
762 ((ImageView) actionBox.getChildren().get(1)).setDisable(true);
763 ((ImageView) actionBox.getChildren().get(2)).setDisable(true);
764 ((ImageView) actionBox.getChildren().get(3)).setDisable(true);
765 ((ImageView) actionBox.getChildren().get(0)).setEffect(lighting);
766 ((ImageView) actionBox.getChildren().get(1)).setEffect(lighting);
767 ((ImageView) actionBox.getChildren().get(2)).setEffect(lighting);
768
769 listCommand.stream().forEach(e -> {
770
771 if (e.getFuncData().equals("BLUE")) {
772 ((ImageView) actionBox.getChildren().get(0)).setEffect(null);
773 ((ImageView) actionBox.getChildren().get(0)).setVisible(true);
774 ((ImageView) actionBox.getChildren().get(0)).setDisable(false);
775 ((ImageView) actionBox.getChildren().get(0)).setUserData("BLUE");
776 ((ImageView) actionBox.getChildren().get(0)).setOnMouseClicked(e1 -> chooseColor(e1));
777 } else if (e.getFuncData().equals("BROWN")) {
778 ((ImageView) actionBox.getChildren().get(1)).setEffect(null);
779 ((ImageView) actionBox.getChildren().get(1)).setVisible(true);
780 ((ImageView) actionBox.getChildren().get(1)).setDisable(false);
781 ((ImageView) actionBox.getChildren().get(1)).setUserData("BROWN");
782 ((ImageView) actionBox.getChildren().get(1)).setOnMouseClicked(e1 -> chooseColor(e1));
783 } else if (e.getFuncData().equals("WHITE")) {
784 ((ImageView) actionBox.getChildren().get(2)).setEffect(null);
785 ((ImageView) actionBox.getChildren().get(2)).setVisible(true);
786 ((ImageView) actionBox.getChildren().get(2)).setDisable(false);
787 ((ImageView) actionBox.getChildren().get(2)).setUserData("WHITE");
788 ((ImageView) actionBox.getChildren().get(2)).setOnMouseClicked(e1 -> chooseColor(e1));
789 }
790
791 });
792 }
793
794 /**
795 * Shows all available grids for player's chosen worker to place
796 *
797 * @param count board grid enumeration
798 */
799 private void setWorker(int[] count) {
800 List<Command> listCommand = controller.getCommand();
801 listCommand.stream().forEach(e -> {
802 int i = Integer.parseInt(e.getFuncData());
803 count[i] = 1;
804 boardImages[i / 5][i % 5][2].setDisable(false);
805 boardImages[i / 5][i % 5][2].setUserData(i);
806 boardImages[i / 5][i % 5][2].setOnMouseEntered(e1 -> showWorker(e1));
807 boardImages[i / 5][i % 5][2].setOnMouseExited(e1 -> closeWorker(e1));
808 boardImages[i / 5][i % 5][2].setOnMouseClicked(e1 -> {
809 closeWorker(e1);
810 chooseAction(e1);
811 });
812 });
813 }
814
815 /**
816 * Set player's constant information (those that won't change until the end of game)
817 */
818 private void setUpPlayerInfo() {
819 Platform.runLater(() -> {
820 animation(((ImageView) actionBox.getChildren().get(0)), true, 10, 0);
821 animation(((ImageView) actionBox.getChildren().get(1)), true, 10, 0);
822 animation(((ImageView) actionBox.getChildren().get(2)), true, 10, 0);
823 animation(((ImageView) actionBox.getChildren().get(3)), true, 10, 0);
824 ((ImageView) actionBox.getChildren().get(0)).setImage(new Image(ImageEnum.getUrl("MOVE")));
825 ((ImageView) actionBox.getChildren().get(1)).setImage(new Image(ImageEnum.getUrl("BUILD")));
826 ((ImageView) actionBox.getChildren().get(2)).setImage(new Image(ImageEnum.getUrl("BUILD_DOME")));
827 ((ImageView) actionBox.getChildren().get(3)).setImage(new Image(ImageEnum.getUrl("END_TURN")));
828 animation(((ImageView) actionBox.getChildren().get(0)), true, 0, 10);
829 animation(((ImageView) actionBox.getChildren().get(1)), true, 0, 10);
830 animation(((ImageView) actionBox.getChildren().get(2)), true, 0, 10);
831 animation(((ImageView) actionBox.getChildren().get(3)), true, 0, 10);
832 ((ImageView) actionBox.getChildren().get(0)).setOnMouseEntered(e -> showConsequence(e));
833 ((ImageView) actionBox.getChildren().get(1)).setOnMouseEntered(e -> showConsequence(e));
834 ((ImageView) actionBox.getChildren().get(2)).setOnMouseEntered(e -> showConsequence(e));
835 ((ImageView) actionBox.getChildren().get(0)).setOnMouseExited(e -> closeConsequence(e));
836 ((ImageView) actionBox.getChildren().get(1)).setOnMouseExited(e -> closeConsequence(e));
837 ((ImageView) actionBox.getChildren().get(2)).setOnMouseExited(e -> closeConsequence(e));
838
839 List<Player> listPlayer = controller.getUserInfo();
840 listPlayer.stream().forEach(e -> {
841 Arrays.stream(players).forEach(e1 -> {
842 if (((Label) e1.getChildren().get(3)).getText().equals(e.getUsername())) {
843 ((ImageView) e1.getChildren().get(2))
844 .setImage(new Image(ImageEnum.getUrl(e.getColor().toUpperCase())));
845 animation(((ImageView) e1.getChildren().get(2)), true, 0, 10);
846 }
847 });
848 });
849 });
850 setUp = false;
851 }
852
853 /**
854 * Reload the board for all players
855 */
856 @Override
857 public void reSet() {
858 if (controller.getGamePhase().equals("CHOOSE_WORKER") && setUp) {
859 setUpPlayerInfo();
860 }
861 for (int i = 0; i < 4; i++) {
862 actionBox.getChildren().get(i).setEffect(lighting);
863 actionBox.getChildren().get(i).setDisable(true);
864 }
865 setPlayerInfo();
866 setBoard();
867 if (controller.getCurrentPlayer().equals(controller.getPlayer())) {
868 for (int i = 0; i < 25; i++) {
869 boardImages[i / 5][i % 5][2].setOnMouseExited(null);
870 boardImages[i / 5][i % 5][2].setOnMouseEntered(null);
871 boardImages[i / 5][i % 5][2].setOnMouseClicked(null);
872 }
873 setAction();
874 } else {
875 for (int i = 0; i < 25; i++) {
876 if (boardImages[i / 5][i % 5][2].getOpacity() == 0.4) {
877 animation(boardImages[i / 5][i % 5][2], false, 0.4, 0);
878 }
879 boardImages[i / 5][i % 5][2].setOnMouseExited(null);
880 boardImages[i / 5][i % 5][2].setOnMouseEntered(null);
881 boardImages[i / 5][i % 5][2].setOnMouseClicked(null);
882 }
883 }
884
885 }
886
887 /**
888 * set view's dimension
889 *
890 * @param width width
891 * @param height height
892 */
893
894 @Override
895 public void setDimension(double width, double height) {
896 if (width * 720 / 1280 < height) {
897 pane.setLayoutY((height - (width * 720 / 1280)) / 2);
898 pane.setLayoutX(0);
899 this.height.set(width * 720 / 1280);
900 this.width.set(width);
901 } else {
902 pane.setLayoutX((width - (height * 1280 / 720)) / 2);
903 pane.setLayoutY(0);
904 this.width.set(height * 1280 / 720);
905 this.height.set(height);
906 }
907 }
908
909
910 /**
911 * Change view
912 *
913 * @param status if it's allowed to change view
914 */
915 @Override
916 public void changePage(Boolean status) {
917 cloud.setVisible(true);
918 FadeTransition fade = new FadeTransition();
919 fade.setDuration(Duration.millis(1000));
920 if (!status) {
921 fade.setFromValue(0);
922 fade.setToValue(10);
923 fade.setOnFinished(e -> {
924 controller.changeScene();
925 });
926 } else {
927 fade.setFromValue(10);
928 fade.setToValue(0);
929 }
930 fade.setCycleCount(1);
931 fade.setAutoReverse(false);
932 fade.setNode(cloud);
933 fade.play();
934 }
935
936 /**
937 * Send quit message to server and end the game
938 */
939 @FXML
940 private void quit() {
941 controller.quit();
942 }
943
944 /**
945 * Receive message from server
946 *
947 * @param message message
948 */
949 @Override
950 public void update(ChatMessage message) {
951 try {
952 listView.setVisible(true);
953 listView.getItems().add("< " + message.getUsername() + " > " + message.getMessage());
954 Platform.runLater(() -> {
955 listView.scrollTo(listView.getItems().size() - 1);
956 Background background = Background.EMPTY;
957 listView.setBackground(background);
958 });
959 } catch (Exception e) {
960 }
961
962 }
963
964 }