Browse Source

Settings hinzugefügt, variables Volumen, Sprache im Programm ändern, Menus outsourced

Jan 5 months ago
parent
commit
a9a97bf1b1

+ 7 - 5
src/main/java/controller/GameController.java

@@ -326,16 +326,18 @@ public class GameController implements Runnable, Serializable {
     }
 
     /**
-     * Toggles between PLAY and PAUSED or exits INVENTORY state.
+     * Toggles between PLAY, PAUSED or exits other menus.
      */
-    public void togglePauseOrExitInventory() {
+    public void handleEscape() {
         GAMESTATE state = view.gameState;
-        if (state == GAMESTATE.INVENTORY) {
+        if (    state == GAMESTATE.INVENTORY
+                || state == GAMESTATE.PAUSED
+                || state == GAMESTATE.SHOP) {
+
             view.gameState = GAMESTATE.PLAY;
+
         } else if (state == GAMESTATE.PLAY) {
             view.gameState = GAMESTATE.PAUSED;
-        } else if (state == GAMESTATE.PAUSED) {
-            view.gameState = GAMESTATE.PLAY;
         }
     }
 

+ 2 - 4
src/main/java/controller/input/GameMouseListener.java

@@ -59,10 +59,8 @@ public class GameMouseListener implements MouseListener, MouseMotionListener {
         }
         if (gamePanel.gameState == GAMESTATE.INVENTORY && e.getButton() == MouseEvent.BUTTON1) {
             controller.handleInventoryClick(e.getX(), e.getY());
-        }else if(gamePanel.gameState == GAMESTATE.PAUSED){
-            gamePanel.ui.handleMenuClick(e.getX(), e.getY());
-        }else if(gamePanel.gameState == GAMESTATE.MAIN_MENU){
-            gamePanel.handleMainMenuClick(e.getX(), e.getY());
+        }else{
+            gamePanel.handleMenusClicks(e.getX(), e.getY());
         }
     }
 

+ 1 - 1
src/main/java/controller/input/KeyHandler.java

@@ -29,7 +29,7 @@ public class KeyHandler implements KeyListener {
             case KeyEvent.VK_D -> rightPressed = true;
             case KeyEvent.VK_UP -> controller.zoomInOut(1);
             case KeyEvent.VK_DOWN -> controller.zoomInOut(-1);
-            case KeyEvent.VK_ESCAPE -> controller.togglePauseOrExitInventory();
+            case KeyEvent.VK_ESCAPE -> controller.handleEscape();
             case KeyEvent.VK_E -> controller.toggleInventory();
             case KeyEvent.VK_R -> controller.toggleShop();
         }

+ 2 - 1
src/main/java/main/Main.java

@@ -15,7 +15,8 @@ public class Main {
 
     public static void main(String[] args) throws IOException {
 
-        Translator.load("lang/de_de.json");
+        Translator.set_de_de();
+
         EconomyInfo.load();
         SoundManager.getInstance().loadAllSounds();
         MusicManager mm = MusicManager.getInstance();

+ 0 - 1
src/main/java/model/GameSaver.java

@@ -33,7 +33,6 @@ public class GameSaver {
             return controller;
         } catch (Exception e) {
             System.out.println("Failed to load save file. Starting a new game...");
-            e.printStackTrace();
             return new GameController();
         }
     }

+ 1 - 1
src/main/java/util/GAMESTATE.java

@@ -5,5 +5,5 @@ public enum GAMESTATE {
     PAUSED,
     INVENTORY,
     QUIT,
-    MAIN_MENU, SHOP, SAVE
+    MAIN_MENU, SHOP, SETTINGS, SAVE
 }

+ 31 - 0
src/main/java/util/Settings.java

@@ -0,0 +1,31 @@
+package util;
+
+import view.sound.MusicManager;
+import view.sound.SoundManager;
+
+public class Settings {
+    private static float volume = 100;
+    private static String language = "DE";
+    private static boolean fullscreen = true;
+
+    public static float getVolume() { return volume; }
+
+    public static void toggleVolume() {
+        volume = (volume + 10) % 110; // 0–100
+        MusicManager.getInstance().setVolume(volume);
+        SoundManager.getInstance().setVolume(volume);
+    }
+
+    public static String getLanguage() { return language; }
+    public static void toggleLanguage() {
+
+        language = language.equals("DE") ? "EN" : "DE";
+        Translator.toggleLang(language);
+
+    }
+
+    public static boolean isFullscreen() { return fullscreen; }
+    public static void toggleFullscreen() {
+        fullscreen = !fullscreen;
+    }
+}

+ 15 - 1
src/main/java/util/Translator.java

@@ -6,9 +6,16 @@ import java.util.Map;
 
 public class Translator {
     private Translator(){};
-
     private static Map<String, String> translations = new HashMap<>();
 
+    public static void toggleLang(String language) {
+        if(language == "DE"){
+            set_de_de();
+        }else{
+            set_en_us();
+        }
+    }
+
     public static void load(String filePath){
         translations.clear();
         try (BufferedReader reader = new BufferedReader(new InputStreamReader(Translator.class.getClassLoader().getResourceAsStream(filePath)))) {
@@ -26,6 +33,13 @@ public class Translator {
             e.printStackTrace();
         }
     }
+
+    public static void set_de_de(){
+        load("lang/de_de.json");
+    }
+    public static void set_en_us(){
+        load("lang/en_us.json");
+    }
     public static String translate(String key) {
         return translations.getOrDefault(key, key); // fallback to key if missing
     }

+ 31 - 13
src/main/java/view/GamePanel.java

@@ -10,8 +10,12 @@ import view.popUpMenu.PopupManager;
 import view.tile.TileManager;
 import util.GAMESTATE;
 import view.ui.InventoryView;
+import view.ui.menu.AbstractMenu;
+import view.ui.menu.MainMenu;
 import view.ui.ShopView;
 import view.ui.UI;
+import view.ui.menu.PauseMenu;
+import view.ui.menu.SettingsMenu;
 
 import javax.swing.*;
 import java.awt.*;
@@ -52,17 +56,20 @@ public class GamePanel extends JPanel{
     private ShopView shopView;
     public Camera camera;
     private MainMenu mainMenu;
+    private SettingsMenu settingsMenu;
+    private PauseMenu pauseMenu;
 
 
     public GamePanel(GameController controller) {
 
         this.gameController = controller; // get from controller
         this.camera = new Camera(this, controller.getKeyHandler());
-
+        this.settingsMenu = new SettingsMenu(this);
         this.tileManager = new TileManager(this);
         this.entityManager = new EntityManager(this);
         this.popupManager = new PopupManager(this, new ArrayList<>(Arrays.asList(tileManager, entityManager)));
         this.mainMenu = new MainMenu(this);
+        this.pauseMenu = new PauseMenu(this);
         this.shopView = new ShopView(this);
 
         Inventory inventory = gameController.getModel().getInventory();
@@ -130,12 +137,7 @@ public class GamePanel extends JPanel{
         super.paintComponent(g);
         g2 = (Graphics2D) g;
 
-        if(gameState == GAMESTATE.MAIN_MENU){
-            //GameSaver.saveGame(gameController);
-            mainMenu.draw(g2);
-            g2.dispose();
-            return;
-        }
+
 
         tileManager.draw(g2);
         entityManager.draw(g2);
@@ -155,11 +157,19 @@ public class GamePanel extends JPanel{
 
 
         if(gameState == GAMESTATE.PAUSED){
-            ui.draw(g2);
+            pauseMenu.draw(g2);
+        }else if(gameState == GAMESTATE.MAIN_MENU){
+            drawMenu(mainMenu, g2);
+        }else if(gameState == GAMESTATE.SETTINGS){
+            drawMenu(settingsMenu, g2);
         }
         g2.dispose();
     }
 
+    private void drawMenu(AbstractMenu menu, Graphics2D g2){
+        menu.draw(g2);
+    }
+
     public void generateNewWorld() {
         tileManager.generateNewWorld();
     }
@@ -168,19 +178,27 @@ public class GamePanel extends JPanel{
         return originalTileSize/tileSize;
     }
 
-    public void handleMainMenuClick(int x, int y) {
-        mainMenu.handleClick(x,y);
-    }
-
     public void toggleShop() {
         closeMenus();
         if(gameState == GAMESTATE.SHOP){
             gameState = GAMESTATE.PLAY;
         }else gameState = GAMESTATE.SHOP;
-
     }
 
     public ShopView getShopView() {
         return shopView;
     }
+
+    public void handleMenusClicks(int x, int y) {
+        if(gameState == GAMESTATE.MAIN_MENU){
+            mainMenu.handleClick(x,y);
+        }else if(gameState == GAMESTATE.SETTINGS){
+            settingsMenu.handleClick(x,y);
+        }else if(gameState == GAMESTATE.PAUSED){
+            pauseMenu.handleClick(x,y);
+        }
+
+    }
+
+
 }

+ 25 - 0
src/main/java/view/sound/MusicManager.java

@@ -3,6 +3,7 @@ package view.sound;
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.Clip;
+import javax.sound.sampled.FloatControl;
 import java.net.URL;
 import java.util.EnumMap;
 
@@ -41,6 +42,7 @@ public class MusicManager {
             AudioInputStream audioStream = AudioSystem.getAudioInputStream(musicURL);
             musicClip = AudioSystem.getClip();
             musicClip.open(audioStream);
+
             return musicClip;
 
         } catch (Exception e) {
@@ -49,10 +51,33 @@ public class MusicManager {
         return null;
     }
 
+    public void setVolume(Clip clip, float percent) {
+        if (clip != null && clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
+
+            FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
+
+            float min = gainControl.getMinimum(); // usually -80.0f
+            float max = gainControl.getMaximum(); // usually 0.0f
+
+            // Clamp percent to 0–100
+            percent = Math.max(0, Math.min(100, percent));
+
+            // Convert percent to gain value
+            float range = max - min;
+            float gain = (range * percent / 100f) + min;
+            System.out.println("Set volume: " + gain + " dB for " + percent + "%");
+            gainControl.setValue(gain); // Safe
+        }
+    }
+
     public void stop() {
         if (musicClip != null) {
             musicClip.stop();
             musicClip.close();
         }
     }
+
+    public void setVolume(float volume) {
+        setVolume(musicClip, volume);
+    }
 }

+ 22 - 0
src/main/java/view/sound/SoundManager.java

@@ -13,6 +13,28 @@ public class SoundManager{
         soundMap.get(sound).stop();
     }
 
+    public void setVolume(Clip clip, float percent) {
+        if (clip.isControlSupported(FloatControl.Type.MASTER_GAIN)) {
+            FloatControl gainControl = (FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
+
+            float min = gainControl.getMinimum(); // usually -80.0f
+            float max = gainControl.getMaximum(); // usually 6.0f or 0.0f
+
+            // Convert percent (0–100) to decibel scale
+            float range = max - min;
+            float gain = (range * percent / 100f) + min;
+
+            gainControl.setValue(gain);
+        } else {
+            System.err.println("Volume control not supported for this clip.");
+        }
+    }
+    public void setVolume(float volume) {
+        soundMap.forEach((sound, clip) -> {
+            setVolume(clip, volume);
+        });
+    }
+
     public enum SOUNDS {
         CLICK,
         MOVING_BUSH,

+ 3 - 56
src/main/java/view/ui/UI.java

@@ -3,12 +3,12 @@ package view.ui;
 import controller.InteractiveController;
 import controller.entity.EntityController;
 import controller.tiles.interactive.InteractiveTileController;
-import util.GAMESTATE;
 import util.Translator;
 import view.GamePanel;
 import view.components.Button;
 import view.popUpMenu.PopupMenu;
 import view.tile.ONCLICKTYPE;
+import view.ui.menu.PauseMenu;
 
 import java.awt.*;
 import java.util.ArrayList;
@@ -17,7 +17,7 @@ public class UI {
     private GamePanel gp;
     private Graphics2D g2;
     private Font arial_40;
-    private ArrayList<Button> activeButtons = new ArrayList<>();
+    private static ArrayList<Button> activeButtons = new ArrayList<>();
 
     public UI(GamePanel gp){
         this.gp = gp;
@@ -29,7 +29,6 @@ public class UI {
         g2.setFont(arial_40);
         g2.setColor(Color.white);
 
-        drawPauseScreen(g2, Translator.translate("menu.pause"));
     }
     public void handleMenuClick(int screenX, int screenY) {
         for (Button button : activeButtons) {
@@ -66,59 +65,7 @@ public class UI {
         }
     }
 
-    private void drawPauseScreen(Graphics2D g2, String message) {
-        // Background overlay
-        g2.setColor(new Color(0, 0, 0, 150));
-        g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight);
-
-        // Dialog box
-        int boxWidth = gp.screenWidth / 2;
-        int boxHeight = gp.screenHeight / 2;
-        int boxX = gp.screenWidth / 2 - boxWidth / 2;
-        int boxY = gp.screenHeight / 4;
-
-        g2.setColor(Color.WHITE);
-        g2.fillRoundRect(boxX, boxY, boxWidth, boxHeight, 25, 25);
-
-        // Message text
-        g2.setColor(Color.BLACK);
-        g2.setFont(new Font("Arial", Font.BOLD, 28));
-        FontMetrics fm = g2.getFontMetrics();
-        int msgWidth = fm.stringWidth(message);
-        g2.drawString(message, gp.screenWidth / 2 - msgWidth / 2, boxY + 50);
-
-        // Buttons
-        int buttonWidth = 260;
-        int buttonHeight = 40;
-        int spacing = 20;
-
-        int buttonX = gp.screenWidth / 2 - buttonWidth / 2;
-        int resumeY = boxY + 100;
-        int saveY = resumeY + buttonHeight + spacing;
-        int exitY = saveY + buttonHeight + spacing;
-        int menuY = exitY + buttonHeight + spacing;
-        Button resumeButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.resume"), () -> {
-            gp.gameState = GAMESTATE.PLAY;
-        });
-        drawAndRegisterButton(resumeButton, buttonX, resumeY);
-
-        Button exitButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.quit"), () -> {
-            gp.gameState = GAMESTATE.QUIT;
-        });
-        drawAndRegisterButton(exitButton, buttonX, exitY);
-
-        Button saveButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.save"), () -> {
-            gp.gameState = GAMESTATE.SAVE;
-        });
-        drawAndRegisterButton(saveButton, buttonX, saveY);
-
-        Button menuButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.main_menu"), () -> {
-            gp.gameState = GAMESTATE.MAIN_MENU;
-        });
-        drawAndRegisterButton(menuButton, buttonX, menuY);
-    }
-
-    private void drawAndRegisterButton(Button button, int buttonX, int buttonY){
+    public static void drawAndRegisterButton(Graphics2D g2, Button button, int buttonX, int buttonY){
         button.setScreenCoordinates(buttonX, buttonY);
         button.draw(g2);
         activeButtons.add(button);

+ 11 - 15
src/main/java/view/MainMenu.java → src/main/java/view/ui/menu/AbstractMenu.java

@@ -1,27 +1,23 @@
-package view;
+package view.ui.menu;
 
-import util.GAMESTATE;
+import view.GamePanel;
 import view.components.Button;
+import view.ui.UI;
 
 import java.awt.*;
 import java.util.ArrayList;
 
-public class MainMenu {
-    GamePanel gamePanel;
+public abstract class AbstractMenu {
+    protected GamePanel gp;
     private ArrayList<Button> activeButtons;
-    private Graphics2D g2;
+    protected Graphics2D g2;
 
-    public MainMenu(GamePanel gp){
-        this.gamePanel = gp;
+    public AbstractMenu(GamePanel gp){
+        this.gp = gp;
         activeButtons = new ArrayList<>();
     }
-    public void draw(Graphics2D g2){
-        this.g2 = g2;
-        Button newGameButton = new Button(100, 100, "Hello", () -> {
-            gamePanel.gameState = GAMESTATE.PLAY;
-        });
-        drawAndRegisterButton(newGameButton, 10, 10);
-    }
+    public abstract void draw(Graphics2D g2);
+
     public void handleClick(int screenX, int screenY) {
         for (Button button : activeButtons) {
             if (button.wasClicked(screenX, screenY)) {
@@ -30,7 +26,7 @@ public class MainMenu {
             }
         }
     }
-    private void drawAndRegisterButton(Button button, int buttonX, int buttonY){
+    protected void drawAndRegisterButton(Button button, int buttonX, int buttonY){
         button.setScreenCoordinates(buttonX, buttonY);
         button.draw(g2);
         activeButtons.add(button);

+ 21 - 0
src/main/java/view/ui/menu/MainMenu.java

@@ -0,0 +1,21 @@
+package view.ui.menu;
+
+import util.GAMESTATE;
+import view.GamePanel;
+import view.components.Button;
+
+import java.awt.*;
+
+public class MainMenu extends AbstractMenu {
+    public MainMenu(GamePanel gp){
+        super(gp);
+    }
+    @Override
+    public void draw(Graphics2D g2){
+        this.g2 = g2;
+        Button newGameButton = new Button(100, 100, "New Game", () -> {
+            gp.gameState = GAMESTATE.PLAY;
+        });
+        drawAndRegisterButton(newGameButton, 10, 10);
+    }
+}

+ 82 - 0
src/main/java/view/ui/menu/PauseMenu.java

@@ -0,0 +1,82 @@
+package view.ui.menu;
+
+import util.GAMESTATE;
+import util.Translator;
+import view.GamePanel;
+import view.components.Button;
+import view.ui.UI;
+
+import java.awt.*;
+
+public class PauseMenu extends AbstractMenu{
+
+    public PauseMenu(GamePanel gamePanel){
+        super(gamePanel);
+    }
+
+    public void draw(Graphics2D g2){
+        this.g2 = g2;
+        String message = Translator.translate("menu.pause");
+        // Background overlay
+        g2.setColor(new Color(0, 0, 0, 150));
+        g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight);
+
+        // Dialog box
+        int boxWidth = gp.screenWidth / 2;
+        int boxHeight = gp.screenHeight / 2;
+        int boxX = gp.screenWidth / 2 - boxWidth / 2;
+        int boxY = gp.screenHeight / 4;
+
+        g2.setColor(Color.WHITE);
+        g2.fillRoundRect(boxX, boxY, boxWidth, boxHeight, 25, 25);
+
+        // Message text
+        g2.setColor(Color.BLACK);
+        g2.setFont(new Font("Arial", Font.BOLD, 28));
+        FontMetrics fm = g2.getFontMetrics();
+        int msgWidth = fm.stringWidth(message);
+        g2.drawString(message, gp.screenWidth / 2 - msgWidth / 2, boxY + 50);
+
+        // Buttons
+        int buttonWidth = 260;
+        int buttonHeight = 40;
+
+        int buttonX = gp.screenWidth / 2 - buttonWidth / 2;
+        int resumeY = boxY + 100;
+        int saveY = getYForNewButton(resumeY);
+        int exitY = getYForNewButton(saveY);
+        int menuY = getYForNewButton(exitY);
+        int settingsY = getYForNewButton(menuY);
+
+        view.components.Button resumeButton = new view.components.Button(buttonWidth, buttonHeight, Translator.translate("menu.resume"), () -> {
+            gp.gameState = GAMESTATE.PLAY;
+        });
+        drawAndRegisterButton(resumeButton, buttonX, resumeY);
+
+        view.components.Button exitButton = new view.components.Button(buttonWidth, buttonHeight, Translator.translate("menu.quit"), () -> {
+            gp.gameState = GAMESTATE.QUIT;
+        });
+        drawAndRegisterButton(exitButton, buttonX, exitY);
+
+        view.components.Button saveButton = new view.components.Button(buttonWidth, buttonHeight, Translator.translate("menu.save"), () -> {
+            gp.gameState = GAMESTATE.SAVE;
+        });
+        drawAndRegisterButton(saveButton, buttonX, saveY);
+
+        view.components.Button menuButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.main_menu"), () -> {
+            gp.gameState = GAMESTATE.MAIN_MENU;
+        });
+        drawAndRegisterButton(menuButton, buttonX, menuY);
+
+        view.components.Button settingsButton = new Button(buttonWidth, buttonHeight, Translator.translate("menu.settings"), () -> {
+            gp.gameState = GAMESTATE.SETTINGS;
+        });
+        drawAndRegisterButton(settingsButton, buttonX, settingsY);
+    }
+
+    private int getYForNewButton(int oldY){
+        int buttonHeight = 40;
+        int spacing = 20;
+        return oldY + buttonHeight + spacing;
+    }
+}

+ 82 - 0
src/main/java/view/ui/menu/SettingsMenu.java

@@ -0,0 +1,82 @@
+package view.ui.menu;
+
+import util.GAMESTATE;
+import util.Settings;
+import util.Translator;
+import view.GamePanel;
+import view.components.Button;
+
+import java.awt.*;
+
+public class SettingsMenu extends AbstractMenu {
+    public SettingsMenu(GamePanel gp) {
+        super(gp);
+    }
+
+    @Override
+    public void draw(Graphics2D g2) {
+        this.g2 = g2;
+
+        // Background overlay
+        g2.setColor(new Color(0, 0, 0, 150));
+        g2.fillRect(0, 0, gp.screenWidth, gp.screenHeight);
+
+        // Dialog box
+        int boxWidth = gp.screenWidth / 2;
+        int boxHeight = gp.screenHeight / 2;
+        int boxX = gp.screenWidth / 2 - boxWidth / 2;
+        int boxY = gp.screenHeight / 4;
+
+        g2.setColor(Color.WHITE);
+        g2.fillRoundRect(boxX, boxY, boxWidth, boxHeight, 25, 25);
+
+        // Title
+        g2.setColor(Color.BLACK);
+        g2.setFont(new Font("Arial", Font.BOLD, 28));
+        String title = Translator.translate("menu.settings");
+        int titleWidth = g2.getFontMetrics().stringWidth(title);
+        g2.drawString(title, gp.screenWidth / 2 - titleWidth / 2, boxY + 40);
+
+        // Buttons/Settings
+        int buttonWidth = 260;
+        int buttonHeight = 40;
+        int spacing = 15;
+
+        int buttonX = gp.screenWidth / 2 - buttonWidth / 2;
+        int audioY = boxY + 80;
+        int langY = audioY + buttonHeight + spacing;
+        int fullscreenY = langY + buttonHeight + spacing;
+        int backY = fullscreenY + buttonHeight + spacing;
+
+        // Music Volume Button (dummy increment/decrement toggle for now)
+        Button musicButton = new Button(buttonWidth, buttonHeight,
+                Translator.translate("settings.volume") + ": " + Settings.getVolume(),
+                () -> {
+                    Settings.toggleVolume();
+                });
+        drawAndRegisterButton(musicButton, buttonX, audioY);
+
+        // Language Selection
+        Button langButton = new Button(buttonWidth, buttonHeight,
+                Translator.translate("settings.language") + ": " + Settings.getLanguage(),
+                () -> {
+                    Settings.toggleLanguage();
+                });
+        drawAndRegisterButton(langButton, buttonX, langY);
+
+        // Fullscreen Toggle
+        Button fullscreenButton = new Button(buttonWidth, buttonHeight,
+                Translator.translate("settings.fullscreen") + ": " + (Settings.isFullscreen() ? "On" : "Off"),
+                () -> {
+                    Settings.toggleFullscreen();
+                });
+        drawAndRegisterButton(fullscreenButton, buttonX, fullscreenY);
+
+        // Back button
+        Button backButton = new Button(buttonWidth, buttonHeight,
+                Translator.translate("menu.back"), () -> {
+            gp.gameState = GAMESTATE.PAUSED;
+        });
+        drawAndRegisterButton(backButton, buttonX, backY);
+    }
+}

+ 5 - 0
src/main/resources/lang/de_de.json

@@ -5,6 +5,11 @@
   "menu.resume": "Fortsetzen",
   "menu.quit": "Beenden",
   "menu.save": "Speichern",
+  "menu.settings": "Einstellungen",
+  "settings.volume": "Lautstaerke",
+  "settings.language": "Sprache",
+  "settings.fullscreen": "Vollbildmodus",
+  "menu.back": "Zurueck",
   "menu.main_menu": "Hauptmenu",
   "menu.shop": "Laden",
   "popup.collect": "Sammeln",

+ 5 - 0
src/main/resources/lang/en_us.json

@@ -5,6 +5,11 @@
   "menu.resume": "Resume",
   "menu.quit": "Quit",
   "menu.save": "Save",
+  "menu.settings": "Settings",
+  "settings.volume": "Volume",
+  "settings.language": "Language",
+  "settings.fullscreen": "Fullscreen",
+  "menu.back": "Back",
   "menu.main_menu": "Main Menu",
   "menu.shop": "Shop",
   "popup.collect": "Collect",