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 }