From 0e3a86d2b210c248188d424fa2e412392a6b47f4 Mon Sep 17 00:00:00 2001
From: ayazb7 <60544937+ayazb7@users.noreply.github.com>
Date: Wed, 6 Apr 2022 15:52:59 +0100
Subject: [PATCH] Adding Grid UI and graphics changes

---
 .../soton/comp1206/component/GameBlock.java   |  13 ++-
 .../soton/comp1206/component/PieceBoard.java  |  16 +++
 .../java/uk/ac/soton/comp1206/game/Game.java  |  53 +++++-----
 .../uk/ac/soton/comp1206/game/GamePiece.java  |   1 +
 .../java/uk/ac/soton/comp1206/game/Grid.java  |   8 +-
 .../soton/comp1206/scene/ChallengeScene.java  |  97 ++++++++++++++----
 .../uk/ac/soton/comp1206/scene/MenuScene.java |   8 +-
 .../ac/soton/comp1206/utility/Multimedia.java |  13 ++-
 .../soton/comp1206/component/GameBlock.class  | Bin 4306 -> 4846 bytes
 .../uk/ac/soton/comp1206/game/Game.class      | Bin 6340 -> 6194 bytes
 .../uk/ac/soton/comp1206/game/GamePiece.class | Bin 3892 -> 3892 bytes
 .../uk/ac/soton/comp1206/game/Grid.class      | Bin 2805 -> 2919 bytes
 .../soton/comp1206/scene/ChallengeScene.class | Bin 6373 -> 7401 bytes
 .../ac/soton/comp1206/scene/MenuScene.class   | Bin 4282 -> 4179 bytes
 14 files changed, 144 insertions(+), 65 deletions(-)
 create mode 100644 tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java

diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java
index e6c5c78..272c525 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/GameBlock.java
@@ -4,6 +4,7 @@ import javafx.beans.property.IntegerProperty;
 import javafx.beans.property.SimpleIntegerProperty;
 import javafx.beans.value.ObservableValue;
 import javafx.scene.canvas.Canvas;
+import javafx.scene.effect.BlendMode;
 import javafx.scene.paint.*;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -119,14 +120,17 @@ public class GameBlock extends Canvas {
         var gc = getGraphicsContext2D();
 
         //Clear
-        gc.clearRect(0,0,width,height);
+        gc.clearRect(0.0D, 0.0D, this.width, this.height);
 
         //Fill
-        gc.setFill(Color.WHITE);
-        gc.fillRect(0,0, width, height);
+        Color gradStart = Color.color(0.0D, 0.0D, 0.6D, 0.3D);
+        Color gradEnd = Color.color(0.0D, 0.0D, 0.2D, 0.5D);
+        gc.setFill(new LinearGradient(0.0D, 0.0D, 1.0D, 1.0D, true, CycleMethod.REFLECT, new Stop(0.0D, gradStart), new Stop(1.0D, gradEnd)));
+        gc.fillRect(0.0D, 0.0D, this.width, this.height);
 
         //Border
-        gc.setStroke(Color.BLACK);
+        gc.setStroke(Color.WHITE);
+        gc.setGlobalAlpha(0.7);
         gc.strokeRect(0,0,width,height);
     }
 
@@ -142,6 +146,7 @@ public class GameBlock extends Canvas {
 
         //Colour fill
         gc.setFill(colour);
+        gc.setGlobalAlpha(1);
         gc.fillRect(0,0, width, height);
 
         //Border
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java
new file mode 100644
index 0000000..c2d35fd
--- /dev/null
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/component/PieceBoard.java
@@ -0,0 +1,16 @@
+package uk.ac.soton.comp1206.component;
+
+import uk.ac.soton.comp1206.game.GamePiece;
+
+public class PieceBoard extends GameBoard {
+
+  private GamePiece pieceToDisplay;
+
+  public PieceBoard(double width, double height) {
+    super(3, 3, width, height);
+  }
+
+  public void displayPiece(GamePiece piece) {
+    this.pieceToDisplay = piece;
+  }
+}
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java
index d1dd5e0..af904f4 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Game.java
@@ -33,17 +33,13 @@ public class Game {
      */
     protected final Grid grid;
 
-    private GamePiece currentPiece;
+    protected GamePiece currentPiece;
+    protected GamePiece nextPiece;
 
-    private SimpleIntegerProperty score;
-
-    private IntegerProperty level;
-
-    private IntegerProperty lives;
-
-    private IntegerProperty multiplier;
-
-    private final Multimedia multimedia;
+    private IntegerProperty score = new SimpleIntegerProperty(0);
+    private IntegerProperty level = new SimpleIntegerProperty(0);
+    private IntegerProperty lives = new SimpleIntegerProperty(0);
+    private IntegerProperty multiplier = new SimpleIntegerProperty(0);
 
     private int remainder = 0;
 
@@ -56,13 +52,6 @@ public class Game {
         this.cols = cols;
         this.rows = rows;
 
-        this.score = new SimpleIntegerProperty(0);
-        this.level = new SimpleIntegerProperty(0);
-        this.lives = new SimpleIntegerProperty(3);
-        this.multiplier = new SimpleIntegerProperty(1);
-
-        this.multimedia = new Multimedia();
-
         //Create a new grid model to represent the game state
         this.grid = new Grid(cols,rows);
     }
@@ -80,6 +69,14 @@ public class Game {
      */
     public void initialiseGame() {
         logger.info("Initialising game");
+
+        this.score.set(0);
+        this.level.set(0);
+        this.lives.set(3);
+        this.multiplier.set(1);
+
+        this.nextPiece = spawnPiece();
+        nextPiece();
         this.currentPiece = spawnPiece();
     }
 
@@ -103,13 +100,19 @@ public class Game {
 
     public GamePiece spawnPiece() {
         Random rand = new Random();
-        int value = rand.nextInt(15);
-        logger.info("Spawning piece of value " + (value + 1));
-        return GamePiece.createPiece(value);
+        GamePiece piece = GamePiece.createPiece(3, rand.nextInt(3));
+        logger.info("Spawning piece: {}" , piece);
+        return piece;
     }
 
-    public void nextPiece() {
-        this.currentPiece = spawnPiece();
+    public GamePiece nextPiece() {
+        this.currentPiece = this.nextPiece;
+        this.nextPiece = spawnPiece();
+
+        logger.info("Current piece is : {}", this.currentPiece);
+        logger.info("Next piece is: {}", this.nextPiece);
+
+        return this.currentPiece;
     }
 
     public void afterPiece() {
@@ -146,7 +149,6 @@ public class Game {
             }
         }
 
-
         int numGridBlocks = 0;
 
         /**
@@ -177,7 +179,6 @@ public class Game {
         int newScore = score.get() + (fullCols.size() + fullRows.size()) * numGridBlocks * 10 * multiplier.get();
         this.setScore(newScore);
         int newRemainder = score.get() % 1000;
-        System.out.println("newRemainder = " + newRemainder + " remainder = " + remainder);
         if (newRemainder < remainder) {
             this.setLevel(level.get() + 1);
             remainder = 0;
@@ -187,7 +188,7 @@ public class Game {
 
         if (fullCols.size() != 0 || fullRows.size() != 0) {
             logger.info("Removing rows/columns");
-            multimedia.playSound("clear.wav");
+            Multimedia.playSound("clear.wav");
             this.setMultiplier(multiplier.get() + 1);
         } else {
             this.setMultiplier(1);
@@ -241,7 +242,7 @@ public class Game {
 
     public void setLevel(int level) {
         logger.info("Increasing level to " + level);
-        multimedia.playSound("level.wav");
+        Multimedia.playSound("level.wav");
         this.level.set(level);
     }
 
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java
index 763897a..761666e 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/GamePiece.java
@@ -28,6 +28,7 @@ public class GamePiece {
      */
     private final String name;
 
+
     /**
      * Create a new GamePiece of the specified piece number
      * @param piece piece number
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java
index fc583da..7905236 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/game/Grid.java
@@ -35,8 +35,6 @@ public class Grid {
      */
     private final SimpleIntegerProperty[][] grid;
 
-    private final Multimedia multimedia;
-
     /**
      * Create a new Grid with the specified number of columns and rows and initialise them
      * @param cols number of columns
@@ -49,8 +47,6 @@ public class Grid {
         //Create the grid itself
         grid = new SimpleIntegerProperty[cols][rows];
 
-        this.multimedia = new Multimedia();
-
         //Add a SimpleIntegerProperty to every block in the grid
         for(var y = 0; y < rows; y++) {
             for(var x = 0; x < cols; x++) {
@@ -106,7 +102,7 @@ public class Grid {
                 if (value == 0) continue;
                 if (get(x + placeX, y + placeY) != 0) {
                     logger.info("Cannot place piece here");
-                    multimedia.playSound("fail.wav");
+                    Multimedia.playSound("fail.wav");
                     return false;
                 }
             }
@@ -118,7 +114,7 @@ public class Grid {
         if (!this.canPlayPiece(gamePiece, placeX, placeY)) return false;
 
         logger.info("Placing block at x:{} y:{}",placeX,placeY);
-        multimedia.playSound("place.wav");
+        Multimedia.playSound("place.wav");
         int[][] blocks = gamePiece.getBlocks();
         placeX = placeX - 1;
         placeY = placeY - 1;
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java
index 8279850..b5fbf96 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/ChallengeScene.java
@@ -1,19 +1,26 @@
 package uk.ac.soton.comp1206.scene;
 
 import javafx.beans.property.Property;
+import javafx.beans.value.ObservableValue;
+import javafx.geometry.Insets;
 import javafx.geometry.Pos;
 import javafx.scene.layout.*;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.Paint;
 import javafx.scene.text.Text;
 import javafx.util.converter.NumberStringConverter;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import uk.ac.soton.comp1206.component.GameBlock;
 import uk.ac.soton.comp1206.component.GameBoard;
+import uk.ac.soton.comp1206.component.PieceBoard;
 import uk.ac.soton.comp1206.game.Game;
 import uk.ac.soton.comp1206.ui.GamePane;
 import uk.ac.soton.comp1206.ui.GameWindow;
 import uk.ac.soton.comp1206.utility.Multimedia;
 
+import java.util.ArrayList;
+
 /**
  * The Single Player challenge scene. Holds the UI for the single player challenge mode in the game.
  */
@@ -22,8 +29,6 @@ public class ChallengeScene extends BaseScene {
     private static final Logger logger = LogManager.getLogger(MenuScene.class);
     protected Game game;
 
-    private Multimedia multimedia;
-
     /**
      * Create a new Single Player challenge scene
      * @param gameWindow the Game Window
@@ -44,7 +49,8 @@ public class ChallengeScene extends BaseScene {
 
         root = new GamePane(gameWindow.getWidth(),gameWindow.getHeight());
 
-        var challengePane = new StackPane();
+        StackPane challengePane = new StackPane();
+        challengePane.setBackground(new Background(new BackgroundFill[] { new BackgroundFill((Paint) Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY) }));
         challengePane.setMaxWidth(gameWindow.getWidth());
         challengePane.setMaxHeight(gameWindow.getHeight());
         challengePane.getStyleClass().add("menu-background");
@@ -53,36 +59,41 @@ public class ChallengeScene extends BaseScene {
         var mainPane = new BorderPane();
         challengePane.getChildren().add(mainPane);
 
-        var board = new GameBoard(game.getGrid(),gameWindow.getWidth()/2,gameWindow.getWidth()/2);
-        mainPane.setCenter(board);
+        //Header of Challenge Scene
+        HBox header = buildHeader();
+
+        mainPane.setTop(header);
+
+        HBox boards = buildBoards();
+
+        mainPane.setCenter(boards);
 
+    }
+
+    public HBox buildHeader() {
+        //Header of Challenge Scene
         HBox header = new HBox();
 
+        //VBox to hold the Score title and value
         VBox scoreBox = new VBox();
         var scoreTitle = new Text("Score");
         scoreTitle.getStyleClass().add("heading");
         var scoreValue = new Text();
-        scoreValue.textProperty().bindBidirectional(game.getScore(), new NumberStringConverter());
+        scoreValue.textProperty().bind(game.getScore().asString());
         scoreValue.getStyleClass().add("score");
         scoreBox.getChildren().addAll(scoreTitle,scoreValue);
         scoreBox.setAlignment(Pos.BASELINE_CENTER);
 
         header.getChildren().add(scoreBox);
 
-        Region space = new Region();
-        space.setMaxWidth(140);
-        HBox.setHgrow(space,Priority.ALWAYS);
-        header.getChildren().add(space);
 
-        var challengeTitle = new Text("Challenge Scene");
+        //Challenge scene title
+        var challengeTitle = new Text("Challenge Mode");
         challengeTitle.getStyleClass().add("title");
         header.getChildren().add(challengeTitle);
 
-        Region space2 = new Region();
-        space2.setMaxWidth(140);
-        HBox.setHgrow(space2,Priority.ALWAYS);
-        header.getChildren().add(space2);
 
+        //VBox to store lives title and value
         VBox livesBox = new VBox();
         var livesTitle = new Text("Lives");
         livesTitle.getStyleClass().add("heading");
@@ -93,12 +104,60 @@ public class ChallengeScene extends BaseScene {
         livesBox.setAlignment(Pos.BASELINE_CENTER);
 
         header.getChildren().add(livesBox);
+
         header.setAlignment(Pos.CENTER);
+        header.setSpacing(140);
 
-        mainPane.setTop(header);
+        return header;
+    }
+
+    public HBox buildBoards() {
+        HBox boards = new HBox();
 
+        var board = new GameBoard(game.getGrid(),gameWindow.getWidth()/2,gameWindow.getWidth()/2);
         //Handle block on gameboard grid being clicked
         board.setOnBlockClick(this::blockClicked);
+
+        boards.getChildren().add(board);
+
+        VBox gameInfo = new VBox();
+
+        var hiScoreTitle = new Text("High Score");
+        hiScoreTitle.getStyleClass().add("heading");
+        gameInfo.getChildren().add(hiScoreTitle);
+
+        var hiScoreVal = new Text("10000");
+        hiScoreVal.getStyleClass().add("hiscore");
+        gameInfo.getChildren().add(hiScoreVal);
+
+        var levelTitle = new Text("Level");
+        levelTitle.getStyleClass().add("heading");
+        gameInfo.getChildren().add(levelTitle);
+
+        var levelVal = new Text();
+        levelVal.textProperty().bind(game.getLevel().asString());
+        levelVal.getStyleClass().add("level");
+        gameInfo.getChildren().add(levelVal);
+
+        var incomingTitle = new Text("Incoming");
+        incomingTitle.getStyleClass().add("heading");
+        gameInfo.getChildren().add(incomingTitle);
+
+        PieceBoard currentPieceBoard = new PieceBoard(gameWindow.getWidth()/6, gameWindow.getWidth()/6);
+        gameInfo.getChildren().add(currentPieceBoard);
+
+        PieceBoard nextPieceBoard = new PieceBoard(gameWindow.getWidth()/10, gameWindow.getWidth()/10);
+        gameInfo.getChildren().add(nextPieceBoard);
+
+        gameInfo.setAlignment(Pos.CENTER);
+        gameInfo.setSpacing(10);
+
+        boards.getChildren().add(gameInfo);
+
+        boards.setAlignment(Pos.CENTER);
+        boards.setSpacing(100);
+
+        return boards;
     }
 
     /**
@@ -109,14 +168,14 @@ public class ChallengeScene extends BaseScene {
         game.blockClicked(gameBlock);
     }
 
+
     /**
      * Setup the game object and model
      */
     public void setupGame() {
         logger.info("Starting a new challenge");
-        multimedia = new Multimedia();
-        multimedia.playBackgroundMusic("game_start.wav", false);
-        Multimedia.getBackgroundPlayer().setOnEndOfMedia(() -> multimedia.playBackgroundMusic("game.wav", true));
+        Multimedia.playBackgroundMusic("game_start.wav", false);
+        Multimedia.getBackgroundPlayer().setOnEndOfMedia(() -> Multimedia.playBackgroundMusic("game.wav", true));
         //Start new game
         game = new Game(5, 5);
     }
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java
index 7d65d35..82084aa 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/scene/MenuScene.java
@@ -19,8 +19,6 @@ public class MenuScene extends BaseScene {
 
     private static final Logger logger = LogManager.getLogger(MenuScene.class);
 
-    private Multimedia multimedia;
-
     /**
      * Create a new menu scene
      * @param gameWindow the Game Window this will be displayed in
@@ -73,9 +71,7 @@ public class MenuScene extends BaseScene {
         mainPane.setTop(menuWidgets);
         mainPane.setCenter(menuButtons);
 
-        multimedia = new Multimedia();
-        multimedia.playBackgroundMusic("menu.mp3", true);
-
+        Multimedia.playBackgroundMusic("menu.mp3", true);
     }
 
     /**
@@ -91,7 +87,7 @@ public class MenuScene extends BaseScene {
      * @param event event
      */
     private void startGame(MouseEvent event) {
-        multimedia.stopSound();
+        Multimedia.stopSound();
         gameWindow.startChallenge();
     }
 
diff --git a/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java b/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java
index 7019bc0..ad81aba 100644
--- a/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java
+++ b/tetrecs/src/main/java/uk/ac/soton/comp1206/utility/Multimedia.java
@@ -13,7 +13,7 @@ public class Multimedia {
   private static MediaPlayer mediaPlayer;
   private static MediaPlayer backgroundPlayer;
 
-  public void playBackgroundMusic(String music, boolean toLoop) {
+  public static void playBackgroundMusic(String music, boolean toLoop) {
     String toPlay = Multimedia.class.getResource("/music/" + music).toExternalForm();
     try{
       Media play = new Media(toPlay);
@@ -30,7 +30,7 @@ public class Multimedia {
     }
   }
 
-  public void playSound(String sound) {
+  public static void playSound(String sound) {
     String toPlay = Multimedia.class.getResource("/sounds/" + sound).toExternalForm();
 
     try{
@@ -45,8 +45,13 @@ public class Multimedia {
     }
   }
 
-  public void stopSound() {
-    backgroundPlayer.stop();
+  public static void stopSound() {
+    if (mediaPlayer != null) {
+      mediaPlayer.stop();
+    }
+    if (backgroundPlayer != null) {
+      backgroundPlayer.stop();
+    }
   }
 
   public static MediaPlayer getBackgroundPlayer() {
diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/component/GameBlock.class b/tetrecs/target/classes/uk/ac/soton/comp1206/component/GameBlock.class
index 7c9c377343b37d114af6e8c5f0f596739e75fa20..191944d061dfb8e127c3714cc9e7ba0b0dea72d2 100644
GIT binary patch
delta 2200
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

delta 1665
zcmaE-dP$M%)W2Q(7#J9A8Ln;Q+Q=-x$q>X4%+3(P!w||4#>gNs`5}wM<T_T(ya*nK
zNCr1X2KM6A61U8p94-bQhG-s!7={2w29C7MoSdN4<PwnXI39+0kXBYFA4g|zkg`M`
zh9r<y&f?UP;F6;J>{O6w3J*gnNHbS4SO}z@i@}&7orfWVA#<_-n=yAbLk>GbE)PQ<
zL;hqxwp_MC9)==@;>icu^y`BdN_iN{K-O@F1UdQz2RH_~`h|e3ui#;*1c`IFxVi=e
zc=~yR1gm)%YCwX_L9Q+!ejN`(J&4cdALQug?g|oW<Y8z63q`v6`1pr|gj#qQT0uhG
z5Fz&<S64rfcsox$LkCEL#mCbZthtMap&KN?3Rlz1!_Ws3;dF5f@`j5};9-~u66FPn
zhJ*$MhWdL3gH4#s!!QLT!wqtFuy>@BPbgS?8V|#CkT{EDV5lR=@|ipgvlyJh7#X-g
zBEF76o_=73b9fl$f)&Da&gWrR021Kwb#?I!^$iFO3h)7|T*Sk$m?3Pl0Y@y;<i%Wv
z`HpZg9A!Ah&TyQE;RM6U%_ZC{jEtuz-{ml#yoN_k`79R$FT*(=hE)u!1sGN{GVplj
z<)s!m=Oh*vrxvp_Tw-KUoh;8IJDH1@i{%O<gB+M+$}7$ciYk9zN7f|_j0{UBPvwnr
zU&g?|V8p<~z`)?ez{23bAi&_wAj;swAkE;*pvd6IpvK_Opv@4(V8{^6V9pT6V9gN8
z;K2~Zu$+N`!H$8Afq}u3VFkm=$!2`!^{W_GGcYkMWnf@PW?*DsVPIfj)!N3Oy^(=|
zftdkh5f=j!SdxVy1#Ey8L=ngU1`uFnSi`WEff1yUVI9MIuxeI@4GilUm>EE(@Id9(
zFl=IAWZ2BWz`(??g@KVlmw}Cek%4jP<hOiA^&pFczy@bCa53aC2r}d|C@>U)Erb}L
z2(@r40|NsK1Ct;h0~6RUj9|BSF>rz{w$s|i;O?W%$EUT0K}>54gVZ(#Z|zMCf!i3u
zQ3Rv3H!;L+V@QAs)<cvggWSsm_O%=XI|BnlIRh(06@xHCErS$89fJl#BZEFe6N4>7
zGuUBb5G$b$V`Z>p*v7D(fsuiU!Ii-c6j=-m43ii*8JHOu7;Hce^VLCdn2z=~hH$V@
zJ<PFDIuLh(MPY&%&gx=dW$0xPW|+Vr!7!0QjbRFdF2hs?YldlHXDL7|ggT3X!G>W6
z!%hZ9237`humhPG7#VgkSVJAC4~hg+Q0!@KVUS$|jvi2KfFg&1VJ_H2NDQz-O=M))
z4beT>QBX`Bp>`=&wR@my>jWjiu?#VHEs|OexVae&nb5Qt%)kT=Tu!Ym3_RM~7}7v7
zgPb0>GH@_#0~-Q~1x~0T3=EtMd%@`uqyyq`kO(O4)k6~BJ_Zhk{ouq0O7+vhsg8l6
zT8MWCL)K=70s(=&3_+31n;1%hBUv^vlm|z$Zepkkj%3@!P#YY{zKNkBIFe%%LvwJX
z0NW;pw%|ws_Du|(!I1(Sn;3e6BLz4&G4uyV3UF;=m=qi-z`coKYH*|g&nAW$!I6;y
zyqg$i2S*C<ZDN=g94WxRiD6;zW(IqZQyIa@4wBi#7&sWD8JHOkfMeqz!yyI+29Q?{
dGcYrpVmQNap5X!m0|OTWBf~|8%M4c;BmrA=J`ex^

diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/Game.class
index 7e03052f6beac83c683a6cc7985ca105d8c325b4..54142e5420e92cd5cec8ffadb11a9b80935bf8b5 100644
GIT binary patch
literal 6194
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

literal 6340
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

diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/GamePiece.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/GamePiece.class
index 8590c34d155c9dc7b40da0d08787509f20795464..ddf9544daf0af815a0ae54f0b67fcb34868d21c6 100644
GIT binary patch
delta 286
zcmdlYw?%G)B3Hc{gAaoyLpy^O!(;}1hI0%C47V6e8ATb)7!?_;8Dki17&90g85c7+
zF|KEDXMDxr!T6oQm&u61kI9}Pn5l{(gsGh&lIajb6w`TzcxEn!1ZHuDROTRtH0F4Q
zZ01=EIn2u$3Yi}<6fwVNC}+`Ps9-T?sAVZ)sAH*TXl4l9ynu_Jk+YY9m7$-3i($g#
z9o*A3XECra%x2(Zn8U!wFqc7?VF80I!$JlvhD8kK42v1;85T0QGAv;5W>_}4f@ccj
z+R41UHjG;*d+~bm?qy(S*vG)lu$MuQ;lShtyw7xxF$gjoXOLq!!Jy4>lEH%EG=nR{
p8HON+vkdVJ=NWPsE-+LwTx4itxXjSaaAoplJ~zfYlYjA90RTk@M;HJA

delta 286
zcmdlYw?%G)B3HdCgAaoSLpy^e!(;|MhI0)147V6e7)2RO85J3<7-JZ$88a9h7#A}*
zGOlNEV|>Nn&iI|dhslV+m&u+Xh^dMpn5ms1g6R-LB-43@IA$(}cxG{i6y_j?ROWbw
zEaq7Z+04rs3YZ@;6f(bOC}YuLC}%Nes9`B$sAZ{VXkrN5ynu_Jk+X+^m7$M;i=lt=
z4({oiGZ|PIW-)Lw%x2(Yn8P5<FrPt|VF7~{!$JmghD8ka3=0@s8Rj#1Gc284!83(%
z&17C)8^$e@y?8x&_b{+C>}B9)*ux;muz&Ib-e<Z;83Y-QF~~6-XV7Li!C=8~iouoP
oG(!->8HRX<a|}5Q=NT#)E-<t)Tw>^ExIB3?pBv-t$-nrl03cdM*8l(j

diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/game/Grid.class b/tetrecs/target/classes/uk/ac/soton/comp1206/game/Grid.class
index 2db3128f7f1a99970c6eb3b5f28bc952ebf73173..002e059f2affcc6dc3522671f50858fd1a9f5865 100644
GIT binary patch
delta 1341
zcmew=`dp0b)W2Q(7#J9A8Ok<t1u)5RFjz7&aHJ(>=IE6tmT@syGuW^**zz#gF_<$l
zs87yk6xAp#$;`<tsnqu^%_+&uO-;#6WMtqh$VsdW&M(bN;bP!maNuEZWN@0C!epoI
z!pI;Mkdv64nU}7Rl#`#Ft&muvP+?VFt59iGUCYJb#^BD*;K9S-$>25lER!{x4-bPG
zgYRTMW*b!w27idb$*B;xa4-b&Fvu_jF*2}eczSwjhOsk*Oio~y<qKm7XJ?4uVTfdi
zVq{RBe34mZ^K#}%jEs4ctyoK0qZt?(VkU244G)fGU|`T<;9_84&}Lv^&|%<Y&}HCb
zFkp~iFlLZvFk#SOFlDf0Fk!G~FlKONuwaN|U|=v|U}aEZkY$Kx;9+24kYdngNMPV$
zU}j)oaAQbhNSYkSCeD~Vxr|MLJ%u3^Y|~sesd|u2Yz&MH3=EE7Qxw2DI6*oXK!6i$
z9!Q=OY#tK>BgkhU{R|8Ykqk@>EDQ_`yjoirgrtpRjAXYlNNr?bU|?bZ8O+7N#K6Gd
z&A`Lp12$X>q8M&CFM~43wII`Zp{6r1@G_)<-Ob1#&!7#mXL2OF2H2f^V7G-c@GwL$
z@G?ZfjpSuuVn}Dm0L${j4d;iuoF8g-G6Mqx8v~;cJA)zvBPilQrZX@wg2I@Cfq@}i
zdmDqY6^jf@imfb5iXF2Vt0=1^%f3Yn{>=4eY@%$EETXJN`xY@+gBhZ1dS>jR?6Vly
zmNO`8iL%Nhh_cBhY-7-z$sn?cK}X17Cxa0agOJ4z1}o+@Eo_X-{~u^!WnBJ$J<A#f
z1_owu09i5cF)%R1Gq5ovFmN#>GVn1ZGe|O|FsL)6G8i(XF<3IBGk7p$Fa*^zWHN*^
zWHCfCq%g!YBr~Kk<bk~(#K6H|$e;lZGIj<T24}EW*%$;FLcrc<1$he|B<T#93|ZjF
zPG`tw-~q=@IztXPxY-yI8FCr&7+4rU!6e1N_Lo7Bogts`4+9tD9|jj0#$OEbzZh75
zF|aZ)G88a4LBr0LfrSASb`@IMGP2tk>}N5sGOq!7-&tk{gRATg2G^Yo-Yg74emfYf
zCYx}&)dzrs;u1J04q^mF5d#lH34<I%DT6XY8G|N6IfE`k1%n|&6@v{!HG>yJ4MPY+
zEkg`L9YYpFHA4YI6+;<ABRnKR7{s6<Vb5R)4G9wlCwNFyFeF+tB!QAOLj^o2D&Rp;
z0SyXG27jcWkY-@#`OBcr&X7OZfJ?N#kU;_Bbq0L~MsQfNYHeX)2gNBQ(L-`mC)iOu
z5CzZ(U}Px5s+kvE^F%C~IT(sTiPw-JhJgW`enH;g6bjzK5W1N`2bAX+!AS~Yy%+-{
KLkTz^mI46hm&Y9d

delta 1242
zcmaDZ_EnVY)W2Q(7#J9A8FDvr1u$`OF>o+g@-SF2SWn){WT$P*$RHJvlbD>Dm#&bM
zlb@WekXWKnVO3qLP-#_N%f(>N;K0t{$iv{o;5=E5*_zFjhrx`&ZE`%bjTp!z4;}^?
z22Vx?HVsctPt7oP2JguSm}U8V8T{B8{COAx7y=m?lqVaq$ZTe3nZ(GLI(ZgrDQge|
zBSY|H5w`H)5C#SYEe0+y$-<z`z{#M)z{jA^Ai-e7AkSdTpuu3mV98+2V9#L0;L2dm
z5X!*7V8X!4pu`}{5XQj6z``KKpv@4@z{9}Iz`)?f5Wx^Rc^{iNW7OnpYzpkr3^8Dv
z{<2BcgKT1BU}RumZ~&X40M@|?(!l@%oM7`n@|<Avm>3vAJ_G4zU|@)3U}9ilU|`_Y
z+QJ|tZ6sqPyNy9=BLf2i69dR#E(RtB1_mz%9tLl);aU*IaKm{SltHcqna&F}oq>Uu
zAr|azMh1BXZIC^acd~1M-N^@b8%Reu1201)+(=#qCWbhMc(5!#+;D!l%lV;ZM=>xk
zurV<Durnw!FoI$lWI6)_qY?uP0|x^GLz4D324yQ28I}}VS(X$#W;0e%R!Nq9ix|9^
z>&@6i*(6y+S&jBBVlV?UMA`Jr*hSfAF|aLXkkb-nl}Qj~lTFyhpgEI)e-nd_kikv{
zBPIssH7#t6%l{v3VP#zYe+$bR1_lOZaM+kJ@G>wk#4)fj#4~U)BrxzXBr!-bBr~Wp
zq%asVq%v4Cq%n9fq%#CDWH5v<)F(4UF(ff0Fyw%J9mK%FV91~h4k>m983sGB57`(5
z8T`S%W(D~M9ugpZiQqU+Vn|}(0Y^#_Lozs&*%)FNQW#PhSQtQ|BgMe>mqC!7A&v15
z0~g~T1{ua*3{t-sSbv!@ure?*q%&AUgUkdPWW`$AGP2tkEM_sVGOq#o+D2vvgPrUS
z2D_aME-Va_7je4PyMsgE5;z17VuU~e0}n$HgB(LKg9<|lg9bw>gAPMEgE>P5gDXQN
zgFizRLpVb<Ln=cBLpDP>Lm@*QJOKO|#GnCS#b5{x0DT50cmNbb0w9=yfuWcofdLW%
z#qba)hK7I&gFjLTNHehW{AEx=4FX<J5P(A<gFyil0+aV~iGh<OB<r++-NXY9VpfQ)
z42%q!5VZ^p4EhX=5IL<a47{Ku0LdN@&3#xjb1-CqQYr(;?Vz*@&WS=^I~aU6Gw6Ww
X7b8Q62qZN#FffQRFfwF=GhGe<Hq)((

diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/ChallengeScene.class
index d3b846bf114e63d4cac1d643ca442a651e0a42dc..db3f11b372bf64a21aa8eddfd74d0f4317da0970 100644
GIT binary patch
delta 4004
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

delta 2952
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
L6Qc{G8-pYOQbDkL

diff --git a/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class b/tetrecs/target/classes/uk/ac/soton/comp1206/scene/MenuScene.class
index 71d171fc0b09428b00659938d81a5d448b8b49c5..ab27c55069861c8e139ae82305e1f07cad2366a0 100644
GIT binary patch
delta 808
zcmdm`cv*q#)W2Q(7#J9A86Iuqa$=X}V3^6sz>%ApSE`p=V9doZn_&(+!(1MQc?|O>
z`?G6JzR7NAKbv7855pn`dqxJ%;*$J=;QZ3O6fOoGh9x`<OF^Q1#U+VFCC(X%IXS6$
z>8V@{%NbU%GpyucSjDiKkwJNKKZnfbR1PO5z7t#wCmBw$Go0pOP-ZwYc`Mfu`E!g6
zTu!B#IVqWW=?aYeYz!B;7%nngVrRI_!*GS+>gE~TER2lTC(q@PRldo^z`<~fhhaa%
z0Re^sj0`-Ud3mWt&N+$2#i_;Y4EGorR3|^=Qe|Ujc)-XYH~Ar#++;OgAyGyKDF$u^
z9tH*mRt81}Rt7c(Mus($LwOZl*D^3L@G&qmFfd3nurkOn@H5CVtYctc5My9sU|<kn
zSkJJ50R#jXG#RuQ7#SEDHZs_QbTcq8flT6HU|>|;yqi~!v0i8f%MONF8yOfFm>59D
z7BR>$Ffgbvh%l%z=rU+9m@;TGI5KE4_%diSL^9|wq%-I-<TL0qR52JbG%*-6bTgPR
zOlB};n9X3uu$;k?VH1ND!+r*9hSLnT3|AQJ8SXPUFuY-KWcbeD#K^+n!pOtm$|%g>
z&M3j)!6?VzRnMrx;0<<r5Chm%P`8^hd|=qbu$h68A)jFz!xo0E3``7742v1IF>GgG
zX6R;^#jt~6Cj$$^CWc~$T@1S!SQ)M`1TySl*v`PlaG$}AVK2jO26hHUhJ7%9GiWm~
zFff8J!mn%$jP(o*48dUgc_6Y-`<XzI1qm?*cLqjqxN`4cSfI6qL46y;VuTrxXozB9
zW{76sVu%471&Ic3s8I|I+zba94lyt?a4;N(J4X?09fL0erx3>uhGm->*g<A8g5v-b
z(F_bC49pBi!0~dF;TQu0gAfA~!*K>ihO-Rk8JHQaG2CFd&2Wc-fq{#Gk>M`GeTIh&
Fk^ru+pd0`I

delta 912
zcmcbtuuGBa)W2Q(7#J9A8J=(Ca$;v=XPC*zpgyrtbaFkrkUST|3<f(+1`dWfJPdOg
z<}osG<(B4@Wag%(WF|5)XigSn69cJ}wB}$~z{tRno0?aums?;A(zb|)VKKv!$rITP
zZDuem<6&6NV9&_FSzMA|5S(9{m%_!M!?2QvVHHS}uec<!sKhxVF()TAFFlouVGYAt
zc7}C44C@&-Z2rfd$i#P+i{Tu@d3J^iJPgVV7boX(9g)Ax$iU@PnwgW5nU}7>$j`=b
zm5bpT!*zCs8$1j*8E$P3;AUZTyu-*KuHloFSeBSpp`TionpdLl3L>pF!}wVl?r|}2
zFx=;1IKpsLfZ-@31CM83UTTqZPGWI!YB4**V@3wm$p^W`CvV{5V`FD{%E%xG<+4w{
z$0H=m#304M&A`LJz`z6w90mpkRt81}Rt7c(Muv@(S$P#*H!(0U@G&qmFfhn6urkOo
z@H5CWY-V6!5My9sU|<kn*ut=t0R#jXG#RuQ7#SEDwlUa)bTcq8i7>D-a4;}1nrzPI
zm1C^e+RZQ{ay!GUtqilZwlK^Vn$NP0Vc|xw-5^`a7-Sh37}OX<7&I7k8MGKo8MGN3
z8FUzY8FU#U8T1&^84MWm84MY!7>pU37)%+u8O#_aGng~XX0Tvb&S1^3iNS_pKZ7m9
zX$E_SD-4bd_ZgfR-Y_^bd}nZBWMOb)tmk2HXB1}eWRzg=Vw7X>Vbo;sWi)2+2YV+7
z;!vn}Od0+&Y-iZPz{rr#aFk&u!!8CUh9-th47(ZjFfcQ8GpuCT%dn4ug<%sz6T^On
z0}QMTR~Ql)4l?XvU}Lz?5Xx|f;Q#|W10%y>SWqx%GceRMFfuSOFd{q*3S<U`aIpP6
z5J{;0OrZFL1R{es10y)7`9Wc}jbW+Q76$cg3@Z@EKw>A3ft?|qfsY{pY#bzZ_@Txz
zFz_=RV@Ns9z{tSCa02coMX;R=44gt7I~Z1PW?%=I$;beT3y9N17?>GOg5&2D!)XQv
p1|bF}hBFL|43`+LFfcRRX1L4nfZ-tn0|OTWBf}$xCk)RRBmosNzbpU%

-- 
GitLab