From e397d69d7ae0cda9e3829ee814240d1c76caaebe Mon Sep 17 00:00:00 2001
From: lars <larslukasneuhaus@gmx.de>
Date: Wed, 23 Oct 2024 22:43:14 +0200
Subject: [PATCH] added score above playfield

---
 .../game/stateless/types/tetris/Tetris.java   |  2 +-
 .../types/tetris/game/Playfield.java          | 56 ++++++++++++++++++-
 .../types/tetris/game/TetrisGame.java         | 12 ++--
 3 files changed, 62 insertions(+), 8 deletions(-)

diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
index 75bedec..b52376d 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/Tetris.java
@@ -143,7 +143,7 @@ class Tetris extends StatelessGame {
         if(this.tetrisGames.get(p) == null) {
             this.tetrisGames.put(p, new TetrisGame(
                 this,
-                getSpawn().sub(6, 8, 15).add(this.tetrisGames.size()*24, 0, 0),
+                getSpawn().sub(6, 8, 15).add(this.tetrisGames.size()*30, 0, 0),
                 Tetromino.Shape.J,
                 this.nextTetrominoesCount,
                 this.isFast,
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/Playfield.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/Playfield.java
index 3df931e..b5dd3a1 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/Playfield.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/Playfield.java
@@ -5,6 +5,7 @@ import eu.mhsl.minenet.minigames.util.BatchUtil;
 import net.minestom.server.coordinate.Pos;
 import net.minestom.server.instance.batch.AbsoluteBlockBatch;
 import net.minestom.server.instance.block.Block;
+import org.apache.commons.lang3.ArrayUtils;
 
 import java.util.Random;
 
@@ -12,6 +13,7 @@ public class Playfield {
     private final Pos lowerLeftCorner;
     private final StatelessGame instance;
     private final static int height = 22;
+    private final static Block scoreBlock = Block.STONE;
     private final int nextTetrominoesCount;
     private final Random random;
 
@@ -24,7 +26,7 @@ public class Playfield {
 
     public Pos getPlayerSpawnPosition() {
 //        return this.lowerLeftCorner.add(6, 9+((double) 3/16), 20).withView(180, 0);
-        return this.lowerLeftCorner.add(6, 9, 20).withView(180, 0);
+        return this.lowerLeftCorner.add(6, 12, 25).withView(180, 0);
     }
 
     public Pos getTetrominoSpawnPosition() {
@@ -36,7 +38,11 @@ public class Playfield {
     }
 
     public Pos getNextPosition() {
-        return this.lowerLeftCorner.add(14, 18, 1);
+        return this.lowerLeftCorner.add(15, 18, 1);
+    }
+
+    public Pos getScorePosition() {
+        return this.lowerLeftCorner.add(-5, height+3, 0);
     }
 
     public void generate() {
@@ -130,6 +136,52 @@ public class Playfield {
         }
     }
 
+    public void updateScore(int score) {
+        this.removeDigits();
+        String scoreString = String.valueOf(score);
+        char[] characters = scoreString.toCharArray();
+        ArrayUtils.reverse(characters);
+        for(int i = 6; i > 0; i--) {
+            char digit;
+            if(i <= characters.length) {
+                digit = characters[i-1];
+            } else {
+                digit = '0';
+            }
+            this.displayDigit(digit, 6-i);
+        }
+    }
+
+
+    private void displayDigit(char digit, int positionFromLeft) {
+        int[][] digitArray;
+        switch (digit) {
+            case '1' -> digitArray = new int[][]{{0,0,1},{0,1,1},{0,0,1},{0,0,1},{0,0,1}};
+            case '2' -> digitArray = new int[][]{{1,1,1},{0,0,1},{1,1,1},{1,0,0},{1,1,1}};
+            case '3' -> digitArray = new int[][]{{1,1,1},{0,0,1},{0,1,1},{0,0,1},{1,1,1}};
+            case '4' -> digitArray = new int[][]{{1,0,1},{1,0,1},{1,1,1},{0,0,1},{0,0,1}};
+            case '5' -> digitArray = new int[][]{{1,1,1},{1,0,0},{1,1,1},{0,0,1},{1,1,1}};
+            case '6' -> digitArray = new int[][]{{1,1,1},{1,0,0},{1,1,1},{1,0,1},{1,1,1}};
+            case '7' -> digitArray = new int[][]{{1,1,1},{0,0,1},{0,1,0},{0,1,0},{0,1,0}};
+            case '8' -> digitArray = new int[][]{{1,1,1},{1,0,1},{1,1,1},{1,0,1},{1,1,1}};
+            case '9' -> digitArray = new int[][]{{1,1,1},{1,0,1},{1,1,1},{0,0,1},{1,1,1}};
+            default -> digitArray = new int[][]{{1,1,1},{1,0,1},{1,0,1},{1,0,1},{1,1,1}};
+        }
+
+        for (int x = 0; x < 3; x++) {
+            for (int y = 0; y < 5; y++) {
+                if(digitArray[4-y][x] == 1) this.instance.setBlock(this.getScorePosition().add(positionFromLeft*4+x, y, 0), scoreBlock);
+            }
+        }
+    }
+
+    private void removeDigits() {
+        for (int x = 0; x < 4 * 6; x++) {
+            for (int y = 0; y < 5; y++) {
+                this.instance.setBlock(this.getScorePosition().add(x, y, 0), Block.AIR);
+            }
+        }
+    }
 
     private void moveAllLinesUp() {
         for (int y = height + 3; y > 1; y--) {
diff --git a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
index 29ea167..5057f0b 100644
--- a/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
+++ b/src/main/java/eu/mhsl/minenet/minigames/instance/game/stateless/types/tetris/game/TetrisGame.java
@@ -101,6 +101,7 @@ public class TetrisGame {
             return TaskSchedule.tick(Math.round((float) standardTickDelay /this.level));
         });
 
+        this.updateInfo();
         this.nextTetrominoes.forEach(tetromino -> {
             double xChange;
             switch (tetromino.shape) {
@@ -172,7 +173,7 @@ public class TetrisGame {
             return false;
         }
         this.score += 1;
-        this.updateSidebar();
+        this.updateInfo();
         return true;
     }
 
@@ -183,10 +184,10 @@ public class TetrisGame {
             return false;
         }
         this.score += 2;
-        this.updateSidebar();
+        this.updateInfo();
         while(this.currentTetromino.moveDown()) {
             this.score += 2;
-            this.updateSidebar();
+            this.updateInfo();
         }
         this.setActiveTetrominoDown();
         return true;
@@ -266,7 +267,8 @@ public class TetrisGame {
         ));
     }
 
-    private void updateSidebar() {
+    private void updateInfo() {
+        this.playfield.updateScore(this.score);
         this.sidebar.updateLineScore("0",  this.score);
         this.sidebar.updateLineScore("1", this.lines);
         this.sidebar.updateLineScore("2", this.level);
@@ -332,7 +334,7 @@ public class TetrisGame {
         this.level = (int) Math.floor((double) this.lines / 10) + 1;
         this.holdPossible = true;
 
-        this.updateSidebar();
+        this.updateInfo();
 
         this.currentTetromino.setPosition(this.tetrominoSpawnPosition);
         this.currentTetromino.draw();