X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fmenu%2FMenuProc.java;h=5314809e4d483deb763b266c7158df91487e91a9;hb=ca4dfc9c8252d4222f778db27e7505909420da39;hp=0ab0bac0af1bfb6f7f778c3764816c026b9f1586;hpb=0ed259db50b9cab761cd5dca5cb229e69886854b;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/menu/MenuProc.java b/core/src/ru/deadsoftware/cavedroid/menu/MenuProc.java index 0ab0bac..5314809 100644 --- a/core/src/ru/deadsoftware/cavedroid/menu/MenuProc.java +++ b/core/src/ru/deadsoftware/cavedroid/menu/MenuProc.java @@ -1,46 +1,126 @@ package ru.deadsoftware.cavedroid.menu; +import com.badlogic.gdx.Gdx; import com.badlogic.gdx.utils.ObjectMap; import ru.deadsoftware.cavedroid.CaveGame; -import ru.deadsoftware.cavedroid.GameScreen; +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 ru.deadsoftware.cavedroid.misc.states.AppState; -import ru.deadsoftware.cavedroid.misc.states.GameState; -import ru.deadsoftware.cavedroid.misc.states.MenuState; + +import javax.inject.Inject; + +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import static ru.deadsoftware.cavedroid.misc.Assets.*; +@MenuScope public class MenuProc extends Renderer { - private MenuMain mainMenu; - private MenuNewGame newGameMenu; + public class Input { + private void startNewGame(int gameMode) { + mMainConfig.getCaveGame().newGame(gameMode); + } + + public void newGameClicked() { + mCurrentMenu = mMenuNewGame; + } - private Menu currentMenu; + public void loadGameClicked() { + mMainConfig.getCaveGame().loadGame(); + } - public MenuProc(int width) { - super(width, width * GameScreen.getHeight() / GameScreen.getWidth()); - mainMenu = new MenuMain(getWidth(), getHeight()); - newGameMenu = new MenuNewGame(getWidth(), getHeight()); - currentMenu = mainMenu; + public void optionsClicked() { + mCurrentMenu = mMenuOptions; + } + + public void quitClicked() { + Gdx.app.exit(); + } + + public void survivalClicked() { + startNewGame(0); + } + + public void creativeClicked() { + startNewGame(1); + } + + public void backClicked() { + mCurrentMenu = mMenuMain; + } + + public void toggleDynamicCamera() { + mMainConfig.setUseDynamicCamera(!mMainConfig.isUseDynamicCamera()); + } + } + + private final MainConfig mMainConfig; + + private final MenuMain mMenuMain; + private final MenuNewGame mMenuNewGame; + private final MenuOptions mMenuOptions; + + private Menu mCurrentMenu; + + @Inject + public MenuProc( + MainConfig mainConfig, + MenusFactory menusFactory + ) { + super(mainConfig.getWidth(), mainConfig.getHeight()); + + mMainConfig = mainConfig; + + Input menuInput = new Input(); + + 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 public boolean touchUp(int screenX, int screenY, int pointer, int mb) { - screenX *= getWidth() / GameScreen.getWidth(); - screenY *= getHeight() / GameScreen.getHeight(); - for (ObjectMap.Entry entry : currentMenu.getButtons()) { + screenX *= getWidth() / Gdx.graphics.getWidth(); + screenY *= getHeight() / Gdx.graphics.getHeight(); + for (ObjectMap.Entry entry : mCurrentMenu.getButtons()) { Button button = entry.value; if (button.getRect().contains(screenX, screenY)) { if (button.getType() > 0) { @@ -53,29 +133,15 @@ public class MenuProc extends Renderer { } @Override - public void render() { + public void render(float delta) { spriter.begin(); - switch (CaveGame.MENU_STATE) { - case MAIN: - currentMenu = mainMenu; - break; - case NEW_GAME: - currentMenu = newGameMenu; - break; - case LOADING: - drawString("Generating World..."); - CaveGame.APP_STATE = AppState.GAME; - CaveGame.GAME_STATE = GameState.PLAY; - break; - case SAVING: - drawString("Saving Game..."); - CaveGame.APP_STATE = AppState.MENU; - CaveGame.MENU_STATE = MenuState.MAIN; - break; - } - currentMenu.draw(spriter, this::drawButton, getWidth(), getHeight()); + mCurrentMenu.draw(spriter); drawString("CaveDroid " + CaveGame.VERSION, 0, getHeight() - getStringHeight("CaveDroid " + CaveGame.VERSION) * 1.5f); spriter.end(); } + + public void reset() { + mCurrentMenu = mMenuMain; + } }