DEADSOFTWARE

Fix codestyle
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameInput.java
1 package ru.deadsoftware.cavedroid.game;
3 import com.badlogic.gdx.Gdx;
4 import com.badlogic.gdx.Input;
5 import com.badlogic.gdx.graphics.g2d.TextureRegion;
6 import com.badlogic.gdx.utils.TimeUtils;
7 import com.google.common.collect.Range;
8 import ru.deadsoftware.cavedroid.CaveGame;
9 import ru.deadsoftware.cavedroid.GameScreen;
10 import ru.deadsoftware.cavedroid.game.mobs.Mob;
11 import ru.deadsoftware.cavedroid.game.mobs.Pig;
12 import ru.deadsoftware.cavedroid.misc.Assets;
13 import ru.deadsoftware.cavedroid.misc.ControlMode;
14 import ru.deadsoftware.cavedroid.misc.states.AppState;
15 import ru.deadsoftware.cavedroid.misc.states.GameState;
17 import static ru.deadsoftware.cavedroid.GameScreen.GP;
18 import static ru.deadsoftware.cavedroid.game.GameItems.*;
20 public class GameInput {
22 private boolean keyDown, touchedDown;
24 private int keyDownCode, touchDownBtn;
25 private float touchDownX, touchDownY;
26 private long touchDownTime;
28 private int curX, curY;
29 private int creativeScroll;
30 private int blockDamage;
32 private boolean checkSwim() {
33 return GameItems.isFluid(GP.world.getForeMap(GP.player.getMapX(), GP.player.getLowerMapY()));
34 }
36 private void goUpwards() {
37 if (checkSwim()) {
38 GP.player.swim = true;
39 } else if (GP.player.canJump()) {
40 GP.player.getMove().add(0, -7);
41 } else if (!GP.player.isFlyMode() && GP.player.gameMode == 1) {
42 GP.player.setFlyMode(true);
43 GP.player.getMove().y = 0;
44 } else if (GP.player.isFlyMode()) {
45 GP.player.getMove().y = -GamePhysics.PL_SPEED;
46 }
47 }
49 @SuppressWarnings("IntegerDivisionInFloatingPointContext")
50 private boolean insideCreativeInv(float screenX, float screenY) {
51 TextureRegion creative = Assets.textureRegions.get("creative");
52 return (screenX > GP.renderer.getWidth() / 2 - creative.getRegionWidth() / 2 &&
53 screenX < GP.renderer.getWidth() / 2 + creative.getRegionWidth() / 2 &&
54 screenY > GP.renderer.getHeight() / 2 - creative.getRegionHeight() / 2 &&
55 screenY < GP.renderer.getHeight() / 2 + creative.getRegionHeight() / 2);
56 }
58 private void wasdPressed(int keycode) {
59 if (GP.controlMode == ControlMode.WALK || !CaveGame.TOUCH) {
60 switch (keycode) {
61 case Input.Keys.A:
62 GP.player.getMove().x = -GamePhysics.PL_SPEED;
63 GP.player.setDir(Mob.Direction.LEFT);
64 if (CaveGame.TOUCH && checkSwim()) {
65 GP.player.swim = true;
66 }
67 break;
68 case Input.Keys.D:
69 GP.player.getMove().x = GamePhysics.PL_SPEED;
70 GP.player.setDir(Mob.Direction.RIGHT);
71 if (CaveGame.TOUCH && checkSwim()) {
72 GP.player.swim = true;
73 }
74 break;
75 case Input.Keys.W:
76 case Input.Keys.SPACE:
77 goUpwards();
78 break;
79 case Input.Keys.S:
80 case Input.Keys.CONTROL_LEFT:
81 GP.player.getMove().y = GamePhysics.PL_SPEED;
82 break;
83 }
84 } else {
85 switch (keycode) {
86 case Input.Keys.A:
87 curX--;
88 break;
89 case Input.Keys.D:
90 curX++;
91 break;
92 case Input.Keys.W:
93 curY--;
94 break;
95 case Input.Keys.S:
96 curY++;
97 break;
98 }
99 blockDamage = 0;
103 private boolean isNotAutoselectable(int x, int y) {
104 return (!GP.world.hasForeAt(x, y) || !GP.world.getForeMapBlock(x, y).hasCollision());
107 private void checkCursorBounds() {
108 if (curY < 0) {
109 curY = 0;
110 } else if (curY >= GP.world.getHeight()) {
111 curY = GP.world.getHeight() - 1;
114 if (GP.controlMode == ControlMode.CURSOR) {
115 if (curX * 16 + 8 < GP.player.getX() + GP.player.getWidth() / 2) {
116 GP.player.setDir(Mob.Direction.LEFT);
117 } else {
118 GP.player.setDir(Mob.Direction.RIGHT);
123 private void moveCursor() {
124 int pastX = curX;
125 int pastY = curY;
127 if (GP.controlMode == ControlMode.WALK && CaveGame.TOUCH) {
128 curX = GP.player.getMapX() + (GP.player.looksLeft() ? -1 : 1);
129 curY = GP.player.getUpperMapY();
130 for (int i = 0; i < 2 && isNotAutoselectable(curX, curY); i++) {
131 curY++;
133 if (isNotAutoselectable(curX, curY)) {
134 curX += GP.player.looksLeft() ? 1 : -1;
136 } else if (!CaveGame.TOUCH) {
137 curX = (int) (Gdx.input.getX() * (GP.renderer.getWidth() /
138 GameScreen.getWidth()) + GP.renderer.getCamX()) / 16;
140 curY = (int) (Gdx.input.getY() * (GP.renderer.getHeight() /
141 GameScreen.getHeight()) + GP.renderer.getCamY()) / 16;
142 if (curX < 0) {
143 curX--;
147 if (pastX != curX || pastY != curY) {
148 blockDamage = 0;
151 checkCursorBounds();
154 private void useItem(int x, int y, int id, boolean bg) {
155 String key = getItem(id).isBlock() ? getBlockKey(id) : getItemKey(id);
156 if (id > 0) {
157 if (getItem(id).isBlock()) {
158 if (!bg) {
159 GP.world.placeToForeground(x, y, getBlockIdByItemId(id));
160 } else {
161 GP.world.placeToBackground(x, y, getBlockIdByItemId(id));
163 } else {
164 switch (key) {
165 case "bucket_water":
166 GP.world.placeToForeground(x, y, getBlockId("water"));
167 GP.player.inventory[GP.player.slot] = getItemId("bucket_empty");
168 break;
169 case "bucket_lava":
170 GP.world.placeToForeground(x, y, getBlockId("lava"));
171 GP.player.inventory[GP.player.slot] = getItemId("bucket_empty");
172 break;
178 private void pressLMB() {
179 if ((GP.world.hasForeAt(curX, curY) && GP.world.getForeMapBlock(curX, curY).getHp() >= 0) ||
180 (!GP.world.hasForeAt(curX, curY) && GP.world.hasBackAt(curX, curY) &&
181 GP.world.getBackMapBlock(curX, curY).getHp() >= 0)) {
182 if (GP.player.gameMode == 0) {
183 blockDamage++;
184 if (GP.world.hasForeAt(curX, curY)) {
185 if (blockDamage >= GP.world.getForeMapBlock(curX, curY).getHp()) {
186 GP.world.destroyForeMap(curX, curY);
187 blockDamage = 0;
189 } else if (GP.world.hasBackAt(curX, curY)) {
190 if (blockDamage >= GP.world.getBackMapBlock(curX, curY).getHp()) {
191 GP.world.destroyBackMap(curX, curY);
192 blockDamage = 0;
195 } else {
196 if (GP.world.hasForeAt(curX, curY)) {
197 GP.world.placeToForeground(curX, curY, 0);
198 } else if (GP.world.hasBackAt(curX, curY)) {
199 GP.world.placeToBackground(curX, curY, 0);
201 touchedDown = false;
206 private boolean insideHotbar(float x, float y) {
207 TextureRegion hotbar = Assets.textureRegions.get("hotbar");
208 return y < hotbar.getRegionHeight() &&
209 Range.open(GP.renderer.getWidth() / 2 - (float) hotbar.getRegionWidth() / 2,
210 GP.renderer.getWidth() / 2 + (float) hotbar.getRegionWidth() / 2).contains(x);
213 private void holdMB() {
214 if (touchDownBtn == Input.Buttons.RIGHT) {
215 useItem(curX, curY, GP.player.inventory[GP.player.slot], true);
216 touchedDown = false;
217 } else {
218 if (insideHotbar(touchDownX, touchDownY)) {
219 CaveGame.GAME_STATE = GameState.CREATIVE_INV;
220 touchedDown = false;
225 public void keyDown(int keycode) {
226 keyDown = true;
227 keyDownCode = keycode;
228 switch (keycode) {
229 case Input.Keys.A:
230 case Input.Keys.D:
231 case Input.Keys.W:
232 case Input.Keys.S:
233 case Input.Keys.SPACE:
234 case Input.Keys.CONTROL_LEFT:
235 wasdPressed(keycode);
236 break;
238 case Input.Keys.ALT_LEFT:
239 if (CaveGame.TOUCH) {
240 GP.controlMode = GP.controlMode == ControlMode.WALK ? ControlMode.CURSOR : ControlMode.WALK;
242 break;
244 case Input.Keys.E:
245 if (CaveGame.GAME_STATE == GameState.PLAY) {
246 switch (GP.player.gameMode) {
247 case 0:
248 //TODO survival inv
249 break;
250 case 1:
251 CaveGame.GAME_STATE = GameState.CREATIVE_INV;
252 break;
254 } else {
255 CaveGame.GAME_STATE = GameState.PLAY;
257 break;
259 case Input.Keys.G:
260 GP.mobs.add(new Pig(curX * 16, curY * 16));
261 break;
263 case Input.Keys.Q:
264 GP.world.placeToForeground(curX, curY, 8);
265 break;
267 case Input.Keys.ESCAPE:
268 case Input.Keys.BACK:
269 CaveGame.APP_STATE = AppState.SAVE;
270 CaveGame.GAME_STATE = GameState.PAUSE;
271 break;
273 case Input.Keys.F1:
274 GameScreen.SHOW_DEBUG = !GameScreen.SHOW_DEBUG;
275 break;
277 case Input.Keys.M:
278 GameScreen.SHOW_MAP = !GameScreen.SHOW_MAP;
279 break;
283 public void keyUp(int keycode) {
284 switch (keycode) {
285 case Input.Keys.A:
286 case Input.Keys.D:
287 GP.player.getMove().x = 0;
288 if (CaveGame.TOUCH && GP.player.swim) {
289 GP.player.swim = false;
291 break;
293 case Input.Keys.W:
294 case Input.Keys.S:
295 case Input.Keys.SPACE:
296 case Input.Keys.CONTROL_LEFT:
297 if (GP.player.isFlyMode()) {
298 GP.player.getMove().y = 0;
300 if (GP.player.swim) {
301 GP.player.swim = false;
303 break;
307 public void touchDown(float touchX, float touchY, int button) {
308 touchDownTime = TimeUtils.millis();
309 touchedDown = true;
310 touchDownBtn = button;
311 touchDownX = touchX;
312 touchDownY = touchY;
315 public void touchUp(float screenX, float screenY, int button) {
316 if (CaveGame.TOUCH && keyDown) {
317 keyUp(keyDownCode);
318 keyDown = false;
320 TextureRegion hotbar = Assets.textureRegions.get("hotbar");
321 TextureRegion creative = Assets.textureRegions.get("creative");
322 if (touchedDown) {
323 if (CaveGame.GAME_STATE == GameState.CREATIVE_INV && insideCreativeInv(screenX, screenY)) {
324 int ix = (int) (screenX - (GP.renderer.getWidth() / 2 - creative.getRegionWidth() / 2 + 8)) / 18;
325 int iy = (int) (screenY - (GP.renderer.getHeight() / 2 - creative.getRegionHeight() / 2 + 18)) / 18;
326 int item = creativeScroll * 8 + (ix + iy * 8);
327 if (ix >= 8 || ix < 0 || iy < 0 || iy >= 5) {
328 item = -1;
330 if (item >= 0 && item < GameItems.getItemsSize()) {
331 System.arraycopy(GP.player.inventory, 0, GP.player.inventory, 1, 8);
332 GP.player.inventory[0] = item;
334 } else if (CaveGame.GAME_STATE == GameState.CREATIVE_INV) {
335 CaveGame.GAME_STATE = GameState.PLAY;
336 } else if (screenY < hotbar.getRegionHeight() &&
337 screenX > GP.renderer.getWidth() / 2 - (float) hotbar.getRegionWidth() / 2 &&
338 screenX < GP.renderer.getWidth() / 2 + (float) hotbar.getRegionWidth() / 2) {
339 GP.player.slot = (int) ((screenX - (GP.renderer.getWidth() / 2 - hotbar.getRegionWidth() / 2)) / 20);
340 } else if (button == Input.Buttons.RIGHT) {
341 useItem(curX, curY,
342 GP.player.inventory[GP.player.slot], false);
343 } else if (button == Input.Buttons.LEFT) {
344 blockDamage = 0;
347 touchedDown = false;
350 public void touchDragged(float screenX, float screenY) {
351 if (CaveGame.GAME_STATE == GameState.CREATIVE_INV && Math.abs(screenY - touchDownY) > 16) {
352 if (insideCreativeInv(screenX, screenY)) {
353 creativeScroll -= (screenY - touchDownY) / 16;
354 touchDownX = screenX;
355 touchDownY = screenY;
356 if (creativeScroll < 0) {
357 creativeScroll = 0;
359 if (creativeScroll > GameProc.MAX_CREATIVE_SCROLL) {
360 creativeScroll = GameProc.MAX_CREATIVE_SCROLL;
366 public void scrolled(int amount) {
367 switch (CaveGame.GAME_STATE) {
368 case PLAY:
369 GP.player.slot += amount;
370 if (GP.player.slot < 0) {
371 GP.player.slot = 8;
373 if (GP.player.slot > 8) {
374 GP.player.slot = 0;
376 break;
377 case CREATIVE_INV:
378 creativeScroll += amount;
379 if (creativeScroll < 0) {
380 creativeScroll = 0;
382 if (creativeScroll > GameProc.MAX_CREATIVE_SCROLL) {
383 creativeScroll = GameProc.MAX_CREATIVE_SCROLL;
385 break;
389 public int getKeyDownCode() {
390 return keyDownCode;
393 public boolean isKeyDown() {
394 return keyDown;
397 int getBlockDamage() {
398 return blockDamage;
401 int getCurX() {
402 return curX;
405 int getCurY() {
406 return curY;
409 int getCreativeScroll() {
410 return creativeScroll;
413 void update() {
414 moveCursor();
415 if (touchedDown && touchDownBtn == Input.Buttons.LEFT) {
416 pressLMB();
418 if (touchedDown && TimeUtils.timeSinceMillis(touchDownTime) > 500) {
419 holdMB();