DEADSOFTWARE

Add use item actions module
[cavedroid.git] / core / src / ru / deadsoftware / cavedroid / game / GameInput.java
index 2bf6e7d096ab17912d6794841661a212841c1988..e26b06bad903c54c3bbc2dcc4cefec8887a0749d 100644 (file)
@@ -3,30 +3,41 @@ package ru.deadsoftware.cavedroid.game;
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.Input;
 import com.badlogic.gdx.graphics.g2d.TextureRegion;
+import com.badlogic.gdx.math.Intersector;
 import com.badlogic.gdx.math.MathUtils;
 import com.badlogic.gdx.utils.TimeUtils;
 import com.google.common.collect.Range;
 import ru.deadsoftware.cavedroid.MainConfig;
+import ru.deadsoftware.cavedroid.game.actions.PlaceBlockActionUtilsKt;
+import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction;
 import ru.deadsoftware.cavedroid.game.mobs.Mob;
 import ru.deadsoftware.cavedroid.game.mobs.MobsController;
 import ru.deadsoftware.cavedroid.game.mobs.Pig;
 import ru.deadsoftware.cavedroid.game.mobs.Player;
 import ru.deadsoftware.cavedroid.game.objects.DropController;
+import ru.deadsoftware.cavedroid.game.objects.Item;
 import ru.deadsoftware.cavedroid.game.world.GameWorld;
 import ru.deadsoftware.cavedroid.misc.Assets;
 import ru.deadsoftware.cavedroid.misc.ControlMode;
 
+import javax.annotation.CheckForNull;
 import javax.inject.Inject;
 
+import java.util.Map;
+
 import static ru.deadsoftware.cavedroid.game.GameItems.*;
 
 @GameScope
 public class GameInput {
 
+    private static final String TAG = "GameInput";
+
     private final MainConfig mMainConfig;
     private final GameWorld mGameWorld;
     private final DropController mDropController;
     private final MobsController mMobsController;
+    private final Map<String, IUseItemAction> mUseItemActionMap;
+
     private final Player mPlayer;
 
     private ControlMode mControlMode;
@@ -50,11 +61,13 @@ public class GameInput {
     public GameInput(MainConfig mainConfig,
                      GameWorld gameWorld,
                      DropController dropController,
-                     MobsController mobsController) {
+                     MobsController mobsController,
+                     Map<String, IUseItemAction> useItemActionMap) {
         mMainConfig = mainConfig;
         mGameWorld = gameWorld;
         mDropController = dropController;
         mMobsController = mobsController;
+        mUseItemActionMap = useItemActionMap;
 
         mPlayer = mMobsController.getPlayer();
 
@@ -192,53 +205,69 @@ public class GameInput {
     }
 
     private void useItem(int x, int y, int id, boolean bg) {
-        String key = getItem(id).isBlock() ? getBlockKey(id) : getItemKey(id);
+        mPlayer.startHitting();
+
         if (id > 0) {
-            if (getItem(id).isBlock()) {
+            final Item item = getItem(id);
+            @CheckForNull final String actionKey = item.getActionKey();
+            if (item.isBlock()) {
                 if (!bg) {
-                    mGameWorld.placeToForeground(x, y, getBlockIdByItemId(id));
+                    PlaceBlockActionUtilsKt.placeToForegroundAction(mUseItemActionMap, item, x, y);
                 } else {
-                    mGameWorld.placeToBackground(x, y, getBlockIdByItemId(id));
+                    PlaceBlockActionUtilsKt.placeToBackgroundAction(mUseItemActionMap, item, x, y);
                 }
-            } else {
-                switch (key) {
-                    case "bucket_water":
-                        mGameWorld.placeToForeground(x, y, getBlockId("water"));
-                        mPlayer.inventory[mPlayer.slot] = getItemId("bucket_empty");
-                        break;
-                    case "bucket_lava":
-                        mGameWorld.placeToForeground(x, y, getBlockId("lava"));
-                        mPlayer.inventory[mPlayer.slot] = getItemId("bucket_empty");
-                        break;
+            } else if (actionKey != null) {
+                final IUseItemAction useItemAction = mUseItemActionMap.get(actionKey);
+
+                if (useItemAction != null) {
+                    useItemAction.perform(item, x, y);
+                } else {
+                    Gdx.app.error(TAG, "use item action " + actionKey + "not found");
                 }
             }
         }
     }
 
+    private void hitMobs() {
+        final Player player = mMobsController.getPlayer();
+        mMobsController.getMobs().forEach((mob) -> {
+            if (Intersector.overlaps(mob, player)) {
+                mob.damage(5);
+                mob.jump();
+            }
+        });
+    }
+
     private void pressLMB() {
-        if (mMainConfig.checkGameUiWindow(GameUiWindow.NONE) &&
-                ((mGameWorld.hasForeAt(mCurX, mCurY) && mGameWorld.getForeMapBlock(mCurX, mCurY).getHp() >= 0) ||
-                        (!mGameWorld.hasForeAt(mCurX, mCurY) && mGameWorld.hasBackAt(mCurX, mCurY) &&
-                                mGameWorld.getBackMapBlock(mCurX, mCurY).getHp() >= 0))) {
-            if (mPlayer.gameMode == 0) {
-                mBlockDamage++;
-                if (mGameWorld.hasForeAt(mCurX, mCurY)) {
-                    if (mBlockDamage >= mGameWorld.getForeMapBlock(mCurX, mCurY).getHp()) {
-                        mGameWorld.destroyForeMap(mCurX, mCurY);
-                        mBlockDamage = 0;
+        if (mMainConfig.checkGameUiWindow(GameUiWindow.NONE)) {
+            mPlayer.startHitting();
+
+            if ((mGameWorld.hasForeAt(mCurX, mCurY) && mGameWorld.getForeMapBlock(mCurX, mCurY).getHp() >= 0) ||
+                    (!mGameWorld.hasForeAt(mCurX, mCurY) && mGameWorld.hasBackAt(mCurX, mCurY) &&
+                            mGameWorld.getBackMapBlock(mCurX, mCurY).getHp() >= 0)) {
+                if (mPlayer.gameMode == 0) {
+                    mBlockDamage++;
+                    if (mGameWorld.hasForeAt(mCurX, mCurY)) {
+                        if (mBlockDamage >= mGameWorld.getForeMapBlock(mCurX, mCurY).getHp()) {
+                            mGameWorld.destroyForeMap(mCurX, mCurY);
+                            mBlockDamage = 0;
+                        }
+                    } else if (mGameWorld.hasBackAt(mCurX, mCurY)) {
+                        if (mBlockDamage >= mGameWorld.getBackMapBlock(mCurX, mCurY).getHp()) {
+                            mGameWorld.destroyBackMap(mCurX, mCurY);
+                            mBlockDamage = 0;
+                        }
                     }
-                } else if (mGameWorld.hasBackAt(mCurX, mCurY)) {
-                    if (mBlockDamage >= mGameWorld.getBackMapBlock(mCurX, mCurY).getHp()) {
-                        mGameWorld.destroyBackMap(mCurX, mCurY);
-                        mBlockDamage = 0;
+                } else {
+                    if (mGameWorld.hasForeAt(mCurX, mCurY)) {
+                        mGameWorld.placeToForeground(mCurX, mCurY, 0);
+                    } else if (mGameWorld.hasBackAt(mCurX, mCurY)) {
+                        mGameWorld.placeToBackground(mCurX, mCurY, 0);
                     }
+                    mTouchedDown = false;
                 }
             } else {
-                if (mGameWorld.hasForeAt(mCurX, mCurY)) {
-                    mGameWorld.placeToForeground(mCurX, mCurY, 0);
-                } else if (mGameWorld.hasBackAt(mCurX, mCurY)) {
-                    mGameWorld.placeToBackground(mCurX, mCurY, 0);
-                }
+                hitMobs();
                 mTouchedDown = false;
             }
         }
@@ -298,13 +327,17 @@ public class GameInput {
                 break;
 
             case Input.Keys.G:
-                mMobsController.addMob(Pig.class, mCurX * 16, mCurY * 16);
+                mMobsController.addMob(new Pig(mCurX * 16, mCurY * 16));
                 break;
 
             case Input.Keys.Q:
                 mGameWorld.placeToForeground(mCurX, mCurY, 8);
                 break;
 
+            case Input.Keys.GRAVE:
+                mMobsController.getPlayer().gameMode = (mMobsController.getPlayer().gameMode + 1) % 2;
+                break;
+
             case Input.Keys.ESCAPE:
             case Input.Keys.BACK:
                 GameSaver.save(mMainConfig, mDropController, mMobsController, mGameWorld);
@@ -470,9 +503,15 @@ public class GameInput {
     }
 
     void update() {
-        if (mTouchedDown && mTouchDownBtn == Input.Buttons.LEFT) {
+        if (!mTouchedDown) {
+            mPlayer.stopHitting();
+            return;
+        }
+
+        if (mTouchDownBtn == Input.Buttons.LEFT) {
             pressLMB();
         }
+
         if (mTouchedDown && TimeUtils.timeSinceMillis(mTouchDownTime) > 500) {
             holdMB();
         }