DEADSOFTWARE

New saving fromat and rewrite in kotlin
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / MenuProc.java
index f96d4d42756545c2d13cfc20de9a74655f986c15..aa3888a5b0c26181b38f1102694b8344e6ba7b9b 100644 (file)
@@ -5,13 +5,15 @@ import com.badlogic.gdx.utils.ObjectMap;
 import ru.deadsoftware.cavedroid.CaveGame;
 import ru.deadsoftware.cavedroid.MainConfig;
 import ru.deadsoftware.cavedroid.menu.objects.Button;
-import ru.deadsoftware.cavedroid.menu.submenus.Menu;
-import ru.deadsoftware.cavedroid.menu.submenus.MenuMain;
-import ru.deadsoftware.cavedroid.menu.submenus.MenuNewGame;
+import ru.deadsoftware.cavedroid.menu.submenus.*;
 import ru.deadsoftware.cavedroid.misc.Renderer;
 
 import javax.inject.Inject;
 
+import java.lang.reflect.Method;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 import static ru.deadsoftware.cavedroid.misc.Assets.*;
 
 @MenuScope
@@ -19,7 +21,7 @@ public class MenuProc extends Renderer {
 
     public class Input {
         private void startNewGame(int gameMode) {
-            mMainConfig.getCaveGame().newGame();
+            mMainConfig.getCaveGame().newGame(gameMode);
         }
 
         public void newGameClicked() {
@@ -30,6 +32,10 @@ public class MenuProc extends Renderer {
             mMainConfig.getCaveGame().loadGame();
         }
 
+        public void optionsClicked() {
+            mCurrentMenu = mMenuOptions;
+        }
+
         public void quitClicked() {
             Gdx.app.exit();
         }
@@ -45,35 +51,67 @@ public class MenuProc extends Renderer {
         public void backClicked() {
             mCurrentMenu = mMenuMain;
         }
+
+        public void setPreference(String key, Object value) {
+            mMainConfig.setPreference(key, value.toString());
+        }
     }
 
     private final MainConfig mMainConfig;
 
     private final MenuMain mMenuMain;
     private final MenuNewGame mMenuNewGame;
+    private final MenuOptions mMenuOptions;
 
     private Menu mCurrentMenu;
 
     @Inject
-    public MenuProc(MainConfig mainConfig) {
+    public MenuProc(
+            MainConfig mainConfig,
+            MenusFactory menusFactory
+    ) {
         super(mainConfig.getWidth(), mainConfig.getHeight());
 
         mMainConfig = mainConfig;
 
         Input menuInput = new Input();
 
-        mMenuMain = new MenuMain(getWidth(), getHeight(), this::drawButton, mainConfig, menuInput);
-        mMenuNewGame = new MenuNewGame(getWidth(), getHeight(), this::drawButton, mainConfig, menuInput);
+        mMenuMain = menusFactory.getMainMenu(getWidth(), getHeight(), this::drawButton, menuInput);
+        mMenuNewGame = menusFactory.getMenuNewGame(getWidth(), getHeight(), this::drawButton, menuInput);
+        mMenuOptions = menusFactory.getMenuOptions(getWidth(), getHeight(), this::drawButton, menuInput);
 
         mCurrentMenu = mMenuMain;
     }
 
+    private String processVariables(String raw) {
+        final Pattern pattern = Pattern.compile("%%([A-Za-z]+)%%", Pattern.CASE_INSENSITIVE);
+        final Matcher matcher = pattern.matcher(raw);
+        while (matcher.find()) {
+            for (int i = 0; i < matcher.groupCount(); i++) {
+                try {
+                    final String group = matcher.group(i);
+                    final String name = group.replaceAll("%%", "");
+                    final Method method = mMainConfig.getClass().getMethod(name);
+                    final String value = method.invoke(mMainConfig).toString();
+                    raw = raw.replace(group, value);
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+
+        return raw;
+    }
+
     private void drawButton(Button button) {
         spriter.draw(textureRegions.get("button_" + button.getType()), button.getX(), button.getY());
         setFontColor(255, 255, 255);
-        drawString(button.getLabel(),
-                (button.getX() + button.getWidth() / 2) - (float) getStringWidth(button.getLabel()) / 2,
-                (button.getY() + button.getHeight() / 2) - (float) getStringHeight(button.getLabel()) / 2);
+
+        String label = processVariables(button.getLabel());
+
+        drawString(label,
+                (button.getX() + button.getWidth() / 2) - (float) getStringWidth(label) / 2,
+                (button.getY() + button.getHeight() / 2) - (float) getStringHeight(label) / 2);
     }
 
     @Override