1 package ru.deadsoftware.cavedroid.game.input.handler.mouse
3 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
4 import com.badlogic.gdx.graphics.g2d.TextureRegion
5 import ru.deadsoftware.cavedroid.game.GameUiWindow
6 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
7 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
8 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
9 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
10 import ru.deadsoftware.cavedroid.game.input.isInsideWindow
11 import ru.fredboy.cavedroid.common.di.GameScope
12 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
13 import ru.fredboy.cavedroid.game.controller.drop.DropController
14 import ru.fredboy.cavedroid.game.controller.mob.MobController
15 import javax.inject.Inject
18 @BindMouseInputHandler
19 class CloseGameWindowMouseInputHandler @Inject constructor(
20 private val gameWindowsManager: GameWindowsManager,
21 private val mobController: MobController,
22 private val dropController: DropController,
23 private val textureRegions: GetTextureRegionByNameUseCase,
24 ) : IMouseInputHandler {
26 private val creativeInventoryTexture get() = requireNotNull(textureRegions["creative"])
27 private val survivalInventoryTexture get() = requireNotNull(textureRegions["survival"])
28 private val craftingInventoryTexture get() = requireNotNull(textureRegions["crafting_table"])
29 private val furnaceInventoryTexture get() = requireNotNull(textureRegions["furnace"])
30 private val chestInventoryTexture get() = requireNotNull(textureRegions["chest"])
32 override fun checkConditions(action: MouseInputAction): Boolean {
33 return gameWindowsManager.getCurrentWindow() != GameUiWindow.NONE &&
34 (action.actionKey is MouseInputActionKey.Left || action.actionKey is MouseInputActionKey.Screen) &&
35 action.actionKey.touchUp &&
36 !isInsideWindow(action, getCurrentWindowTexture())
39 private fun getCurrentWindowTexture(): TextureRegion {
40 return when (val window = gameWindowsManager.getCurrentWindow()) {
41 GameUiWindow.CREATIVE_INVENTORY -> creativeInventoryTexture
42 GameUiWindow.SURVIVAL_INVENTORY -> survivalInventoryTexture
43 GameUiWindow.CRAFTING_TABLE -> craftingInventoryTexture
44 GameUiWindow.FURNACE -> furnaceInventoryTexture
45 GameUiWindow.CHEST -> chestInventoryTexture
46 else -> throw UnsupportedOperationException("Cant close window ${window.name}")
50 override fun handle(action: MouseInputAction) {
51 val selectedItem = gameWindowsManager.currentWindow?.selectedItem
52 if (selectedItem != null) {
53 dropController.addDrop(
54 /* x = */ mobController.player.x + (32f * mobController.player.direction.basis),
55 /* y = */ mobController.player.y,
56 /* item = */ selectedItem.item,
57 /* count = */ selectedItem.amount,
59 gameWindowsManager.currentWindow?.selectedItem = null
61 gameWindowsManager.closeWindow()