From 6cc7b95852c91ed630e06cdbbec90bd80850b1cb Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Fri, 1 Aug 2025 17:59:48 +0200 Subject: [PATCH] feat: scale speed based on level --- .../java/eu/midnightdust/yaytris/Settings.java | 1 + src/main/java/eu/midnightdust/yaytris/Tetris.java | 13 +++++++++++++ .../java/eu/midnightdust/yaytris/game/Space.java | 3 ++- .../eu/midnightdust/yaytris/ui/AbstractMenu.java | 6 +++++- .../java/eu/midnightdust/yaytris/ui/ScoreMenu.java | 14 ++++++++++++++ .../eu/midnightdust/yaytris/ui/SettingsMenu.java | 8 ++++++++ .../eu/midnightdust/yaytris/util/NightJson.java | 1 + tetris_settings.json5 | 3 ++- 8 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/midnightdust/yaytris/Settings.java b/src/main/java/eu/midnightdust/yaytris/Settings.java index 5a2a370..515d465 100644 --- a/src/main/java/eu/midnightdust/yaytris/Settings.java +++ b/src/main/java/eu/midnightdust/yaytris/Settings.java @@ -9,6 +9,7 @@ public class Settings { public static int musicVolume = 100; public static int soundVolume = 100; public static float guiScale = 3.f; + public static boolean shouldScaleSpeed = true; public static Difficulty difficulty = Difficulty.NORMAL; public static void load() { diff --git a/src/main/java/eu/midnightdust/yaytris/Tetris.java b/src/main/java/eu/midnightdust/yaytris/Tetris.java index 41be977..81440a3 100644 --- a/src/main/java/eu/midnightdust/yaytris/Tetris.java +++ b/src/main/java/eu/midnightdust/yaytris/Tetris.java @@ -59,10 +59,23 @@ public class Tetris { public static void updateScore(int score) { if (ui.getMenuPanel() instanceof ScoreMenu) ((ScoreMenu) ui.getMenuPanel()).updateScore(score); + updateLevel(score); } public static void updateTime() { if (ui.getMenuPanel() instanceof ScoreMenu) ((ScoreMenu) ui.getMenuPanel()).updateTime(startTime); } + public static void updateLevel(int score) { + int newLevel = Math.max(0, (int) (score / 1000f)); + if (newLevel != space.level) { + if (gravityTask != null && Settings.shouldScaleSpeed) { + gravityTask.cancel(); + gravityTask = new GravityTimerTask(); + timer.scheduleAtFixedRate(gravityTask, 0, Math.max(10, Settings.difficulty.getTimerPeriod() - (Settings.difficulty.getTimerPeriod() / 8) * newLevel)); + } + space.level = newLevel; + if (ui.getMenuPanel() instanceof ScoreMenu) ((ScoreMenu) ui.getMenuPanel()).updateLevel(newLevel); + } + } public static class GravityTimerTask extends TimerTask { @Override diff --git a/src/main/java/eu/midnightdust/yaytris/game/Space.java b/src/main/java/eu/midnightdust/yaytris/game/Space.java index a977d56..239a345 100644 --- a/src/main/java/eu/midnightdust/yaytris/game/Space.java +++ b/src/main/java/eu/midnightdust/yaytris/game/Space.java @@ -13,6 +13,7 @@ public class Space { private TetrominoShape nextShape; private Tetromino currentTetromino; private int score; + public int level; public Space() { gameMap = new Color[14][8]; @@ -79,7 +80,7 @@ public class Space { gameMap[line][i] = newBlobs[i]; } if (Arrays.stream(gameMap[line]).noneMatch(Objects::isNull)) { // Line completed - combo += 10; + combo += 40; completedLines.add(line); combo *= completedLines.size(); } diff --git a/src/main/java/eu/midnightdust/yaytris/ui/AbstractMenu.java b/src/main/java/eu/midnightdust/yaytris/ui/AbstractMenu.java index 0a5a257..ac2d3d7 100644 --- a/src/main/java/eu/midnightdust/yaytris/ui/AbstractMenu.java +++ b/src/main/java/eu/midnightdust/yaytris/ui/AbstractMenu.java @@ -9,8 +9,12 @@ import static eu.midnightdust.yaytris.ui.TetrisUI.setFontScale; public class AbstractMenu extends JPanel { @Override public Component add(Component comp) { - comp.setBounds(scale(60), scale(20+23*this.getComponentCount()), scale(100), scale(20)); + comp.setBounds(scale(60), scale(20+getSpacing()*this.getComponentCount()), scale(100), scale(20)); if (comp instanceof JComponent) setFontScale((JComponent) comp); return super.add(comp); } + + public int getSpacing() { + return 23; + } } diff --git a/src/main/java/eu/midnightdust/yaytris/ui/ScoreMenu.java b/src/main/java/eu/midnightdust/yaytris/ui/ScoreMenu.java index cd6c804..51505c0 100644 --- a/src/main/java/eu/midnightdust/yaytris/ui/ScoreMenu.java +++ b/src/main/java/eu/midnightdust/yaytris/ui/ScoreMenu.java @@ -15,6 +15,7 @@ public class ScoreMenu extends AbstractMenu { final PreviewCanvas previewCanvas; final JLabel gameOverLabel; final JLabel currentScoreLabel; + final JLabel currentLevelLabel; final JLabel currentTimeLabel; ScoreMenu(int x, int y, int width, int height, TetrisUI ui) { @@ -34,6 +35,9 @@ public class ScoreMenu extends AbstractMenu { this.currentScoreLabel = new JLabel("Score: 0"); this.add(currentScoreLabel); + this.currentLevelLabel = new JLabel("Level: 0"); + this.add(currentLevelLabel); + this.currentTimeLabel = new JLabel("Zeit: 00:00"); this.add(currentTimeLabel); @@ -58,4 +62,14 @@ public class ScoreMenu extends AbstractMenu { public void gameOver() { this.gameOverLabel.setText("Game over :("); } + + public void updateLevel(int level) { + this.currentLevelLabel.setText(String.format("Level: %s", level)); + this.repaint(); + } + + @Override + public int getSpacing() { + return 17; + } } diff --git a/src/main/java/eu/midnightdust/yaytris/ui/SettingsMenu.java b/src/main/java/eu/midnightdust/yaytris/ui/SettingsMenu.java index dce21d0..9ce5a2d 100644 --- a/src/main/java/eu/midnightdust/yaytris/ui/SettingsMenu.java +++ b/src/main/java/eu/midnightdust/yaytris/ui/SettingsMenu.java @@ -41,6 +41,14 @@ public class SettingsMenu extends JPanel { }); this.add(scaleSlider); + this.add(new JLabel("Geschwindigkeitszunahme:")); + JCheckBox speedCheckbox = new JCheckBox("Aktiviert", Settings.shouldScaleSpeed); + speedCheckbox.addChangeListener(change -> { + Settings.shouldScaleSpeed = speedCheckbox.isSelected(); + Settings.write(); + }); + this.add(speedCheckbox); + this.add(new JLabel("Schwierigkeit:")); JComboBox difficultySelector = new JComboBox<>(Difficulty.values()); difficultySelector.setSelectedItem(Settings.difficulty); diff --git a/src/main/java/eu/midnightdust/yaytris/util/NightJson.java b/src/main/java/eu/midnightdust/yaytris/util/NightJson.java index 3b90498..d840ab5 100644 --- a/src/main/java/eu/midnightdust/yaytris/util/NightJson.java +++ b/src/main/java/eu/midnightdust/yaytris/util/NightJson.java @@ -94,6 +94,7 @@ public class NightJson { case "long": return Long.parseLong(currentString); case "float": return Float.parseFloat(currentString); case "double": return Double.parseDouble(currentString); + case "boolean": return Boolean.parseBoolean(currentString); } if (field.getType().isEnum()) return Arrays.stream(field.getType().getEnumConstants()) .filter(enumConstant -> Objects.equals(enumConstant.toString(), currentString)).findFirst().orElseThrow(); diff --git a/tetris_settings.json5 b/tetris_settings.json5 index e0ab6d7..88b2b41 100644 --- a/tetris_settings.json5 +++ b/tetris_settings.json5 @@ -1,6 +1,7 @@ { - "musicVolume": 100, + "musicVolume": 25, "soundVolume": 100, "guiScale": 6.0, + "shouldScaleSpeed": false, "difficulty": "Normal" } \ No newline at end of file