DEADSOFTWARE

Add mobs damage and initial spawn
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / menu / MenuProc.java
1 package ru.deadsoftware.cavedroid.menu;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.utils.ObjectMap;
5 import ru.deadsoftware.cavedroid.CaveGame;
6 import ru.deadsoftware.cavedroid.MainConfig;
7 import ru.deadsoftware.cavedroid.menu.objects.Button;
8 import ru.deadsoftware.cavedroid.menu.submenus.*;
9 import ru.deadsoftware.cavedroid.misc.Renderer;
11 import javax.inject.Inject;
13 import java.lang.reflect.Field;
14 import java.lang.reflect.Method;
15 import java.util.List;
16 import java.util.regex.Matcher;
17 import java.util.regex.Pattern;
19 import static ru.deadsoftware.cavedroid.misc.Assets.*;
21 @MenuScope
22 public class MenuProc extends Renderer {
24 public class Input {
25 private void startNewGame(int gameMode) {
26 mMainConfig.getCaveGame().newGame(gameMode);
27 }
29 public void newGameClicked() {
30 mCurrentMenu = mMenuNewGame;
31 }
33 public void loadGameClicked() {
34 mMainConfig.getCaveGame().loadGame();
35 }
37 public void optionsClicked() {
38 mCurrentMenu = mMenuOptions;
39 }
41 public void quitClicked() {
42 Gdx.app.exit();
43 }
45 public void survivalClicked() {
46 startNewGame(0);
47 }
49 public void creativeClicked() {
50 startNewGame(1);
51 }
53 public void backClicked() {
54 mCurrentMenu = mMenuMain;
55 }
57 public void toggleDynamicCamera() {
58 mMainConfig.setUseDynamicCamera(!mMainConfig.isUseDynamicCamera());
59 }
60 }
62 private final MainConfig mMainConfig;
64 private final MenuMain mMenuMain;
65 private final MenuNewGame mMenuNewGame;
66 private final MenuOptions mMenuOptions;
68 private Menu mCurrentMenu;
70 @Inject
71 public MenuProc(
72 MainConfig mainConfig,
73 MenusFactory menusFactory
74 ) {
75 super(mainConfig.getWidth(), mainConfig.getHeight());
77 mMainConfig = mainConfig;
79 Input menuInput = new Input();
81 mMenuMain = menusFactory.getMainMenu(getWidth(), getHeight(), this::drawButton, menuInput);
82 mMenuNewGame = menusFactory.getMenuNewGame(getWidth(), getHeight(), this::drawButton, menuInput);
83 mMenuOptions = menusFactory.getMenuOptions(getWidth(), getHeight(), this::drawButton, menuInput);
85 mCurrentMenu = mMenuMain;
86 }
88 private String processVariables(String raw) {
89 final Pattern pattern = Pattern.compile("%%([A-Za-z]+)%%", Pattern.CASE_INSENSITIVE);
90 final Matcher matcher = pattern.matcher(raw);
91 while (matcher.find()) {
92 for (int i = 0; i < matcher.groupCount(); i++) {
93 try {
94 final String group = matcher.group(i);
95 final String name = group.replaceAll("%%", "");
96 final Method method = mMainConfig.getClass().getMethod(name);
97 final String value = method.invoke(mMainConfig).toString();
98 raw = raw.replace(group, value);
99 } catch (Exception e) {
100 throw new RuntimeException(e);
105 return raw;
108 private void drawButton(Button button) {
109 spriter.draw(textureRegions.get("button_" + button.getType()), button.getX(), button.getY());
110 setFontColor(255, 255, 255);
112 String label = processVariables(button.getLabel());
114 drawString(label,
115 (button.getX() + button.getWidth() / 2) - (float) getStringWidth(label) / 2,
116 (button.getY() + button.getHeight() / 2) - (float) getStringHeight(label) / 2);
119 @Override
120 public boolean touchUp(int screenX, int screenY, int pointer, int mb) {
121 screenX *= getWidth() / Gdx.graphics.getWidth();
122 screenY *= getHeight() / Gdx.graphics.getHeight();
123 for (ObjectMap.Entry<String, Button> entry : mCurrentMenu.getButtons()) {
124 Button button = entry.value;
125 if (button.getRect().contains(screenX, screenY)) {
126 if (button.getType() > 0) {
127 button.clicked();
129 break;
132 return false;
135 @Override
136 public void render(float delta) {
137 spriter.begin();
138 mCurrentMenu.draw(spriter);
139 drawString("CaveDroid " + CaveGame.VERSION, 0,
140 getHeight() - getStringHeight("CaveDroid " + CaveGame.VERSION) * 1.5f);
141 spriter.end();
144 public void reset() {
145 mCurrentMenu = mMenuMain;