X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=core%2Fsrc%2Fru%2Fdeadsoftware%2Fcavedroid%2Fgame%2Finput%2Fhandler%2Fmouse%2FSelectSurvivalInventoryItemMouseInputHandler.kt;h=d5858ac0d70822b6f1aa2a317669273c75f4e203;hb=f353e00257a70bb9cdee0e783558c68f5cb0d3d6;hp=559ccfc79388a09157838d3238f0326709764f24;hpb=dfe9ff3e9253c250f62ee029411f773916948601;p=cavedroid.git diff --git a/core/src/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectSurvivalInventoryItemMouseInputHandler.kt b/core/src/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectSurvivalInventoryItemMouseInputHandler.kt index 559ccfc..d5858ac 100644 --- a/core/src/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectSurvivalInventoryItemMouseInputHandler.kt +++ b/core/src/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectSurvivalInventoryItemMouseInputHandler.kt @@ -9,8 +9,11 @@ import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey import ru.deadsoftware.cavedroid.game.input.isInsideWindow import ru.deadsoftware.cavedroid.game.mobs.MobsController -import ru.deadsoftware.cavedroid.game.windows.GameWindowsConfigs -import ru.deadsoftware.cavedroid.game.windows.GameWindowsManager +import ru.deadsoftware.cavedroid.game.model.item.InventoryItem +import ru.deadsoftware.cavedroid.game.objects.DropController +import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs +import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager +import ru.deadsoftware.cavedroid.game.ui.windows.inventory.SurvivalInventoryWindow import ru.deadsoftware.cavedroid.misc.Assets import javax.inject.Inject @@ -19,30 +22,20 @@ class SelectSurvivalInventoryItemMouseInputHandler @Inject constructor( private val gameWindowsManager: GameWindowsManager, private val mobsController: MobsController, private val gameItemsHolder: GameItemsHolder, + private val dropController: DropController, ) : IGameInputHandler { private val survivalWindowTexture get() = requireNotNull(Assets.textureRegions["survival"]) override fun checkConditions(action: MouseInputAction): Boolean { return gameWindowsManager.getCurrentWindow() == GameUiWindow.SURVIVAL_INVENTORY && - isInsideWindow(action, survivalWindowTexture) && - (action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Touch) - && action.actionKey.touchUp + isInsideWindow(action, survivalWindowTexture) && + (action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Right || action.actionKey is MouseInputActionKey.Screen) + && (action.actionKey.touchUp || action.actionKey is MouseInputActionKey.Screen) } - override fun handle(action: MouseInputAction) { - val survivalTexture = survivalWindowTexture - val xOnGrid = (action.screenX - (action.cameraViewport.width / 2 - survivalTexture.regionWidth / 2 + - GameWindowsConfigs.Survival.itemsGridMarginLeft)) / - GameWindowsConfigs.Survival.itemsGridColWidth - val yOnGrid = (action.screenY - (action.cameraViewport.height / 2 - survivalTexture.regionHeight / 2 + - GameWindowsConfigs.Survival.itemsGridMarginTop)) / - GameWindowsConfigs.Survival.itemsGridRowHeight - - if (xOnGrid < 0 || xOnGrid >= GameWindowsConfigs.Survival.itemsInRow || - yOnGrid < 0 || yOnGrid > GameWindowsConfigs.Survival.itemsInCol) { - return - } + private fun handleInsideInventoryGrid(action: MouseInputAction, xOnGrid: Int, yOnGrid: Int) { + val window = gameWindowsManager.currentWindow as SurvivalInventoryWindow var itemIndex = ((xOnGrid.toInt() + yOnGrid.toInt() * GameWindowsConfigs.Survival.itemsInRow)) itemIndex += GameWindowsConfigs.Survival.hotbarCells @@ -51,11 +44,115 @@ class SelectSurvivalInventoryItemMouseInputHandler @Inject constructor( itemIndex -= mobsController.player.inventory.size } - val item = mobsController.player.inventory[itemIndex] - mobsController.player.inventory[itemIndex] = gameWindowsManager.selectedItem ?: gameItemsHolder.fallbackItem.toInventoryItem() - gameWindowsManager.selectedItem = item + if (action.actionKey is MouseInputActionKey.Screen) { + if (!action.actionKey.touchUp) { + window.onLeftCLick(mobsController.player.inventory.items as MutableList, gameItemsHolder, itemIndex, action.actionKey.pointer) + } else { + if (action.actionKey.pointer == window.selectItemPointer) { + window.onLeftCLick(mobsController.player.inventory.items as MutableList, gameItemsHolder, itemIndex, action.actionKey.pointer) + } else { + window.onRightClick(mobsController.player.inventory.items as MutableList, itemIndex) + } + } + } else if (action.actionKey is MouseInputActionKey.Left) { + window.onLeftCLick(mobsController.player.inventory.items as MutableList, gameItemsHolder, itemIndex) + } else { + window.onRightClick(mobsController.player.inventory.items as MutableList, itemIndex) + } + + Gdx.app.debug( + TAG, + "selected item: ${window.selectedItem?.item?.params?.key ?: "null"}; index $itemIndex, grid ($xOnGrid;$yOnGrid)" + ) + } + + private fun handleInsideCraft(action: MouseInputAction, xOnCraft: Int, yOnCraft: Int) { + val window = gameWindowsManager.currentWindow as SurvivalInventoryWindow + val index = xOnCraft + yOnCraft * GameWindowsConfigs.Crafting.craftGridSize // this is crafting on purpose!! + + if (action.actionKey is MouseInputActionKey.Screen) { + if (!action.actionKey.touchUp) { + window.onLeftCLick(window.craftingItems, gameItemsHolder, index, action.actionKey.pointer) + } else { + if (action.actionKey.pointer == window.selectItemPointer) { + window.onLeftCLick(window.craftingItems, gameItemsHolder, index, action.actionKey.pointer) + } else { + window.onRightClick(window.craftingItems, index) + } + } + } else if (action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Screen) { + window.onLeftCLick(window.craftingItems, gameItemsHolder, index) + } else { + window.onRightClick(window.craftingItems, index) + } + + window.craftResult = + gameItemsHolder.craftItem(window.craftingItems.map { it?.item ?: gameItemsHolder.fallbackItem }) + } + + override fun handle(action: MouseInputAction) { + val survivalTexture = survivalWindowTexture + val window = gameWindowsManager.currentWindow as SurvivalInventoryWindow + + val xOnWindow = action.screenX - (action.cameraViewport.width / 2 - survivalTexture.regionWidth / 2) + val yOnWindow = action.screenY - (action.cameraViewport.height / 2 - survivalTexture.regionHeight / 2) + + val xOnGrid = (xOnWindow - GameWindowsConfigs.Survival.itemsGridMarginLeft) / + GameWindowsConfigs.Survival.itemsGridColWidth + val yOnGrid = (yOnWindow - GameWindowsConfigs.Survival.itemsGridMarginTop) / + GameWindowsConfigs.Survival.itemsGridRowHeight + + val xOnCraft = (xOnWindow - GameWindowsConfigs.Survival.craftOffsetX) / + GameWindowsConfigs.Survival.itemsGridColWidth + val yOnCraft = (yOnWindow - GameWindowsConfigs.Survival.craftOffsetY) / + GameWindowsConfigs.Survival.itemsGridRowHeight + + val isInsideInventoryGrid = xOnGrid >= 0 && xOnGrid < GameWindowsConfigs.Survival.itemsInRow && + yOnGrid >= 0 && yOnGrid < GameWindowsConfigs.Survival.itemsInCol + + val isInsideCraftGrid = xOnCraft >= 0 && xOnCraft < GameWindowsConfigs.Survival.craftGridSize && + yOnCraft >= 0 && yOnCraft < GameWindowsConfigs.Survival.craftGridSize + + val isInsideCraftResult = xOnWindow > GameWindowsConfigs.Survival.craftResultOffsetX && + xOnWindow < GameWindowsConfigs.Survival.craftResultOffsetX + GameWindowsConfigs.Survival.itemsGridColWidth && + yOnWindow > GameWindowsConfigs.Survival.craftResultOffsetY && + yOnWindow < GameWindowsConfigs.Survival.craftResultOffsetY + GameWindowsConfigs.Survival.itemsGridRowHeight + + if (isInsideInventoryGrid) { + handleInsideInventoryGrid(action, xOnGrid.toInt(), yOnGrid.toInt()) + } else if (isInsideCraftGrid) { + handleInsideCraft(action, xOnCraft.toInt(), yOnCraft.toInt()) + } else if (isInsideCraftResult && action.actionKey.touchUp) { + val selectedItem = window.selectedItem + if (selectedItem == null || selectedItem.item.isNone() || + (selectedItem.item == window.craftResult?.item && selectedItem.amount + (window.craftResult?.amount ?: 0) <= selectedItem.item.params.maxStack)) { + for (i in window.craftingItems.indices) { + if ((window.craftingItems[i]?.amount ?: 0) > 1) { + window.craftingItems[i]?.amount = window.craftingItems[i]?.amount!! - 1 + } else { + window.craftingItems[i] = null + } + } + if (selectedItem != null && !selectedItem.item.isNone()) { + selectedItem.amount += (window.craftResult?.amount ?: 0) + } else { + window.selectedItem = window.craftResult + } + window.craftResult = gameItemsHolder.craftItem(window.craftingItems + .map { it?.item ?: gameItemsHolder.fallbackItem }) + } + } else if (action.actionKey.touchUp) { + window.selectedItem?.let { selectedItem -> + dropController.addDrop( + /* x = */ mobsController.player.x + (32f * mobsController.player.direction.basis), + /* y = */ mobsController.player.y, + /* item = */ selectedItem.item, + /* count = */ selectedItem.amount, + ) + window.selectedItem = null + } + } - Gdx.app.debug(TAG, "selected item: ${gameWindowsManager.selectedItem?.item?.params?.key ?: "null"}; index $itemIndex, grid ($xOnGrid;$yOnGrid)") } companion object {