DEADSOFTWARE

Clean arch
authorfredboy <fredboy@protonmail.com>
Tue, 13 Aug 2024 14:27:38 +0000 (21:27 +0700)
committerfredboy <fredboy@protonmail.com>
Tue, 13 Aug 2024 14:27:38 +0000 (21:27 +0700)
229 files changed:
buildSrc/src/main/kotlin/DependencyHandlerExtentions.kt
core/build.gradle.kts
core/common/build.gradle.kts [moved from core/base/build.gradle.kts with 100% similarity]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/di/GameScope.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/GameScope.kt with 72% similarity]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/model/SpriteOrigin.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/SpriteOrigin.kt with 93% similarity]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/GdxExtensions.kt [new file with mode: 0644]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/MeasureUnitsUtils.kt [moved from core/base/src/main/kotlin/ru/fredboy/cavedroid/utils/MeasureUnitsUtils.kt with 92% similarity]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/RenderingUtils.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/RenderingUtils.kt with 86% similarity]
core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/SpriteUtils.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/SpriteUtils.kt with 89% similarity]
core/data/assets/build.gradle.kts
core/data/assets/src/main/kotlin/ru/fredboy/cavedroid/data/assets/internal/BlockDamageAssetsRepositoryImpl.kt
core/data/items/build.gradle.kts [new file with mode: 0644]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/di/DataItemsModule.kt [new file with mode: 0644]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/mapper/BlockMapper.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/mapper/BlockMapper.kt with 82% similarity]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/mapper/ItemMapper.kt [new file with mode: 0644]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/BlockDto.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/BlockDto.kt with 96% similarity]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/CraftingDto.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/CraftingDto.kt with 73% similarity]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/GameItemsDto.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/GameItemsDto.kt with 73% similarity]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/ItemDto.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/ItemDto.kt with 95% similarity]
core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/repository/ItemsRepositoryImpl.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt with 57% similarity]
core/data/save/build.gradle.kts [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/di/DataSaveModule.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ChestMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ContainerControllerMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ControlModeMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DirectionMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropControllerMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FallingBlockMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FurnaceMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryItemMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/MobControllerMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PigMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PlayerMapper.kt [new file with mode: 0644]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/model/SaveDataDto.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/SaveDataDto.kt with 74% similarity]
core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/repository/SaveDataRepositoryImpl.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/save/GameSaveLoader.kt with 64% similarity]
core/domain/assets/build.gradle.kts
core/domain/items/build.gradle.kts [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/Block.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/Block.kt with 72% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/BlockAnimationInfo.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/BlockAnimationInfo.kt with 52% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/BlockDropInfo.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/BlockDropInfo.kt with 57% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/BlockMargins.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/BlockMargins.kt with 78% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/CommonBlockParams.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/CommonBlockParams.kt with 83% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingRecipe.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingResult.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/CommonItemParams.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/CommonItemParams.kt with 65% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/InventoryItem.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/InventoryItem.kt with 59% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/Item.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/Item.kt with 91% similarity]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/repository/ItemsRepository.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/DisposeItemsRepositoryUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlockByKeyUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlocksByTypeUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetCraftingResultUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetFallbackItemUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByIndexUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByKeyUseCase.kt [new file with mode: 0644]
core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/InitializeItemsRepositoryUseCase.kt [new file with mode: 0644]
core/domain/save/build.gradle.kts [new file with mode: 0644]
core/domain/save/src/main/kotlin/ru/fredboy/cavedroid/domain/save/model/GameSaveData.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/save/GameSaveData.kt with 67% similarity]
core/domain/save/src/main/kotlin/ru/fredboy/cavedroid/domain/save/repository/SaveDataRepository.kt [new file with mode: 0644]
core/game/controller/container/build.gradle.kts [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/ContainerController.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/di/ControllerContainerModule.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/impl/ContainerControllerImpl.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerAddedListener.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerRemovedListener.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Chest.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Container.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Furnace.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Furnace.kt with 57% similarity]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerAddedListenerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerRemovedListenerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DestroyContainerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DisposeContainerControllerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/GetContainerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerAddedListenerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerRemovedListenerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/ResetContainerUseCase.kt [new file with mode: 0644]
core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/UpdateContainerControllerUseCase.kt [new file with mode: 0644]
core/game/controller/drop/build.gradle.kts [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/DropController.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/di/ControllerDropModule.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/impl/DropControllerImpl.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropAddedListener.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropRemovedListener.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/model/Drop.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/AddDropUseCase.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/ForEachDropUseCase.kt [new file with mode: 0644]
core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/UpdateDropController.kt [new file with mode: 0644]
core/game/controller/mob/build.gradle.kts [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/MobController.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/di/MobControllerModule.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/impl/MobControllerImpl.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Direction.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/FallingBlock.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Inventory.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Mob.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Pig.kt [new file with mode: 0644]
core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Player.kt [new file with mode: 0644]
core/game/world/build.gradle.kts [new file with mode: 0644]
core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/GameWorld.kt [new file with mode: 0644]
core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/Biome.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/world/Biome.kt with 51% similarity]
core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/GameWorldGenerator.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/world/GameWorldGenerator.kt with 77% similarity]
core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/WorldGeneratorConfig.kt [moved from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/world/generator/WorldGeneratorConfig.kt with 86% similarity]
core/src/main/java/ru/deadsoftware/cavedroid/game/GameComponent.java
core/src/main/java/ru/deadsoftware/cavedroid/game/GameModule.java
core/src/main/java/ru/deadsoftware/cavedroid/game/GamePhysics.java
core/src/main/java/ru/deadsoftware/cavedroid/game/GameProc.java
core/src/main/java/ru/deadsoftware/cavedroid/game/GameRenderer.java
core/src/main/java/ru/deadsoftware/cavedroid/game/GameScreen.java
core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/Mob.java [deleted file]
core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/player/Player.java [deleted file]
core/src/main/java/ru/deadsoftware/cavedroid/game/objects/drop/DropController.java [deleted file]
core/src/main/java/ru/deadsoftware/cavedroid/game/world/GameWorld.java [deleted file]
core/src/main/java/ru/deadsoftware/cavedroid/menu/MenuComponent.java
core/src/main/java/ru/deadsoftware/cavedroid/menu/MenuProc.java
core/src/main/java/ru/deadsoftware/cavedroid/menu/submenus/Menu.java
core/src/main/java/ru/deadsoftware/cavedroid/menu/submenus/MenuMain.java
core/src/main/kotlin/ru/deadsoftware/cavedroid/CaveGame.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/MainComponent.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/CommonBlockActionUtils.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/placeblock/IPlaceBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/placeblock/PlaceBlockItemToBackgroundAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/placeblock/PlaceBlockItemToForegroundAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/placeblock/PlaceSlabAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/updateblock/UpdateBedLeftAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/updateblock/UpdateBedRightAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/updateblock/UpdateGrassAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/updateblock/UpdateRequiresBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/updateblock/UpdateSnowedGrassAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useblock/IUseBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useblock/UseChestAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useblock/UseCraftingTableAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useblock/UseFurnaceAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/IUseItemAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/UseBedAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/UseEmptyBucketAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/UseLavaBucketAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/UsePigSpawnEggAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/actions/useitem/UseWaterBucketAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/debug/DebugInfoStringsProvider.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/CloseGameWindowKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/DropItemKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/FlyDownKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/FlyUpKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/GoLeftKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/GoRightKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/JumpKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/MoveCursorControlsModeKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/OpenInventoryKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/PauseGameKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/SelectHotbarSlotKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/StopSwimKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/SwimUpKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/ToggleControlsModeKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/ToggleDebugInfoKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/ToggleGameModeKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/ToggleMinimapKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/keyboard/TurnOnFlyModeKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/AbstractInventoryItemsMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/AttackMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/CloseGameWindowMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/CreativeInventoryScrollMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/CursorMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/HotbarMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectChestInventoryItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectCraftingInventoryItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectCreativeInventoryItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectFurnaceInventoryItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/SelectSurvivalInventoryItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/mouse/UseItemMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/handler/touch/JoystickInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/mapper/KeyboardInputActionMapper.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/input/mapper/MouseInputActionMapper.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/FallingBlock.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobSaveDataMapper.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobsController.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/PeacefulMob.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/Pig.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/craft/CraftingRecipe.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/mapper/ItemMapper.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Chest.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Container.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/ContainerController.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/drop/Drop.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/BackgroundBlocksRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/BlocksRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/DebugRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/DropsRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/ForegroundBlocksRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/HudRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/MobsRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/TouchControlsRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/WindowsRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/AbstractWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/ChestWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/CraftingWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/CreativeWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/FurnaceWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/render/windows/SurvivalWindowRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/TooltipManager.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/GameWindowsManager.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/AbstractInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/AbstractInventoryWindowWithCraftGrid.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/ChestInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/CraftingInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/CreativeInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/FurnaceInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/ui/windows/inventory/SurvivalInventoryWindow.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/world/GameWorldBlocksLogicControllerTask.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/world/GameWorldFluidsLogicControllerTask.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/game/world/GameWorldMobDamageControllerTask.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/menu/submenus/MenusFactory.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/Saveable.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindKeyboardInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindMouseInputHandler.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindPlaceBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindRenderer.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindUpdateBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindUseBlockAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/BindUseItemAction.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/annotations/multibind/MultibindingConfig.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ArrayMapExtensions.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/AssetLoader.kt
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/GdxExtensions.kt [deleted file]
core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ItemUtils.kt [deleted file]
settings.gradle.kts

index 2326301027c4364300f03220d966eb3f84aa3695..0c6ff2454471b55a900fb3e553199858a1a9080f 100644 (file)
@@ -11,8 +11,8 @@ fun DependencyHandler.useModule(moduleName: String) {
     add("implementation", project(moduleName))
 }
 
-fun DependencyHandler.useBaseModule() {
-    useModule(":core:base")
+fun DependencyHandler.useCommonModule() {
+    useModule(":core:common")
 }
 
 fun DependencyHandler.useAutomultibind() {
index 5afa43eba7ac1d68dd783ae1b744816bbf12c382..17eb33bcf91baf6b81c6862fc8618a57df559af9 100644 (file)
@@ -21,13 +21,25 @@ dependencies {
     useKotlinxSerializationJson()
     useKotlinxSerializationProtobuf()
 
-    useBaseModule()
+    useCommonModule()
 
     // data
     useModule(":core:data:assets")
+    useModule(":core:data:items")
+    useModule(":core:data:save")
 
-    //domain
+    // domain
     useModule(":core:domain:assets")
+    useModule(":core:domain:items")
+    useModule(":core:domain:save")
+
+    // controller
+    useModule(":core:game:controller:drop")
+    useModule(":core:game:controller:container")
+    useModule(":core:game:controller:mob")
+
+    // world
+    useModule(":core:game:world")
 
     implementation(Dependencies.jetbrainsAnnotations)
-}
\ No newline at end of file
+}
similarity index 72%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/GameScope.kt
rename to core/common/src/main/kotlin/ru/fredboy/cavedroid/common/di/GameScope.kt
index b0e445717c63ab9eb1d62f6f00373ce43df4eab5..d97d8bf534d687d53a87a62a5b25e353f2ac6702 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.game
+package ru.fredboy.cavedroid.common.di
 
 import javax.inject.Scope
 
similarity index 93%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/SpriteOrigin.kt
rename to core/common/src/main/kotlin/ru/fredboy/cavedroid/common/model/SpriteOrigin.kt
index d465ce1ec1841b306f4d12acf41210ab437e8159..14a799a348472e6d324f60abc128052886d7509d 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.misc.utils
+package ru.fredboy.cavedroid.common.model
 
 import com.badlogic.gdx.graphics.g2d.Sprite
 
diff --git a/core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/GdxExtensions.kt b/core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/GdxExtensions.kt
new file mode 100644 (file)
index 0000000..3701a62
--- /dev/null
@@ -0,0 +1,5 @@
+package ru.fredboy.cavedroid.common.utils
+
+import com.badlogic.gdx.Graphics
+
+val Graphics.ratio get() = width.toFloat() / height.toFloat()
similarity index 86%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/RenderingUtils.kt
rename to core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/RenderingUtils.kt
index 329ece9bfcaea277755ac710d2b421ac87ed4329..ef477082630439d999579be9fd96cbef0f101b7b 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.misc.utils
+package ru.fredboy.cavedroid.common.utils
 
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.graphics.Color
@@ -7,9 +7,6 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont
 import com.badlogic.gdx.graphics.g2d.GlyphLayout
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.misc.Assets
-import ru.fredboy.cavedroid.utils.bl
 
 private fun Rectangle.shifted(shift: Float) = Rectangle(x + shift, y, width, height)
 
@@ -82,21 +79,22 @@ fun colorFromHexString(hex: String): Color {
 }
 
 fun SpriteBatch.withScissors(
-    mainConfig: MainConfig,
+    viewportWidth: Float,
+    viewportHeight: Float,
     x: Float,
     y: Float,
     width: Float,
     height: Float,
     block: () -> Unit
 ) {
-    val scaleX = Gdx.graphics.width / mainConfig.width
-    val scaleY = Gdx.graphics.height / mainConfig.height
+    val scaleX = Gdx.graphics.width / viewportWidth
+    val scaleY = Gdx.graphics.height / viewportHeight
 
     flush()
     Gdx.gl.glEnable(GL20.GL_SCISSOR_TEST)
     Gdx.gl.glScissor(
         /* x = */ (x * scaleX).toInt(),
-        /* y = */ ((mainConfig.height - y - height) * scaleY).toInt(),
+        /* y = */ ((viewportHeight - y - height) * scaleY).toInt(),
         /* width = */ (width * scaleX).toInt(),
         /* height = */ (height * scaleY).toInt()
     )
similarity index 89%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/SpriteUtils.kt
rename to core/common/src/main/kotlin/ru/fredboy/cavedroid/common/utils/SpriteUtils.kt
index a26c5b95dd8b3699fb4bf8362b8e7c6ed890520d..91052d22363c4c922d196503de9dfd355de75807 100644 (file)
@@ -1,8 +1,9 @@
-package ru.deadsoftware.cavedroid.misc.utils
+package ru.fredboy.cavedroid.common.utils
 
 import com.badlogic.gdx.graphics.Color
 import com.badlogic.gdx.graphics.g2d.Sprite
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
+import ru.fredboy.cavedroid.common.model.SpriteOrigin
 
 /**
  * Draw sprite at given position rotated by [rotation] degrees
@@ -33,4 +34,4 @@ fun SpriteBatch.drawSprite(
 
 fun Sprite.applyOrigin(origin: SpriteOrigin) {
     origin.applyToSprite(this)
-}
\ No newline at end of file
+}
index 096f367857975356f29abf518546761738f77201..8ab6f7c009b1ad6f71ecf9941d83d902b7b40912 100644 (file)
@@ -8,7 +8,7 @@ java.sourceCompatibility = ApplicationInfo.sourceCompatibility
 java.targetCompatibility = ApplicationInfo.sourceCompatibility
 
 dependencies {
-    useBaseModule()
+    useCommonModule()
     useModule(":core:domain:assets")
     useLibgdx()
     useKotlinxSerializationJson()
index 507034f82819a88173c9a495a37e084a8fe3fae7..f073ad3787c2f8cd33242f4e498c7d73864ce478 100644 (file)
@@ -2,9 +2,9 @@ package ru.fredboy.cavedroid.data.assets.internal
 
 import com.badlogic.gdx.graphics.g2d.Sprite
 import ru.fredboy.cavedroid.domain.assets.repository.BlockDamageAssetsRepository
-import ru.fredboy.cavedroid.utils.BLOCK_SIZE_PX
-import ru.fredboy.cavedroid.utils.bl
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.BLOCK_SIZE_PX
+import ru.fredboy.cavedroid.common.utils.bl
+import ru.fredboy.cavedroid.common.utils.px
 import javax.inject.Inject
 import javax.inject.Singleton
 
diff --git a/core/data/items/build.gradle.kts b/core/data/items/build.gradle.kts
new file mode 100644 (file)
index 0000000..dfd5c0f
--- /dev/null
@@ -0,0 +1,18 @@
+plugins {
+    kotlin
+    ksp
+    kotlinxSerialization
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useCommonModule()
+    useLibgdx()
+    useKotlinxSerializationJson()
+    useDagger()
+
+    useModule(":core:domain:assets")
+    useModule(":core:domain:items")
+}
diff --git a/core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/di/DataItemsModule.kt b/core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/di/DataItemsModule.kt
new file mode 100644 (file)
index 0000000..7289613
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.data.items.di
+
+import dagger.Binds
+import dagger.Module
+import ru.fredboy.cavedroid.data.items.repository.ItemsRepositoryImpl
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+
+@Module
+abstract class DataItemsModule {
+
+    @Binds
+    internal abstract fun bindItemsRepository(impl: ItemsRepositoryImpl): ItemsRepository
+
+}
similarity index 82%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/mapper/BlockMapper.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/mapper/BlockMapper.kt
index 136c06b8bcb0a65aabc72f89593a6bcba94674d0..27012ebcf767c983eb5e2e7bb315b90818519604 100644 (file)
@@ -1,20 +1,17 @@
-package ru.deadsoftware.cavedroid.game.model.mapper
+package ru.fredboy.cavedroid.data.items.mapper
 
 import com.badlogic.gdx.graphics.Texture
-import dagger.Reusable
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.block.*
-import ru.deadsoftware.cavedroid.game.model.block.Block.*
-import ru.deadsoftware.cavedroid.game.model.dto.BlockDto
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.misc.Assets
-import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
+import ru.fredboy.cavedroid.data.items.model.BlockDto
+import ru.fredboy.cavedroid.data.items.repository.ItemsRepositoryImpl
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockTextureUseCase
+import ru.fredboy.cavedroid.domain.items.model.block.*
+import ru.fredboy.cavedroid.domain.items.model.block.Block.*
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 import javax.inject.Inject
+import javax.inject.Singleton
 
-@Reusable
+@Singleton
 class BlockMapper @Inject constructor(
-    private val assetLoader: AssetLoader,
     private val getBlockTexture: GetBlockTextureUseCase,
 ) {
 
@@ -79,7 +76,7 @@ class BlockMapper @Inject constructor(
         val drop = dto.drop
         val dropCount = dto.dropCount
 
-        if (drop == GameItemsHolder.FALLBACK_ITEM_KEY || dropCount == 0) {
+        if (drop == ItemsRepositoryImpl.FALLBACK_ITEM_KEY || dropCount == 0) {
             return null
         }
 
@@ -100,7 +97,7 @@ class BlockMapper @Inject constructor(
     }
 
     private fun getTexture(textureName: String): Texture? {
-        if (textureName == GameItemsHolder.FALLBACK_BLOCK_KEY) {
+        if (textureName == ItemsRepositoryImpl.FALLBACK_BLOCK_KEY) {
             return null
         }
 
diff --git a/core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/mapper/ItemMapper.kt b/core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/mapper/ItemMapper.kt
new file mode 100644 (file)
index 0000000..c1849de
--- /dev/null
@@ -0,0 +1,130 @@
+package ru.fredboy.cavedroid.data.items.mapper
+
+import com.badlogic.gdx.graphics.g2d.Sprite
+import ru.fredboy.cavedroid.common.model.SpriteOrigin
+import ru.fredboy.cavedroid.common.utils.colorFromHexString
+import ru.fredboy.cavedroid.data.items.model.ItemDto
+import ru.fredboy.cavedroid.data.items.repository.ItemsRepositoryImpl
+import ru.fredboy.cavedroid.domain.assets.usecase.GetItemTextureUseCase
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.model.item.CommonItemParams
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.model.item.Item.*
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class ItemMapper @Inject constructor(
+    private val getItemTexture: GetItemTextureUseCase,
+) {
+
+    fun map(key: String, dto: ItemDto, block: Block?, slabTopBlock: Block.Slab?, slabBottomBlock: Block.Slab?): Item {
+        val params = mapCommonParams(key, dto)
+
+        return when (dto.type) {
+            "normal" -> Normal(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto))
+            )
+
+            "usable" -> Usable(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                useActionKey = requireNotNull(dto.actionKey)
+            )
+
+            "shovel" -> Shovel(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                mobDamageMultiplier = dto.mobDamageMultiplier,
+                blockDamageMultiplier = dto.blockDamageMultiplier,
+                level = requireNotNull(dto.toolLevel)
+            )
+
+            "sword" -> Sword(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                mobDamageMultiplier = dto.mobDamageMultiplier,
+                blockDamageMultiplier = dto.blockDamageMultiplier,
+                level = requireNotNull(dto.toolLevel)
+            )
+
+            "pickaxe" -> Pickaxe(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                mobDamageMultiplier = dto.mobDamageMultiplier,
+                blockDamageMultiplier = dto.blockDamageMultiplier,
+                level = requireNotNull(dto.toolLevel)
+            )
+
+            "axe" -> Axe(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                mobDamageMultiplier = dto.mobDamageMultiplier,
+                blockDamageMultiplier = dto.blockDamageMultiplier,
+                level = requireNotNull(dto.toolLevel)
+            )
+
+            "shears" -> Shears(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                mobDamageMultiplier = dto.mobDamageMultiplier,
+                blockDamageMultiplier = dto.blockDamageMultiplier,
+                level = requireNotNull(dto.toolLevel)
+            )
+
+            "block" -> Block(
+                params = params,
+                block = requireNotNull(block)
+            )
+
+            "slab" -> Slab(
+                params = params,
+                topPartBlock = requireNotNull(slabTopBlock),
+                bottomPartBlock = requireNotNull(slabBottomBlock)
+            )
+
+            "food" -> Food(
+                params = params,
+                sprite = requireNotNull(loadSprite(dto)),
+                heal = requireNotNull(dto.heal)
+            )
+
+            "none" -> None(
+                params = params
+            )
+
+            else -> throw IllegalArgumentException("Unknown item type ${dto.type}")
+        }
+    }
+
+    private fun mapCommonParams(key: String, dto: ItemDto): CommonItemParams {
+        return CommonItemParams(
+            key = key,
+            name = dto.name,
+            inHandSpriteOrigin = SpriteOrigin(
+                x = dto.originX,
+                y = dto.origin_y,
+            ),
+            maxStack = dto.maxStack,
+            burningTimeMs = dto.burningTime,
+            smeltProductKey = dto.smeltProduct,
+        )
+    }
+
+    private fun loadSprite(dto: ItemDto): Sprite? {
+        if (dto.type == "none" || dto.type == "block" || dto.texture == ItemsRepositoryImpl.FALLBACK_ITEM_KEY) {
+            return null
+        }
+
+        val texture = getItemTexture[dto.texture]
+        return Sprite(texture)
+            .apply {
+                flip(false, true)
+                dto.tint?.let {
+                    color = colorFromHexString(it)
+                }
+            }
+    }
+
+}
\ No newline at end of file
similarity index 96%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/BlockDto.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/BlockDto.kt
index ecbe5bf0e7c3cc4b1564b92d4e03ba8fe20c5b3d..7875461fb91a65cc79b17c82aee1feb3e2bed5e5 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.game.model.dto
+package ru.fredboy.cavedroid.data.items.model
 
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
similarity index 73%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/CraftingDto.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/CraftingDto.kt
index 469602acff9d7c7bb48f45e937f00f691ed4dc0e..1346aa64b8dcad593fce7f55d9ea12a6a678450c 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.game.model.dto
+package ru.fredboy.cavedroid.data.items.model
 
 import kotlinx.serialization.Serializable
 
similarity index 73%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/GameItemsDto.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/GameItemsDto.kt
index aef3a13a2cc0011ebadebbf24254ee3bc5555310..450c7168763f7ce901957475135de53abeb79319 100644 (file)
@@ -1,8 +1,7 @@
-package ru.deadsoftware.cavedroid.game.model.dto
+package ru.fredboy.cavedroid.data.items.model
 
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
-import kotlinx.serialization.json.*
 
 @Serializable
 data class GameItemsDto(
similarity index 95%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/ItemDto.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/model/ItemDto.kt
index a276b7100decd2174e87cd88bb0f9231f7030b9e..1c2844406e849c7071fe28d23dda87eed6a16f2f 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.game.model.dto
+package ru.fredboy.cavedroid.data.items.model
 
 import kotlinx.serialization.SerialName
 import kotlinx.serialization.Serializable
similarity index 57%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/GameItemsHolder.kt
rename to core/data/items/src/main/kotlin/ru/fredboy/cavedroid/data/items/repository/ItemsRepositoryImpl.kt
index 050ae6fe442acacc4d3c20211d94b7200738182c..58f9e05f38645d5a7d28674f899937ddb67e44a3 100644 (file)
@@ -1,28 +1,29 @@
-package ru.deadsoftware.cavedroid.game
+package ru.fredboy.cavedroid.data.items.repository
 
 import com.badlogic.gdx.Gdx
 import kotlinx.serialization.json.Json
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.craft.CraftingRecipe
-import ru.deadsoftware.cavedroid.game.model.craft.CraftingResult
-import ru.deadsoftware.cavedroid.game.model.dto.BlockDto
-import ru.deadsoftware.cavedroid.game.model.dto.CraftingDto
-import ru.deadsoftware.cavedroid.game.model.dto.GameItemsDto
-import ru.deadsoftware.cavedroid.game.model.dto.ItemDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.model.mapper.BlockMapper
-import ru.deadsoftware.cavedroid.game.model.mapper.ItemMapper
-import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
-import java.util.LinkedList
+import ru.fredboy.cavedroid.data.items.mapper.BlockMapper
+import ru.fredboy.cavedroid.data.items.mapper.ItemMapper
+import ru.fredboy.cavedroid.data.items.model.BlockDto
+import ru.fredboy.cavedroid.data.items.model.CraftingDto
+import ru.fredboy.cavedroid.data.items.model.GameItemsDto
+import ru.fredboy.cavedroid.data.items.model.ItemDto
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.model.craft.CraftingRecipe
+import ru.fredboy.cavedroid.domain.items.model.craft.CraftingResult
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import java.util.*
 import javax.inject.Inject
+import javax.inject.Singleton
+import kotlin.collections.LinkedHashMap
 
-@GameScope
-class GameItemsHolder @Inject constructor(
-    private val assetLoader: AssetLoader,
-    private val blockMapper: BlockMapper,
+@Singleton
+internal class ItemsRepositoryImpl @Inject constructor(
     private val itemMapper: ItemMapper,
-) {
+    private val blockMapper: BlockMapper,
+) : ItemsRepository {
 
     private var _initialized: Boolean = false
 
@@ -30,9 +31,10 @@ class GameItemsHolder @Inject constructor(
     private val itemsMap = LinkedHashMap<String, Item>()
     private val craftingRecipes = LinkedList<CraftingRecipe>()
 
-    lateinit var fallbackBlock: Block
+    override lateinit var fallbackBlock: Block.None
         private set
-    lateinit var fallbackItem: Item
+
+    override lateinit var fallbackItem: Item.None
         private set
 
     init {
@@ -45,7 +47,7 @@ class GameItemsHolder @Inject constructor(
                 .apply(Block::initialize)
         }
 
-        fallbackBlock = blocksMap[FALLBACK_BLOCK_KEY]
+        fallbackBlock = blocksMap[FALLBACK_BLOCK_KEY] as? Block.None
             ?: throw IllegalArgumentException("Fallback block key '$FALLBACK_BLOCK_KEY' not found")
     }
 
@@ -69,12 +71,12 @@ class GameItemsHolder @Inject constructor(
             }
         }
 
-        fallbackItem = itemsMap[FALLBACK_ITEM_KEY]
+        fallbackItem = itemsMap[FALLBACK_ITEM_KEY] as? Item.None
             ?: throw IllegalArgumentException("Fallback item key '$FALLBACK_ITEM_KEY' not found")
     }
 
     private fun loadCraftingRecipes() {
-        val jsonString = assetLoader.getAssetHandle("json/crafting.json").readString()
+        val jsonString = Gdx.files.internal("json/crafting.json").readString()
         val jsonMap = JsonFormat.decodeFromString<Map<String, CraftingDto>>(jsonString)
 
         if (jsonMap.isNotEmpty() && itemsMap.isEmpty()) {
@@ -84,18 +86,30 @@ class GameItemsHolder @Inject constructor(
         jsonMap.forEach { (key, value) ->
             craftingRecipes += CraftingRecipe(
                 input = value.input.map(::Regex),
-                output = CraftingResult(getItem(key), value.count)
+                output = CraftingResult(getItemByKey(key), value.count)
             )
         }
     }
 
-    fun initialize() {
+    private fun <T> Map<String, T>.getOrFallback(key: String, fallback: T, lazyErrorMessage: () -> String): T {
+        if (!_initialized) {
+            throw IllegalStateException("GameItemsHolder was not initialized before use")
+        }
+
+        val t = this[key] ?: run {
+            Gdx.app.error(TAG, lazyErrorMessage.invoke())
+            return fallback
+        }
+        return t
+    }
+
+    override fun initialize() {
         if (_initialized) {
             Gdx.app.debug(TAG, "Attempted to init when already initialized")
             return
         }
 
-        val jsonString = assetLoader.getAssetHandle("json/game_items.json").readString()
+        val jsonString = Gdx.files.internal("json/game_items.json").readString()
         val gameItemsDto = JsonFormat.decodeFromString<GameItemsDto>(jsonString)
 
         loadBlocks(gameItemsDto.blocks)
@@ -106,74 +120,68 @@ class GameItemsHolder @Inject constructor(
         loadCraftingRecipes()
     }
 
-    private fun <T> Map<String, T>.getOrFallback(key: String, fallback: T, lazyErrorMessage: () -> String): T {
-        if (!_initialized) {
-            throw IllegalStateException("GameItemsHolder was not initialized before use")
+    override fun getItemByKey(key: String): Item {
+        return itemsMap.getOrFallback(key, fallbackItem) {
+            "No item with key '$key' found. Returning $FALLBACK_ITEM_KEY"
         }
+    }
 
-        val t = this[key] ?: run {
-            Gdx.app.error(TAG, lazyErrorMessage.invoke())
-            return fallback
+    override fun getItemByIndex(index: Int): Item {
+        return if (index in itemsMap.values.indices) {
+            itemsMap.values.elementAt(index)
+        } else {
+            fallbackItem
         }
-        return t
     }
 
-    fun getBlock(key: String): Block {
+    override fun getBlockByKey(key: String): Block {
         return blocksMap.getOrFallback(key, fallbackBlock) {
             "No block with key '$key' found. Returning $FALLBACK_BLOCK_KEY"
         }
     }
 
-    fun getItem(key: String): Item {
-        return itemsMap.getOrFallback(key, fallbackItem) {
-            "No item with key '$key' found. Returning $FALLBACK_BLOCK_KEY"
-        }
+    override fun <T : Block> getBlocksByType(type: Class<T>): List<T> {
+        return blocksMap.values.filterIsInstance(type)
     }
 
-    fun craftItem(input: List<Item>): InventoryItem? {
-        val startIndex = input.indexOfFirst { !it.isNone() }.takeIf { it >= 0 } ?: return null
-
-        return  try {
-            craftingRecipes.first { rec ->
-                for (i in rec.input.indices) {
-                    if (startIndex + i >= input.size) {
-                        return@first rec.input.subList(i, rec.input.size).all { it.matches("none") }
-                    }
-                    if (!input[startIndex + i].params.key.matches(rec.input[i])) {
-                        return@first false
-                    }
+    override fun getCraftingResult(input: List<Item>): InventoryItem {
+        val startIndex = input.indexOfFirst { !it.isNone() }.takeIf { it >= 0 }
+            ?: return fallbackItem.toInventoryItem()
+
+        val output = craftingRecipes.firstOrNull { rec ->
+            for (i in rec.input.indices) {
+                if (startIndex + i >= input.size) {
+                    return@firstOrNull rec.input.subList(i, rec.input.size).all { it.matches("none") }
                 }
-                return@first true
-            }.output.toInventoryItem()
-        } catch (e: NoSuchElementException) {
-            null
-        }
-    }
+                if (!input[startIndex + i].params.key.matches(rec.input[i])) {
+                    return@firstOrNull false
+                }
+            }
+            return@firstOrNull true
+        }?.output
 
-    fun getAllItems(): Collection<Item> {
-        return itemsMap.values
+        return output?.toInventoryItem() ?: fallbackItem.toInventoryItem()
     }
 
-    fun getItemFromCreativeInventory(position: Int): Item {
-        return if (position in itemsMap.values.indices) {
-            itemsMap.values.elementAt(position)
-        } else {
-            fallbackItem
-        }
+    override fun getAllItems(): Collection<Item> {
+        return itemsMap.values
     }
 
-    fun getMaxCreativeScrollAmount(): Int = itemsMap.size / 8
+    override fun dispose() {
+        _initialized = false
 
-    fun <T : Block> getBlocksByType(type: Class<T>): List<T> {
-        return blocksMap.values.filterIsInstance(type)
+        blocksMap.clear()
+        itemsMap.clear()
+        craftingRecipes.clear()
     }
 
     companion object {
-        private const val TAG = "GameItemsHolder"
+        private const val TAG = "ItemsRepositoryImpl"
 
         private val JsonFormat = Json { ignoreUnknownKeys = true }
 
         const val FALLBACK_BLOCK_KEY = "none"
         const val FALLBACK_ITEM_KEY = "none"
     }
+
 }
\ No newline at end of file
diff --git a/core/data/save/build.gradle.kts b/core/data/save/build.gradle.kts
new file mode 100644 (file)
index 0000000..23aa6d0
--- /dev/null
@@ -0,0 +1,24 @@
+plugins {
+    kotlin
+    ksp
+    kotlinxSerialization
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useCommonModule()
+    useLibgdx()
+    useKotlinxSerializationProtobuf()
+    useDagger()
+
+    useModule(":core:domain:assets")
+    useModule(":core:domain:items")
+    useModule(":core:domain:save")
+
+    useModule(":core:game:controller:container")
+    useModule(":core:game:controller:drop")
+    useModule(":core:game:controller:mob")
+    useModule(":core:game:world")
+}
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/di/DataSaveModule.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/di/DataSaveModule.kt
new file mode 100644 (file)
index 0000000..cc68d6f
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.data.save.di
+
+import dagger.Binds
+import dagger.Module
+import ru.fredboy.cavedroid.data.save.repository.SaveDataRepositoryImpl
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository
+
+@Module
+abstract class DataSaveModule {
+
+    @Binds
+    internal abstract fun bindSaveDataRepository(impl: SaveDataRepositoryImpl): SaveDataRepository
+
+}
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ChestMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ChestMapper.kt
new file mode 100644 (file)
index 0000000..81d9d0c
--- /dev/null
@@ -0,0 +1,35 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
+import javax.inject.Inject
+
+@Reusable
+class ChestMapper @Inject constructor(
+    private val inventoryItemMapper: InventoryItemMapper,
+    private val getFallbackItemUseCase: GetFallbackItemUseCase,
+) {
+
+    fun mapSaveData(chest: Chest): SaveDataDto.ChestSaveDataDto {
+        return SaveDataDto.ChestSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            size = chest.size,
+            items = chest.items.map(inventoryItemMapper::mapSaveData)
+        )
+    }
+
+    fun mapChest(saveDataDto: SaveDataDto.ChestSaveDataDto): Chest {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Chest(
+            fallbackItem = getFallbackItemUseCase(),
+            initialItems = saveDataDto.items.map(inventoryItemMapper::mapInventoryItem)
+        )
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ContainerControllerMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ContainerControllerMapper.kt
new file mode 100644 (file)
index 0000000..365b91d
--- /dev/null
@@ -0,0 +1,52 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.container.impl.ContainerControllerImpl
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
+import javax.inject.Inject
+
+@Reusable
+class ContainerControllerMapper @Inject constructor(
+    private val chestMapper: ChestMapper,
+    private val furnaceMapper: FurnaceMapper,
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
+) {
+
+    fun mapSaveData(containerController: ContainerControllerImpl): SaveDataDto.ContainerControllerSaveDataDto {
+        return SaveDataDto.ContainerControllerSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            containerMap = containerController.containerMap.mapNotNull { (key, container) ->
+                when (container) {
+                    is Furnace -> furnaceMapper.mapSaveData(container)
+                    is Chest -> chestMapper.mapSaveData(container)
+                    else -> null
+                }?.let { value -> key to value }
+            }.toMap()
+        )
+    }
+
+    fun mapContainerController(saveDataDto: SaveDataDto.ContainerControllerSaveDataDto): ContainerControllerImpl {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return ContainerControllerImpl(getItemByKeyUseCase).apply {
+            saveDataDto.containerMap.forEach { (key, value) ->
+                val container = when (value) {
+                    is SaveDataDto.FurnaceSaveDataDto -> furnaceMapper.mapFurnace(value)
+                    is SaveDataDto.ChestSaveDataDto -> chestMapper.mapChest(value)
+                    else -> null
+                }
+
+                if (container != null) {
+                    containerMap.put(key, container)
+                }
+            }
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ControlModeMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/ControlModeMapper.kt
new file mode 100644 (file)
index 0000000..f28bf7a
--- /dev/null
@@ -0,0 +1,39 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import com.badlogic.gdx.Gdx
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import javax.inject.Inject
+
+@Reusable
+class ControlModeMapper @Inject constructor() {
+
+    fun mapSaveData(direction: Player.ControlMode): SaveDataDto.ControlModeSaveDataDto {
+        return SaveDataDto.ControlModeSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            value = when (direction) {
+                Player.ControlMode.WALK -> 0
+                Player.ControlMode.CURSOR -> 1
+            }
+        )
+    }
+
+    fun mapControlMode(saveDataDto: SaveDataDto.ControlModeSaveDataDto): Player.ControlMode {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return when (saveDataDto.value) {
+            0 -> Player.ControlMode.WALK
+            1 -> Player.ControlMode.CURSOR
+            else -> {
+                Gdx.app.error(TAG, "Unknown control mode value: ${saveDataDto.value}")
+                Player.ControlMode.CURSOR
+            }
+        }
+    }
+
+    companion object {
+        private const val TAG = "ControlModeMapper"
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DirectionMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DirectionMapper.kt
new file mode 100644 (file)
index 0000000..1a989ae
--- /dev/null
@@ -0,0 +1,39 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import com.badlogic.gdx.Gdx
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
+import javax.inject.Inject
+
+@Reusable
+class DirectionMapper @Inject constructor() {
+
+    fun mapSaveData(direction: Direction): SaveDataDto.DirectionSaveDataDto {
+        return SaveDataDto.DirectionSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            value = when (direction) {
+                Direction.LEFT -> 0
+                Direction.RIGHT -> 1
+            }
+        )
+    }
+
+    fun mapDirection(saveDataDto: SaveDataDto.DirectionSaveDataDto): Direction {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return when (saveDataDto.value) {
+            0 -> Direction.LEFT
+            1 -> Direction.RIGHT
+            else -> {
+                Gdx.app.error(TAG, "Unknown direction value: ${saveDataDto.value}")
+                Direction.RIGHT
+            }
+        }
+    }
+
+    companion object {
+        private const val TAG = "DirectionMapper"
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropControllerMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropControllerMapper.kt
new file mode 100644 (file)
index 0000000..4b9e1b6
--- /dev/null
@@ -0,0 +1,33 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.impl.DropControllerImpl
+import javax.inject.Inject
+
+@Reusable
+class DropControllerMapper @Inject constructor(
+    private val dropMapper: DropMapper
+) {
+
+    fun mapSaveData(dropController: DropController): SaveDataDto.DropControllerSaveDataDto {
+        return SaveDataDto.DropControllerSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            drops = dropController.getAllDrop().map(dropMapper::mapSaveData)
+        )
+    }
+
+    fun mapDropController(saveDataDto: SaveDataDto.DropControllerSaveDataDto): DropController {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return DropControllerImpl(
+            initialDrop = saveDataDto.drops.map(dropMapper::mapDrop)
+        )
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/DropMapper.kt
new file mode 100644 (file)
index 0000000..14d26d1
--- /dev/null
@@ -0,0 +1,50 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import javax.inject.Inject
+
+@Reusable
+class DropMapper @Inject constructor(
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
+) {
+
+    fun mapSaveData(drop: Drop): SaveDataDto.DropSaveDataDto {
+        return SaveDataDto.DropSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            x = drop.x,
+            y = drop.y,
+            width = drop.width,
+            height = drop.height,
+            velocityX = drop.velocity.x,
+            velocityY = drop.velocity.y,
+            itemKey = drop.item.params.key,
+            amount = drop.amount,
+            pickedUp = drop.isPickedUp
+        )
+    }
+
+    fun mapDrop(saveDataDto: SaveDataDto.DropSaveDataDto): Drop {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Drop(
+            x = saveDataDto.x,
+            y = saveDataDto.y,
+            item = getItemByKeyUseCase[saveDataDto.itemKey],
+            _amount = saveDataDto.amount
+        ).apply {
+            width = saveDataDto.width
+            height = saveDataDto.height
+            velocity.y = saveDataDto.velocityY
+            velocity.x = saveDataDto.velocityX
+            isPickedUp = saveDataDto.pickedUp
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FallingBlockMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FallingBlockMapper.kt
new file mode 100644 (file)
index 0000000..96a135f
--- /dev/null
@@ -0,0 +1,60 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.model.FallingBlock
+import javax.inject.Inject
+
+@Reusable
+class FallingBlockMapper @Inject constructor(
+    private val directionMapper: DirectionMapper,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
+) {
+
+    fun mapSaveData(fallingBlock: FallingBlock): SaveDataDto.FallingBlockSaveDataDto {
+        return SaveDataDto.FallingBlockSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            x = fallingBlock.x,
+            y = fallingBlock.y,
+            width = fallingBlock.width,
+            height = fallingBlock.height,
+            velocityX =  fallingBlock.velocity.x,
+            velocityY = fallingBlock.velocity.y,
+            animDelta = fallingBlock.animDelta,
+            anim = fallingBlock.anim,
+            direction = directionMapper.mapSaveData(fallingBlock.direction),
+            dead = fallingBlock.isDead,
+            canJump = fallingBlock.canJump,
+            flyMode = fallingBlock.isFlyMode,
+            maxHealth = fallingBlock.maxHealth,
+            health = fallingBlock.health,
+            blockKey = fallingBlock.block.params.key,
+        )
+    }
+
+    fun mapFallingBlock(saveDataDto: SaveDataDto.FallingBlockSaveDataDto): FallingBlock {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return FallingBlock(
+            block = getBlockByKeyUseCase[saveDataDto.blockKey],
+            x = saveDataDto.x,
+            y = saveDataDto.y
+        ).apply {
+            width = saveDataDto.width
+            height = saveDataDto.height
+            velocity.x = saveDataDto.velocityX
+            velocity.x = saveDataDto.velocityY
+            animDelta = saveDataDto.animDelta
+            anim = saveDataDto.anim
+            direction = directionMapper.mapDirection(saveDataDto.direction)
+            canJump = saveDataDto.canJump
+            isFlyMode = saveDataDto.flyMode
+            health = saveDataDto.health
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FurnaceMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/FurnaceMapper.kt
new file mode 100644 (file)
index 0000000..1eef88c
--- /dev/null
@@ -0,0 +1,48 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
+import javax.inject.Inject
+
+@Reusable
+class FurnaceMapper @Inject constructor(
+    private val inventoryItemMapper: InventoryItemMapper,
+    private val getFallbackItem: GetFallbackItemUseCase,
+    private val getItemByKey: GetItemByKeyUseCase,
+) {
+
+    fun mapSaveData(furnace: Furnace): SaveDataDto.FurnaceSaveDataDto {
+        return SaveDataDto.FurnaceSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            size = furnace.size,
+            currentFuelItemKey = furnace.currentFuelKey,
+            items = furnace.items.map(inventoryItemMapper::mapSaveData),
+            startBurnTimeMs = furnace.startBurnTimeMs,
+            startSmeltTimeMs = furnace.smeltStarTimeMs,
+            burnProgress = furnace.burnProgress,
+            smeltProgress = furnace.smeltProgress,
+        )
+    }
+
+    fun mapFurnace(saveDataDto: SaveDataDto.FurnaceSaveDataDto): Furnace {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Furnace(
+            fallbackItem = getFallbackItem(),
+            initialItems = saveDataDto.items.map(inventoryItemMapper::mapInventoryItem),
+        ).apply {
+            currentFuel = saveDataDto.currentFuelItemKey?.let(getItemByKey::get) ?: getFallbackItem()
+            startBurnTimeMs = saveDataDto.startBurnTimeMs
+            smeltStarTimeMs = saveDataDto.startSmeltTimeMs
+            burnProgress = saveDataDto.burnProgress
+            smeltProgress = saveDataDto.smeltProgress
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryItemMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryItemMapper.kt
new file mode 100644 (file)
index 0000000..ab3e0e2
--- /dev/null
@@ -0,0 +1,34 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import javax.inject.Inject
+
+@Reusable
+class InventoryItemMapper @Inject constructor(
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
+) {
+
+    fun mapSaveData(inventoryItem: InventoryItem): SaveDataDto.InventoryItemSaveDataDto {
+        return SaveDataDto.InventoryItemSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            itemKey = inventoryItem.item.params.key,
+            amount = inventoryItem.amount
+        )
+    }
+
+    fun mapInventoryItem(saveDataDto: SaveDataDto.InventoryItemSaveDataDto): InventoryItem {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return InventoryItem(
+            item = getItemByKeyUseCase[saveDataDto.itemKey],
+            _amount = saveDataDto.amount,
+        )
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/InventoryMapper.kt
new file mode 100644 (file)
index 0000000..c3b6731
--- /dev/null
@@ -0,0 +1,41 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.game.controller.mob.model.Inventory
+import javax.inject.Inject
+
+@Reusable
+class InventoryMapper @Inject constructor(
+    private val inventoryItemMapper: InventoryItemMapper,
+    private val getFallbackItem: GetFallbackItemUseCase,
+) {
+
+    fun mapSaveData(inventory: Inventory): SaveDataDto.InventorySaveDataDto {
+        return SaveDataDto.InventorySaveDataDto(
+            version = SAVE_DATA_VERSION,
+            size = inventory.size,
+            hotbarSize = inventory.hotbarSize,
+            activeSlot = inventory.activeSlot,
+            items = inventory.items.map(inventoryItemMapper::mapSaveData)
+        )
+    }
+
+    fun mapInventory(saveDataDto: SaveDataDto.InventorySaveDataDto): Inventory {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Inventory(
+            size = saveDataDto.size,
+            hotbarSize = saveDataDto.hotbarSize,
+            fallbackItem = getFallbackItem(),
+            initialItems = saveDataDto.items.map(inventoryItemMapper::mapInventoryItem)
+        ).apply {
+            activeSlot = saveDataDto.activeSlot
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/MobControllerMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/MobControllerMapper.kt
new file mode 100644 (file)
index 0000000..652123f
--- /dev/null
@@ -0,0 +1,57 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.assets.repository.MobAssetsRepository
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.game.controller.mob.impl.MobControllerImpl
+import ru.fredboy.cavedroid.game.controller.mob.model.FallingBlock
+import ru.fredboy.cavedroid.game.controller.mob.model.Pig
+import javax.inject.Inject
+
+@Reusable
+class MobControllerMapper @Inject constructor(
+    private val pigMapper: PigMapper,
+    private val fallingBlockMapper: FallingBlockMapper,
+    private val playerMapper: PlayerMapper,
+    private val mobAssetsRepository: MobAssetsRepository,
+    private val getFallbackItemUseCase: GetFallbackItemUseCase,
+) {
+
+    fun mapSaveData(mobController: MobControllerImpl): SaveDataDto.MobControllerSaveDataDto {
+        return SaveDataDto.MobControllerSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            mobs = mobController.mobs.mapNotNull { mob ->
+                when (mob) {
+                    is Pig -> pigMapper.mapSaveData(mob)
+                    is FallingBlock -> fallingBlockMapper.mapSaveData(mob)
+                    else -> null
+                }
+            },
+            player = playerMapper.mapSaveData(mobController.player)
+        )
+    }
+
+    fun mapMobController(saveDataDto: SaveDataDto.MobControllerSaveDataDto): MobControllerImpl {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return MobControllerImpl(
+            mobAssetsRepository = mobAssetsRepository,
+            getFallbackItemUseCase = getFallbackItemUseCase
+        ).apply {
+            (mobs as MutableList).addAll(saveDataDto.mobs.mapNotNull { mob ->
+                when (mob) {
+                    is SaveDataDto.PigSaveDataDto -> pigMapper.mapPig(mob)
+                    is SaveDataDto.FallingBlockSaveDataDto -> fallingBlockMapper.mapFallingBlock(mob)
+                    else -> null
+                }
+            })
+
+            player = playerMapper.mapPlayer(saveDataDto.player)
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PigMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PigMapper.kt
new file mode 100644 (file)
index 0000000..1f82bcb
--- /dev/null
@@ -0,0 +1,59 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
+import ru.fredboy.cavedroid.game.controller.mob.model.Pig
+import javax.inject.Inject
+
+@Reusable
+class PigMapper @Inject constructor(
+    private val directionMapper: DirectionMapper,
+    private val getPigSpriteUseCase: GetPigSpritesUseCase
+) {
+
+    fun mapSaveData(pig: Pig): SaveDataDto.PigSaveDataDto {
+        return SaveDataDto.PigSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            x = pig.x,
+            y = pig.y,
+            width = pig.width,
+            height = pig.height,
+            velocityX =  pig.velocity.x,
+            velocityY = pig.velocity.y,
+            animDelta = pig.animDelta,
+            anim = pig.anim,
+            direction = directionMapper.mapSaveData(pig.direction),
+            dead = pig.isDead,
+            canJump = pig.canJump,
+            flyMode = pig.isFlyMode,
+            maxHealth = pig.maxHealth,
+            health = pig.health
+        )
+    }
+
+    fun mapPig(saveDataDto: SaveDataDto.PigSaveDataDto): Pig {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Pig(
+            sprite = getPigSpriteUseCase(),
+            x = saveDataDto.x,
+            y = saveDataDto.y
+        ).apply {
+            width = saveDataDto.width
+            height = saveDataDto.height
+            velocity.x = saveDataDto.velocityX
+            velocity.x = saveDataDto.velocityY
+            animDelta = saveDataDto.animDelta
+            anim = saveDataDto.anim
+            direction = directionMapper.mapDirection(saveDataDto.direction)
+            canJump = saveDataDto.canJump
+            isFlyMode = saveDataDto.flyMode
+            health = saveDataDto.health
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
diff --git a/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PlayerMapper.kt b/core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/mapper/PlayerMapper.kt
new file mode 100644 (file)
index 0000000..94f2af5
--- /dev/null
@@ -0,0 +1,90 @@
+package ru.fredboy.cavedroid.data.save.mapper
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.assets.usecase.GetPlayerSpritesUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import javax.inject.Inject
+
+@Reusable
+class PlayerMapper @Inject constructor(
+    private val directionMapper: DirectionMapper,
+    private val inventoryMapper: InventoryMapper,
+    private val controlModeMapper: ControlModeMapper,
+    private val getPlayerSpritesUseCase: GetPlayerSpritesUseCase,
+    private val getFallbackItemUseCase: GetFallbackItemUseCase,
+) {
+
+    fun mapSaveData(player: Player): SaveDataDto.PlayerSaveDataDto {
+        return SaveDataDto.PlayerSaveDataDto(
+            version = SAVE_DATA_VERSION,
+            x = player.x,
+            y = player.y,
+            width = player.width,
+            height = player.height,
+            velocityX =  player.velocity.x,
+            velocityY = player.velocity.y,
+            animDelta = player.animDelta,
+            anim = player.anim,
+            direction = directionMapper.mapSaveData(player.direction),
+            dead = player.isDead,
+            canJump = player.canJump,
+            flyMode = player.isFlyMode,
+            maxHealth = player.maxHealth,
+            health = player.health,
+            hitting = player.isHitting,
+            hittingWithDamage = player.isHittingWithDamage,
+            hitAnim = player.hitAnim,
+            hitAnimDelta = player.hitAnimDelta,
+            inventory = inventoryMapper.mapSaveData(player.inventory),
+            gameMode = player.gameMode,
+            swim = player.swim,
+            headRotation = player.headRotation,
+            blockDamage = player.blockDamage,
+            cursorX = player.cursorX,
+            cursorY = player.cursorY,
+            spawnPointX = 0f,
+            spawnPointY = 0f,
+            controlMode = controlModeMapper.mapSaveData(player.controlMode)
+        )
+    }
+
+    fun mapPlayer(saveDataDto: SaveDataDto.PlayerSaveDataDto): Player {
+        saveDataDto.verifyVersion(SAVE_DATA_VERSION)
+
+        return Player(
+            sprite = getPlayerSpritesUseCase(),
+            getFallbackItem = getFallbackItemUseCase,
+            x = saveDataDto.x,
+            y = saveDataDto.y
+        ).apply {
+            width = saveDataDto.width
+            height = saveDataDto.height
+            velocity.x = saveDataDto.velocityX
+            velocity.x = saveDataDto.velocityY
+            animDelta = saveDataDto.animDelta
+            anim = saveDataDto.anim
+            direction = directionMapper.mapDirection(saveDataDto.direction)
+            canJump = saveDataDto.canJump
+            isFlyMode = saveDataDto.flyMode
+            health = saveDataDto.health
+            isHitting = saveDataDto.hitting
+            isHittingWithDamage = saveDataDto.hittingWithDamage
+            hitAnim = saveDataDto.hitAnim
+            hitAnimDelta = saveDataDto.hitAnimDelta
+            inventory = inventoryMapper.mapInventory(saveDataDto.inventory)
+            gameMode = saveDataDto.gameMode
+            swim = saveDataDto.swim
+            headRotation = saveDataDto.headRotation
+            blockDamage = saveDataDto.blockDamage
+            cursorX = saveDataDto.cursorX
+            cursorY = saveDataDto.cursorY
+            controlMode = controlModeMapper.mapControlMode(saveDataDto.controlMode)
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 3
+    }
+}
\ No newline at end of file
similarity index 74%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/dto/SaveDataDto.kt
rename to core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/model/SaveDataDto.kt
index e6ad828102d281453e83251c9c343051204da296..322961d8c806f22b0bb968d60b08d8522ba0bce1 100644 (file)
@@ -1,9 +1,7 @@
-package ru.deadsoftware.cavedroid.game.model.dto
+package ru.fredboy.cavedroid.data.save.model
 
 import kotlinx.serialization.Contextual
 import kotlinx.serialization.Serializable
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.player.Player.ControlMode
 
 @Serializable
 sealed class SaveDataDto {
@@ -16,10 +14,22 @@ sealed class SaveDataDto {
         }
     }
 
+    @Serializable
+    data class DirectionSaveDataDto(
+        override val version: Int,
+        val value: Int,
+    ) : SaveDataDto()
+
+    @Serializable
+    data class ControlModeSaveDataDto(
+        override val version: Int,
+        val value: Int,
+    ) : SaveDataDto()
+
     @Serializable
     sealed class ContainerSaveDataDto : SaveDataDto() {
         abstract val size: Int
-        abstract val items: List<InventoryItemSaveData>
+        abstract val items: List<InventoryItemSaveDataDto>
     }
 
     @Serializable
@@ -34,10 +44,9 @@ sealed class SaveDataDto {
 
     @Serializable
     sealed class MobSaveDataDto : RectangleObjectSaveDataDto() {
-        abstract val type: Mob.Type
-        abstract val animDelta: Int
+        abstract val animDelta: Float
         abstract val anim: Float
-        abstract val direction: Mob.Direction
+        abstract val direction: DirectionSaveDataDto
         abstract val dead: Boolean
         abstract val canJump: Boolean
         abstract val flyMode: Boolean
@@ -46,27 +55,27 @@ sealed class SaveDataDto {
     }
 
     @Serializable
-    data class InventoryItemSaveData(
+    data class InventoryItemSaveDataDto(
         override val version: Int,
         val itemKey: String,
         val amount: Int,
     ) : SaveDataDto()
 
     @Serializable
-    data class InventorySaveData(
+    data class InventorySaveDataDto(
         override val version: Int,
         override val size: Int,
         val hotbarSize: Int,
         val activeSlot: Int,
-        override val items: List<InventoryItemSaveData>,
+        override val items: List<InventoryItemSaveDataDto>,
     ) : ContainerSaveDataDto()
 
     @Serializable
-    data class FurnaceSaveData(
+    data class FurnaceSaveDataDto(
         override val version: Int,
         override val size: Int,
         val currentFuelItemKey: String?,
-        override val items: List<InventoryItemSaveData>,
+        override val items: List<InventoryItemSaveDataDto>,
         val startBurnTimeMs: Long,
         val startSmeltTimeMs: Long,
         val burnProgress: Float,
@@ -74,20 +83,20 @@ sealed class SaveDataDto {
     ) : ContainerSaveDataDto()
 
     @Serializable
-    data class ChestSaveData(
+    data class ChestSaveDataDto(
         override val version: Int,
         override val size: Int,
-        override val items: List<InventoryItemSaveData>
+        override val items: List<InventoryItemSaveDataDto>
     ) : ContainerSaveDataDto()
 
     @Serializable
-    data class ContainerControllerSaveData(
+    data class ContainerControllerSaveDataDto(
         override val version: Int,
         val containerMap: Map<String, @Contextual ContainerSaveDataDto>,
-    ): SaveDataDto()
+    ) : SaveDataDto()
 
     @Serializable
-    data class DropSaveData(
+    data class DropSaveDataDto(
         override val version: Int,
         override val x: Float,
         override val y: Float,
@@ -99,15 +108,15 @@ sealed class SaveDataDto {
         val amount: Int,
         val pickedUp: Boolean
     ) : RectangleObjectSaveDataDto()
-    
+
     @Serializable
-    data class DropControllerSaveData(
+    data class DropControllerSaveDataDto(
         override val version: Int,
-        val drops: List<DropSaveData>
+        val drops: List<DropSaveDataDto>
     ) : SaveDataDto()
-    
+
     @Serializable
-    data class PigSaveData(
+    data class PigSaveDataDto(
         override val version: Int,
         override val x: Float,
         override val y: Float,
@@ -115,10 +124,9 @@ sealed class SaveDataDto {
         override val height: Float,
         override val velocityX: Float,
         override val velocityY: Float,
-        override val type: Mob.Type,
-        override val animDelta: Int,
+        override val animDelta: Float,
         override val anim: Float,
-        override val direction: Mob.Direction,
+        override val direction: DirectionSaveDataDto,
         override val dead: Boolean,
         override val canJump: Boolean,
         override val flyMode: Boolean,
@@ -127,7 +135,7 @@ sealed class SaveDataDto {
     ) : MobSaveDataDto()
 
     @Serializable
-    data class FallingBlockSaveData(
+    data class FallingBlockSaveDataDto(
         override val version: Int,
         override val x: Float,
         override val y: Float,
@@ -135,10 +143,9 @@ sealed class SaveDataDto {
         override val height: Float,
         override val velocityX: Float,
         override val velocityY: Float,
-        override val type: Mob.Type,
-        override val animDelta: Int,
+        override val animDelta: Float,
         override val anim: Float,
-        override val direction: Mob.Direction,
+        override val direction: DirectionSaveDataDto,
         override val dead: Boolean,
         override val canJump: Boolean,
         override val flyMode: Boolean,
@@ -148,12 +155,11 @@ sealed class SaveDataDto {
     ) : MobSaveDataDto()
 
     @Serializable
-    data class PlayerSaveData(
+    data class PlayerSaveDataDto(
         override val version: Int,
-        override val type: Mob.Type,
-        override val animDelta: Int,
+        override val animDelta: Float,
         override val anim: Float,
-        override val direction: Mob.Direction,
+        override val direction: DirectionSaveDataDto,
         override val dead: Boolean,
         override val canJump: Boolean,
         override val flyMode: Boolean,
@@ -169,7 +175,7 @@ sealed class SaveDataDto {
         val hittingWithDamage: Boolean,
         val hitAnim: Float,
         val hitAnimDelta: Float,
-        val inventory: InventorySaveData,
+        val inventory: InventorySaveDataDto,
         val gameMode: Int,
         val swim: Boolean,
         val headRotation: Float,
@@ -178,14 +184,14 @@ sealed class SaveDataDto {
         val cursorY: Int,
         val spawnPointX: Float,
         val spawnPointY: Float,
-        val controlMode: ControlMode,
+        val controlMode: ControlModeSaveDataDto,
     ) : MobSaveDataDto()
 
     @Serializable
-    data class MobsControllerSaveData(
+    data class MobControllerSaveDataDto(
         override val version: Int,
         val mobs: List<@Contextual MobSaveDataDto>,
-        val player: PlayerSaveData,
+        val player: PlayerSaveDataDto,
     ) : SaveDataDto()
-    
+
 }
\ No newline at end of file
similarity index 64%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/save/GameSaveLoader.kt
rename to core/data/save/src/main/kotlin/ru/fredboy/cavedroid/data/save/repository/SaveDataRepositoryImpl.kt
index 9ebc63ac72fdf713aa112aea229fc6af9ed56d3d..537c4fd377fc3ca7634ea6ae29c275597a4de69f 100644 (file)
@@ -1,38 +1,38 @@
-package ru.deadsoftware.cavedroid.game.save
+package ru.fredboy.cavedroid.data.save.repository
 
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.files.FileHandle
-import kotlinx.serialization.ExperimentalSerializationApi
 import kotlinx.serialization.decodeFromByteArray
 import kotlinx.serialization.encodeToByteArray
 import kotlinx.serialization.protobuf.ProtoBuf
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.game.ui.TooltipManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPlayerSpritesUseCase
+import ru.fredboy.cavedroid.data.save.mapper.ContainerControllerMapper
+import ru.fredboy.cavedroid.data.save.mapper.DropControllerMapper
+import ru.fredboy.cavedroid.data.save.mapper.MobControllerMapper
+import ru.fredboy.cavedroid.data.save.model.SaveDataDto
+import ru.fredboy.cavedroid.domain.assets.repository.MobAssetsRepository
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.domain.save.model.GameSaveData
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.impl.ContainerControllerImpl
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.impl.MobControllerImpl
+import ru.fredboy.cavedroid.game.world.GameWorld
 import java.nio.ByteBuffer
 import java.util.zip.GZIPInputStream
 import java.util.zip.GZIPOutputStream
+import javax.inject.Inject
 
-@OptIn(ExperimentalSerializationApi::class)
-object GameSaveLoader {
-
-    private const val MAP_SAVE_VERSION: UByte = 2u
-
-    private const val SAVES_DIR = "/saves"
-    private const val DROP_FILE = "/drop.dat"
-    private const val MOBS_FILE = "/mobs.dat"
-    private const val CONTAINERS_FILE = "/containers.dat"
-    private const val DICT_FILE = "/dict"
-    private const val FOREMAP_FILE = "/foremap.dat.gz"
-    private const val BACKMAP_FILE = "/backmap.dat.gz"
+internal class SaveDataRepositoryImpl @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+    private val dropControllerMapper: DropControllerMapper,
+    private val containerControllerMapper: ContainerControllerMapper,
+    private val mobControllerMapper: MobControllerMapper,
+) : SaveDataRepository {
 
     private fun Int.toByteArray(): ByteArray {
         return ByteBuffer.allocate(Int.SIZE_BYTES)
@@ -68,6 +68,7 @@ object GameSaveLoader {
         file.writeBytes(result, false)
     }
 
+
     private fun compressMap(map: Array<Array<Block>>, dict: Map<String, Int>): ByteArray {
         if (dict.size > 0xff) {
             throw IllegalArgumentException("Cannot save this map as bytes")
@@ -120,7 +121,7 @@ object GameSaveLoader {
     private fun decompressMap(
         bytes: ByteArray,
         dict: List<String>,
-        gameItemsHolder: GameItemsHolder
+        itemsRepository: ItemsRepository,
     ): Array<Array<Block>> {
         val version = bytes.first().toUByte()
         require(version == MAP_SAVE_VERSION)
@@ -134,7 +135,7 @@ object GameSaveLoader {
                 val blockId = bytes[i + Int.SIZE_BYTES].toUByte().toInt()
 
                 for (j in 0 ..< run) {
-                    add(gameItemsHolder.getBlock(dict[blockId]))
+                    add(itemsRepository.getBlockByKey(dict[blockId]))
                 }
             }
         }
@@ -146,21 +147,22 @@ object GameSaveLoader {
         }
     }
 
+
     private fun loadMap(
-        gameItemsHolder: GameItemsHolder,
+        itemsRepository: ItemsRepository,
         savesPath: String
     ): Pair<Array<Array<Block>>, Array<Array<Block>>> {
         val dict = Gdx.files.absolute("$savesPath$DICT_FILE").readString().split("\n")
 
         val foreMap: Array<Array<Block>>
         with(GZIPInputStream(Gdx.files.absolute("$savesPath$FOREMAP_FILE").read())) {
-            foreMap = decompressMap(readBytes(), dict, gameItemsHolder)
+            foreMap = decompressMap(readBytes(), dict, itemsRepository)
             close()
         }
 
         val backMap: Array<Array<Block>>
         with(GZIPInputStream(Gdx.files.absolute("$savesPath$BACKMAP_FILE").read())) {
-            backMap = decompressMap(readBytes(), dict, gameItemsHolder)
+            backMap = decompressMap(readBytes(), dict, itemsRepository)
             close()
         }
 
@@ -168,8 +170,8 @@ object GameSaveLoader {
     }
 
     private fun saveMap(gameWorld: GameWorld, savesPath: String) {
-        val fullForeMap = gameWorld.fullForeMap
-        val fullBackMap = gameWorld.fullBackMap
+        val fullForeMap = gameWorld.foreMap
+        val fullBackMap = gameWorld.backMap
 
         val dict = buildBlocksDictionary(fullForeMap, fullBackMap)
 
@@ -186,15 +188,34 @@ object GameSaveLoader {
         }
     }
 
-    fun load(
-        mainConfig: MainConfig,
-        gameItemsHolder: GameItemsHolder,
-        tooltipManager: TooltipManager,
-        getPlayerSprites: GetPlayerSpritesUseCase,
-        getPigSprites: GetPigSpritesUseCase,
-    ): GameSaveData {
-        val gameFolder = mainConfig.gameFolder
-        val savesPath = "$gameFolder$SAVES_DIR"
+    override fun save(
+        gameDataFolder: String,
+        dropController: DropController,
+        mobController: MobController,
+        containerController: ContainerController,
+        gameWorld: GameWorld
+    ) {
+        val savesPath = "$gameDataFolder$SAVES_DIR"
+
+        Gdx.files.absolute(savesPath).mkdirs()
+
+        val dropFile = Gdx.files.absolute("$savesPath$DROP_FILE")
+        val mobsFile = Gdx.files.absolute("$savesPath$MOBS_FILE")
+        val containersFile = Gdx.files.absolute("$savesPath$CONTAINERS_FILE")
+
+        val dropBytes = ProtoBuf.encodeToByteArray(dropControllerMapper.mapSaveData(dropController))
+        val mobsBytes = ProtoBuf.encodeToByteArray(mobControllerMapper.mapSaveData(mobController as MobControllerImpl))
+        val containersBytes = ProtoBuf.encodeToByteArray(containerControllerMapper.mapSaveData(containerController as ContainerControllerImpl))
+
+        dropFile.writeBytes(dropBytes, false)
+        mobsFile.writeBytes(mobsBytes, false)
+        containersFile.writeBytes(containersBytes, false)
+
+        saveMap(gameWorld, savesPath)
+    }
+
+    override fun load(gameDataFolder: String): GameSaveData {
+        val savesPath = "$gameDataFolder$SAVES_DIR"
 
         val dropFile = Gdx.files.absolute("$savesPath$DROP_FILE")
         val mobsFile = Gdx.files.absolute("$savesPath$MOBS_FILE")
@@ -204,69 +225,28 @@ object GameSaveLoader {
         val mobsBytes = mobsFile.readBytes()
         val containersBytes = containersFile.readBytes()
 
-        val dropController = ProtoBuf.decodeFromByteArray<SaveDataDto.DropControllerSaveData>(dropBytes)
+        val dropController = ProtoBuf.decodeFromByteArray<SaveDataDto.DropControllerSaveDataDto>(dropBytes)
             .let { saveData ->
-                DropController.fromSaveData(
-                    /* saveData = */ saveData,
-                    /* gameItemsHolder = */ gameItemsHolder
-                )
+                dropControllerMapper.mapDropController(saveData)
             }
 
-        val mobsController = ProtoBuf.decodeFromByteArray<SaveDataDto.MobsControllerSaveData>(mobsBytes)
+        val mobController = ProtoBuf.decodeFromByteArray<SaveDataDto.MobControllerSaveDataDto>(mobsBytes)
             .let { saveData ->
-                MobsController.fromSaveData(
-                    saveData = saveData,
-                    gameItemsHolder = gameItemsHolder,
-                    tooltipManager = tooltipManager,
-                    getPigSprites = getPigSprites,
-                    getPlayerSprites = getPlayerSprites
-                )
+                mobControllerMapper.mapMobController(saveData)
             }
 
-        val containerController = ProtoBuf.decodeFromByteArray<SaveDataDto.ContainerControllerSaveData>(containersBytes)
+        val containerController = ProtoBuf.decodeFromByteArray<SaveDataDto.ContainerControllerSaveDataDto>(containersBytes)
             .let { saveData ->
-                ContainerController.fromSaveData(
-                    saveData = saveData,
-                    dropController = dropController,
-                    gameItemsHolder = gameItemsHolder
-                )
+                containerControllerMapper.mapContainerController(saveData)
             }
 
-        val (foreMap, backMap) = loadMap(gameItemsHolder, savesPath)
+        val (foreMap, backMap) = loadMap(itemsRepository, savesPath)
 
-        return GameSaveData(mobsController, dropController, containerController, foreMap, backMap)
+        return GameSaveData(mobController, dropController, containerController, foreMap, backMap)
     }
 
-    fun save(
-        mainConfig: MainConfig,
-        dropController: DropController,
-        mobsController: MobsController,
-        containerController: ContainerController,
-        gameWorld: GameWorld
-    ) {
-        val gameFolder = mainConfig.gameFolder
-        val savesPath = "$gameFolder$SAVES_DIR"
-
-        Gdx.files.absolute(savesPath).mkdirs()
-
-        val dropFile = Gdx.files.absolute("$savesPath$DROP_FILE")
-        val mobsFile = Gdx.files.absolute("$savesPath$MOBS_FILE")
-        val containersFile = Gdx.files.absolute("$savesPath$CONTAINERS_FILE")
-
-        val dropBytes = ProtoBuf.encodeToByteArray(dropController.getSaveData())
-        val mobsBytes = ProtoBuf.encodeToByteArray(mobsController.getSaveData())
-        val containersBytes = ProtoBuf.encodeToByteArray(containerController.getSaveData())
-
-        dropFile.writeBytes(dropBytes, false)
-        mobsFile.writeBytes(mobsBytes, false)
-        containersFile.writeBytes(containersBytes, false)
-
-        saveMap(gameWorld, savesPath)
-    }
-
-    fun exists(mainConfig: MainConfig): Boolean {
-        val gameFolder = mainConfig.gameFolder
-        val savesPath = "$gameFolder$SAVES_DIR"
+    override fun exists(gameDataFolder: String,): Boolean {
+        val savesPath = "$gameDataFolder$SAVES_DIR"
 
         return Gdx.files.absolute("$savesPath$DROP_FILE").exists() &&
                 Gdx.files.absolute("$savesPath$MOBS_FILE").exists() &&
@@ -276,5 +256,15 @@ object GameSaveLoader {
                 Gdx.files.absolute("$savesPath$BACKMAP_FILE").exists()
     }
 
+    companion object {
+        private const val MAP_SAVE_VERSION: UByte = 2u
 
+        private const val SAVES_DIR = "/saves"
+        private const val DROP_FILE = "/drop.dat"
+        private const val MOBS_FILE = "/mobs.dat"
+        private const val CONTAINERS_FILE = "/containers.dat"
+        private const val DICT_FILE = "/dict"
+        private const val FOREMAP_FILE = "/foremap.dat.gz"
+        private const val BACKMAP_FILE = "/backmap.dat.gz"
+    }
 }
\ No newline at end of file
index 2dd0121e83ad3741310d243f2a166818a38bfb4f..9d3840d4d361c7b01f982d303e7ccb680d063672 100644 (file)
@@ -7,7 +7,7 @@ java.sourceCompatibility = ApplicationInfo.sourceCompatibility
 java.targetCompatibility = ApplicationInfo.sourceCompatibility
 
 dependencies {
-    useBaseModule()
+    useCommonModule()
     useLibgdx()
     useDagger()
 }
diff --git a/core/domain/items/build.gradle.kts b/core/domain/items/build.gradle.kts
new file mode 100644 (file)
index 0000000..9d3840d
--- /dev/null
@@ -0,0 +1,13 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useCommonModule()
+    useLibgdx()
+    useDagger()
+}
similarity index 72%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/Block.kt
rename to core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/Block.kt
index fa99bfd91ed2afa2ed63221b23374ba221ad1baa..43c63d9279d7226044cb4d85d79dd5597489ff9e 100644 (file)
@@ -1,11 +1,12 @@
-package ru.deadsoftware.cavedroid.game.model.block
+package ru.fredboy.cavedroid.domain.items.model.block
 
 import com.badlogic.gdx.graphics.g2d.Sprite
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.math.Rectangle
 import com.badlogic.gdx.utils.TimeUtils
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.misc.utils.colorFromHexString
+import ru.fredboy.cavedroid.common.utils.BLOCK_SIZE_PX
+import ru.fredboy.cavedroid.common.utils.colorFromHexString
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.contract
 
@@ -14,11 +15,11 @@ sealed class Block {
 
     abstract val params: CommonBlockParams
 
-    val width: Float get() = 16f - params.collisionMargins.left - params.collisionMargins.right
-    val height: Float get() = 16f - params.collisionMargins.top - params.collisionMargins.bottom
+    val width: Float get() = BLOCK_SIZE_PX - params.collisionMargins.left - params.collisionMargins.right
+    val height: Float get() = BLOCK_SIZE_PX - params.collisionMargins.top - params.collisionMargins.bottom
 
-    val spriteWidth: Float get() = 16f - params.spriteMargins.left - params.spriteMargins.right
-    val spriteHeight: Float get() = 16f - params.spriteMargins.top - params.spriteMargins.bottom
+    val spriteWidth: Float get() = BLOCK_SIZE_PX - params.spriteMargins.left - params.spriteMargins.right
+    val spriteHeight: Float get() = BLOCK_SIZE_PX - params.spriteMargins.top - params.spriteMargins.bottom
 
     protected var animation: Array<Sprite>? = null
 
@@ -133,8 +134,8 @@ sealed class Block {
 
     fun getRectangle(x: Int, y: Int): Rectangle {
         return Rectangle(
-            /* x = */ x * 16f + params.collisionMargins.left,
-            /* y = */ y * 16f + params.collisionMargins.top,
+            /* x = */ x * BLOCK_SIZE_PX + params.collisionMargins.left,
+            /* y = */ y * BLOCK_SIZE_PX + params.collisionMargins.top,
             /* width = */ width,
             /* height = */ height
         )
@@ -205,28 +206,7 @@ sealed class Block {
         override val state: Int,
     ) : Fluid()
 
-    /* Legacy accessors below */
-
-    // collision margins
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val left: Int get() = params.collisionMargins.left
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val right: Int get() = params.collisionMargins.left
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val top: Int get() = params.collisionMargins.left
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val bottom: Int get() = params.collisionMargins.left
-    
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val hp: Int get() = params.hitPoints
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val collision: Boolean get() = params.hasCollision
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val animated: Boolean get() = params.animationInfo != null
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val frames: Int get() = params.animationInfo?.framesCount ?: 0
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) val drop: String get() = params.dropInfo?.itemKey ?: "none"
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun hasDrop() = params.dropInfo != null
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun toJump() = params.hasCollision && params.collisionMargins.top < 8
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun hasCollision() = params.hasCollision
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun isBackground() = params.isBackground
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun isTransparent() = params.isTransparent
-    @Deprecated(LEGACY_ACCESSOR_DEPRECATION) fun getTexture() = sprite
-
     companion object {
-        private const val LEGACY_ACCESSOR_DEPRECATION = "legacy accessors will be removed"
         private const val ANIMATION_FRAME_DURATION_MS = 100L
     }
 }
\ No newline at end of file
similarity index 83%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/block/CommonBlockParams.kt
rename to core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/block/CommonBlockParams.kt
index 19454629f6d475c127162b623a434168ab8c9015..4ce0f2e0452ac933e9627ef26f22126bd0a3f589 100644 (file)
@@ -1,7 +1,7 @@
-package ru.deadsoftware.cavedroid.game.model.block
+package ru.fredboy.cavedroid.domain.items.model.block
 
 import com.badlogic.gdx.graphics.Texture
-import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 
 data class CommonBlockParams(
     val key: String,
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingRecipe.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingRecipe.kt
new file mode 100644 (file)
index 0000000..5b24bb5
--- /dev/null
@@ -0,0 +1,6 @@
+package ru.fredboy.cavedroid.domain.items.model.craft
+
+data class CraftingRecipe(
+    val input: List<Regex>,
+    val output: CraftingResult
+)
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingResult.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/craft/CraftingResult.kt
new file mode 100644 (file)
index 0000000..4d16e98
--- /dev/null
@@ -0,0 +1,11 @@
+package ru.fredboy.cavedroid.domain.items.model.craft
+
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+
+data class CraftingResult(
+    val item: Item,
+    val amount: Int,
+) {
+    fun toInventoryItem() = InventoryItem(item, amount)
+}
similarity index 65%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/CommonItemParams.kt
rename to core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/CommonItemParams.kt
index 00af08b529e17caf6c89ac9051b49a56bd918824..878eaee64ff2845dfb2fe4603c45c185d9e8d2bb 100644 (file)
@@ -1,6 +1,6 @@
-package ru.deadsoftware.cavedroid.game.model.item
+package ru.fredboy.cavedroid.domain.items.model.item
 
-import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin
+import ru.fredboy.cavedroid.common.model.SpriteOrigin
 
 data class CommonItemParams(
     val key: String,
@@ -9,4 +9,4 @@ data class CommonItemParams(
     val maxStack: Int,
     val burningTimeMs: Long?,
     val smeltProductKey: String?,
-)
\ No newline at end of file
+)
similarity index 59%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/InventoryItem.kt
rename to core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/InventoryItem.kt
index 0c50643d0064e2c5c6de1a1d448a734c13ffd386..2ec69c9c4b27eed6ef959d2ebd3025931dbe6ce8 100644 (file)
@@ -1,25 +1,19 @@
-package ru.deadsoftware.cavedroid.game.model.item
+package ru.fredboy.cavedroid.domain.items.model.item
 
 import com.badlogic.gdx.graphics.Color
 import com.badlogic.gdx.graphics.g2d.BitmapFont
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.misc.Assets
-import ru.deadsoftware.cavedroid.misc.Saveable
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
-import ru.deadsoftware.cavedroid.misc.utils.drawString
-import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
-import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.drawSprite
+import ru.fredboy.cavedroid.common.utils.drawString
+import ru.fredboy.cavedroid.common.utils.px
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.contract
 
-class InventoryItem @JvmOverloads constructor(
-    val itemKey: String,
+class InventoryItem(
+    val item: Item,
     _amount: Int = 1,
-) :  Saveable {
+) {
 
     var amount = _amount
         set(value) {
@@ -30,30 +24,6 @@ class InventoryItem @JvmOverloads constructor(
             }
         }
 
-    private var _item: Item? = null
-
-    var item: Item
-        get() {
-            requireNotNull(_item) { "_item is null" }
-            return _item.takeIf { amount > 0 } ?: throw IllegalArgumentException("Accessing item with zero amount")
-        }
-        private set (value) {
-            _item = value
-        }
-
-    @JvmOverloads
-    constructor(item: Item, amount: Int = 1) : this(item.params.key, amount) {
-        _item = item
-    }
-
-    fun init(gameItemsHolder: GameItemsHolder) {
-        if (_item != null) {
-            return
-        }
-        _item = gameItemsHolder.getItem(itemKey)
-    }
-
-    @JvmOverloads
     fun add(count: Int = 1) {
         if (count > 0 && Int.MAX_VALUE - count < amount) {
             throw IllegalArgumentException("$amount + $count exceeds Int.MAX_VALUE")
@@ -62,7 +32,6 @@ class InventoryItem @JvmOverloads constructor(
         amount += count
     }
 
-    @JvmOverloads
     fun subtract(count: Int = 1) {
         if (count < 0) {
             throw IllegalArgumentException("Can't subtract negative amount")
@@ -71,12 +40,17 @@ class InventoryItem @JvmOverloads constructor(
         add(-count)
     }
 
-    @JvmOverloads
     fun canBeAdded(count: Int = 1): Boolean {
         return amount + count <= item.params.maxStack
     }
 
-    private fun drawAmountText(spriteBatch: SpriteBatch, font: BitmapFont, text: String,  x: Float, y: Float) {
+    private fun drawAmountText(
+        spriteBatch: SpriteBatch,
+        font: BitmapFont,
+        text: String,
+        x: Float,
+        y: Float
+    ) {
         spriteBatch.drawString(font, text, x + 1, y + 1, Color.BLACK)
         spriteBatch.drawString(font, text, x, y, Color.WHITE)
     }
@@ -86,8 +60,8 @@ class InventoryItem @JvmOverloads constructor(
         font: BitmapFont,
         x: Float,
         y: Float,
-        getStringWidth: GetStringWidthUseCase,
-        getStringHeight: GetStringHeightUseCase,
+        getStringWidth: (String) -> Float,
+        getStringHeight: (String) -> Float,
     ) {
         if (item.isNone()) {
             return
@@ -111,8 +85,8 @@ class InventoryItem @JvmOverloads constructor(
         font: BitmapFont,
         x: Float,
         y: Float,
-        getStringWidth: GetStringWidthUseCase,
-        getStringHeight: GetStringHeightUseCase,
+        getStringWidth: (String) -> Float,
+        getStringHeight: (String) -> Float,
     ) {
         if (item.isNone()) {
             return
@@ -151,35 +125,12 @@ class InventoryItem @JvmOverloads constructor(
         }
     }
 
-    override fun getSaveData(): SaveDataDto.InventoryItemSaveData {
-        return SaveDataDto.InventoryItemSaveData(
-            version = SAVE_DATA_VERSION,
-            itemKey = itemKey,
-            amount = amount,
-        )
-    }
-
     companion object {
-        private const val SAVE_DATA_VERSION = 1
-
         @OptIn(ExperimentalContracts::class)
         fun InventoryItem?.isNoneOrNull(): Boolean {
             contract { returns(false) implies(this@isNoneOrNull != null) }
             return this?.item == null || this.item.isNone()
         }
-
-
-        fun fromSaveData(
-            saveData: SaveDataDto.InventoryItemSaveData,
-            gameItemsHolder: GameItemsHolder? = null
-        ): InventoryItem {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            val inventoryItem = InventoryItem(saveData.itemKey, saveData.amount)
-            gameItemsHolder?.let(inventoryItem::init)
-
-            return inventoryItem
-        }
     }
 
 }
similarity index 91%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/item/Item.kt
rename to core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/model/item/Item.kt
index 9b2c62de4794111b4edab8bb332af7a0a99f5809..86363951030c296e66a130b8f2da73dd2a64f270 100644 (file)
@@ -1,10 +1,9 @@
-package ru.deadsoftware.cavedroid.game.model.item
+package ru.fredboy.cavedroid.domain.items.model.item
 
 import com.badlogic.gdx.graphics.g2d.Sprite
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.block.Block as BlockModel
 import kotlin.contracts.ExperimentalContracts
 import kotlin.contracts.contract
+import ru.fredboy.cavedroid.domain.items.model.block.Block as DomainBlockModel
 
 @OptIn(ExperimentalContracts::class)
 sealed class Item {
@@ -24,7 +23,7 @@ sealed class Item {
         contract { returns(true) implies (this@Item is None) }
         return this is None
     }
-    
+
     fun isPlaceable(): Boolean {
         contract { returns(true) implies (this@Item is Placeable) }
         return this is Placeable
@@ -72,7 +71,7 @@ sealed class Item {
     }
 
     sealed class Placeable : Item() {
-        abstract val block: BlockModel
+        abstract val block: DomainBlockModel
         override val sprite: Sprite get() = block.sprite
     }
 
@@ -91,17 +90,17 @@ sealed class Item {
 
     data class Block(
         override val params: CommonItemParams,
-        override val block: BlockModel
+        override val block: DomainBlockModel
     ) : Placeable()
 
     data class Slab(
         override val params: CommonItemParams,
-        val topPartBlock: BlockModel.Slab,
-        val bottomPartBlock: BlockModel.Slab
+        val topPartBlock: DomainBlockModel.Slab,
+        val bottomPartBlock: DomainBlockModel.Slab
     ) : Placeable() {
         override val block get() = bottomPartBlock
     }
-    
+
     data class Sword(
         override val params: CommonItemParams,
         override val sprite: Sprite,
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/repository/ItemsRepository.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/repository/ItemsRepository.kt
new file mode 100644 (file)
index 0000000..9cc422b
--- /dev/null
@@ -0,0 +1,28 @@
+package ru.fredboy.cavedroid.domain.items.repository
+
+import com.badlogic.gdx.utils.Disposable
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+
+interface ItemsRepository : Disposable {
+
+    val fallbackBlock: Block.None
+
+    val fallbackItem: Item.None
+
+    fun initialize()
+
+    fun getItemByKey(key: String): Item
+
+    fun getItemByIndex(index: Int): Item
+
+    fun getBlockByKey(key: String): Block
+
+    fun <T : Block> getBlocksByType(type: Class<T>): List<T>
+
+    fun getCraftingResult(input: List<Item>): InventoryItem
+
+    fun getAllItems(): Collection<Item>
+
+}
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/DisposeItemsRepositoryUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/DisposeItemsRepositoryUseCase.kt
new file mode 100644 (file)
index 0000000..2043452
--- /dev/null
@@ -0,0 +1,16 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class DisposeItemsRepositoryUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun invoke() {
+        itemsRepository.dispose()
+    }
+
+}
\ No newline at end of file
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlockByKeyUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlockByKeyUseCase.kt
new file mode 100644 (file)
index 0000000..3c81e2c
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetBlockByKeyUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun get(key: String): Block {
+        return itemsRepository.getBlockByKey(key)
+    }
+
+}
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlocksByTypeUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetBlocksByTypeUseCase.kt
new file mode 100644 (file)
index 0000000..4d74119
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetBlocksByTypeUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun <T : Block> get(type: Class<T>): List<T> {
+        return itemsRepository.getBlocksByType(type)
+    }
+
+}
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetCraftingResultUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetCraftingResultUseCase.kt
new file mode 100644 (file)
index 0000000..09af13a
--- /dev/null
@@ -0,0 +1,18 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetCraftingResultUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun get(input: List<Item>): InventoryItem {
+        return itemsRepository.getCraftingResult(input)
+    }
+
+}
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetFallbackItemUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetFallbackItemUseCase.kt
new file mode 100644 (file)
index 0000000..7b09362
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetFallbackItemUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository
+) {
+
+    operator fun invoke(): Item.None {
+        return itemsRepository.fallbackItem
+    }
+
+}
\ No newline at end of file
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByIndexUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByIndexUseCase.kt
new file mode 100644 (file)
index 0000000..28dafd5
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetItemByIndexUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun get(index: Int): Item {
+        return itemsRepository.getItemByIndex(index)
+    }
+
+}
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByKeyUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/GetItemByKeyUseCase.kt
new file mode 100644 (file)
index 0000000..2371b0b
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class GetItemByKeyUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun get(key: String): Item {
+        return itemsRepository.getItemByKey(key)
+    }
+
+}
\ No newline at end of file
diff --git a/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/InitializeItemsRepositoryUseCase.kt b/core/domain/items/src/main/kotlin/ru/fredboy/cavedroid/domain/items/usecase/InitializeItemsRepositoryUseCase.kt
new file mode 100644 (file)
index 0000000..fe4f84f
--- /dev/null
@@ -0,0 +1,16 @@
+package ru.fredboy.cavedroid.domain.items.usecase
+
+import dagger.Reusable
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import javax.inject.Inject
+
+@Reusable
+class InitializeItemsRepositoryUseCase @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+) {
+
+    operator fun invoke() {
+        itemsRepository.initialize()
+    }
+
+}
diff --git a/core/domain/save/build.gradle.kts b/core/domain/save/build.gradle.kts
new file mode 100644 (file)
index 0000000..bdd2f11
--- /dev/null
@@ -0,0 +1,21 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useCommonModule()
+    useLibgdx()
+    useDagger()
+
+    useModule(":core:domain:items")
+    useModule(":core:domain:assets")
+
+    useModule(":core:game:controller:container")
+    useModule(":core:game:controller:drop")
+    useModule(":core:game:controller:mob")
+    useModule(":core:game:world")
+}
similarity index 67%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/save/GameSaveData.kt
rename to core/domain/save/src/main/kotlin/ru/fredboy/cavedroid/domain/save/model/GameSaveData.kt
index e0d64e72359a4620454ab96df2515a8c9694e35e..109e90c046dbd966d417acef05749f0cd590f690 100644 (file)
@@ -1,21 +1,21 @@
-package ru.deadsoftware.cavedroid.game.save
+package ru.fredboy.cavedroid.domain.save.model
 
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 
 class GameSaveData(
-    private var mobsController: MobsController?,
+    private var mobController: MobController?,
     private var dropController: DropController?,
     private var containerController: ContainerController?,
     private var foreMap: Array<Array<Block>>?,
     private var backMap: Array<Array<Block>>?
 ) {
 
-    fun retrieveMobsController(): MobsController {
-        val value = requireNotNull(mobsController)
-        mobsController = null
+    fun retrieveMobsController(): MobController {
+        val value = requireNotNull(mobController)
+        mobController = null
         return value
     }
 
@@ -44,7 +44,7 @@ class GameSaveData(
     }
 
     fun isEmpty(): Boolean {
-        return mobsController == null &&
+        return mobController == null &&
                 dropController == null &&
                 containerController == null &&
                 foreMap == null &&
diff --git a/core/domain/save/src/main/kotlin/ru/fredboy/cavedroid/domain/save/repository/SaveDataRepository.kt b/core/domain/save/src/main/kotlin/ru/fredboy/cavedroid/domain/save/repository/SaveDataRepository.kt
new file mode 100644 (file)
index 0000000..741df80
--- /dev/null
@@ -0,0 +1,25 @@
+package ru.fredboy.cavedroid.domain.save.repository
+
+import ru.fredboy.cavedroid.domain.save.model.GameSaveData
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
+
+interface SaveDataRepository {
+
+    fun save(
+        gameDataFolder: String,
+        dropController: DropController,
+        mobController: MobController,
+        containerController: ContainerController,
+        gameWorld: GameWorld
+    )
+
+    fun load(
+        gameDataFolder: String,
+    ): GameSaveData
+
+    fun exists(gameDataFolder: String): Boolean
+
+}
\ No newline at end of file
diff --git a/core/game/controller/container/build.gradle.kts b/core/game/controller/container/build.gradle.kts
new file mode 100644 (file)
index 0000000..ef847ce
--- /dev/null
@@ -0,0 +1,15 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useLibgdx()
+    useDagger()
+
+    useCommonModule()
+    useModule(":core:domain:items")
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/ContainerController.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/ContainerController.kt
new file mode 100644 (file)
index 0000000..965835b
--- /dev/null
@@ -0,0 +1,37 @@
+package ru.fredboy.cavedroid.game.controller.container
+
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerAddedListener
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerRemovedListener
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+
+interface ContainerController {
+
+    val size: Int
+
+    fun getContainer(x: Int, y: Int, z: Int): Container?
+
+    fun addContainer(x: Int, y: Int, z: Int, container: Container)
+
+    /**
+     * Removes container without notifying listeners
+     */
+    fun resetContainer(x: Int, y: Int, z: Int)
+
+    /**
+     * Removes container and notifies listeners
+     */
+    fun destroyContainer(x: Int, y: Int, z: Int)
+
+    fun addContainerAddedListener(listener: ContainerAddedListener)
+
+    fun removeContainerAddedListener(listener: ContainerAddedListener)
+
+    fun addContainerRemovedListener(listener: ContainerRemovedListener)
+
+    fun removeContainerRemovedListener(listener: ContainerRemovedListener)
+
+    fun update(delta: Float)
+
+    fun dispose()
+
+}
\ No newline at end of file
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/di/ControllerContainerModule.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/di/ControllerContainerModule.kt
new file mode 100644 (file)
index 0000000..4d2a339
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.container.di
+
+import dagger.Binds
+import dagger.Module
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.impl.ContainerControllerImpl
+
+@Module
+abstract class ControllerContainerModule {
+
+    @Binds
+    internal abstract fun bindContainerController(impl: ContainerControllerImpl): ContainerController
+
+}
\ No newline at end of file
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/impl/ContainerControllerImpl.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/impl/ContainerControllerImpl.kt
new file mode 100644 (file)
index 0000000..5985682
--- /dev/null
@@ -0,0 +1,87 @@
+package ru.fredboy.cavedroid.game.controller.container.impl
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerAddedListener
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerRemovedListener
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import javax.inject.Inject
+
+@GameScope
+class ContainerControllerImpl @Inject constructor(
+    private val itemByKey: GetItemByKeyUseCase,
+) : ContainerController {
+
+    val containerMap = mutableMapOf<String, Container>()
+
+    private val containerAddedListeners = mutableSetOf<ContainerAddedListener>()
+    private val containerRemovedListeners = mutableSetOf<ContainerRemovedListener>()
+
+    override val size get() = containerMap.size
+
+    private fun getContainerKey(x: Int, y: Int, z: Int): String {
+        return "$x;$y;$z"
+    }
+
+    override fun getContainer(x: Int, y: Int, z: Int): Container? {
+        return containerMap[getContainerKey(x, y, z)]
+    }
+
+    override fun addContainer(x: Int, y: Int, z: Int, container: Container) {
+        val key = getContainerKey(x, y, z)
+        if (containerMap.containsKey(key)) {
+            resetContainer(x, y, z)
+        }
+
+        containerMap[key] = container
+
+        containerAddedListeners.forEach { listener ->
+            listener.onContainerAdded(x, y, z, container)
+        }
+    }
+
+    private fun retrieveContainer(x: Int, y: Int, z: Int): Container? {
+        return containerMap.remove(getContainerKey(x, y, z))
+    }
+
+    override fun resetContainer(x: Int, y: Int, z: Int) {
+        retrieveContainer(x, y, z)
+    }
+
+    override fun destroyContainer(x: Int, y: Int, z: Int) {
+        retrieveContainer(x, y, z)?.let { container ->
+            containerRemovedListeners.forEach { listener ->
+                listener.onContainerRemoved(x, y, z, container)
+            }
+        }
+    }
+
+    override fun addContainerAddedListener(listener: ContainerAddedListener) {
+        containerAddedListeners.add(listener)
+    }
+
+    override fun removeContainerAddedListener(listener: ContainerAddedListener) {
+        containerAddedListeners.remove(listener)
+    }
+
+    override fun addContainerRemovedListener(listener: ContainerRemovedListener) {
+        containerRemovedListeners.add(listener)
+    }
+
+    override fun removeContainerRemovedListener(listener: ContainerRemovedListener) {
+        containerRemovedListeners.remove(listener)
+    }
+
+    override fun update(delta: Float) {
+        containerMap.values.forEach { container ->
+            container.update(itemByKey)
+        }
+    }
+
+    override fun dispose() {
+        containerAddedListeners.clear()
+        containerRemovedListeners.clear()
+        containerMap.clear()
+    }
+}
\ No newline at end of file
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerAddedListener.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerAddedListener.kt
new file mode 100644 (file)
index 0000000..7b03354
--- /dev/null
@@ -0,0 +1,9 @@
+package ru.fredboy.cavedroid.game.controller.container.listener
+
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+
+fun interface ContainerAddedListener {
+
+    fun onContainerAdded(x: Int, y: Int, z: Int, container: Container)
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerRemovedListener.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/listener/ContainerRemovedListener.kt
new file mode 100644 (file)
index 0000000..878a2bd
--- /dev/null
@@ -0,0 +1,9 @@
+package ru.fredboy.cavedroid.game.controller.container.listener
+
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+
+fun interface ContainerRemovedListener {
+
+    fun onContainerRemoved(x: Int, y: Int, z: Int, container: Container)
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Chest.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Chest.kt
new file mode 100644 (file)
index 0000000..a20838f
--- /dev/null
@@ -0,0 +1,23 @@
+package ru.fredboy.cavedroid.game.controller.container.model
+
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+
+class Chest(
+    fallbackItem: Item,
+    initialItems: List<InventoryItem>? = null,
+) : Container(
+    size = SIZE,
+    fallbackItem = fallbackItem,
+    initialItems = initialItems
+) {
+
+    override fun update(itemByKey: GetItemByKeyUseCase) {
+        // no-op
+    }
+
+    companion object {
+        private const val SIZE = 27
+    }
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Container.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Container.kt
new file mode 100644 (file)
index 0000000..65e5729
--- /dev/null
@@ -0,0 +1,21 @@
+package ru.fredboy.cavedroid.game.controller.container.model
+
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+
+abstract class Container(
+    val size: Int,
+    protected val fallbackItem: Item,
+    initialItems: List<InventoryItem>? = null
+) {
+
+    private val _items = Array(size) { index ->
+        initialItems?.getOrNull(index) ?: fallbackItem.toInventoryItem()
+    }
+
+    val items get() = _items.asList() as MutableList<InventoryItem>
+
+    abstract fun update(itemByKey: GetItemByKeyUseCase)
+
+}
\ No newline at end of file
similarity index 57%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Furnace.kt
rename to core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/model/Furnace.kt
index 237006dc6959626ec939bcc81f12ed2826d8245a..6ed18a060075aa0d6f8f21035b66ba072b0e8219 100644 (file)
@@ -1,19 +1,21 @@
-package ru.deadsoftware.cavedroid.game.objects.container
+package ru.fredboy.cavedroid.game.controller.container.model
 
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.math.MathUtils
 import com.badlogic.gdx.utils.TimeUtils
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.misc.Saveable
-
-class Furnace @JvmOverloads constructor(
-    gameItemsHolder: GameItemsHolder,
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem.Companion.isNoneOrNull
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+
+class Furnace(
+    fallbackItem: Item,
     initialItems: List<InventoryItem>? = null
-) : Container(SIZE, gameItemsHolder, initialItems), Saveable {
+) : Container(
+    size = SIZE,
+    fallbackItem = fallbackItem,
+    initialItems = initialItems,
+) {
 
     var fuel: InventoryItem
         get() = items[FUEL_INDEX]
@@ -43,22 +45,18 @@ class Furnace @JvmOverloads constructor(
 
     var currentFuelKey: String? = null
 
-    private var startBurnTimeMs = 0L
-    private var smeltStarTimeMs = 0L
+    var startBurnTimeMs = 0L
+    var smeltStarTimeMs = 0L
 
     var burnProgress = 0f
-        private set(value) {
+        set(value) {
             field = MathUtils.clamp(value, 0f, 1f)
         }
     var smeltProgress = 0f
-        private set(value) {
+        set(value) {
             field = MathUtils.clamp(value, 0f, 1f)
         }
 
-    fun init(gameItemsHolder: GameItemsHolder) {
-        currentFuel = currentFuelKey?.let { gameItemsHolder.getItem(it) }
-        items.forEach { it.init(gameItemsHolder) }
-    }
 
     fun canSmelt(): Boolean {
         return (result.isNoneOrNull() || (result.item.params.key == input.item.params.smeltProductKey)) &&
@@ -66,18 +64,18 @@ class Furnace @JvmOverloads constructor(
                 (!fuel.isNoneOrNull() || burnProgress > 0f)
     }
 
-    private fun startBurning(gameItemsHolder: GameItemsHolder) {
+    private fun startBurning() {
         requireNotNull(fuel.item.params.burningTimeMs) { "Cant start burning without fuel" }
         currentFuel = fuel.item
         fuel.subtract()
         if (fuel.amount <= 0) {
-            fuel = gameItemsHolder.fallbackItem.toInventoryItem()
+            fuel = fallbackItem.toInventoryItem()
         }
         startBurnTimeMs = TimeUtils.millis()
         burnProgress = 0f
     }
 
-    override fun update(gameItemsHolder: GameItemsHolder) {
+    override fun update(itemByKey: GetItemByKeyUseCase) {
         if (currentFuel?.isNone() == true) {
             currentFuel = null
         }
@@ -97,7 +95,7 @@ class Furnace @JvmOverloads constructor(
 
         if (currentFuel?.isNone() == false && burnProgress >= 1f) {
             if (canSmelt()) {
-                startBurning(gameItemsHolder)
+                startBurning()
             } else {
                 currentFuel = null
                 burnProgress = 0f
@@ -109,7 +107,7 @@ class Furnace @JvmOverloads constructor(
             return
         }
         if (currentFuel == null && !fuel.isNoneOrNull()) {
-            startBurning(gameItemsHolder)
+            startBurning()
             smeltStarTimeMs = startBurnTimeMs
             smeltProgress = 0f
         }
@@ -121,7 +119,7 @@ class Furnace @JvmOverloads constructor(
 
         if (isActive && smeltProgress >= 1f) {
             val productKey = requireNotNull(input.item.params.smeltProductKey)
-            val res = gameItemsHolder.getItem(productKey)
+            val res = itemByKey[productKey]
             if (result.isNoneOrNull()) {
                 result = res.toInventoryItem()
             } else {
@@ -129,28 +127,14 @@ class Furnace @JvmOverloads constructor(
             }
             input.subtract()
             if (input.amount <= 0) {
-                input = gameItemsHolder.fallbackItem.toInventoryItem()
+                input = fallbackItem.toInventoryItem()
             }
             smeltStarTimeMs = TimeUtils.millis()
             smeltProgress = 0f
         }
     }
 
-    override fun getSaveData(): SaveDataDto.FurnaceSaveData {
-        return SaveDataDto.FurnaceSaveData(
-            version = SAVE_DATA_VERSION,
-            size = size,
-            currentFuelItemKey = currentFuelKey,
-            items = items.map(InventoryItem::getSaveData),
-            startBurnTimeMs = startBurnTimeMs,
-            startSmeltTimeMs = smeltStarTimeMs,
-            burnProgress = burnProgress,
-            smeltProgress = smeltProgress,
-        )
-    }
-
     companion object {
-        private const val SAVE_DATA_VERSION = 1
         private const val SIZE = 3
         private const val TAG = "Furnace"
 
@@ -159,23 +143,6 @@ class Furnace @JvmOverloads constructor(
         const val RESULT_INDEX = 2
 
         const val SMELTING_TIME_MS = 10000L
-
-        fun fromSaveData(saveData: SaveDataDto.FurnaceSaveData, gameItemsHolder: GameItemsHolder): Furnace {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return Furnace(
-                gameItemsHolder = gameItemsHolder,
-                initialItems = saveData.items.map { item ->
-                    InventoryItem.fromSaveData(item, gameItemsHolder)
-                }
-            ).apply {
-                currentFuelKey = saveData.currentFuelItemKey
-                startBurnTimeMs = saveData.startSmeltTimeMs
-                smeltStarTimeMs = saveData.startSmeltTimeMs
-                burnProgress = saveData.burnProgress
-                smeltProgress = saveData.smeltProgress
-            }
-        }
     }
 
 }
\ No newline at end of file
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerAddedListenerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerAddedListenerUseCase.kt
new file mode 100644 (file)
index 0000000..95a74dc
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerAddedListener
+import javax.inject.Inject
+
+class AddContainerAddedListenerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(containerAddedListener: ContainerAddedListener) {
+        containerController.addContainerAddedListener(containerAddedListener)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerRemovedListenerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerRemovedListenerUseCase.kt
new file mode 100644 (file)
index 0000000..03fa499
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerRemovedListener
+import javax.inject.Inject
+
+class AddContainerRemovedListenerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(containerRemovedListener: ContainerRemovedListener) {
+        containerController.addContainerRemovedListener(containerRemovedListener)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/AddContainerUseCase.kt
new file mode 100644 (file)
index 0000000..60f490a
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+import javax.inject.Inject
+
+class AddContainerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(x: Int, y: Int, z: Int, container: Container) {
+        containerController.addContainer(x, y, z, container)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DestroyContainerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DestroyContainerUseCase.kt
new file mode 100644 (file)
index 0000000..e8c1714
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import javax.inject.Inject
+
+class DestroyContainerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(x: Int, y: Int, z: Int) {
+        containerController.destroyContainer(x, y, z)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DisposeContainerControllerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/DisposeContainerControllerUseCase.kt
new file mode 100644 (file)
index 0000000..a8871cc
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import javax.inject.Inject
+
+class DisposeContainerControllerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke() {
+        containerController.dispose()
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/GetContainerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/GetContainerUseCase.kt
new file mode 100644 (file)
index 0000000..8ab149b
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+import javax.inject.Inject
+
+class GetContainerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(x: Int, y: Int, z: Int): Container? {
+        return containerController.getContainer(x, y, z)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerAddedListenerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerAddedListenerUseCase.kt
new file mode 100644 (file)
index 0000000..15fb4ec
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerAddedListener
+import javax.inject.Inject
+
+class RemoveContainerAddedListenerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(containerAddedListener: ContainerAddedListener) {
+        containerController.removeContainerAddedListener(containerAddedListener)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerRemovedListenerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/RemoveContainerRemovedListenerUseCase.kt
new file mode 100644 (file)
index 0000000..070e48f
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.listener.ContainerRemovedListener
+import javax.inject.Inject
+
+class RemoveContainerRemovedListenerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(containerRemovedListener: ContainerRemovedListener) {
+        containerController.removeContainerRemovedListener(containerRemovedListener)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/ResetContainerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/ResetContainerUseCase.kt
new file mode 100644 (file)
index 0000000..60f2125
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import javax.inject.Inject
+
+class ResetContainerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(x: Int, y: Int, z: Int) {
+        containerController.resetContainer(x, y, z)
+    }
+
+}
diff --git a/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/UpdateContainerControllerUseCase.kt b/core/game/controller/container/src/main/kotlin/ru/fredboy/cavedroid/game/controller/container/usecase/UpdateContainerControllerUseCase.kt
new file mode 100644 (file)
index 0000000..f42d6f1
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.container.usecase
+
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import javax.inject.Inject
+
+class UpdateContainerControllerUseCase @Inject constructor(
+    private val containerController: ContainerController,
+) {
+
+    operator fun invoke(delta: Float) {
+        containerController.update(delta)
+    }
+
+}
diff --git a/core/game/controller/drop/build.gradle.kts b/core/game/controller/drop/build.gradle.kts
new file mode 100644 (file)
index 0000000..ef847ce
--- /dev/null
@@ -0,0 +1,15 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useLibgdx()
+    useDagger()
+
+    useCommonModule()
+    useModule(":core:domain:items")
+}
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/DropController.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/DropController.kt
new file mode 100644 (file)
index 0000000..82209f7
--- /dev/null
@@ -0,0 +1,35 @@
+package ru.fredboy.cavedroid.game.controller.drop
+
+import ru.fredboy.cavedroid.game.controller.drop.listener.DropAddedListener
+import ru.fredboy.cavedroid.game.controller.drop.listener.DropRemovedListener
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+
+interface DropController {
+
+    val size: Int
+
+    fun getAllDrop(): Collection<Drop>
+
+    fun addDrop(drop: Drop)
+
+    fun addDrop(x: Float, y: Float, item: Item, count: Int)
+
+    fun addDrop(x: Float, y: Float, inventoryItem: InventoryItem)
+
+    fun forEach(action: (Drop) -> Unit)
+
+    fun update(delta: Float)
+
+    fun addDropAddedListener(listener: DropAddedListener)
+
+    fun removeDropAddedListener(listener: DropAddedListener)
+
+    fun addDropRemovedListener(listener: DropRemovedListener)
+
+    fun removeDropRemovedListener(listener: DropRemovedListener)
+
+    fun dispose()
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/di/ControllerDropModule.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/di/ControllerDropModule.kt
new file mode 100644 (file)
index 0000000..da2f398
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.drop.di
+
+import dagger.Binds
+import dagger.Module
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.impl.DropControllerImpl
+
+@Module
+abstract class ControllerDropModule {
+
+    @Binds
+    internal abstract fun bindDropController(impl: DropControllerImpl): DropController
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/impl/DropControllerImpl.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/impl/DropControllerImpl.kt
new file mode 100644 (file)
index 0000000..372b9a8
--- /dev/null
@@ -0,0 +1,86 @@
+package ru.fredboy.cavedroid.game.controller.drop.impl
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.listener.DropAddedListener
+import ru.fredboy.cavedroid.game.controller.drop.listener.DropRemovedListener
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import java.util.LinkedList
+import javax.inject.Inject
+
+@GameScope
+class DropControllerImpl @Inject constructor() : DropController {
+
+    private val drops = LinkedList<Drop>()
+
+    private val dropAddedListeners = HashSet<DropAddedListener>()
+    private val dropRemovedListeners = HashSet<DropRemovedListener>()
+
+    constructor(initialDrop: Collection<Drop>) : this() {
+        drops.addAll(initialDrop)
+    }
+
+    override val size get() = drops.size
+
+    override fun getAllDrop(): Collection<Drop> {
+        return drops
+    }
+
+    override fun addDrop(drop: Drop) {
+        drops.add(drop)
+        dropAddedListeners.forEach { listener ->
+            listener.onDropAdded(drop)
+        }
+    }
+
+    override fun addDrop(x: Float, y: Float, item: Item, count: Int) {
+        addDrop(Drop(x, y, item, count))
+    }
+
+    override fun addDrop(x: Float, y: Float, inventoryItem: InventoryItem) {
+        addDrop(x, y, inventoryItem.item, inventoryItem.amount)
+    }
+
+    override fun forEach(action: (Drop) -> Unit) {
+        drops.forEach(action)
+    }
+
+    override fun update(delta: Float) {
+        val iterator = drops.iterator()
+
+        while (iterator.hasNext()) {
+            val drop = iterator.next();
+            if (drop.isPickedUp) {
+                iterator.remove()
+                dropRemovedListeners.forEach { listener ->
+                    listener.onDropRemoved(drop)
+                }
+            }
+        }
+    }
+
+    override fun addDropAddedListener(listener: DropAddedListener) {
+        dropAddedListeners.add(listener)
+    }
+
+    override fun removeDropAddedListener(listener: DropAddedListener) {
+        dropAddedListeners.remove(listener)
+    }
+
+    override fun addDropRemovedListener(listener: DropRemovedListener) {
+        dropRemovedListeners.add(listener)
+    }
+
+    override fun removeDropRemovedListener(listener: DropRemovedListener) {
+        dropRemovedListeners.remove(listener)
+    }
+
+    override fun dispose() {
+        dropAddedListeners.clear()
+        dropAddedListeners.clear()
+        drops.clear()
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropAddedListener.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropAddedListener.kt
new file mode 100644 (file)
index 0000000..63798b9
--- /dev/null
@@ -0,0 +1,9 @@
+package ru.fredboy.cavedroid.game.controller.drop.listener
+
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+
+fun interface DropAddedListener {
+
+    fun onDropAdded(drop: Drop)
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropRemovedListener.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/listener/DropRemovedListener.kt
new file mode 100644 (file)
index 0000000..4242e23
--- /dev/null
@@ -0,0 +1,9 @@
+package ru.fredboy.cavedroid.game.controller.drop.listener
+
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+
+fun interface DropRemovedListener {
+
+    fun onDropRemoved(drop: Drop)
+
+}
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/model/Drop.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/model/Drop.kt
new file mode 100644 (file)
index 0000000..376297f
--- /dev/null
@@ -0,0 +1,58 @@
+package ru.fredboy.cavedroid.game.controller.drop.model
+
+import com.badlogic.gdx.math.Intersector
+import com.badlogic.gdx.math.Rectangle
+import com.badlogic.gdx.math.Vector2
+import ru.fredboy.cavedroid.common.utils.BLOCK_SIZE_PX
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+
+class Drop(
+    x: Float,
+    y: Float,
+    val item: Item,
+    _amount: Int = 1,
+) : Rectangle(x, y, DROP_SIZE, DROP_SIZE) {
+
+    val velocity = getInitialVelocity()
+
+    var isPickedUp = false
+    var amount = _amount
+        private set
+
+    fun canMagnetTo(rectangle: Rectangle): Boolean {
+        val magnetArea = getMagnetArea()
+        return Intersector.overlaps(magnetArea, rectangle)
+    }
+
+    fun subtract(count: Int = 1) {
+        if (count < 0) {
+            throw IllegalArgumentException("Can't subtract negative amount")
+        }
+
+        amount -= count
+
+        if (amount <= 0) {
+            isPickedUp = true
+        }
+    }
+
+    private fun getMagnetArea(): Rectangle {
+        return Rectangle(
+            /* x = */ x - MAGNET_DISTANCE,
+            /* y = */ y - MAGNET_DISTANCE,
+            /* width = */ width + MAGNET_DISTANCE * 2,
+            /* height = */ height + MAGNET_DISTANCE * 2,
+        )
+    }
+
+
+    companion object {
+        private fun getInitialVelocity(): Vector2 = Vector2(0f, -1f)
+
+        private const val MAGNET_DISTANCE = 8f
+
+        const val MAGNET_VELOCITY = 256f
+        const val DROP_SIZE = BLOCK_SIZE_PX / 2
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/AddDropUseCase.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/AddDropUseCase.kt
new file mode 100644 (file)
index 0000000..8d08651
--- /dev/null
@@ -0,0 +1,27 @@
+package ru.fredboy.cavedroid.game.controller.drop.usecase
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import javax.inject.Inject
+
+@GameScope
+class AddDropUseCase @Inject constructor(
+    private val dropController: DropController,
+) {
+
+    operator fun invoke(drop: Drop) {
+        dropController.addDrop(drop)
+    }
+
+    operator fun invoke(x: Float, y: Float, item: Item, count: Int) {
+        dropController.addDrop(x, y, item, count)
+    }
+
+    operator fun invoke(x: Float, y: Float, inventoryItem: InventoryItem) {
+        dropController.addDrop(x, y, inventoryItem)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/ForEachDropUseCase.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/ForEachDropUseCase.kt
new file mode 100644 (file)
index 0000000..6fe4125
--- /dev/null
@@ -0,0 +1,17 @@
+package ru.fredboy.cavedroid.game.controller.drop.usecase
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import javax.inject.Inject
+
+@GameScope
+class ForEachDropUseCase @Inject constructor(
+    private val dropController: DropController
+) {
+
+    operator fun invoke(action: (Drop) -> Unit) {
+        dropController.forEach(action)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/UpdateDropController.kt b/core/game/controller/drop/src/main/kotlin/ru/fredboy/cavedroid/game/controller/drop/usecase/UpdateDropController.kt
new file mode 100644 (file)
index 0000000..71db977
--- /dev/null
@@ -0,0 +1,16 @@
+package ru.fredboy.cavedroid.game.controller.drop.usecase
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import javax.inject.Inject
+
+@GameScope
+class UpdateDropController @Inject constructor(
+    private val dropController: DropController
+) {
+
+    operator fun invoke(delta: Float) {
+        dropController.update(delta)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/build.gradle.kts b/core/game/controller/mob/build.gradle.kts
new file mode 100644 (file)
index 0000000..1ea25f3
--- /dev/null
@@ -0,0 +1,16 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useLibgdx()
+    useDagger()
+
+    useCommonModule()
+    useModule(":core:domain:assets")
+    useModule(":core:domain:items")
+}
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/MobController.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/MobController.kt
new file mode 100644 (file)
index 0000000..e291860
--- /dev/null
@@ -0,0 +1,24 @@
+package ru.fredboy.cavedroid.game.controller.mob
+
+import ru.fredboy.cavedroid.game.controller.mob.model.Mob
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+
+interface MobController {
+
+    val mobs: List<Mob>
+
+    val player: Player
+
+    fun addMob(mob: Mob)
+
+    fun removeMob(mob: Mob)
+
+    operator fun plusAssign(mob: Mob) {
+        addMob(mob)
+    }
+
+    operator fun minusAssign(mob: Mob) {
+        removeMob(mob)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/di/MobControllerModule.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/di/MobControllerModule.kt
new file mode 100644 (file)
index 0000000..973ac2f
--- /dev/null
@@ -0,0 +1,14 @@
+package ru.fredboy.cavedroid.game.controller.mob.di
+
+import dagger.Binds
+import dagger.Module
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.impl.MobControllerImpl
+
+@Module
+abstract class MobControllerModule {
+
+    @Binds
+    internal abstract fun bindMobController(impl: MobControllerImpl): MobController
+
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/impl/MobControllerImpl.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/impl/MobControllerImpl.kt
new file mode 100644 (file)
index 0000000..b221631
--- /dev/null
@@ -0,0 +1,33 @@
+package ru.fredboy.cavedroid.game.controller.mob.impl
+
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.assets.repository.MobAssetsRepository
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Mob
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import java.util.LinkedList
+import javax.inject.Inject
+
+@GameScope
+class MobControllerImpl @Inject constructor(
+    mobAssetsRepository: MobAssetsRepository,
+    getFallbackItemUseCase: GetFallbackItemUseCase,
+) : MobController {
+
+    private val _mobs = LinkedList<Mob>()
+
+    override val mobs: List<Mob> get() = _mobs
+
+    override var player = Player(mobAssetsRepository.getPlayerSprites(), getFallbackItemUseCase, 0f, 0f)
+
+    override fun addMob(mob: Mob) {
+        // TODO: Probably shouldn't add if already in the list
+        _mobs.add(mob)
+    }
+
+    override fun removeMob(mob: Mob) {
+        _mobs.remove(mob)
+    }
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Direction.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Direction.kt
new file mode 100644 (file)
index 0000000..f75f1cf
--- /dev/null
@@ -0,0 +1,15 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import com.badlogic.gdx.math.MathUtils
+
+enum class Direction(
+    val index: Int,
+    val basis: Int,
+) {
+    LEFT(0, -1),
+    RIGHT(1, 1);
+
+    companion object {
+        fun random() = if (MathUtils.randomBoolean()) LEFT else RIGHT
+    }
+}
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/FallingBlock.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/FallingBlock.kt
new file mode 100644 (file)
index 0000000..7032fc7
--- /dev/null
@@ -0,0 +1,32 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import com.badlogic.gdx.graphics.g2d.SpriteBatch
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+
+class FallingBlock(
+    val block: Block,
+    x: Float,
+    y: Float,
+) : Mob(x, y, 1.px, 1.px, Direction.RIGHT, Int.MAX_VALUE , {}) {
+
+    init {
+        velocity.y = 1f
+    }
+
+    override val speed get() = 0f
+
+    override fun changeDir() = Unit
+
+    override fun jump() = Unit
+
+    override fun draw(
+        spriteBatch: SpriteBatch,
+        x: Float,
+        y: Float,
+        delta: Float
+    ) {
+        block.draw(spriteBatch, x, y)
+    }
+
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Inventory.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Inventory.kt
new file mode 100644 (file)
index 0000000..598b265
--- /dev/null
@@ -0,0 +1,97 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+
+class Inventory @JvmOverloads constructor(
+    val size: Int,
+    val hotbarSize: Int,
+    private val fallbackItem: Item.None,
+    initialItems: List<InventoryItem>? = null
+) {
+
+    private val _items: Array<InventoryItem>
+
+    init {
+        if (size < 0 || hotbarSize < 0 || hotbarSize > size) {
+            throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size")
+        }
+
+        _items = Array(size) { index -> initialItems?.getOrNull(index) ?: fallbackItem.toInventoryItem() }
+    }
+
+    val items get() = _items.asList() as MutableList<InventoryItem>
+
+    val hotbarItems get() = items.subList(0, hotbarSize)
+
+    private var _activeSlot = 0
+
+    var activeSlot
+        get() = _activeSlot
+        set(value) {
+            if (value in 0 ..< hotbarSize) {
+                _activeSlot = value
+            }
+        }
+
+    val activeItem get() = _items[activeSlot]
+
+    fun getAvailableSlotForItem(item: Item): Int {
+        for (i in _items.indices) {
+            val inventoryItem = _items[i]
+
+            if (item == inventoryItem.item && inventoryItem.canBeAdded()) {
+                return i
+            }
+        }
+
+        for (i in _items.indices) {
+            val inventoryItem = _items[i]
+
+            if (inventoryItem.item.isNone()) {
+                return i
+            }
+        }
+
+        return -1
+    }
+
+    fun canPickItem(item: Item): Boolean {
+        return getAvailableSlotForItem(item) >= 0
+    }
+
+    fun addItem(item: Item) {
+        _items.copyInto(
+            destination = _items,
+            destinationOffset = 1,
+            startIndex = 0,
+            endIndex = size - 1
+        )
+
+        _items[0] = item.toInventoryItem(item.params.maxStack)
+    }
+
+    @JvmOverloads
+    fun decreaseItemAmount(slot: Int, count: Int = 1) {
+        val item = _items[slot]
+        item.subtract(count)
+        if (item.amount <= 0) {
+            _items[slot] = fallbackItem.toInventoryItem()
+        }
+    }
+
+    @JvmOverloads
+    fun decreaseCurrentItemAmount(count: Int = 1) {
+        decreaseItemAmount(activeSlot, count)
+    }
+
+    fun clear() {
+        for (i in _items.indices) {
+            _items[i] = fallbackItem.toInventoryItem()
+        }
+    }
+
+    companion object {
+        private const val SAVE_DATA_VERSION = 1
+    }
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Mob.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Mob.kt
new file mode 100644 (file)
index 0000000..b4015e8
--- /dev/null
@@ -0,0 +1,208 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import com.badlogic.gdx.Gdx
+import com.badlogic.gdx.graphics.Color
+import com.badlogic.gdx.graphics.g2d.SpriteBatch
+import com.badlogic.gdx.math.MathUtils
+import com.badlogic.gdx.math.Rectangle
+import com.badlogic.gdx.math.Vector2
+import com.badlogic.gdx.utils.Timer
+import ru.fredboy.cavedroid.common.utils.bl
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import kotlin.math.abs
+
+abstract class Mob(
+    x: Float,
+    y: Float,
+    width: Float,
+    height: Float,
+    var direction: Direction,
+    val maxHealth: Int,
+    val behaviourStrategy: Mob.(Float) -> Unit,
+) : Rectangle(x, y, width, height) {
+
+    private var resetTakeDamageTask: ResetTakeDamageTask? = null
+
+    var velocity = Vector2()
+        protected set
+
+    val mapX get() = (x + width / 2).bl
+    val upperMapY get() = y.bl
+    val middleMapY get() = (y + height / 2).bl
+    val lowerMapY get() = (y + height).bl
+
+    var animDelta = ANIMATION_SPEED;
+    var anim = 0f
+
+    var isDead = false
+        protected set
+
+    var canJump = false
+
+    var isFlyMode = false
+
+    var health = maxHealth
+
+    var takingDamage = false
+        set(value) {
+            field = value
+
+            if (value) {
+                var resetTask = resetTakeDamageTask
+                if (resetTask != null && resetTask.isScheduled) {
+                    resetTask.cancel()
+                } else {
+                    resetTask = ResetTakeDamageTask()
+                }
+                Timer.schedule(resetTask, DAMAGE_TINT_TIMEOUT_S)
+                resetTakeDamageTask = resetTask
+            }
+        }
+
+    protected val tintColor: Color
+        get() = if (takingDamage) {
+            DAMAGE_TINT_COLOR
+        } else {
+            Color.WHITE
+        }
+
+    abstract val speed: Float
+
+    private fun isAnimationIncreasing(): Boolean {
+        return anim > 0 && animDelta > 0 || anim < 0 && animDelta < 0
+    }
+
+    private fun checkHealth() {
+        health = MathUtils.clamp(health, 0, maxHealth)
+
+        if (health <= 0) {
+            kill()
+        }
+    }
+
+    protected fun updateAnimation(delta: Float) {
+        val velocityMultiplier = abs(velocity.x) / speed
+        val animMultiplier = (if (velocityMultiplier == 0f) 1f else velocityMultiplier) * delta
+        val maxAnim = ANIMATION_RANGE * (if (velocityMultiplier == 0f) 1f else velocityMultiplier)
+
+        if (velocity.x != 0f || abs(anim) > animDelta * animMultiplier) {
+            anim += animDelta * animMultiplier
+        } else {
+            anim = 0f
+        }
+
+        if (anim > maxAnim) {
+            anim = maxAnim
+            animDelta = -ANIMATION_SPEED
+        } else if (anim < -maxAnim) {
+            anim = -maxAnim
+            animDelta = ANIMATION_SPEED
+        }
+
+        if (velocity.x == 0f && isAnimationIncreasing()) {
+            animDelta = -animDelta
+        }
+    }
+
+    protected fun switchDir() {
+        direction = if (looksLeft()) {
+            Direction.RIGHT
+        } else {
+            Direction.LEFT
+        }
+    }
+
+    fun looksLeft() = direction == Direction.LEFT
+
+    fun looksRight() = direction == Direction.RIGHT
+
+    fun kill() {
+        isDead = true
+    }
+
+    open fun damage(damage: Int) {
+        if (damage == 0) {
+            return
+        }
+
+        if (damage < 0) {
+            Gdx.app.error(TAG, "Damage can't be negative!")
+            return
+        }
+
+        if (health <= Int.MIN_VALUE + damage) {
+            health = Int.MIN_VALUE + damage
+        }
+
+        health -= damage
+        checkHealth()
+
+        takingDamage = true
+    }
+
+    fun heal(heal: Int) {
+        if (heal < 0) {
+            Gdx.app.error(TAG, "Heal can't be negative")
+            return
+        }
+
+        if (health >= Int.MAX_VALUE - heal) {
+            health = Int.MAX_VALUE - heal
+        }
+
+        health += health
+        checkHealth()
+    }
+
+    fun getHitBox(): Rectangle {
+        return Rectangle(
+            /* x = */ x - HIT_RANGE,
+            /* y = */ y + HIT_RANGE,
+            /* width = */ width + HIT_RANGE * 2f,
+            /* height = */ height + HIT_RANGE * 2f
+        )
+    }
+
+    fun update(delta: Float) {
+        this.behaviourStrategy(delta)
+    }
+
+    open fun getDropItems(
+        itemByKey: GetItemByKeyUseCase
+    ): List<InventoryItem> {
+        return emptyList()
+    }
+
+    fun attachToController(mobController: MobController) {
+        mobController += this
+    }
+
+    abstract fun draw(spriteBatch: SpriteBatch, x: Float, y: Float, delta: Float)
+
+    abstract fun changeDir()
+
+    abstract fun jump()
+
+    private inner class ResetTakeDamageTask : Timer.Task() {
+        override fun run() {
+            takingDamage = false
+        }
+    }
+
+    companion object {
+        private const val TAG = "Mob"
+
+        @JvmStatic
+        protected val ANIMATION_SPEED = 360f
+
+        protected const val ANIMATION_RANGE = 60f
+
+        private const val HIT_RANGE = 8f;
+
+        private const val DAMAGE_TINT_TIMEOUT_S = 0.5f
+        private val DAMAGE_TINT_COLOR = Color((0xff8080 shl 8) or 0xFF)
+
+    }
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Pig.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Pig.kt
new file mode 100644 (file)
index 0000000..4f1585b
--- /dev/null
@@ -0,0 +1,74 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import com.badlogic.gdx.graphics.Color
+import com.badlogic.gdx.graphics.g2d.SpriteBatch
+import com.badlogic.gdx.math.Vector2
+import ru.fredboy.cavedroid.common.utils.drawSprite
+import ru.fredboy.cavedroid.domain.assets.model.MobSprite
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+
+class Pig(
+    private val sprite: MobSprite.Pig,
+    x: Float,
+    y: Float
+) : Mob(x, y, WIDTH, HEIGHT, Direction.random(), MAX_HEALTH, {}) {
+
+    override val speed get() = SPEED
+    
+    override fun changeDir() {
+        switchDir()
+        velocity = Vector2(direction.basis * speed, 0f)
+    }
+
+    override fun jump() {
+        velocity.y = JUMP_VELOCITY
+    }
+
+    override fun damage(damage: Int) {
+        super.damage(damage)
+
+        if (damage > 0) {
+            if (canJump) {
+                jump()
+            }
+        }
+    }
+
+    override fun getDropItems(itemByKey: GetItemByKeyUseCase): List<InventoryItem> {
+        return listOf(itemByKey["porkchop_raw"].toInventoryItem())
+    }
+
+    override fun draw(
+        spriteBatch: SpriteBatch,
+        x: Float,
+        y: Float,
+        delta: Float
+    ) {
+        updateAnimation(delta)
+
+        val leftLegX = x + sprite.getLeftLegRelativeX(direction.index)
+        val rightLegX = x + sprite.getRightLegRelativeX(direction.index)
+        val legY = y + sprite.getLegsRelativeY()
+
+        sprite.leg.setOrigin(sprite.leg.width / 2, 0f)
+        sprite.leg.setFlip(looksRight(), sprite.leg.isFlipY)
+        sprite.headAndBody.setFlip(looksRight(), sprite.leg.isFlipY)
+
+        val backgroundTintColor = tintColor.cpy().sub(Color(0xAAAAAA shl 8))
+
+        spriteBatch.drawSprite(sprite.leg, leftLegX, legY, -anim, tint = backgroundTintColor)
+        spriteBatch.drawSprite(sprite.leg, rightLegX, legY, -anim, tint = backgroundTintColor)
+        spriteBatch.drawSprite(sprite.headAndBody, x, y, tint = tintColor)
+        spriteBatch.drawSprite(sprite.leg, leftLegX, legY, anim, tint = tintColor)
+        spriteBatch.drawSprite(sprite.leg, rightLegX, legY, anim, tint = tintColor)
+    }
+    
+    companion object {
+        private const val WIDTH = 25f
+        private const val HEIGHT = 18f
+        private const val SPEED =  48f
+        private const val JUMP_VELOCITY = -133.332f
+        private const val MAX_HEALTH = 10
+    }
+}
\ No newline at end of file
diff --git a/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Player.kt b/core/game/controller/mob/src/main/kotlin/ru/fredboy/cavedroid/game/controller/mob/model/Player.kt
new file mode 100644 (file)
index 0000000..6540357
--- /dev/null
@@ -0,0 +1,250 @@
+package ru.fredboy.cavedroid.game.controller.mob.model
+
+import com.badlogic.gdx.graphics.Color
+import com.badlogic.gdx.graphics.g2d.SpriteBatch
+import com.badlogic.gdx.math.MathUtils
+import com.badlogic.gdx.math.Vector2
+import ru.fredboy.cavedroid.common.utils.applyOrigin
+import ru.fredboy.cavedroid.common.utils.drawSprite
+import ru.fredboy.cavedroid.domain.assets.model.MobSprite
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+
+class Player(
+    private val sprite: MobSprite.Player,
+    private val getFallbackItem: GetFallbackItemUseCase,
+    x: Float,
+    y: Float,
+) : Mob(x, y, WIDTH, HEIGHT, Direction.random(), MAX_HEALTH, {}) {
+
+    var inventory = Inventory(
+        size = INVENTORY_SIZE,
+        hotbarSize = HOTBAR_SIZE,
+        fallbackItem = getFallbackItem(),
+    )
+
+    var gameMode = 0
+    var swim = false
+
+    var cursorX = 0
+    var cursorY = 0
+
+    var controlMode = ControlMode.WALK
+    var blockDamage = 0f
+
+    var isHitting = false
+    var isHittingWithDamage = false
+
+    var hitAnim = 0f
+    var hitAnimDelta = ANIMATION_SPEED
+
+    var headRotation = 0f
+
+    override val speed get() = SPEED
+
+    override fun changeDir() {
+        switchDir()
+        velocity = Vector2(direction.basis * speed, 0f)
+    }
+
+    override fun jump() {
+        velocity.y = JUMP_VELOCITY
+    }
+
+    override fun damage(damage: Int) {
+        super.damage(damage)
+
+        if (damage > 0 && canJump) {
+            jump()
+        }
+    }
+
+    override fun getDropItems(itemByKey: GetItemByKeyUseCase): List<InventoryItem> {
+        return inventory.items
+    }
+
+    override fun draw(spriteBatch: SpriteBatch, x: Float, y: Float, delta: Float) {
+        with(sprite) {
+            hand.setFlip(looksRight(), hand.isFlipY)
+            leg.setFlip(looksRight(), leg.isFlipY)
+            head.setFlip(looksRight(), head.isFlipY)
+            body.setFlip(looksRight(), body.isFlipY)
+
+            hand.setOrigin(hand.width / 2f, 0f)
+            leg.setOrigin(leg.width / 2f, 0f)
+            head.setOrigin(head.width / 2, head.height)
+
+            var backHandAnim = 0f
+            var frontHandAnim = 0f
+
+            val rightHandAnim = getRightHandAnim(delta)
+
+            if (looksLeft()) {
+                backHandAnim = rightHandAnim
+                frontHandAnim = anim
+            } else {
+                backHandAnim = -anim
+                frontHandAnim = -rightHandAnim
+            }
+
+            val backgroundTintColor = tintColor.cpy().sub(Color(0xAAAAAA shl 16))
+
+            hand.color = backgroundTintColor
+            spriteBatch.drawSprite(hand, x + getBodyRelativeX(), y + getBodyRelativeY(), backHandAnim)
+
+            if (looksLeft()) {
+                drawItem(spriteBatch, x, y, -backHandAnim)
+            }
+
+            leg.color = backgroundTintColor
+            spriteBatch.drawSprite(leg, x + getBodyRelativeX(), y + getLegsRelativeY(), anim)
+
+            leg.color = tintColor
+            spriteBatch.drawSprite(leg, x + getBodyRelativeX(), y + getLegsRelativeY(), -anim)
+
+            head.color = tintColor
+            spriteBatch.drawSprite(head, x, y, headRotation)
+
+            body.color = tintColor
+            spriteBatch.drawSprite(body, x + getBodyRelativeX(), y + getBodyRelativeY())
+
+            if (looksRight()) {
+                drawItem(spriteBatch, x, y, frontHandAnim)
+            }
+
+            hand.color = tintColor
+            spriteBatch.drawSprite(hand, x + getBodyRelativeX(), y + getBodyRelativeY(), frontHandAnim)
+        }
+    }
+
+    fun startHitting(withDamage: Boolean = true) {
+        if (isHitting) {
+            return
+        }
+
+        isHitting = true
+        isHittingWithDamage = withDamage
+        hitAnim = HIT_ANIMATION_RANGE.endInclusive
+        hitAnimDelta = ANIMATION_SPEED
+    }
+
+    fun stopHitting() {
+        blockDamage = 0f
+        isHitting = false
+    }
+
+    fun decreaseCurrentItemCount() {
+        if (gameMode == 1) {
+            return
+        }
+
+        inventory.activeItem.subtract()
+
+        if (inventory.activeItem.amount <= 0) {
+            setCurrentInventorySlotItem(getFallbackItem())
+        }
+    }
+
+    fun setCurrentInventorySlotItem(item: Item) {
+        inventory.items[inventory.activeSlot] = item.toInventoryItem()
+    }
+
+    private fun drawItem(spriteBatch: SpriteBatch, x: Float, y: Float, handAnim: Float) {
+        val item = inventory.activeItem.item.takeIf { !it.isNone() } ?: return
+        val itemSprite = item.sprite
+        val isSmallSprite = !item.isTool() || item.isShears()
+        val originalWidth = itemSprite.width
+        val originalHeight = itemSprite.height
+        val handLength = sprite.hand.height
+
+        if (isSmallSprite) {
+            itemSprite.setSize(SMALL_ITEM_SIZE, SMALL_ITEM_SIZE)
+        }
+
+        val spriteOrigin = item.params.inHandSpriteOrigin
+        val handMultiplier = -direction.basis
+        val xOffset = (-1 + direction.index) * itemSprite.width + SMALL_ITEM_SIZE / 2 +
+                handMultiplier * itemSprite.width * spriteOrigin.x
+        val yOffset = if (!isSmallSprite) - itemSprite.height / 2 else 0f
+
+        val rotate = handAnim + HAND_ITEM_ANGLE_DEG
+
+        if (item.isTool()) {
+            itemSprite.rotate90(looksLeft())
+        }
+
+        val itemX = x + handLength * MathUtils.sin(handMultiplier * handAnim * MathUtils.degRad) + xOffset
+        val itemY = y + handLength * MathUtils.cos(handMultiplier * handAnim * MathUtils.degRad) + yOffset
+
+        if (looksLeft()) {
+            itemSprite.setFlip(!item.isTool(), itemSprite.isFlipY)
+            itemSprite.applyOrigin(spriteOrigin.getFlipped(flipX = true, flipY = false))
+        } else {
+            itemSprite.setFlip(item.isTool(), itemSprite.isFlipY)
+            itemSprite.applyOrigin(spriteOrigin)
+        }
+
+        itemSprite.rotation = -handMultiplier * rotate
+        itemSprite.setPosition(itemX, itemY)
+        itemSprite.draw(spriteBatch)
+
+
+        // dont forget to reset
+        itemSprite.setFlip(false, itemSprite.isFlipY)
+        itemSprite.rotation = 0f
+        itemSprite.setOriginCenter()
+        itemSprite.setSize(originalWidth, originalHeight)
+        if (item.isTool()) {
+            itemSprite.rotate90(looksRight())
+        }
+    }
+
+    private fun getRightHandAnim(delta: Float): Float {
+        hitAnim -= hitAnimDelta * delta
+
+        if (hitAnim !in HIT_ANIMATION_RANGE) {
+            if (isHitting) {
+                hitAnim = MathUtils.clamp(hitAnim, HIT_ANIMATION_RANGE.start, HIT_ANIMATION_RANGE.endInclusive)
+                hitAnimDelta = -hitAnimDelta
+            } else {
+                hitAnimDelta = ANIMATION_SPEED
+            }
+        }
+
+        if (!isHitting) {
+            if (hitAnim < hitAnimDelta * delta) {
+                hitAnim = 0f
+                hitAnimDelta = 0f
+                return -anim
+            }
+        }
+
+        return hitAnim
+    }
+
+    enum class ControlMode {
+        WALK,
+        CURSOR
+    }
+
+    companion object {
+        const val HOTBAR_SIZE = 9
+        const val INVENTORY_SIZE = 36
+
+        const val MAX_HEALTH = 20
+
+        private const val WIDTH = 4f
+        private const val HEIGHT = 30f
+
+        private const val SPEED = 69.072f
+        private const val JUMP_VELOCITY = -133.332f
+
+        private val HIT_ANIMATION_RANGE = 30f..90f
+
+        private val SMALL_ITEM_SIZE = 8f
+        private val HAND_ITEM_ANGLE_DEG = 30f
+    }
+}
\ No newline at end of file
diff --git a/core/game/world/build.gradle.kts b/core/game/world/build.gradle.kts
new file mode 100644 (file)
index 0000000..8c3e673
--- /dev/null
@@ -0,0 +1,19 @@
+plugins {
+    kotlin
+    ksp
+}
+
+java.sourceCompatibility = ApplicationInfo.sourceCompatibility
+java.targetCompatibility = ApplicationInfo.sourceCompatibility
+
+dependencies {
+    useLibgdx()
+    useDagger()
+
+    useCommonModule()
+    useModule(":core:domain:items")
+
+    useModule(":core:game:controller:container")
+    useModule(":core:game:controller:drop")
+    useModule(":core:game:controller:mob")
+}
diff --git a/core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/GameWorld.kt b/core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/GameWorld.kt
new file mode 100644 (file)
index 0000000..a6b0a24
--- /dev/null
@@ -0,0 +1,267 @@
+package ru.fredboy.cavedroid.game.world
+
+import com.badlogic.gdx.Gdx
+import com.badlogic.gdx.math.MathUtils
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
+import ru.fredboy.cavedroid.game.controller.container.model.Container
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.generator.GameWorldGenerator
+import ru.fredboy.cavedroid.game.world.generator.WorldGeneratorConfig
+import javax.inject.Inject
+
+@GameScope
+class GameWorld @Inject constructor(
+    private val itemsRepository: ItemsRepository,
+    private val containerController: ContainerController,
+    private val mobController: MobController,
+    private val dropController: DropController,
+    initialForeMap: Array<Array<Block>>?,
+    initialBackMap: Array<Array<Block>>?,
+) {
+    val foreMap: Array<Array<Block>>
+    val backMap: Array<Array<Block>>
+
+    val width: Int
+    val height: Int
+
+    val generatorConfig = WorldGeneratorConfig.getDefault()
+
+    init {
+        width = generatorConfig.width
+        height = generatorConfig.height
+
+        val (generatedFore, generatedBack) = GameWorldGenerator(generatorConfig, itemsRepository).generate()
+        foreMap = generatedFore
+        backMap = generatedBack
+    }
+
+    private fun transformX(x: Int): Int {
+        var transformed = x % width
+        if (transformed < 0) {
+            transformed = width + x
+        }
+        return transformed
+    }
+
+    private fun getMap(x: Int, y: Int, layer: Int): Block {
+        val fallback = itemsRepository.fallbackBlock
+
+        if (y !in 0 ..< height) {
+            return fallback
+        }
+
+        val transformedX = transformX(x)
+
+        if (transformedX !in 0 ..< width) {
+            return fallback
+        }
+
+        return when (layer) {
+            FOREGROUND_Z -> foreMap[transformedX][y]
+            BACKGROUND_Z -> backMap[transformedX][y]
+            else -> {
+                Gdx.app.error(TAG, "Unexpected value for layer in getMap ($layer). Returning fallback")
+                fallback
+            }
+        }
+    }
+
+    private fun setMap(x: Int, y: Int, layer: Int, value: Block) {
+        if (y !in 0 ..< height) {
+            return
+        }
+
+        val transformedX = transformX(x)
+
+        if (transformedX !in 0 ..< width) {
+            return
+        }
+
+        containerController.destroyContainer(x, y, layer)
+
+        if (value.isContainer()) {
+            when {
+                value.isChest() -> Chest(itemsRepository.fallbackItem)
+                value.isFurnace() -> Furnace(itemsRepository.fallbackItem)
+                else -> {
+                    Gdx.app.error(TAG, "Unknow container type: ${value::class.simpleName}")
+                    null
+                }
+            }?.let { container ->
+                containerController.addContainer(x, y, layer, container)
+            }
+        }
+
+        when (layer) {
+            FOREGROUND_Z -> foreMap[transformedX][y] = value
+            BACKGROUND_Z -> backMap[transformedX][y] = value
+            else -> {
+                Gdx.app.error(TAG, "Unexpected value for layer in setMap ($layer). Returning fallback")
+            }
+        }
+    }
+
+    private fun isSameSlab(slab1: Block, slab2: Block): Boolean {
+        return slab1 is Block.Slab && slab2 is Block.Slab &&
+                (slab1.params.key == slab2.otherPartBlockKey || slab1.otherPartBlockKey == slab2.params.key)
+    }
+
+    fun hasForeAt(x: Int, y: Int): Boolean {
+        return !getMap(x, y, FOREGROUND_Z).isNone()
+    }
+
+    fun hasBackAt(x: Int, y: Int): Boolean {
+        return !getMap(x, y, BACKGROUND_Z).isNone()
+    }
+
+    fun getForeMap(x: Int, y: Int): Block {
+        return getMap(x, y, FOREGROUND_Z)
+    }
+
+    fun setForeMap(x: Int, y: Int, block: Block) {
+        setMap(x, y, FOREGROUND_Z, block)
+    }
+
+    fun resetForeMap(x: Int, y: Int) {
+        setForeMap(x, y, itemsRepository.fallbackBlock)
+    }
+
+    fun getBackMap(x: Int, y: Int): Block {
+        return getMap(x, y, BACKGROUND_Z)
+    }
+
+    fun setBackMap(x: Int, y: Int, block: Block) {
+        setMap(x, y, BACKGROUND_Z, block)
+    }
+
+    fun canPlaceToForeground(x: Int, y: Int, value: Block): Boolean {
+        return !hasForeAt(x, y) || value.isNone() || !getForeMap(x, y).params.hasCollision
+    }
+
+    fun placeToForeground(x: Int, y: Int, value: Block): Boolean {
+        return if (canPlaceToForeground(x, y, value)) {
+            setForeMap(x, y, value)
+            true
+        } else if (value is Block.Slab && isSameSlab(value, getForeMap(x, y))) {
+            setForeMap(x, y, itemsRepository.getBlockByKey(value.otherPartBlockKey))
+            true
+        } else {
+            false
+        }
+    }
+
+    fun placeToBackground(x: Int, y: Int, value: Block): Boolean {
+        return if (value.isNone() || getBackMap(x, y).isNone() && value.params.hasCollision &&
+            (!value.params.isTransparent || value.params.key == "glass" || value.isChest() || value.isSlab())) {
+            setBackMap(x, y, value)
+            true
+        } else {
+            false
+        }
+    }
+
+    fun checkPlayerCursorBounds() {
+        with(mobController.player) {
+            if (gameMode == 0) {
+                val minCursorX = mapX - SURVIVAL_CURSOR_RANGE
+                val maxCursorX = mapX + SURVIVAL_CURSOR_RANGE
+                val minCursorY = middleMapY - SURVIVAL_CURSOR_RANGE
+                val maxCursorY = middleMapY + SURVIVAL_CURSOR_RANGE
+
+                cursorX = MathUtils.clamp(cursorX, minCursorX, maxCursorX)
+                cursorY = MathUtils.clamp(cursorY, minCursorY, maxCursorY)
+            }
+
+            cursorY = MathUtils.clamp(cursorY, 0, this@GameWorld.height)
+        }
+    }
+
+    fun playerDurateTool() {
+        TODO()
+    }
+
+    private fun shouldDrop(block: Block): Boolean {
+        TODO()
+    }
+
+    private fun spawnInitialMobs() {
+        TODO()
+    }
+
+    fun destroyForeMap(x: Int, y: Int) {
+        val block = getForeMap(x, y)
+
+        if (block.isContainer()) {
+            containerController.destroyContainer(x, y, FOREGROUND_Z)
+        }
+
+        block.params.dropInfo?.takeIf { shouldDrop(block) }?.let { dropInfo ->
+            dropController.addDrop(
+                x = transformX(x).px,
+                y = y.px,
+                item = itemsRepository.getItemByKey(dropInfo.itemKey),
+                count = dropInfo.count,
+            )
+        }
+        playerDurateTool()
+        placeToForeground(x, y, itemsRepository.fallbackBlock)
+    }
+
+    fun destroyBackMap(x: Int, y: Int) {
+        val block = getBackMap(x, y)
+
+        if (block.isContainer()) {
+            containerController.destroyContainer(x, y, BACKGROUND_Z)
+        }
+
+        block.params.dropInfo?.takeIf { shouldDrop(block) }?.let { dropInfo ->
+            dropController.addDrop(
+                x = transformX(x).px,
+                y = y.px,
+                item = itemsRepository.getItemByKey(dropInfo.itemKey),
+                count = dropInfo.count,
+            )
+        }
+        playerDurateTool()
+        placeToBackground(x, y, itemsRepository.fallbackBlock)
+    }
+
+    private fun getContainerAt(x: Int, y: Int, layer: Int): Container? {
+        return containerController.getContainer(x, y, layer)
+    }
+
+    fun getForegroundContainer(x: Int, y: Int): Container? {
+        return getContainerAt(x, y, FOREGROUND_Z)
+    }
+
+    fun getBackgroundContainer(x: Int, y: Int): Container? {
+        return getContainerAt(x, y, BACKGROUND_Z)
+    }
+
+    fun getForegroundFurnace(x: Int, y: Int): Furnace? {
+        return getForegroundContainer(x, y) as? Furnace
+    }
+
+    fun getBackgroundFurnace(x: Int, y: Int): Furnace? {
+        return getBackgroundContainer(x, y) as? Furnace
+    }
+
+
+    companion object {
+        private const val TAG = "GameWorld"
+
+        private const val FOREGROUND_Z = 0
+        private const val BACKGROUND_Z = 1
+
+        private const val SURVIVAL_CURSOR_RANGE = 4
+    }
+}
\ No newline at end of file
similarity index 51%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/world/Biome.kt
rename to core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/Biome.kt
index ee214bd783a27a8c5c4f84551991aebdea1f6fb1..98d63198c04e73181ec8423e2c8e37e939ed9a52 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.game.model.world
+package ru.fredboy.cavedroid.game.world.generator
 
 enum class Biome {
     PLAINS,
similarity index 77%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/world/GameWorldGenerator.kt
rename to core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/GameWorldGenerator.kt
index 9562f08b192462e95b1704b5e73a36fd20f395a4..7f2c65c9562b2dd4efff3bf79f257a2792329a89 100644 (file)
@@ -1,9 +1,7 @@
-package ru.deadsoftware.cavedroid.game.world
+package ru.fredboy.cavedroid.game.world.generator
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.world.Biome
-import ru.deadsoftware.cavedroid.game.model.world.generator.WorldGeneratorConfig
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 import kotlin.math.abs
 import kotlin.math.max
 import kotlin.math.min
@@ -11,13 +9,13 @@ import kotlin.random.Random
 
 class GameWorldGenerator(
     private val config: WorldGeneratorConfig,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
 ) {
 
     private val random = Random(config.seed)
 
-    private val foreMap by lazy { Array(config.width) { Array(config.height) { gameItemsHolder.fallbackBlock } } }
-    private val backMap by lazy { Array(config.width) { Array(config.height) { gameItemsHolder.fallbackBlock } } }
+    private val foreMap by lazy { Array(config.width) { Array<Block>(config.height) { itemsRepository.fallbackBlock } } }
+    private val backMap by lazy { Array(config.width) { Array<Block>(config.height) { itemsRepository.fallbackBlock } } }
 
     private val heights by lazy { generateHeights() }
     private val biomesMap by lazy { generateBiomes() }
@@ -68,11 +66,11 @@ class GameWorldGenerator(
 
         val surfaceHeight = heights[x]
 
-        val grass = gameItemsHolder.getBlock("grass_snowed")
-        val bedrock = gameItemsHolder.getBlock("bedrock")
-        val dirt = gameItemsHolder.getBlock("dirt")
-        val stone = gameItemsHolder.getBlock("stone")
-        val snow = gameItemsHolder.getBlock("snow")
+        val grass = itemsRepository.getBlockByKey("grass_snowed")
+        val bedrock = itemsRepository.getBlockByKey("bedrock")
+        val dirt = itemsRepository.getBlockByKey("dirt")
+        val stone = itemsRepository.getBlockByKey("stone")
+        val snow = itemsRepository.getBlockByKey("snow")
 
         foreMap[x][surfaceHeight] = grass
         foreMap[x][config.height - 1] = bedrock
@@ -109,10 +107,10 @@ class GameWorldGenerator(
 
         val surfaceHeight = heights[x]
 
-        val grass = gameItemsHolder.getBlock("grass")
-        val bedrock = gameItemsHolder.getBlock("bedrock")
-        val dirt = gameItemsHolder.getBlock("dirt")
-        val stone = gameItemsHolder.getBlock("stone")
+        val grass = itemsRepository.getBlockByKey("grass")
+        val bedrock = itemsRepository.getBlockByKey("bedrock")
+        val dirt = itemsRepository.getBlockByKey("dirt")
+        val stone = itemsRepository.getBlockByKey("stone")
 
         foreMap[x][surfaceHeight] = grass
         foreMap[x][config.height - 1] = bedrock
@@ -147,10 +145,10 @@ class GameWorldGenerator(
 
         val surfaceHeight = heights[x]
 
-        val sand = gameItemsHolder.getBlock("sand")
-        val bedrock = gameItemsHolder.getBlock("bedrock")
-        val sandstone = gameItemsHolder.getBlock("sandstone")
-        val stone = gameItemsHolder.getBlock("stone")
+        val sand = itemsRepository.getBlockByKey("sand")
+        val bedrock = itemsRepository.getBlockByKey("bedrock")
+        val sandstone = itemsRepository.getBlockByKey("sandstone")
+        val stone = itemsRepository.getBlockByKey("stone")
 
 
         foreMap[x][surfaceHeight] = sand
@@ -183,11 +181,11 @@ class GameWorldGenerator(
     }
 
     private fun fillWater() {
-        val water = gameItemsHolder.getBlock("water")
+        val water = itemsRepository.getBlockByKey("water")
 
         for (x in 0 ..< config.width) {
             for (y in config.seaLevel ..< config.height) {
-                if (foreMap[x][y] != gameItemsHolder.fallbackBlock) {
+                if (!foreMap[x][y].isNone()) {
                     break
                 }
 
@@ -197,7 +195,7 @@ class GameWorldGenerator(
     }
 
     private fun generateCactus(x: Int) {
-        val cactus = gameItemsHolder.getBlock("cactus")
+        val cactus = itemsRepository.getBlockByKey("cactus")
         val cactusHeight = random.nextInt(3)
         val h = heights[x] - 1
 
@@ -207,8 +205,8 @@ class GameWorldGenerator(
     }
 
     private fun generateOak(x: Int) {
-        val log = gameItemsHolder.getBlock("log_oak")
-        val leaves = gameItemsHolder.getBlock("leaves_oak")
+        val log = itemsRepository.getBlockByKey("log_oak")
+        val leaves = itemsRepository.getBlockByKey("leaves_oak")
         val h = heights[x] - 1
         val treeH = random.nextInt(5, 7)
         val height = max(0, h - treeH)
@@ -225,7 +223,7 @@ class GameWorldGenerator(
                 backMap[x1][y] = leaves
             }
             if (random.nextInt(15) < 3) {
-                foreMap[x1][heights[x1] - 1] = gameItemsHolder.getBlock(mushrooms.random(random))
+                foreMap[x1][heights[x1] - 1] = itemsRepository.getBlockByKey(mushrooms.random(random))
             }
         }
 
@@ -235,8 +233,8 @@ class GameWorldGenerator(
     }
 
     private fun generateSpruce(x: Int) {
-        val log = gameItemsHolder.getBlock("log_spruce")
-        val leaves = gameItemsHolder.getBlock("leaves_spruce")
+        val log = itemsRepository.getBlockByKey("log_spruce")
+        val leaves = itemsRepository.getBlockByKey("leaves_spruce")
         val h = heights[x] - 1
         val treeH = random.nextInt(7, 9)
         val height = max(0, h - treeH)
@@ -266,7 +264,7 @@ class GameWorldGenerator(
     }
 
     private fun generateTallGrass(x: Int) {
-        val tallGrass = gameItemsHolder.getBlock(plainsPlants.random(random))
+        val tallGrass = itemsRepository.getBlockByKey(plainsPlants.random(random))
         val h = heights[x] - 1
         if (h > 0) {
             foreMap[x][h] = tallGrass
@@ -274,7 +272,7 @@ class GameWorldGenerator(
     }
 
     private fun generateDeadBush(x: Int) {
-        val bush = gameItemsHolder.getBlock("deadbush")
+        val bush = itemsRepository.getBlockByKey("deadbush")
         val h = heights[x] - 1
         if (h > 0) {
             foreMap[x][h] = bush
@@ -282,12 +280,12 @@ class GameWorldGenerator(
     }
 
     private fun generateOres(x : Int) {
-        val stone = gameItemsHolder.getBlock("stone")
-        val coal = gameItemsHolder.getBlock("coal_ore")
-        val iron = gameItemsHolder.getBlock("iron_ore")
-        val gold = gameItemsHolder.getBlock("gold_ore")
-        val diamond = gameItemsHolder.getBlock("diamond_ore")
-        val lapis = gameItemsHolder.getBlock("lapis_ore")
+        val stone = itemsRepository.getBlockByKey("stone")
+        val coal = itemsRepository.getBlockByKey("coal_ore")
+        val iron = itemsRepository.getBlockByKey("iron_ore")
+        val gold = itemsRepository.getBlockByKey("gold_ore")
+        val diamond = itemsRepository.getBlockByKey("diamond_ore")
+        val lapis = itemsRepository.getBlockByKey("lapis_ore")
 
         for (y in heights[x] ..< config.height) {
             val res = random.nextInt(10000)
similarity index 86%
rename from core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/world/generator/WorldGeneratorConfig.kt
rename to core/game/world/src/main/kotlin/ru/fredboy/cavedroid/game/world/generator/WorldGeneratorConfig.kt
index 64da3fe5db30dce581edcd0ebe46fb2c8d690e7a..a228cb6bc5bc60e92d80902ca0c7e016d18e3235 100644 (file)
@@ -1,7 +1,6 @@
-package ru.deadsoftware.cavedroid.game.model.world.generator
+package ru.fredboy.cavedroid.game.world.generator
 
 import com.badlogic.gdx.utils.TimeUtils
-import ru.deadsoftware.cavedroid.game.model.world.Biome
 
 data class WorldGeneratorConfig(
     val width: Int,
index 63263088c1c066be3e353dfefbf9f58db9a41e77..ba0bf19b809ffdd05d71adcf659af7ae4ab1ac07 100644 (file)
@@ -3,12 +3,21 @@ package ru.deadsoftware.cavedroid.game;
 import dagger.Component;
 import ru.deadsoftware.cavedroid.MainComponent;
 import ru.deadsoftware.cavedroid.generated.module.*;
+import ru.fredboy.cavedroid.common.di.GameScope;
+import ru.fredboy.cavedroid.data.assets.di.DataAssetsModule;
+import ru.fredboy.cavedroid.data.items.di.DataItemsModule;
+import ru.fredboy.cavedroid.data.save.di.DataSaveModule;
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository;
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository;
 
 @GameScope
 @Component(dependencies = {
             MainComponent.class
         },
         modules = {GameModule.class,
+//                DataAssetsModule.class,
+//                DataItemsModule.class,
+                DataSaveModule.class,
                 UseItemActionsModule.class,
                 UpdateBlockActionsModule.class,
                 PlaceBlockActionsModule.class,
@@ -20,5 +29,5 @@ import ru.deadsoftware.cavedroid.generated.module.*;
 public interface GameComponent {
     GameProc getGameProc();
 
-    GameItemsHolder getGameItemsHolder();
+    ItemsRepository getItemsRepository();
 }
index 74765e1f1508ddb246f3b37c79829966f1c1a669..bc598fb97c45d87fae7fe6867e2e8a38d74cccf6 100644 (file)
@@ -4,16 +4,24 @@ import dagger.Module;
 import dagger.Provides;
 import org.jetbrains.annotations.Nullable;
 import ru.deadsoftware.cavedroid.MainConfig;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController;
-import ru.deadsoftware.cavedroid.game.save.GameSaveData;
-import ru.deadsoftware.cavedroid.game.save.GameSaveLoader;
 import ru.deadsoftware.cavedroid.game.ui.TooltipManager;
-import ru.deadsoftware.cavedroid.game.world.GameWorld;
+import ru.fredboy.cavedroid.common.di.GameScope;
+import ru.fredboy.cavedroid.domain.assets.repository.MobAssetsRepository;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetPlayerSpritesUseCase;
+import ru.fredboy.cavedroid.domain.items.model.block.Block;
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository;
+import ru.fredboy.cavedroid.domain.items.usecase.GetFallbackItemUseCase;
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase;
+import ru.fredboy.cavedroid.domain.save.model.GameSaveData;
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository;
+import ru.fredboy.cavedroid.game.controller.container.ContainerController;
+import ru.fredboy.cavedroid.game.controller.container.impl.ContainerControllerImpl;
+import ru.fredboy.cavedroid.game.controller.drop.DropController;
+import ru.fredboy.cavedroid.game.controller.drop.impl.DropControllerImpl;
+import ru.fredboy.cavedroid.game.controller.mob.MobController;
+import ru.fredboy.cavedroid.game.controller.mob.impl.MobControllerImpl;
+import ru.fredboy.cavedroid.game.world.GameWorld;
 
 @Module
 public class GameModule {
@@ -23,20 +31,12 @@ public class GameModule {
 
     public static boolean loaded = false;
 
-    private static void load(MainConfig mainConfig,
-                             GameItemsHolder gameItemsHolder,
-                             TooltipManager tooltipManager,
-                             GetPlayerSpritesUseCase getPlayerSpritesUseCase,
-                             GetPigSpritesUseCase getPigSpritesUseCase) {
+    private static void load(MainConfig mainConfig, SaveDataRepository saveDataRepository) {
         if (loaded) {
             return;
         }
 
-        data = GameSaveLoader.INSTANCE.load(mainConfig,
-                gameItemsHolder,
-                tooltipManager,
-                getPlayerSpritesUseCase,
-                getPigSpritesUseCase);
+        data = saveDataRepository.load(mainConfig.getGameFolder());
 
         loaded = true;
     }
@@ -50,65 +50,55 @@ public class GameModule {
     @Provides
     @GameScope
     public static DropController provideDropController(MainConfig mainConfig,
-                                                       GameItemsHolder gameItemsHolder,
-                                                       TooltipManager tooltipManager,
-                                                       GetPlayerSpritesUseCase getPlayerSpritesUseCase,
-                                                       GetPigSpritesUseCase getPigSpritesUseCase) {
-        load(mainConfig, gameItemsHolder, tooltipManager, getPlayerSpritesUseCase, getPigSpritesUseCase);
-        DropController controller = data != null ? data.retrieveDropController() : new DropController();
+                                                       SaveDataRepository saveDataRepository) {
+        load(mainConfig, saveDataRepository);
+        DropController controller = data != null ? data.retrieveDropController() : new DropControllerImpl();
         makeDataNullIfEmpty();
-        controller.initDrops(gameItemsHolder);
         return controller;
     }
 
     @Provides
     @GameScope
     public static ContainerController provideFurnaceController(MainConfig mainConfig,
-                                                               DropController dropController,
-                                                               GameItemsHolder gameItemsHolder,
-                                                               TooltipManager tooltipManager,
-                                                               GetPlayerSpritesUseCase getPlayerSpritesUseCase,
-                                                               GetPigSpritesUseCase getPigSpritesUseCase) {
-        load(mainConfig, gameItemsHolder, tooltipManager, getPlayerSpritesUseCase, getPigSpritesUseCase);
+                                                               SaveDataRepository saveDataRepository,
+                                                               GetItemByKeyUseCase getItemByKeyUseCase
+                                                               ) {
+        load(mainConfig, saveDataRepository);
         ContainerController controller = data != null
                 ? data.retrieveContainerController()
-                : new ContainerController(dropController, gameItemsHolder);
+                : new ContainerControllerImpl(getItemByKeyUseCase);
         makeDataNullIfEmpty();
-        controller.init(dropController, gameItemsHolder);
         return controller;
     }
 
     @Provides
     @GameScope
-    public static MobsController provideMobsController(MainConfig mainConfig,
-                                                       GameItemsHolder gameItemsHolder,
-                                                       TooltipManager tooltipManager,
-                                                       GetPlayerSpritesUseCase getPlayerSpritesUseCase,
-                                                       GetPigSpritesUseCase getPigSpritesUseCase) {
-        load(mainConfig, gameItemsHolder, tooltipManager, getPlayerSpritesUseCase, getPigSpritesUseCase);
-        MobsController controller = data != null
+    public static MobController provideMobsController(MainConfig mainConfig,
+                                                      SaveDataRepository saveDataRepository,
+                                                      MobAssetsRepository mobAssetsRepository,
+                                                      GetFallbackItemUseCase getFallbackItemUseCase) {
+        load(mainConfig, saveDataRepository);
+        MobController controller = data != null
                 ? data.retrieveMobsController()
-                : new MobsController(gameItemsHolder, tooltipManager, getPlayerSpritesUseCase);
+                : new MobControllerImpl(mobAssetsRepository, getFallbackItemUseCase);
         makeDataNullIfEmpty();
-        controller.getPlayer().initInventory(gameItemsHolder, tooltipManager);
         return controller;
     }
 
     @Provides
     @GameScope
     public static GameWorld provideGameWorld(MainConfig mainConfig,
-                                             DropController dropController,
-                                             MobsController mobsController,
-                                             GameItemsHolder gameItemsHolder,
+                                             SaveDataRepository saveDataRepository,
+                                             ItemsRepository itemsRepository,
                                              ContainerController containerController,
-                                             TooltipManager tooltipManager,
-                                             GetPlayerSpritesUseCase getPlayerSpritesUseCase,
-                                             GetPigSpritesUseCase getPigSpritesUseCase) {
-        load(mainConfig, gameItemsHolder, tooltipManager, getPlayerSpritesUseCase, getPigSpritesUseCase);
+                                             MobController mobController,
+                                             DropController dropController
+                                             ) {
+        load(mainConfig, saveDataRepository);
         Block[][] fm = data != null ? data.retrieveForeMap() : null;
         Block[][] bm = data != null ? data.retrieveBackMap() : null;
         makeDataNullIfEmpty();
-        return new GameWorld(dropController, mobsController, gameItemsHolder, containerController, fm, bm);
+        return new GameWorld(itemsRepository, containerController, mobController, dropController, fm, bm);
     }
 
 }
index 406ee346b461859f3d436d82ab8f155cf286c8ee..7e1cbb37c9d1988d2d538bf8e4f7db54232b7918 100644 (file)
@@ -6,19 +6,22 @@ import com.badlogic.gdx.math.Rectangle;
 import com.badlogic.gdx.math.Vector2;
 import org.jetbrains.annotations.Nullable;
 import ru.deadsoftware.cavedroid.MainConfig;
-import ru.deadsoftware.cavedroid.game.mobs.Mob;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.mobs.player.Player;
-import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
-import ru.deadsoftware.cavedroid.game.objects.drop.Drop;
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
-import ru.deadsoftware.cavedroid.game.world.GameWorld;
+import ru.fredboy.cavedroid.common.di.GameScope;
+import ru.fredboy.cavedroid.common.utils.MeasureUnitsUtilsKt;
+import ru.fredboy.cavedroid.domain.items.model.block.Block;
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem;
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase;
+import ru.fredboy.cavedroid.game.controller.drop.DropController;
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop;
+import ru.fredboy.cavedroid.game.controller.mob.MobController;
+import ru.fredboy.cavedroid.game.controller.mob.model.FallingBlock;
+import ru.fredboy.cavedroid.game.controller.mob.model.Mob;
+import ru.fredboy.cavedroid.game.controller.mob.model.Player;
+import ru.fredboy.cavedroid.game.world.GameWorld;
 
 import javax.inject.Inject;
 import java.util.Iterator;
 
-
 @GameScope
 public class GamePhysics {
 
@@ -29,21 +32,21 @@ public class GamePhysics {
 
     private final GameWorld mGameWorld;
     private final MainConfig mMainConfig;
-    private final MobsController mMobsController;
+    private final MobController mMobController;
     private final DropController mDropController;
-    private final GameItemsHolder mGameItemsHolder;
+    private final GetItemByKeyUseCase mGetItemByKeyUseCase;
 
     @Inject
     public GamePhysics(GameWorld gameWorld,
                        MainConfig mainConfig,
-                       MobsController mobsController,
+                       MobController mobController,
                        DropController dropController,
-                       GameItemsHolder gameItemsHolder) {
+                       GetItemByKeyUseCase getItemByKeyUseCase) {
         mGameWorld = gameWorld;
         mMainConfig = mainConfig;
-        mMobsController = mobsController;
+        mMobController = mobController;
         mDropController = dropController;
-        mGameItemsHolder = gameItemsHolder;
+        mGetItemByKeyUseCase = getItemByKeyUseCase;
     }
 
     /**
@@ -61,7 +64,7 @@ public class GamePhysics {
             return false;
         }
 
-        return (block.toJump() &&
+        return (block.getParams().getHasCollision() && block.getParams().getCollisionMargins().getTop() < 8 &&
                 (mob.getY() + mob.getHeight()) - block.getRectangle(blX / 16, blY / 16).y > 8);
     }
 
@@ -90,7 +93,7 @@ public class GamePhysics {
                     continue;
                 }
                 block = mGameWorld.getForeMap(x, y);
-                if (block.hasCollision()) {
+                if (block.getParams().getHasCollision()) {
                     final Rectangle blockRect = block.getRectangle(x, y);
                     if (Intersector.overlaps(rect, blockRect)) {
                         return blockRect;
@@ -102,13 +105,17 @@ public class GamePhysics {
         return null;
     }
 
+    private boolean isBlockToJump(Block block) {
+        return block.getParams().getHasCollision() && block.getParams().getCollisionMargins().getTop() < 8;
+    }
+
     private Block getBlock(Rectangle rect) {
         return mGameWorld.getForeMap((int) (rect.x + rect.width / 2) / 16,
                 (int) (rect.y + rect.height / 8 * 7) / 16);
     }
 
     private Rectangle getShiftedPlayerRect(float shift) {
-        final Player player = mMobsController.getPlayer();
+        final Player player = mMobController.getPlayer();
         return new Rectangle(player.x + shift, player.y, player.width, player.height);
     }
 
@@ -117,9 +124,9 @@ public class GamePhysics {
      */
     @Nullable
     private Rectangle getShiftedMagnetingPlayerRect(Drop drop) {
-        final Player player = mMobsController.getPlayer();
+        final Player player = mMobController.getPlayer();
 
-        if (!player.inventory.canPickItem(drop)) {
+        if (!player.getInventory().canPickItem(drop.getItem())) {
             return null;
         }
 
@@ -127,12 +134,14 @@ public class GamePhysics {
             return getShiftedPlayerRect(0);
         }
 
-        final Rectangle shiftedLeft = getShiftedPlayerRect(-mGameWorld.getWidthPx());
+        final float fullWorldPx = MeasureUnitsUtilsKt.getPx(mGameWorld.getWidth());
+
+        final Rectangle shiftedLeft = getShiftedPlayerRect(-fullWorldPx);
         if (drop.canMagnetTo(shiftedLeft)) {
             return shiftedLeft;
         }
 
-        final Rectangle shiftedRight = getShiftedPlayerRect(mGameWorld.getWidthPx());
+        final Rectangle shiftedRight = getShiftedPlayerRect(fullWorldPx);
         if (drop.canMagnetTo(shiftedRight)) {
             return shiftedRight;
         }
@@ -141,10 +150,11 @@ public class GamePhysics {
     }
 
     private void pickUpDropIfPossible(Rectangle shiftedPlayerTarget, Drop drop) {
-        final Player player = mMobsController.getPlayer();
+        final Player player = mMobController.getPlayer();
 
         if (Intersector.overlaps(shiftedPlayerTarget, drop)) {
-            player.inventory.pickDrop(drop);
+            // TODO: Pick up drop
+//            player.getInventory().pickDrop(drop);
         }
     }
 
@@ -188,7 +198,7 @@ public class GamePhysics {
         @Nullable Rectangle collidingRect = checkColl(mob);
 
         if (collidingRect != null) {
-            if (mob.canJump() && !mob.isFlyMode() && collidingRect.y >= mob.y + mob.height - 8) {
+            if (mob.getCanJump() && !mob.isFlyMode() && collidingRect.y >= mob.y + mob.height - 8) {
                 mob.y = collidingRect.y - mob.height;
                 return;
             }
@@ -215,13 +225,14 @@ public class GamePhysics {
 //                    mob.x += d;
 //                }
 
-                if (mob.canJump()) {
+                if (mob.getCanJump()) {
                     mob.changeDir();
                 }
             }
         }
 
-        mob.checkWorldBounds(mGameWorld);
+        // TODO: Check World Bounds
+//        mob.checkWorldBounds(mGameWorld);
     }
 
     private void mobYColl(Mob mob) {
@@ -264,7 +275,7 @@ public class GamePhysics {
             mob.y -= 1;
         }
 
-        if (mob.getY() > mGameWorld.getHeightPx()) {
+        if (mob.getY() > MeasureUnitsUtilsKt.getPx(mGameWorld.getHeight())) {
             mob.kill();
         }
     }
@@ -275,10 +286,10 @@ public class GamePhysics {
         }
 
         if (getBlock(player).isFluid()) {
-            if (mMainConfig.isTouch() && player.getVelocity().x != 0 && !player.swim && !player.isFlyMode()) {
-                player.swim = true;
+            if (mMainConfig.isTouch() && player.getVelocity().x != 0 && !player.getSwim() && !player.isFlyMode()) {
+                player.setSwim(true);
             }
-            if (!player.swim) {
+            if (!player.getSwim()) {
                 if (!player.isFlyMode() && player.getVelocity().y < 32f) {
                     player.getVelocity().y += gravity.y * delta;
                 }
@@ -305,14 +316,14 @@ public class GamePhysics {
 
         mobXColl(player);
 
-        if (mMainConfig.isTouch() && !player.isFlyMode() && player.canJump() && player.getVelocity().x != 0 && checkJump(player)) {
+        if (mMainConfig.isTouch() && !player.isFlyMode() && player.getCanJump() && player.getVelocity().x != 0 && checkJump(player)) {
             player.jump();
             player.setCanJump(false);
         }
     }
 
     private void mobPhy(Mob mob, float delta) {
-        if (mob.getType() == Mob.Type.MOB && getBlock(mob).isFluid()) {
+        if (!(mob instanceof FallingBlock) && getBlock(mob).isFluid()) {
             if (mob.getVelocity().y > 32f) {
                 mob.getVelocity().y -= mob.getVelocity().y * 32f * delta;
             }
@@ -336,29 +347,30 @@ public class GamePhysics {
         mob.x += mob.getVelocity().x * delta;
         mobXColl(mob);
 
-        if (mob.canJump() && mob.getVelocity().x != 0 && checkJump(mob)) {
+        if (mob.getCanJump() && mob.getVelocity().x != 0 && checkJump(mob)) {
             mob.jump();
             mob.setCanJump(false);
         }
     }
 
     void update(float delta) {
-        Player player = mMobsController.getPlayer();
+        Player player = mMobController.getPlayer();
 
-        for (Iterator<Drop> it = mDropController.getIterator(); it.hasNext(); ) {
+        for (Iterator<Drop> it = mDropController.getAllDrop().iterator(); it.hasNext(); ) {
             Drop drop = it.next();
             dropPhy(drop, delta);
-            if (drop.getPickedUp()) {
+            if (drop.isPickedUp()) {
                 it.remove();
             }
         }
 
-        for (Iterator<Mob> it = mMobsController.getMobs().iterator(); it.hasNext(); ) {
+        for (Iterator<Mob> it = mMobController.getMobs().iterator(); it.hasNext(); ) {
             Mob mob = it.next();
-            mob.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
+            //todo: Mob ai
+//            mob.ai(mGameWorld, mGameItemsHolder, mMobController, delta);
             mobPhy(mob, delta);
             if (mob.isDead()) {
-                for (InventoryItem invItem : mob.getDrop(mGameItemsHolder)) {
+                for (InventoryItem invItem : mob.getDropItems(mGetItemByKeyUseCase)) {
                     mDropController.addDrop(mob.x, mob.y, invItem);
                 }
 
@@ -367,13 +379,15 @@ public class GamePhysics {
         }
 
         playerPhy(player, delta);
-        player.ai(mGameWorld, mGameItemsHolder, mMobsController, delta);
+        //todo : Update player
+//        player.ai(mGameWorld, mGameItemsHolder, mMobController, delta);
         if (player.isDead()) {
-            for (InventoryItem invItem : player.inventory.getItems()) {
+            for (InventoryItem invItem : player.getInventory().getItems()) {
                 mDropController.addDrop(player.x, player.y, invItem);
             }
-            player.inventory.clear();
-            player.respawn(mGameWorld, mGameItemsHolder);
+            player.getInventory().clear();
+            //todo: Respawn player
+//            player.respawn(mGameWorld, mGameItemsHolder);
         }
     }
 
index 29062a44a07d24deff2efcefa40a2ec542a8978a..5c206ff9c45d37b93aee5d58c2bc6458a16dcb19 100644 (file)
@@ -4,12 +4,13 @@ import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.utils.Disposable;
 import com.badlogic.gdx.utils.Timer;
 import ru.deadsoftware.cavedroid.MainConfig;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.mobs.player.Player;
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController;
 import ru.deadsoftware.cavedroid.game.world.GameWorldBlocksLogicControllerTask;
 import ru.deadsoftware.cavedroid.game.world.GameWorldFluidsLogicControllerTask;
 import ru.deadsoftware.cavedroid.game.world.GameWorldMobDamageControllerTask;
+import ru.fredboy.cavedroid.common.di.GameScope;
+import ru.fredboy.cavedroid.game.controller.container.ContainerController;
+import ru.fredboy.cavedroid.game.controller.mob.MobController;
+import ru.fredboy.cavedroid.game.controller.mob.model.Player;
 
 import javax.inject.Inject;
 
@@ -18,9 +19,8 @@ public class GameProc implements Disposable {
 
     private final GamePhysics mGamePhysics;
     private final GameRenderer mGameRenderer;
-    private final MobsController mMobsController;
+    private final MobController mMobsController;
     private final ContainerController mContainerController;
-    private final GameItemsHolder mGameItemsHolder;
     private final GameWorldFluidsLogicControllerTask mGameWorldFluidsLogicControllerTask;
     private final GameWorldBlocksLogicControllerTask mGameWorldBlocksLogicControllerTask;
     private final GameWorldMobDamageControllerTask mGameWorldMobDamageControllerTask;
@@ -31,9 +31,8 @@ public class GameProc implements Disposable {
     public GameProc(MainConfig mainConfig,
                     GamePhysics gamePhysics,
                     GameRenderer gameRenderer,
-                    MobsController mobsController,
+                    MobController mobsController,
                     ContainerController containerController,
-                    GameItemsHolder gameItemsHolder,
                     GameWorldFluidsLogicControllerTask gameWorldFluidsLogicControllerTask,
                     GameWorldBlocksLogicControllerTask gameWorldBlocksLogicControllerTask,
                     GameWorldMobDamageControllerTask gameWorldMobDamageControllerTask
@@ -42,12 +41,11 @@ public class GameProc implements Disposable {
         mGameRenderer = gameRenderer;
         mMobsController = mobsController;
         mContainerController = containerController;
-        mGameItemsHolder = gameItemsHolder;
         mGameWorldFluidsLogicControllerTask = gameWorldFluidsLogicControllerTask;
         mGameWorldBlocksLogicControllerTask = gameWorldBlocksLogicControllerTask;
         mGameWorldMobDamageControllerTask = gameWorldMobDamageControllerTask;
 
-        mobsController.getPlayer().controlMode = mainConfig.isTouch() ? Player.ControlMode.WALK : Player.ControlMode.CURSOR;
+        mobsController.getPlayer().setControlMode(mainConfig.isTouch() ? Player.ControlMode.WALK : Player.ControlMode.CURSOR);
 
         mWorldLogicTimer.scheduleTask(gameWorldFluidsLogicControllerTask, 0,
                 GameWorldFluidsLogicControllerTask.FLUID_UPDATE_INTERVAL_SEC);
@@ -58,13 +56,13 @@ public class GameProc implements Disposable {
     }
 
     public void setPlayerGameMode(int gameMode) {
-        mMobsController.getPlayer().gameMode = gameMode;
+        mMobsController.getPlayer().setGameMode(gameMode);
     }
 
     public void update(float delta) {
         mGamePhysics.update(delta);
         mGameRenderer.render(delta);
-        mContainerController.update();
+        mContainerController.update(delta);
     }
 
     public void show() {
index 941bd43db9478ed316b03d17c627095586736839..e6de7079eb14c8abeb628bd0ebd0dac2327c1bb5 100644 (file)
@@ -18,18 +18,19 @@ import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey;
 import ru.deadsoftware.cavedroid.game.input.handler.mouse.CursorMouseInputHandler;
 import ru.deadsoftware.cavedroid.game.input.mapper.KeyboardInputActionMapper;
 import ru.deadsoftware.cavedroid.game.input.mapper.MouseInputActionMapper;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.mobs.player.Player;
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer;
 import ru.deadsoftware.cavedroid.game.ui.TooltipManager;
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager;
-import ru.deadsoftware.cavedroid.game.world.GameWorld;
 import ru.deadsoftware.cavedroid.misc.Renderer;
-import ru.deadsoftware.cavedroid.misc.utils.RenderingUtilsKt;
+import ru.fredboy.cavedroid.common.di.GameScope;
+import ru.fredboy.cavedroid.common.utils.MeasureUnitsUtilsKt;
+import ru.fredboy.cavedroid.common.utils.RenderingUtilsKt;
 import ru.fredboy.cavedroid.domain.assets.model.TouchButton;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTouchButtonsUseCase;
-import ru.fredboy.cavedroid.utils.MeasureUnitsUtilsKt;
+import ru.fredboy.cavedroid.game.controller.mob.MobController;
+import ru.fredboy.cavedroid.game.controller.mob.model.Player;
+import ru.fredboy.cavedroid.game.world.GameWorld;
 
 import javax.inject.Inject;
 import java.util.*;
@@ -43,7 +44,7 @@ public class GameRenderer extends Renderer {
     private static final TouchButton nullButton = new TouchButton(new Rectangle(), -1, true);
 
     private final MainConfig mMainConfig;
-    private final MobsController mMobsController;
+    private final MobController mMobsController;
     private final GameWorld mGameWorld;
     private final List<IGameRenderer> mRenderers;
     private final CursorMouseInputHandler mCursorMouseInputHandler;
@@ -65,7 +66,7 @@ public class GameRenderer extends Renderer {
 
     @Inject
     GameRenderer(MainConfig mainConfig,
-                 MobsController mobsController,
+                 MobController mobsController,
                  GameWorld gameWorld,
                  Set<IGameRenderer> renderers,
                  CursorMouseInputHandler cursorMouseInputHandler,
@@ -118,14 +119,14 @@ public class GameRenderer extends Renderer {
 
         float camTargetX, camTargetY;
 
-        boolean followPlayer = player.controlMode == Player.ControlMode.WALK || !mMainConfig.isTouch();
+        boolean followPlayer = player.getControlMode() == Player.ControlMode.WALK || !mMainConfig.isTouch();
 
         if (followPlayer) {
             camTargetX = plTargetX + Math.min(player.getVelocity().x * 2, getWidth() / 2);
             camTargetY = plTargetY + player.getVelocity().y;
         } else {
-            camTargetX = MeasureUnitsUtilsKt.getPx(player.cursorX) + MeasureUnitsUtilsKt.getPx(1) / 2;
-            camTargetY = MeasureUnitsUtilsKt.getPx(player.cursorY) + MeasureUnitsUtilsKt.getPx(1) / 2;
+            camTargetX = MeasureUnitsUtilsKt.getPx(player.getCursorX()) + MeasureUnitsUtilsKt.getPx(1) / 2;
+            camTargetY = MeasureUnitsUtilsKt.getPx(player.getCursorY()) + MeasureUnitsUtilsKt.getPx(1) / 2;
         }
 
         Vector2 moveVector = new Vector2(camTargetX - camCenterX, camTargetY - camCenterY);
@@ -144,14 +145,15 @@ public class GameRenderer extends Renderer {
 
         float camX = getCamX();
         float camY = getCamY();
-        float worldWidth = MeasureUnitsUtilsKt.getPx(mGameWorld.getWidth()) - getWidth() / 2;
-
-        if (moveVector.x >= worldWidth) {
-            camX += mGameWorld.getWidthPx();
-            moveVector.x -= mGameWorld.getWidthPx();
-        } else if (moveVector.x <= -worldWidth) {
-            camX -= mGameWorld.getWidthPx();
-            moveVector.x += mGameWorld.getWidthPx();
+        float fullWorldPx = MeasureUnitsUtilsKt.getPx(mGameWorld.getWidth());
+        float worldWidthScreenOffset = fullWorldPx - getWidth() / 2;
+
+        if (moveVector.x >= worldWidthScreenOffset) {
+            camX += fullWorldPx;
+            moveVector.x -= fullWorldPx;
+        } else if (moveVector.x <= -worldWidthScreenOffset) {
+            camX -= fullWorldPx;
+            moveVector.x += fullWorldPx;
         }
 
         setCamPos(camX + moveVector.x * delta * 2, camY + moveVector.y * delta * 2);
index d7546e98ad60758261240dfbd661425e92f90bc6..f6e658d668dce3a2d99efbc8673a0595ba2932f0 100644 (file)
@@ -14,8 +14,6 @@ public class GameScreen implements Screen {
 
     @Nullable
     private GameProc mGameProc;
-    @Nullable
-    private GameItemsHolder mGameItemsHolder;
 
     @Inject
     public GameScreen(MainConfig mainConfig) {
diff --git a/core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/Mob.java b/core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/Mob.java
deleted file mode 100644 (file)
index e1c6514..0000000
+++ /dev/null
@@ -1,358 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs;
-
-import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.math.Rectangle;
-import com.badlogic.gdx.math.Vector2;
-import com.badlogic.gdx.utils.Timer;
-import org.jetbrains.annotations.Nullable;
-import ru.deadsoftware.cavedroid.game.GameItemsHolder;
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto;
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
-import ru.deadsoftware.cavedroid.game.world.GameWorld;
-import ru.deadsoftware.cavedroid.misc.Saveable;
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * Mob class.
- */
-public abstract class Mob extends Rectangle implements  Saveable {
-
-    private static final float DAMAGE_TINT_TIMEOUT_S = 0.5f;
-    private static final Color DAMAGE_TINT_COLOR = new Color(0xff8080ff);
-
-    private static final float HIT_RANGE = 8f;
-
-    protected static int ANIMATION_SPEED = 360;
-
-    public enum Type {
-        MOB,
-        FALLING_BLOCK
-    }
-
-    public enum Direction {
-
-        LEFT(0, -1),
-        RIGHT(1, 1);
-
-        private final int index;
-        private final int basis;
-
-        /**
-         * Index for this direction (left = 0, right = 1)
-         */
-        public final int getIndex() {
-            return index;
-        }
-
-        /**
-         * Basis for this direction (left = -1, right = 1)
-         */
-        public final int getBasis() {
-            return basis;
-        }
-
-        Direction(int index, int basis) {
-            this.index = index;
-            this.basis = basis;
-        }
-    }
-
-    private class ResetTakeDamageTask extends Timer.Task {
-
-        @Override
-        public void run() {
-            mTakingDamage = false;
-        }
-    }
-
-    protected Vector2 mVelocity;
-    protected Type mType;
-    protected int mAnimDelta = ANIMATION_SPEED;
-    protected float mAnim;
-
-    protected Direction mDirection;
-    protected boolean mDead;
-    protected boolean mCanJump;
-    protected boolean mFlyMode;
-
-    protected int mMaxHealth;
-    protected int mHealth;
-
-    private boolean mTakingDamage = false;
-
-    @Nullable
-    private ResetTakeDamageTask mResetTakeDamageTask = null;
-
-    /**
-     * @param x          in pixels
-     * @param y          in pixels
-     * @param width      in pixels
-     * @param height     in pixels
-     * @param mDirection Direction in which mob is looking
-     */
-    protected Mob(float x, float y, float width, float height, Direction mDirection, Type type, int maxHealth) {
-        super(x, y, width, height);
-        mVelocity = new Vector2(0, 0);
-        mCanJump = false;
-        mDead = false;
-        this.mDirection = mDirection;
-        this.mType = type;
-        this.mMaxHealth = maxHealth;
-        this.mHealth = mMaxHealth;
-    }
-
-    protected static Direction randomDir() {
-        return MathUtils.randomBoolean(.5f) ? Direction.LEFT : Direction.RIGHT;
-    }
-
-    private boolean isAnimationIncreasing() {
-        return mAnim > 0 && mAnimDelta > 0 || mAnim < 0 && mAnimDelta < 0;
-    }
-
-    private void checkHealth() {
-        mHealth = MathUtils.clamp(mHealth, 0, mMaxHealth);
-
-        if (mHealth <= 0) {
-            kill();
-        }
-    }
-
-    protected final void updateAnimation(float delta) {
-        final float velocityMultiplier = (Math.abs(getVelocity().x) / getSpeed());
-        final float animMultiplier = (velocityMultiplier == 0f ? 1f : velocityMultiplier) * delta;
-        final float maxAnim = 60f * (velocityMultiplier == 0f ? 1f : velocityMultiplier);
-
-        if (mVelocity.x != 0f || Math.abs(mAnim) > mAnimDelta * animMultiplier) {
-            mAnim += mAnimDelta * animMultiplier;
-        } else {
-            mAnim = 0;
-        }
-
-        if (mAnim > maxAnim) {
-            mAnim = maxAnim;
-            mAnimDelta = -ANIMATION_SPEED;
-        } else if (mAnim < -maxAnim) {
-            mAnim = -maxAnim;
-            mAnimDelta = ANIMATION_SPEED;
-        }
-
-        if (mVelocity.x == 0f && isAnimationIncreasing()) {
-            mAnimDelta = -mAnimDelta;
-        }
-    }
-
-    /**
-     * @return The X coordinate of a mob in blocks
-     */
-    public final int getMapX() {
-        return (int) (x + (getWidth() / 2)) / 16;
-    }
-
-    /**
-     * @return The Y coordinate of mob's upper edge in blocks
-     */
-    public final int getUpperMapY() {
-        return (int) (y / 16);
-    }
-
-    /**
-     * @return The Y coordinate if mob's vertical center in blocks
-     */
-    public final int getMiddleMapY() {
-        return (int) (y + (getHeight() / 2)) / 16;
-    }
-
-    /**
-     * @return The Y coordinate of mob's legs in blocks
-     */
-    public final int getLowerMapY() {
-        return (int) (y + getHeight()) / 16;
-    }
-
-    public final float getWidth() {
-        return width;
-    }
-
-    public final float getHeight() {
-        return height;
-    }
-
-    /**
-     * @return Integer representing a direction in which mob is looking, where 0 is left and 1 is right
-     */
-    public final Direction getDirection() {
-        return mDirection;
-    }
-
-    public final boolean looksLeft() {
-        return mDirection == Direction.LEFT;
-    }
-
-    public final boolean looksRight() {
-        return mDirection == Direction.RIGHT;
-    }
-
-    /**
-     * Switches direction in which mob is looking
-     */
-    protected final void switchDir() {
-        mDirection = looksLeft() ? Direction.RIGHT : Direction.LEFT;
-    }
-
-    public final boolean isDead() {
-        return mDead;
-    }
-
-    public final float getAnim() {
-        return mAnim;
-    }
-
-    /**
-     * Set's mob's dead variable to true and nothing else. It doesn't delete the
-     */
-    public void kill() {
-        mDead = true;
-    }
-
-    public final void move(float delta) {
-        x += mVelocity.x * delta;
-        y += mVelocity.y * delta;
-    }
-
-    public final Vector2 getVelocity() {
-        return mVelocity;
-    }
-
-    protected final void setVelocity(Vector2 velocity) {
-        mVelocity = velocity;
-    }
-
-    public final boolean canJump() {
-        return mCanJump;
-    }
-
-    public final void setCanJump(boolean canJump) {
-        this.mCanJump = canJump;
-    }
-
-    public final boolean isFlyMode() {
-        return mFlyMode;
-    }
-
-    public final void setFlyMode(boolean flyMode) {
-        this.mFlyMode = flyMode;
-    }
-
-    public final Type getType() {
-        return mType;
-    }
-
-    public final void checkWorldBounds(GameWorld gameWorld) {
-        if (x + width / 2 < 0) {
-            x += gameWorld.getWidthPx();
-        }
-        if (x + width / 2 > gameWorld.getWidthPx()) {
-            x -= gameWorld.getWidthPx();
-        }
-    }
-
-    public final int getHealth() {
-        return mHealth;
-    }
-
-    public final int getMaxHealth() {
-        return mMaxHealth;
-    }
-
-    public final void attachToController(MobsController controller) {
-        controller.addMob(this);
-    }
-
-    public void damage(int damage) {
-        if (damage == 0) {
-            return;
-        }
-
-        if (damage < 0) {
-            Gdx.app.error(this.getClass().getSimpleName(), "Damage cant be negative!");
-            return;
-        }
-
-        if (mHealth <= Integer.MIN_VALUE + damage) {
-            mHealth = Integer.MIN_VALUE + damage;
-        }
-
-        mHealth -= damage;
-        checkHealth();
-
-        setTakingDamage(true);
-    }
-
-    public void heal(int heal) {
-        if (heal < 0) {
-            Gdx.app.error(this.getClass().getSimpleName(), "Heal cant be negative!");
-            return;
-        }
-
-        if (mHealth >= Integer.MAX_VALUE - heal) {
-            mHealth = Integer.MAX_VALUE - heal;
-        }
-
-        mHealth += heal;
-        checkHealth();
-    }
-
-    public Rectangle getHitBox() {
-        return new Rectangle(x - HIT_RANGE, y - HIT_RANGE, width + HIT_RANGE, height + HIT_RANGE);
-    }
-
-    public boolean isTakingDamage() {
-        return mTakingDamage;
-    }
-
-    public void setTakingDamage(boolean takingDamage) {
-        mTakingDamage = takingDamage;
-
-        if (takingDamage) {
-            if (mResetTakeDamageTask != null && mResetTakeDamageTask.isScheduled()) {
-                mResetTakeDamageTask.cancel();
-            } else if (mResetTakeDamageTask == null) {
-                mResetTakeDamageTask = new ResetTakeDamageTask();
-            }
-
-            Timer.schedule(mResetTakeDamageTask, DAMAGE_TINT_TIMEOUT_S);
-        }
-    }
-
-    protected Color getTintColor() {
-        return isTakingDamage() ? DAMAGE_TINT_COLOR : Color.WHITE;
-    }
-
-    public List<InventoryItem> getDrop(GameItemsHolder gameItemsHolder) {
-        return Collections.emptyList();
-    }
-
-    public abstract void draw(SpriteBatch spriteBatch, float x, float y, float delta);
-
-    public abstract void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, MobsController mobsController, float delta);
-
-    public abstract void changeDir();
-
-    public abstract float getSpeed();
-
-    public abstract void jump();
-
-    @Override
-    public abstract SaveDataDto.MobSaveDataDto getSaveData();
-
-    public static Mob fromSaveData(SaveDataDto.MobSaveDataDto saveData,
-                                   GetPigSpritesUseCase getPigSpritesUseCase) {
-        return MobSaveDataMapperKt.fromSaveData(saveData, getPigSpritesUseCase);
-    }
-}
diff --git a/core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/player/Player.java b/core/src/main/java/ru/deadsoftware/cavedroid/game/mobs/player/Player.java
deleted file mode 100644 (file)
index 406b165..0000000
+++ /dev/null
@@ -1,538 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs.player;
-
-import com.badlogic.gdx.graphics.Color;
-import com.badlogic.gdx.graphics.g2d.Sprite;
-import com.badlogic.gdx.graphics.g2d.SpriteBatch;
-import com.badlogic.gdx.math.MathUtils;
-import com.badlogic.gdx.math.Vector2;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import ru.deadsoftware.cavedroid.game.GameItemsHolder;
-import ru.deadsoftware.cavedroid.game.mobs.Mob;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto;
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
-import ru.deadsoftware.cavedroid.game.model.item.Item;
-import ru.deadsoftware.cavedroid.game.objects.drop.Drop;
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
-import ru.deadsoftware.cavedroid.game.ui.TooltipManager;
-import ru.deadsoftware.cavedroid.game.world.GameWorld;
-import ru.deadsoftware.cavedroid.misc.Assets;
-import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin;
-import ru.deadsoftware.cavedroid.misc.utils.SpriteUtilsKt;
-import ru.fredboy.cavedroid.domain.assets.model.MobSprite;
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPlayerSpritesUseCase;
-
-public class Player extends Mob {
-
-    private static final int SAVE_DATA_VERSION = 1;
-
-    private static final float SPEED = 69.072f;
-    private static final float JUMP_VELOCITY = -133.332f;
-    private static final int SURVIVAL_CURSOR_RANGE = 4;
-
-    public static final int MAX_HEALTH = 20;
-    public static final int INVENTORY_SIZE = 36;
-    public static final int HOTBAR_SIZE = 9;
-
-    private boolean hitting = false, hittingWithDamage = false;
-    private float hitAnim = 0f;
-    private float hitAnimDelta = ANIMATION_SPEED;
-
-    private MobSprite.Player playerSprite;
-
-    public Inventory inventory;
-
-    public int gameMode;
-    public boolean swim;
-    public float headRotation = 0f;
-
-    public float blockDamage = 0f;
-    public int cursorX = 0;
-    public int cursorY = 0;
-
-    @Nullable
-    private Vector2 spawnPoint = null;
-
-    public ControlMode controlMode = ControlMode.WALK;
-
-    public enum ControlMode {
-        WALK,
-        CURSOR
-    }
-
-    public Player(GameItemsHolder gameItemsHolder, TooltipManager tooltipManager, MobSprite.Player playerSprite) {
-        super(0, 0, 4, 30, randomDir(), Type.MOB, MAX_HEALTH);
-        this.playerSprite = playerSprite;
-        inventory = new Inventory(INVENTORY_SIZE, HOTBAR_SIZE, gameItemsHolder, tooltipManager);
-        swim = false;
-    }
-
-    public void initInventory(GameItemsHolder gameItemsHolder, TooltipManager tooltipManager) {
-        inventory.initItems(gameItemsHolder, tooltipManager);
-    }
-
-    public void respawn(GameWorld gameWorld, GameItemsHolder itemsHolder) {
-        Vector2 pos = getSpawnPoint(gameWorld, itemsHolder);
-        this.x = pos.x;
-        this.y = pos.y;
-        mVelocity.setZero();
-        mDead = false;
-        heal(MAX_HEALTH);
-    }
-
-    public void decreaseCurrentItemCount(GameItemsHolder gameItemsHolder) {
-        if (gameMode == 1) {
-            return;
-        }
-
-        final InventoryItem item = inventory.getActiveItem();
-        item.subtract();
-        if (item.getAmount() <= 0) {
-            setCurrentInventorySlotItem(gameItemsHolder.getFallbackItem());
-        }
-    }
-
-    public void dropCurrentItem(DropController dropController) {
-        final InventoryItem activeItem = inventory.getActiveItem();
-
-    }
-
-    private Vector2 getSpawnPoint(GameWorld gameWorld, GameItemsHolder itemsHolder) {
-        if (spawnPoint != null) {
-            return spawnPoint;
-        }
-
-        int y, x = gameWorld.getWidth() / 2;
-        for (y = 0; y <= gameWorld.getWorldConfig().getSeaLevel(); y++) {
-            if (y == gameWorld.getWorldConfig().getSeaLevel()) {
-                for (x = 0; x < gameWorld.getWidth(); x++) {
-                    if (gameWorld.getForeMap(x, y).getParams().getHasCollision()) {
-                        break;
-                    }
-                    if (x == gameWorld.getWidth() - 1) {
-                        gameWorld.setForeMap(x, y, itemsHolder.getBlock("grass"));
-                        break;
-                    }
-                }
-                break;
-            }
-            if (gameWorld.hasForeAt(x, y) && gameWorld.getForeMap(x, y).hasCollision()) {
-                break;
-            }
-        }
-        spawnPoint = new Vector2(x * 16 + 8 - getWidth() / 2, (float) y * 16 - getHeight());
-        return spawnPoint;
-    }
-
-    public void setDir(Direction dir) {
-        if (dir != getDirection()) {
-            switchDir();
-        }
-    }
-
-    public void setCurrentInventorySlotItem(Item item) {
-        inventory.getItems().set(inventory.getActiveSlot(), item.toInventoryItem());
-    }
-
-    @Override
-    public float getSpeed() {
-        return SPEED;
-    }
-
-    @Override
-    public void jump() {
-        if (!canJump()) {
-            if (gameMode == 1) {
-                if (isFlyMode()) {
-                    setFlyMode(false);
-                } else {
-                    getVelocity().y = 0f;
-                    setFlyMode(true);
-                }
-            }
-            return;
-        }
-        mVelocity.y = JUMP_VELOCITY;
-    }
-
-    private boolean checkBlockCanBeHit(Block block) {
-        return !block.isNone() && block.getParams().getHitPoints() >= 0;
-    }
-
-    /**
-     * @return true if any mob fas hit
-     */
-    private boolean hitMobs(GameItemsHolder gameItemsHolder, MobsController mobsController) {
-        if (!hitting || !hittingWithDamage) {
-            return false;
-        }
-
-        boolean result = false;
-        for (Mob mob : mobsController.getMobs()) {
-            if (overlaps(mob.getHitBox())) {
-                final Item activeItem = inventory.getActiveItem().getItem();
-                final Item.Tool tool = activeItem.isTool() ? (Item.Tool) activeItem : null;
-                if (tool != null) {
-                    decreaseCurrentItemCount(gameItemsHolder);
-                }
-                result = true;
-                mob.damage(MathUtils.floor(tool != null ? tool.getMobDamageMultiplier() : 1));
-            }
-        }
-        return result;
-    }
-
-    private void hitBlock(GameWorld gameWorld, GameItemsHolder gameItemsHolder) {
-        if (!hitting || !hittingWithDamage) {
-            return;
-        }
-
-        final Block foregroundBlock = gameWorld.getForeMap(cursorX, cursorY);
-        final Block backgroundBlock = gameWorld.getBackMap(cursorX, cursorY);
-
-
-        if ((checkBlockCanBeHit(foregroundBlock)) ||
-                (foregroundBlock.isNone() && checkBlockCanBeHit(backgroundBlock))) {
-            if (gameMode == 0) {
-                if (!foregroundBlock.isNone()) {
-                    if (blockDamage >= foregroundBlock.getParams().getHitPoints()) {
-                        gameWorld.destroyForeMap(cursorX, cursorY);
-                        blockDamage = 0;
-                    }
-                } else if (!backgroundBlock.isNone()) {
-                    if (blockDamage >= backgroundBlock.getParams().getHitPoints()) {
-                        gameWorld.destroyBackMap(cursorX, cursorY);
-                        blockDamage = 0;
-                    }
-                }
-            } else {
-                if (!foregroundBlock.isNone()) {
-                    gameWorld.placeToForeground(cursorX, cursorY, gameItemsHolder.getFallbackBlock());
-                } else if (!backgroundBlock.isNone()) {
-                    gameWorld.placeToBackground(cursorX, cursorY, gameItemsHolder.getFallbackBlock());
-                }
-                stopHitting();
-            }
-        } else {
-            stopHitting();
-        }
-    }
-
-    @Override
-    public void ai(GameWorld gameWorld, GameItemsHolder gameItemsHolder, MobsController mobsController, float delta) {
-        updateAnimation(delta);
-
-        if (!hitMobs(gameItemsHolder, mobsController)) {
-            hitBlock(gameWorld, gameItemsHolder);
-        } else {
-            stopHitting();
-        }
-
-        if (gameMode == 1) {
-            return;
-        }
-
-        final Block foregroundBlock = gameWorld.getForeMap(cursorX, cursorY);
-        final Block backgroundBlock = gameWorld.getBackMap(cursorX, cursorY);
-        @Nullable final Block target;
-
-        if (checkBlockCanBeHit(foregroundBlock)) {
-            target = foregroundBlock;
-        } else if (checkBlockCanBeHit(backgroundBlock)) {
-            target = backgroundBlock;
-        } else {
-            target = null;
-        }
-
-        final boolean canHitBlock = target != null;
-
-        float multiplier = 1f;
-        final Item currentItem = inventory.getActiveItem().getItem();
-        if (currentItem instanceof Item.Tool && canHitBlock) {
-            if (target.getParams().getToolType() == currentItem.getClass()
-                    && ((Item.Tool)currentItem).getLevel() >= target.getParams().getToolLevel()) {
-                multiplier = 2f * ((Item.Tool)currentItem).getLevel();
-            }
-            multiplier *= ((Item.Tool)currentItem).getBlockDamageMultiplier();
-        }
-
-        if (hitting && hittingWithDamage && canHitBlock) {
-            blockDamage += 60f * delta * multiplier;
-        } else {
-            blockDamage = 0f;
-        }
-    }
-
-    @Override
-    public void changeDir() {
-    }
-
-    @Override
-    public void damage(int damage) {
-        if (gameMode == 1) {
-            return;
-        }
-
-        if (damage > 0) {
-            getVelocity().y += JUMP_VELOCITY / 3f;
-        }
-
-        super.damage(damage);
-    }
-
-    @Override
-    public void heal(int heal) {
-        if (gameMode == 1) {
-            return;
-        }
-        super.heal(heal);
-    }
-
-    public void checkCursorBounds(GameWorld gameWorld) {
-        if (gameMode == 0) {
-            int minCursorX = getMapX() - SURVIVAL_CURSOR_RANGE;
-            int maxCursorX = getMapX() + SURVIVAL_CURSOR_RANGE;
-            int minCursorY = getMiddleMapY() - SURVIVAL_CURSOR_RANGE;
-            int maxCursorY = getMiddleMapY() + SURVIVAL_CURSOR_RANGE;
-
-            cursorX = MathUtils.clamp(cursorX, minCursorX, maxCursorX);
-            cursorY = MathUtils.clamp(cursorY, minCursorY, maxCursorY);
-        }
-
-        cursorY = MathUtils.clamp(cursorY, 0, gameWorld.getHeight() - 1);
-    }
-
-    private void drawItem(SpriteBatch spriteBatch, float x, float y, float anim) {
-        final Item item = inventory.getActiveItem().getItem();
-
-        if (item == null || item.isNone()) {
-            return;
-        }
-
-        final Sprite sprite = item.getSprite();
-        final boolean smallSprite = !item.isTool() || item.isShears();
-
-        final float originalWidth = sprite.getWidth();
-        final float originalHeight = sprite.getHeight();
-
-        if (smallSprite) {
-            sprite.setSize(Drop.DROP_SIZE, Drop.DROP_SIZE);
-        }
-
-        final float handLength = playerSprite.getHand().getHeight();
-
-        final SpriteOrigin spriteOrigin = item.getParams().getInHandSpriteOrigin();
-        final int handMultiplier = -getDirection().getBasis();
-        final float xOffset = (-1 + getDirection().getIndex()) * sprite.getWidth() + 4 + handMultiplier * (sprite.getWidth() * spriteOrigin.getX());
-        final float yOffset = !smallSprite ? -sprite.getHeight() / 2 : 0;
-
-        float rotate = anim + 30;
-
-        if (item.isTool()) {
-            sprite.rotate90(looksLeft());
-        }
-
-        final float itemX = x + handLength * MathUtils.sin(handMultiplier * anim * MathUtils.degRad) + xOffset;
-        final float itemY = y + handLength * MathUtils.cos(handMultiplier * anim * MathUtils.degRad) + yOffset;
-
-        if (looksLeft()) {
-            sprite.setFlip(!item.isTool(), sprite.isFlipY());
-            SpriteUtilsKt.applyOrigin(sprite, spriteOrigin.getFlipped(true, false));
-        } else {
-            sprite.setFlip(item.isTool(), sprite.isFlipY());
-            SpriteUtilsKt.applyOrigin(sprite, spriteOrigin);
-        }
-
-        sprite.setRotation(-handMultiplier * rotate);
-        sprite.setPosition(itemX, itemY);
-        sprite.draw(spriteBatch);
-
-        // dont forget to reset
-        sprite.setFlip(false, sprite.isFlipY());
-        sprite.setRotation(0);
-        sprite.setOriginCenter();
-        sprite.setSize(originalWidth, originalHeight);
-        if (item.isTool()) {
-            sprite.rotate90(looksRight());
-        }
-    }
-
-    public void startHitting(boolean withDamage) {
-        if (hitting) {
-            return;
-        }
-
-        hitting = true;
-        hittingWithDamage = withDamage;
-        hitAnim = 90f;
-        hitAnimDelta = ANIMATION_SPEED;
-    }
-
-    public void startHitting() {
-        startHitting(true);
-    }
-
-    public void stopHitting() {
-        blockDamage = 0f;
-        hitting = false;
-    }
-
-    private float getRightHandAnim(float delta) {
-        hitAnim -= hitAnimDelta * delta;
-
-        if (hitAnim < 30f || hitAnim > 90f) {
-            if (hitting) {
-                hitAnim = MathUtils.clamp(hitAnim, 30f, 90f);
-                hitAnimDelta = -hitAnimDelta;
-            } else  {
-                hitAnimDelta = ANIMATION_SPEED;
-            }
-        }
-
-        if (!hitting) {
-            if (hitAnim < hitAnimDelta * delta) {
-                hitAnim = 0;
-                hitAnimDelta = 0;
-                return -mAnim;
-            }
-        }
-
-        return hitAnim;
-    }
-
-    @Override
-    public void draw(SpriteBatch spriteBatch, float x, float y, float delta) {
-        final Sprite hand = playerSprite.getHand();
-        final Sprite leg = playerSprite.getLeg();
-        final Sprite head = playerSprite.getHead();
-        final Sprite body = playerSprite.getBody();
-
-        hand.setFlip(looksRight(), hand.isFlipY());
-        leg.setFlip(looksRight(), leg.isFlipY());
-        head.setFlip(looksRight(), head.isFlipY());
-        body.setFlip(looksRight(), body.isFlipY());
-
-        hand.setOrigin(hand.getWidth() / 2, 0);
-        leg.setOrigin(leg.getWidth() / 2, 0);
-        head.setOrigin(head.getWidth() / 2, head.getHeight());
-
-        float backHandAnim, frontHandAnim;
-
-        final float rightHandAnim = getRightHandAnim(delta);
-
-        if (looksLeft()) {
-            backHandAnim = rightHandAnim;
-            frontHandAnim = mAnim;
-        } else {
-            backHandAnim = -mAnim;
-            frontHandAnim = -rightHandAnim;
-        }
-
-        final Color backgroundTintColor = getTintColor().cpy().sub(new Color(0xAAAAAA00));
-
-        hand.setColor(backgroundTintColor);
-        SpriteUtilsKt.drawSprite(spriteBatch, hand, x + 2, y + 8, backHandAnim);
-
-        if (looksLeft()) {
-            drawItem(spriteBatch, x, y, -backHandAnim);
-        }
-
-        leg.setColor(backgroundTintColor);
-        SpriteUtilsKt.drawSprite(spriteBatch, leg, x + 2, y + 20, mAnim);
-
-        leg.setColor(getTintColor());
-        SpriteUtilsKt.drawSprite(spriteBatch, leg, x + 2, y + 20, -mAnim);
-
-        head.setColor(getTintColor());
-        SpriteUtilsKt.drawSprite(spriteBatch, head, x, y, headRotation);
-
-        body.setColor(getTintColor());
-        SpriteUtilsKt.drawSprite(spriteBatch, body, x + 2, y + 8);
-
-        if (looksRight()) {
-            drawItem(spriteBatch, x, y, frontHandAnim);
-        }
-
-        hand.setColor(getTintColor());
-        SpriteUtilsKt.drawSprite(spriteBatch, hand, x + 2, y + 8, frontHandAnim);
-    }
-
-    @NotNull
-    @Override
-    public SaveDataDto.PlayerSaveData getSaveData() {
-        return new SaveDataDto.PlayerSaveData(
-                SAVE_DATA_VERSION,
-                mType,
-                mAnimDelta,
-                mAnim,
-                mDirection,
-                mDead,
-                mCanJump,
-                mFlyMode,
-                mMaxHealth,
-                mHealth,
-                x,
-                y,
-                width,
-                height,
-                getVelocity().x,
-                getVelocity().y,
-                hitting,
-                hittingWithDamage,
-                hitAnim,
-                hitAnimDelta,
-                inventory.getSaveData(),
-                gameMode,
-                swim,
-                headRotation,
-                blockDamage,
-                cursorX,
-                cursorY,
-                spawnPoint != null ? spawnPoint.x : 0f,
-                spawnPoint != null ? spawnPoint.y : 0f,
-                controlMode
-        );
-    }
-
-    public static Player fromSaveData(
-            SaveDataDto.PlayerSaveData saveData,
-            GameItemsHolder gameItemsHolder,
-            TooltipManager tooltipManager,
-            GetPlayerSpritesUseCase getPlayerSpritesUseCase
-    ) {
-        saveData.verifyVersion(SAVE_DATA_VERSION);
-
-        Player player = new Player(gameItemsHolder, tooltipManager, getPlayerSpritesUseCase.invoke());
-
-        player.mType = saveData.getType();
-        player.mAnimDelta = saveData.getAnimDelta();
-        player.mAnim = saveData.getAnim();
-        player.mDirection = saveData.getDirection();
-        player.mDead = saveData.getDead();
-        player.mCanJump = saveData.getCanJump();
-        player.mFlyMode = saveData.getFlyMode();
-        player.mMaxHealth = saveData.getMaxHealth();
-        player.mHealth = saveData.getHealth();
-        player.x = saveData.getX();
-        player.y = saveData.getY();
-        player.width = saveData.getWidth();
-        player.height = saveData.getHeight();
-        player.hitting = saveData.getHitting();
-        player.hittingWithDamage = saveData.getHittingWithDamage();
-        player.hitAnim = saveData.getHitAnim();
-        player.hitAnimDelta = saveData.getHitAnimDelta();
-        player.inventory = Inventory.Companion.fromSaveData(saveData.getInventory(), gameItemsHolder, tooltipManager);
-        player.gameMode = saveData.getGameMode();
-        player.swim = saveData.getSwim();
-        player.headRotation = saveData.getHeadRotation();
-        player.blockDamage = saveData.getBlockDamage();
-        player.cursorX = saveData.getCursorX();
-        player.cursorY = saveData.getCursorY();
-        player.spawnPoint = new Vector2(saveData.getSpawnPointX(), saveData.getSpawnPointY());
-        player.controlMode = saveData.getControlMode();
-
-        return player;
-    }
-}
diff --git a/core/src/main/java/ru/deadsoftware/cavedroid/game/objects/drop/DropController.java b/core/src/main/java/ru/deadsoftware/cavedroid/game/objects/drop/DropController.java
deleted file mode 100644 (file)
index 7b99676..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package ru.deadsoftware.cavedroid.game.objects.drop;
-
-import org.jetbrains.annotations.NotNull;
-import ru.deadsoftware.cavedroid.game.GameItemsHolder;
-import ru.deadsoftware.cavedroid.game.GameScope;
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto;
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
-import ru.deadsoftware.cavedroid.game.model.item.Item;
-import ru.deadsoftware.cavedroid.misc.Saveable;
-
-import javax.inject.Inject;
-import java.util.Iterator;
-import java.util.LinkedList;
-
-@GameScope
-public class DropController implements Saveable {
-
-    private static final int SAVE_DATA_VERSION = 1;
-
-    public interface Callback {
-        void run(Drop drop);
-    }
-
-    private final LinkedList<Drop> mDrops = new LinkedList<>();
-
-    @Inject
-    public DropController() {
-    }
-
-    public void initDrops(GameItemsHolder gameItemsHolder) {
-        for (Drop drop : mDrops) {
-            drop.initItem(gameItemsHolder);
-        }
-    }
-
-    public void addDrop(float x, float y, Item item) {
-        addDrop(x, y, item, 1);
-    }
-
-    public void addDrop(float x, float y, Item item, int count) {
-        if (item.isNone()) {
-            return;
-        }
-        mDrops.add(new Drop(x, y, item, count));
-    }
-
-    public void addDrop(float x, float y, @NotNull InventoryItem invItem) {
-        addDrop(x, y, invItem.getItem(), invItem.getAmount());
-    }
-
-    public int getSize() {
-        return mDrops.size();
-    }
-
-    public void forEach(Callback callback) {
-        for (Drop drop : mDrops) {
-            callback.run(drop);
-        }
-    }
-
-    public Iterator<Drop> getIterator() {
-        return mDrops.iterator();
-    }
-
-    @Override
-    @NotNull
-    public SaveDataDto.DropControllerSaveData getSaveData() {
-        final LinkedList<SaveDataDto.DropSaveData> dropSaveData = new LinkedList<>();
-        for (Drop drop : mDrops) {
-            dropSaveData.add(drop.getSaveData());
-        }
-        return new SaveDataDto.DropControllerSaveData(SAVE_DATA_VERSION, dropSaveData);
-    }
-
-    public static DropController fromSaveData(
-            SaveDataDto.DropControllerSaveData saveData, GameItemsHolder gameItemsHolder) {
-        saveData.verifyVersion(SAVE_DATA_VERSION);
-
-        DropController controller = new DropController();
-
-        for (SaveDataDto.DropSaveData dropSaveData : saveData.getDrops()) {
-            controller.mDrops.add(Drop.Companion.fromSaveData(dropSaveData, gameItemsHolder));
-        }
-
-        return controller;
-    }
-
-}
diff --git a/core/src/main/java/ru/deadsoftware/cavedroid/game/world/GameWorld.java b/core/src/main/java/ru/deadsoftware/cavedroid/game/world/GameWorld.java
deleted file mode 100644 (file)
index b6b9ff8..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-package ru.deadsoftware.cavedroid.game.world;
-
-import kotlin.Pair;
-import org.jetbrains.annotations.Nullable;
-import ru.deadsoftware.cavedroid.game.GameItemsHolder;
-import ru.deadsoftware.cavedroid.game.GameScope;
-import ru.deadsoftware.cavedroid.game.mobs.MobsController;
-import ru.deadsoftware.cavedroid.game.model.block.Block;
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem;
-import ru.deadsoftware.cavedroid.game.model.item.Item;
-import ru.deadsoftware.cavedroid.game.model.world.generator.WorldGeneratorConfig;
-import ru.deadsoftware.cavedroid.game.objects.container.Container;
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController;
-import ru.deadsoftware.cavedroid.game.objects.container.Furnace;
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController;
-import ru.fredboy.cavedroid.utils.MeasureUnitsUtilsKt;
-
-import javax.inject.Inject;
-
-@GameScope
-public class GameWorld {
-
-    private static final int FOREGROUND_Z = 0;
-    private static final int BACKGROUND_Z = 1;
-
-    private final DropController mDropController;
-    private final MobsController mMobsController;
-    private final GameItemsHolder mGameItemsHolder;
-    private final ContainerController mContainerController;
-
-    private final int mWidth;
-    private final int mHeight;
-    private final Block[][] mForeMap;
-    private final Block[][] mBackMap;
-
-    private final WorldGeneratorConfig mWorldConfig = WorldGeneratorConfig.Companion.getDefault();
-
-    @Inject
-    public GameWorld(DropController dropController,
-                     MobsController mobsController,
-                     GameItemsHolder gameItemsHolder,
-                     ContainerController containerController,
-                     @Nullable Block[][] foreMap,
-                     @Nullable Block[][] backMap) {
-        mDropController = dropController;
-        mMobsController = mobsController;
-        mGameItemsHolder = gameItemsHolder;
-        mContainerController = containerController;
-
-        boolean isNewGame = foreMap == null || backMap == null;
-
-        if (isNewGame) {
-            mWidth = mWorldConfig.getWidth();
-            mHeight = mWorldConfig.getHeight();
-            Pair<Block[][], Block[][]> maps = new GameWorldGenerator(mWorldConfig, mGameItemsHolder).generate();
-            mForeMap = maps.getFirst();
-            mBackMap = maps.getSecond();
-            spawnInitialMobs();
-            mMobsController.getPlayer().respawn(this, mGameItemsHolder);
-        } else {
-            mForeMap = foreMap;
-            mBackMap = backMap;
-            mWidth = mForeMap.length;
-            mHeight = mForeMap[0].length;
-        }
-    }
-
-    public int getWidth() {
-        return mWidth;
-    }
-
-    public int getHeight() {
-        return mHeight;
-    }
-
-    /**
-     * @deprecated for kotlin use {@link MeasureUnitsUtilsKt#getPx } extension val
-     */
-    @Deprecated
-    public float getWidthPx() {
-        return MeasureUnitsUtilsKt.getPx(mWidth);
-    }
-
-    /**
-     * @deprecated for kotlin use {@link MeasureUnitsUtilsKt#getPx } extension val
-     */
-    @Deprecated
-    public float getHeightPx() {
-        return MeasureUnitsUtilsKt.getPx(mHeight);
-    }
-
-    public Block[][] getFullForeMap() {
-        return mForeMap;
-    }
-
-    public Block[][] getFullBackMap() {
-        return mBackMap;
-    }
-
-    private int transformX(int x) {
-        x = x % getWidth();
-        if (x < 0) {
-            x = getWidth() - Math.abs(x);
-        }
-        return x;
-    }
-
-    private Block getMap(int x, int y, int layer) {
-        Block map = mGameItemsHolder.getFallbackBlock();
-
-        if (y < 0 || y >= getHeight()) {
-            return map;
-        }
-
-        x = transformX(x);
-
-        if (x < 0 || x >= getWidth()) {
-            return map;
-        }
-
-        map = (layer == 0) ? mForeMap[x][y] : mBackMap[x][y];
-
-        return map;
-    }
-
-    private void setMap(int x, int y, int layer, Block value) {
-        if (y < 0 || y >= getHeight()) {
-            return;
-        }
-
-        x = transformX(x);
-
-        if (x < 0 || x >= getWidth()) {
-            return;
-        }
-
-        mContainerController.destroyContainer(x, y, layer, false);
-
-        if (value.isContainer()) {
-            mContainerController.addContainer(x, y, layer, (Class<? extends Block.Container>) value.getClass());
-        }
-
-        if (layer == 0) {
-            mForeMap[x][y] = value;
-        } else {
-            mBackMap[x][y] = value;
-        }
-    }
-
-    private boolean isSameSlab(Block slab1, Block slab2) {
-        if (!(slab1 instanceof Block.Slab) || !(slab2 instanceof Block.Slab)) {
-            return false;
-        }
-
-        return slab1.getParams().getKey().equals(((Block.Slab) slab2).getOtherPartBlockKey())
-                || slab1.getParams().getKey().equals(slab2.getParams().getKey());
-    }
-
-    public boolean hasForeAt(int x, int y) {
-        return getMap(x, y, FOREGROUND_Z) != mGameItemsHolder.getFallbackBlock();
-    }
-
-    public boolean hasBackAt(int x, int y) {
-        return getMap(x, y, BACKGROUND_Z) != mGameItemsHolder.getFallbackBlock();
-    }
-
-    public Block getForeMap(int x, int y) {
-        return getMap(x, y, FOREGROUND_Z);
-    }
-
-    public void setForeMap(int x, int y, Block block) {
-        setMap(x, y, FOREGROUND_Z, block);
-    }
-
-    public void resetForeMap(int x, int y) {
-        setForeMap(x, y, mGameItemsHolder.getFallbackBlock());
-    }
-
-    public Block getBackMap(int x, int y) {
-        return getMap(x, y, BACKGROUND_Z);
-    }
-
-    public void setBackMap(int x, int y, Block block) {
-        setMap(x, y, BACKGROUND_Z, block);
-    }
-
-    public boolean canPlaceToForeground(int x, int y, Block value) {
-        return !hasForeAt(x, y) || value == mGameItemsHolder.getFallbackBlock() || !getForeMap(x, y).hasCollision();
-    }
-
-    public boolean placeToForeground(int x, int y, Block value) {
-        if (canPlaceToForeground(x, y, value)) {
-            setForeMap(x, y, value);
-            return true;
-        } else if (value instanceof Block.Slab && isSameSlab(value, getForeMap(x, y))) {
-            setForeMap(x, y, mGameItemsHolder.getBlock(((Block.Slab) value).getFullBlockKey()));
-            return true;
-        }
-        return false;
-    }
-
-    public boolean placeToBackground(int x, int y, Block value) {
-        if (value == mGameItemsHolder.getFallbackBlock() || (getBackMap(x, y) == mGameItemsHolder.getFallbackBlock() && value.hasCollision()) &&
-                (!value.isTransparent() || value == mGameItemsHolder.getBlock("glass") || value.isChest() || value.isSlab())) {
-            setBackMap(x, y, value);
-            return true;
-        }
-        return false;
-    }
-
-    private void playerDurateTool() {
-        final InventoryItem playerCurrentItem = mMobsController.getPlayer().inventory.getActiveItem();
-        if (playerCurrentItem.getItem().isTool()) {
-            mMobsController.getPlayer().decreaseCurrentItemCount(mGameItemsHolder);
-        }
-    }
-
-    private boolean shouldDrop(Block block) {
-        final Item item = mMobsController.getPlayer().inventory.getActiveItem().getItem();
-        int toolLevel = item.isTool() ? ((Item.Tool) item).getLevel() : 0;
-        if (item.isTool() && block.getParams().getToolType() != item.getClass()) {
-            toolLevel = 0;
-        }
-        return toolLevel >= block.getParams().getToolLevel();
-    }
-
-    private void spawnInitialMobs() {
-//        for (int x = 0; x < getWidth(); x++) {
-//            int y = 0;
-//            while (y < getWorldConfig().getSeaLevel()) {
-//                if (getForeMap(x, y) == mGameItemsHolder.getBlock("grass")) {
-//                    if (MathUtils.randomBoolean(.125f)) {
-//                        mMobsController.addMob(new Pig(MeasureUnitsUtilsKt.getPx(x), MeasureUnitsUtilsKt.getPx(y)));
-//                    }
-//                    break;
-//                }
-//                y++;
-//            }
-//        }
-    }
-
-    public void destroyForeMap(int x, int y) {
-        Block block = getForeMap(x, y);
-        if (block.isContainer()) {
-            mContainerController.destroyContainer(x, y, FOREGROUND_Z, true);
-        }
-        if (block.hasDrop() && shouldDrop(block)) {
-            for (int i = 0; i < block.getParams().getDropInfo().getCount(); i++) {
-                mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, mGameItemsHolder.getItem(block.getDrop()));
-            }
-        }
-        playerDurateTool();
-        placeToForeground(x, y, mGameItemsHolder.getFallbackBlock());
-    }
-
-    public WorldGeneratorConfig getWorldConfig() {
-        return mWorldConfig;
-    }
-
-    public void destroyBackMap(int x, int y) {
-        Block block = getBackMap(x, y);
-        if (block.isContainer()) {
-            mContainerController.destroyContainer(x, y, BACKGROUND_Z, true);
-        }
-        if (block.hasDrop() && shouldDrop(block)) {
-            for (int i = 0; i < block.getParams().getDropInfo().getCount(); i++) {
-                mDropController.addDrop(transformX(x) * 16 + 4, y * 16 + 4, mGameItemsHolder.getItem(block.getDrop()));
-            }
-        }
-        playerDurateTool();
-        placeToBackground(x, y, mGameItemsHolder.getFallbackBlock());
-    }
-
-    @Nullable
-    private Container getContainerAt(int x, int y, int z) {
-        return mContainerController.getContainer(transformX(x), y, z);
-    }
-
-    @Nullable
-    public Container getForegroundContainer(int x, int y) {
-        return getContainerAt(x, y, FOREGROUND_Z);
-    }
-
-    @Nullable
-    public Container getBackgroundContainer(int x, int y) {
-        return getContainerAt(x, y, BACKGROUND_Z);
-    }
-
-    @Nullable
-    public Furnace getForegroundFurnace(int x, int y) {
-        @Nullable
-        final Container container = getForegroundContainer(x, y);
-
-        if (container instanceof Furnace) {
-            return (Furnace) container;
-        }
-
-        return null;
-    }
-
-    @Nullable
-    public Furnace getBackgroundFurnace(int x, int y) {
-        @Nullable
-        final Container container = getBackgroundContainer(x, y);
-
-        if (container instanceof Furnace) {
-            return (Furnace) container;
-        }
-
-        return null;
-    }
-}
\ No newline at end of file
index 567436821bf69a8e9fc7c6dfbcb7c26fa9011539..ccd2aff3d9117d7157a6d0f19ff4dd034e46902f 100644 (file)
@@ -2,9 +2,10 @@ package ru.deadsoftware.cavedroid.menu;
 
 import dagger.Component;
 import ru.deadsoftware.cavedroid.MainComponent;
+import ru.fredboy.cavedroid.data.save.di.DataSaveModule;
 
 @MenuScope
-@Component(dependencies = MainComponent.class)
+@Component(dependencies = MainComponent.class, modules = DataSaveModule.class)
 public interface MenuComponent {
     MenuProc getMenuProc();
 }
index 947392caca2b0e5a04a28841a156902c0270ba46..72afc14b296afd7a684086d02ede83a8c7774acd 100644 (file)
@@ -1,14 +1,13 @@
 package ru.deadsoftware.cavedroid.menu;
 
 import com.badlogic.gdx.Gdx;
-import com.badlogic.gdx.graphics.Color;
 import com.badlogic.gdx.utils.ObjectMap;
 import ru.deadsoftware.cavedroid.CaveGame;
 import ru.deadsoftware.cavedroid.MainConfig;
 import ru.deadsoftware.cavedroid.menu.objects.Button;
 import ru.deadsoftware.cavedroid.menu.submenus.*;
 import ru.deadsoftware.cavedroid.misc.Renderer;
-import ru.deadsoftware.cavedroid.misc.utils.RenderingUtilsKt;
+import ru.fredboy.cavedroid.common.utils.RenderingUtilsKt;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase;
@@ -20,8 +19,6 @@ import java.lang.reflect.Method;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static ru.deadsoftware.cavedroid.misc.Assets.*;
-
 @MenuScope
 public class MenuProc extends Renderer {
 
index 575eb7af5e14d7e6c031d5589bab2194993fdbe6..5f48fa4d2f3a938986c5888fc80d07fff9c9ee5a 100644 (file)
@@ -7,7 +7,6 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch;
 import com.badlogic.gdx.graphics.g2d.TextureRegion;
 import com.badlogic.gdx.utils.ArrayMap;
 import com.badlogic.gdx.utils.JsonValue;
-import kotlin.text.StringsKt;
 import ru.deadsoftware.cavedroid.MainConfig;
 import ru.deadsoftware.cavedroid.menu.MenuProc;
 import ru.deadsoftware.cavedroid.menu.objects.BooleanOptionButton;
@@ -57,6 +56,9 @@ public abstract class Menu {
         mMenuInput = menuInput;
         mAssetLoader = assetLoader;
         mGetTextureRegionByNameUseCase = getTextureRegionByNameUseCase;
+    }
+
+    final void init() {
         initButtons();
     }
 
index d51f328c9ea94410205710d18ebad8a443a79d2d..8dcd27517a6d08a33e5c2ff9b769b9b42c9114bc 100644 (file)
@@ -1,27 +1,30 @@
 package ru.deadsoftware.cavedroid.menu.submenus;
 
 import ru.deadsoftware.cavedroid.MainConfig;
-import ru.deadsoftware.cavedroid.game.save.GameSaveLoader;
 import ru.deadsoftware.cavedroid.menu.MenuProc;
 import ru.deadsoftware.cavedroid.menu.objects.Button;
 import ru.deadsoftware.cavedroid.menu.objects.ButtonEventListener;
 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer;
 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader;
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase;
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository;
 
-import javax.inject.Inject;
 import java.util.HashMap;
 
 public class MenuMain extends Menu {
 
+    private final SaveDataRepository mSaveDataRepository;
+
     public MenuMain(float width,
                     float height,
                     ButtonRenderer buttonRenderer,
                     MainConfig mainConfig,
                     MenuProc.Input menuInput,
                     AssetLoader assetLoader,
-                    GetTextureRegionByNameUseCase getTextureRegionByNameUseCase) {
+                    GetTextureRegionByNameUseCase getTextureRegionByNameUseCase,
+                    SaveDataRepository saveDataRepository) {
         super(width, height, buttonRenderer, mainConfig, menuInput, assetLoader, getTextureRegionByNameUseCase);
+        mSaveDataRepository = saveDataRepository;
     }
 
     @Override
@@ -37,7 +40,7 @@ public class MenuMain extends Menu {
     @Override
     protected void initButtons() {
         loadButtonsFromJson(mAssetLoader.getAssetHandle("json/menu_main_buttons.json"));
-        if (GameSaveLoader.INSTANCE.exists(mMainConfig)) {
+        if (mSaveDataRepository.exists(mMainConfig.getGameFolder())) {
             getButtons().get("load_game").setType(Button.NORMAL);
         }
     }
index 0ba7763cb12662fe601b5ca29c91b1555a9cca98..73d9afb0ec166d56899b45889295bbd69f657230 100644 (file)
@@ -3,10 +3,9 @@ package ru.deadsoftware.cavedroid
 import com.badlogic.gdx.Application
 import com.badlogic.gdx.Game
 import com.badlogic.gdx.Gdx
-import ru.deadsoftware.cavedroid.misc.Assets
 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
-import ru.deadsoftware.cavedroid.misc.utils.ratio
 import ru.deadsoftware.cavedroid.prefs.PreferencesStore
+import ru.fredboy.cavedroid.common.utils.ratio
 
 class CaveGame(
     private val gameDataDirectoryPath: String,
index 09474ecded6fe71bae2e4cca0117979f74c3aed3..f1a6c1c4b2c77472efabb1236414d3a1dcc759b7 100644 (file)
@@ -6,16 +6,18 @@ import ru.deadsoftware.cavedroid.menu.MenuScreen
 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
 import ru.deadsoftware.cavedroid.prefs.PreferencesStore
 import ru.fredboy.cavedroid.data.assets.di.DataAssetsModule
+import ru.fredboy.cavedroid.data.items.di.DataItemsModule
 import ru.fredboy.cavedroid.domain.assets.GameAssetsHolder
 import ru.fredboy.cavedroid.domain.assets.repository.*
 import ru.fredboy.cavedroid.domain.assets.usecase.DisposeAssetsUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.InitializeAssetsUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 import javax.inject.Singleton
 
 @Singleton
 @Component(
     dependencies = [CaveGame::class, PreferencesStore::class],
-    modules = [DataAssetsModule::class]
+    modules = [DataAssetsModule::class, DataItemsModule::class]
 )
 interface MainComponent {
 
@@ -45,4 +47,6 @@ interface MainComponent {
 
     val touchButtonsAssetsRepository: TouchButtonsAssetsRepository
 
+    val itemsRepository: ItemsRepository
+
 }
\ No newline at end of file
index 2803ef04e9fbcf21cd9b13a6a8d3f4e991727e1a..da28f53afc84aeb95f4792fa8150e81073e3952d 100644 (file)
@@ -6,7 +6,7 @@ import ru.deadsoftware.cavedroid.game.actions.updateblock.IUpdateBlockAction
 import ru.deadsoftware.cavedroid.game.actions.updateblock.UpdateRequiresBlockAction
 import ru.deadsoftware.cavedroid.game.actions.placeblock.PlaceBlockItemToBackgroundAction
 import ru.deadsoftware.cavedroid.game.actions.placeblock.PlaceBlockItemToForegroundAction
-import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 
 private const val TAG = "PlaceBlockActionUtils"
 
index 06c70c4a0353d8aeda98016aa4a5d7a338897f80..142fc6dfde7b67f8e4ebce561a423c1b44c83755 100644 (file)
@@ -1,6 +1,6 @@
 package ru.deadsoftware.cavedroid.game.actions.placeblock
 
-import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 
 interface IPlaceBlockAction {
 
index 72583017e73e32dc4d6408e1dd216525d744508f..091a0b6a3ed4dfd4db2204c95cda94922cb73009 100644 (file)
@@ -1,24 +1,22 @@
 package ru.deadsoftware.cavedroid.game.actions.placeblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindPlaceBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindPlaceBlockAction(stringKey = PlaceBlockItemToBackgroundAction.ACTION_KEY)
 class PlaceBlockItemToBackgroundAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val gameItemsHolder: GameItemsHolder,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IPlaceBlockAction {
 
     override fun place(placeable: Item.Placeable, x: Int, y: Int) {
         if (gameWorld.placeToBackground(x, y, placeable.block)) {
-            mobsController.player.decreaseCurrentItemCount(gameItemsHolder)
+            mobController.player.decreaseCurrentItemCount()
         }
     }
 
index ec249fbc027561047a08993854b8a4d397a2b7f7..7e145d34908560d16f31df0c39ef4122226febe3 100644 (file)
@@ -1,11 +1,10 @@
 package ru.deadsoftware.cavedroid.game.actions.placeblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindPlaceBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
@@ -13,8 +12,7 @@ import javax.inject.Inject
 class PlaceBlockItemToForegroundAction @Inject constructor(
     private val gameWorld: GameWorld,
     private val placeSlabAction: PlaceSlabAction,
-    private val gameItemsHolder: GameItemsHolder,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IPlaceBlockAction {
 
     override fun place(placeable: Item.Placeable, x: Int, y: Int) {
@@ -22,7 +20,7 @@ class PlaceBlockItemToForegroundAction @Inject constructor(
             placeSlabAction.place(placeable, x, y)
         } else {
             if (gameWorld.placeToForeground(x, y, placeable.block)) {
-                mobsController.player.decreaseCurrentItemCount(gameItemsHolder)
+                mobController.player.decreaseCurrentItemCount()
             }
         }
     }
index 00c62d7d94b392eb6e769a18366489c1a1417a4e..74a0b84f9209d11a8996d7aaab5ed38b66761b5b 100644 (file)
@@ -1,20 +1,18 @@
 package ru.deadsoftware.cavedroid.game.actions.placeblock
 
 import com.badlogic.gdx.Gdx
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindPlaceBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindPlaceBlockAction(stringKey = PlaceSlabAction.ACTION_KEY)
 class PlaceSlabAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
 ) : IPlaceBlockAction {
 
     override fun place(placeable: Item.Placeable, x: Int, y: Int) {
@@ -33,7 +31,7 @@ class PlaceSlabAction @Inject constructor(
         }
 
         if (gameWorld.placeToForeground(x, y, slabPart)) {
-            mobsController.player.decreaseCurrentItemCount(gameItemsHolder)
+            mobController.player.decreaseCurrentItemCount()
         }
     }
 
index c23b80f310e637497e0bd4fea6f3e92ef2cf3c7e..2bd5d2dc633eb3f3093955c9a590e2bdce46f5e8 100644 (file)
@@ -1,20 +1,20 @@
 package ru.deadsoftware.cavedroid.game.actions.updateblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUpdateBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUpdateBlockAction(stringKey = UpdateBedLeftAction.BLOCK_KEY)
 class UpdateBedLeftAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val gameItemsHolder: GameItemsHolder,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
 ) : IUpdateBlockAction {
 
     override fun update(x: Int, y: Int) {
-        val bedRight = gameItemsHolder.getBlock("bed_r")
+        val bedRight = getBlockByKeyUseCase["bed_r"]
         if (gameWorld.getForeMap(x + 1, y) != bedRight) {
             gameWorld.resetForeMap(x, y)
         }
index cd8b2d37fbb8fcb6c8f36ac65212e66e940ef36b..15b016f24ec96b058f4a5a4919d96b681124b33c 100644 (file)
@@ -1,20 +1,20 @@
 package ru.deadsoftware.cavedroid.game.actions.updateblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUpdateBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUpdateBlockAction(stringKey = UpdateBedRightAction.BLOCK_KEY)
 class UpdateBedRightAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val gameItemsHolder: GameItemsHolder,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
 ) : IUpdateBlockAction {
 
     override fun update(x: Int, y: Int) {
-        val bedLeft = gameItemsHolder.getBlock("bed_l")
+        val bedLeft = getBlockByKeyUseCase["bed_l"]
         if (gameWorld.getForeMap(x - 1, y) != bedLeft) {
             gameWorld.resetForeMap(x, y)
         }
index 476235a3dae9671dd240f057045364770ace0a3c..99a45abe0bd5cb3ffa88f96d96904ef8175b983a 100644 (file)
@@ -1,16 +1,16 @@
 package ru.deadsoftware.cavedroid.game.actions.updateblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUpdateBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUpdateBlockAction(stringKey = UpdateGrassAction.BLOCK_KEY)
 class UpdateGrassAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mGameItemsHolder: GameItemsHolder,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
 ) : IUpdateBlockAction {
 
     override fun update(x: Int, y: Int) {
@@ -19,8 +19,8 @@ class UpdateGrassAction @Inject constructor(
         val makesDirt = blockOnTop.params.hasCollision || blockOnTop.isFluid()
 
         when {
-            makesDirt -> gameWorld.setForeMap(x, y, mGameItemsHolder.getBlock("dirt"))
-            blockOnTop.params.key == "snow" -> gameWorld.setForeMap(x, y, mGameItemsHolder.getBlock("grass_snowed"))
+            makesDirt -> gameWorld.setForeMap(x, y, getBlockByKeyUseCase["dirt"])
+            blockOnTop.params.key == "snow" -> gameWorld.setForeMap(x, y, getBlockByKeyUseCase["grass_snowed"])
         }
     }
 
index 2b3dd303156a27a63e5e27a751682ba66805fea5..eb2a624fb88509bdf2a20647e705e9175f0c82e0 100644 (file)
@@ -1,18 +1,18 @@
 package ru.deadsoftware.cavedroid.game.actions.updateblock
 
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.FallingBlock
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUpdateBlockAction
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.FallingBlock
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUpdateBlockAction(stringKey = UpdateRequiresBlockAction.ACTION_KEY)
 class UpdateRequiresBlockAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IUpdateBlockAction {
 
     override fun update(x: Int, y: Int) {
@@ -21,8 +21,8 @@ class UpdateRequiresBlockAction @Inject constructor(
 
             if (block.params.isFallable) {
                 gameWorld.resetForeMap(x, y)
-                FallingBlock(block.params.key, x.px, y.px)
-                    .attachToController(mobsController)
+                FallingBlock(block, x.px, y.px)
+                    .attachToController(mobController)
             } else {
                 gameWorld.destroyForeMap(x, y)
             }
index 2cf5a57b5918e856e0f0042bde266d15623155fe..a8903a4293ebd7f7fcccf9f0de6c36901e866c93 100644 (file)
@@ -1,16 +1,16 @@
 package ru.deadsoftware.cavedroid.game.actions.updateblock
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUpdateBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUpdateBlockAction(stringKey = UpdateSnowedGrassAction.BLOCK_KEY)
 class UpdateSnowedGrassAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mGameItemsHolder: GameItemsHolder,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
 ) : IUpdateBlockAction {
 
     override fun update(x: Int, y: Int) {
@@ -18,8 +18,8 @@ class UpdateSnowedGrassAction @Inject constructor(
         val makesDirt = blockOnTop.params.hasCollision || blockOnTop.isFluid()
 
         when {
-            makesDirt -> gameWorld.setForeMap(x, y, mGameItemsHolder.getBlock("dirt"))
-            blockOnTop.params.key != "snow" -> gameWorld.setForeMap(x, y, mGameItemsHolder.getBlock("grass"))
+            makesDirt -> gameWorld.setForeMap(x, y, getBlockByKeyUseCase["dirt"])
+            blockOnTop.params.key != "snow" -> gameWorld.setForeMap(x, y, getBlockByKeyUseCase["grass"])
         }
     }
 
index ddc70c5c8a0381a1e8360533e93f33090444e5db..a2e77ff47da6b96abccda90d2520391ef53542cd 100644 (file)
@@ -1,6 +1,6 @@
 package ru.deadsoftware.cavedroid.game.actions.useblock
 
-import ru.deadsoftware.cavedroid.game.model.block.Block
+import ru.fredboy.cavedroid.domain.items.model.block.Block
 
 interface IUseBlockAction {
 
index 93684e76778e3820ce49adb6bb478bc94a5eecb9..f7a2d29f43e1ae8169adcaafe9d8e2db9cd65c86 100644 (file)
@@ -1,11 +1,11 @@
 package ru.deadsoftware.cavedroid.game.actions.useblock
 
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.objects.container.Chest
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
index 6d6c1e9337c54388ba446b942d4a92abb11ced04..9c04860ed37d88018dc97140928a36fbf054aba6 100644 (file)
@@ -1,9 +1,9 @@
 package ru.deadsoftware.cavedroid.game.actions.useblock
 
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.model.block.Block
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.block.Block
 import javax.inject.Inject
 
 @GameScope
index 0b8ba5344c7c660db0cddf99bf4db27734a3271a..8aa1456b1d9a62428f147f51ac19ea96e8b3c99f 100644 (file)
@@ -1,10 +1,10 @@
 package ru.deadsoftware.cavedroid.game.actions.useblock
 
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.model.block.Block
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseBlockAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
index d963aeedb187e0be94b527608ece434ce807f050..7e42000b9f18693309dd10796b06f1fc2e3ab492 100644 (file)
@@ -1,6 +1,6 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.model.item.Item
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 
 interface IUseItemAction {
 
index f48115efa02dbe00f5bd3c3adc0ac777729116fe..ab7232e05acf6ad1e83b7921acb9a923118f45a3 100644 (file)
@@ -1,29 +1,29 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseItemAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUseItemAction(UseBedAction.ACTION_KEY)
 class UseBedAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase
 ) : IUseItemAction {
 
     override fun perform(item: Item.Usable, x: Int, y: Int) {
-        val bedLeft = gameItemsHolder.getBlock("bed_l")
-        val bedRight = gameItemsHolder.getBlock("bed_r")
+        val bedLeft = getBlockByKeyUseCase["bed_l"]
+        val bedRight = getBlockByKeyUseCase["bed_r"]
 
         if (gameWorld.canPlaceToForeground(x, y, bedLeft) && gameWorld.canPlaceToForeground(x + 1, y, bedRight)) {
             gameWorld.placeToForeground(x, y, bedLeft)
             gameWorld.placeToForeground(x + 1, y, bedRight)
-            mobsController.player.inventory.decreaseCurrentItemAmount()
+            mobController.player.inventory.decreaseCurrentItemAmount()
         }
     }
 
index 6992af7d9f1af61cfdf9a52892f7fd983b2d83d2..51ad33b0e3cb0a593c9d3c394798d0ac9d20d14f 100644 (file)
@@ -1,20 +1,20 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseItemAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUseItemAction(UseEmptyBucketAction.ACTION_KEY)
 class UseEmptyBucketAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
 ) : IUseItemAction {
 
     override fun perform(item: Item.Usable, x: Int, y: Int) {
@@ -24,14 +24,13 @@ class UseEmptyBucketAction @Inject constructor(
         }
         gameWorld.resetForeMap(x, y)
 
-        @Suppress("REDUNDANT_ELSE_IN_WHEN")
         val filled = when (foregroundBlock) {
-            is Block.Lava -> gameItemsHolder.getItem("bucket_lava")
-            is Block.Water -> gameItemsHolder.getItem("bucket_water")
+            is Block.Lava -> getItemByKeyUseCase["bucket_lava"]
+            is Block.Water -> getItemByKeyUseCase["bucket_water"]
             else -> throw IllegalStateException("unknown fluid")
         }
 
-        mobsController.player.setCurrentInventorySlotItem(filled)
+        mobController.player.setCurrentInventorySlotItem(filled)
     }
 
     companion object {
index ec1e585dfeadc87c8351695c2ab493024ef9d472..6eb8a1c2c69fd1f114b69d5ffd39be221673a68b 100644 (file)
@@ -1,26 +1,28 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseItemAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUseItemAction(UseLavaBucketAction.ACTION_KEY)
 class UseLavaBucketAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
 ) : IUseItemAction {
 
     override fun perform(item: Item.Usable, x: Int, y: Int) {
-        gameWorld.placeToForeground(x, y, gameItemsHolder.getBlock("lava"))
+        gameWorld.placeToForeground(x, y, getBlockByKeyUseCase["lava"])
 
-        if (mobsController.player.gameMode != 1) {
-            mobsController.player.setCurrentInventorySlotItem(gameItemsHolder.getItem("bucket_empty"))
+        if (mobController.player.gameMode != 1) {
+            mobController.player.setCurrentInventorySlotItem(getItemByKeyUseCase["bucket_empty"])
         }
     }
 
index 76088aea6a828242852c7eabe6e07a050c128433..b05c39fb3a584da5ce486dfd6ee5fb163a3379cd 100644 (file)
@@ -1,30 +1,26 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.Pig
-import ru.deadsoftware.cavedroid.game.model.item.Item
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseItemAction
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Pig
 import javax.inject.Inject
 
 @GameScope
 @BindUseItemAction(UsePigSpawnEggAction.ACTION_KEY)
 class UsePigSpawnEggAction @Inject constructor(
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
     private val getPigSprites: GetPigSpritesUseCase,
 ) : IUseItemAction {
 
     override fun perform(item: Item.Usable, x: Int, y: Int) {
-        Pig(getPigSprites(), mobsController.player.cursorX.px, mobsController.player.cursorY.px)
-            .apply {
-                attachToController(mobsController)
-            }
+        Pig(getPigSprites(), mobController.player.cursorX.px, mobController.player.cursorY.px)
+            .apply { attachToController(mobController) }
 
-        mobsController.player.decreaseCurrentItemCount(gameItemsHolder)
+        mobController.player.decreaseCurrentItemCount()
     }
 
     companion object {
index 739ec2899335130d1b9daae1e3c2f14db5b8e991..a49b5c6237c35d61bbc8a770b44761d9597f77e0 100644 (file)
@@ -1,25 +1,27 @@
 package ru.deadsoftware.cavedroid.game.actions.useitem
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindUseItemAction
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.domain.items.usecase.GetBlockByKeyUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindUseItemAction(UseWaterBucketAction.ACTION_KEY)
 class UseWaterBucketAction @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobsController: MobController,
+    private val getBlockByKeyUseCase: GetBlockByKeyUseCase,
+    private val getItemByKeyUseCase: GetItemByKeyUseCase,
 ) : IUseItemAction {
 
     override fun perform(item: Item.Usable, x: Int, y: Int) {
-        gameWorld.placeToForeground(x, y, gameItemsHolder.getBlock("water"))
+        gameWorld.placeToForeground(x, y, getBlockByKeyUseCase["water"])
         if (mobsController.player.gameMode != 1) {
-            mobsController.player.setCurrentInventorySlotItem(gameItemsHolder.getItem("bucket_empty"))
+            mobsController.player.setCurrentInventorySlotItem(getItemByKeyUseCase["bucket_empty"])
         }
     }
 
index 51dc335c50b3b302ea8cb7ce7d2ee50efe0fbe52..90246b7b2734bebc7b2765b44b17ab358ad5ea8e 100644 (file)
@@ -1,23 +1,23 @@
 package ru.deadsoftware.cavedroid.game.debug
 
 import com.badlogic.gdx.Gdx
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 class DebugInfoStringsProvider @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
     private val containerController: ContainerController,
     private val gameWorld: GameWorld,
 ) {
 
     fun getDebugStrings(): List<String> {
-        val player = mobsController.player
+        val player = mobController.player
 
         return listOf(
             "FPS: ${Gdx.graphics.framesPerSecond}",
@@ -27,7 +27,7 @@ class DebugInfoStringsProvider @Inject constructor(
             "CurY: ${player.cursorY}",
             "Velocity: ${player.velocity}",
             "Swim: ${player.swim}",
-            "Mobs: ${mobsController.mobs.size}",
+            "Mobs: ${mobController.mobs.size}",
             "Drops: ${dropController.size}",
             "Containers: ${containerController.size}",
             "Block: ${gameWorld.getForeMap(player.cursorX, player.cursorY).params.key}",
index 8bf9b1c25d666408b1c3c1a70ac1e9f14bd9dd23..e8d5e9fd3cd2a5a812d28f8ae06ded0ed86c53c7 100644 (file)
@@ -1,21 +1,21 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class CloseGameWindowKeyboardInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
 ) : IKeyboardInputHandler {
 
@@ -29,9 +29,9 @@ class CloseGameWindowKeyboardInputHandler @Inject constructor(
         if (selectedItem != null) {
             for (i in 1 .. selectedItem.amount) {
                 dropController.addDrop(
-                    /* x = */ mobsController.player.x + (32f * mobsController.player.direction.basis),
-                    /* y = */ mobsController.player.y,
-                    /* item = */ selectedItem.item
+                    /* x = */ mobController.player.x + (32f * mobController.player.direction.basis),
+                    /* y = */ mobController.player.y,
+                    /* item = */ selectedItem
                 )
             }
             gameWindowsManager.currentWindow?.selectedItem = null
index e9c8eb0499fad68d8be0022d03f9cb68842f027f..7fc60acbc7772943ba1e8bde95bce57c88898929 100644 (file)
@@ -1,35 +1,35 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.objects.drop.Drop
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class DropItemKeyboardInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.DropItem &&
                 action.isKeyDown && gameWindowsManager.getCurrentWindow() == GameUiWindow.NONE &&
-                !mobsController.player.inventory.activeItem.item.isNone()
+                !mobController.player.inventory.activeItem.item.isNone()
     }
 
     private fun createDrop(item: Item, playerX: Float, playerY: Float, amount: Int) {
         dropController.addDrop(
-            /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobsController.player.direction.basis),
+            /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobController.player.direction.basis),
             /* y = */ playerY,
             /* item = */ item,
             /* count = */ amount
@@ -37,7 +37,7 @@ class DropItemKeyboardInputHandler @Inject constructor(
     }
 
     override fun handle(action: KeyboardInputAction) {
-        val player = mobsController.player
+        val player = mobController.player
         val currentItem = player.inventory.activeItem
         val dropAmount =  if (currentItem.item.isTool()) currentItem.amount else 1
 
index ae5f4c3c86473c2b0240ee4d41171557c2a76f76..a331b67d44925ef0028ad4120b0d7dd22cadbd63 100644 (file)
@@ -1,33 +1,33 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class FlyDownKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Down &&
-                mobsController.player.isFlyMode &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                mobController.player.isFlyMode &&
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
         if (action.isKeyDown) {
-            mobsController.player.velocity.y = mobsController.player.speed
+            mobController.player.velocity.y = mobController.player.speed
         } else {
-            mobsController.player.velocity.y = 0f
+            mobController.player.velocity.y = 0f
         }
     }
 
index 444fe09f36ab6dcfd2fdceb71928905cce53d74d..0f9c57f60c56d038de6ff69f948bc2e894f32150 100644 (file)
@@ -1,34 +1,34 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class FlyUpKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Up &&
-                !mobsController.player.swim &&
-                mobsController.player.isFlyMode &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                !mobController.player.swim &&
+                mobController.player.isFlyMode &&
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
         if (action.isKeyDown) {
-            mobsController.player.velocity.y = -mobsController.player.speed
+            mobController.player.velocity.y = -mobController.player.speed
         } else {
-            mobsController.player.velocity.y = 0f
+            mobController.player.velocity.y = 0f
         }
     }
 
index 2b40d4634ad55a81fb62c416190b133a94f557c2..2ba1d83c95f2103d3aec8319ef37e0781c5ad6c9 100644 (file)
@@ -1,35 +1,35 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class GoLeftKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Left &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch) &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch) &&
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
         if (action.isKeyDown) {
-            mobsController.player.velocity.x = -mobsController.player.speed
-            mobsController.player.setDir(Mob.Direction.LEFT)
+            mobController.player.velocity.x = -mobController.player.speed
+            mobController.player.direction = Direction.LEFT
         } else {
-            mobsController.player.velocity.x = 0f
+            mobController.player.velocity.x = 0f
         }
     }
 }
\ No newline at end of file
index ec38218fea5c7d5aa511615d559f3dab2cdfc1f6..a2434e46b07084c58a12d05941cf9dc41659749d 100644 (file)
@@ -1,34 +1,34 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class GoRightKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController
+    private val mobController: MobController
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Right &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
         if (action.isKeyDown) {
-            mobsController.player.velocity.x = mobsController.player.speed
-            mobsController.player.setDir(Mob.Direction.RIGHT)
+            mobController.player.velocity.x = mobController.player.speed
+            mobController.player.direction = Direction.RIGHT
         } else {
-            mobsController.player.velocity.x = 0f
+            mobController.player.velocity.x = 0f
         }
     }
 }
\ No newline at end of file
index bcacbf578ebf6928bbb4e0e62c0c5fc03eb1c3b7..5594c39be4c1e40b574f9af22775141d49054c04 100644 (file)
@@ -1,31 +1,31 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class JumpKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Up &&
-                mobsController.player.canJump() && !mobsController.player.isFlyMode &&
+                mobController.player.canJump && !mobController.player.isFlyMode &&
                 action.isKeyDown &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
-        mobsController.player.jump()
+        mobController.player.jump()
     }
 
 }
\ No newline at end of file
index 84c5b900cc5d12fdc2d217a5eee0326e716340e7..221469c57e9d9d8b40bc8585783b6a4d2158041f 100644 (file)
@@ -1,21 +1,21 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class MoveCursorControlsModeKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobsController: MobController,
     private val gameWorld: GameWorld,
 ) : IKeyboardInputHandler {
 
@@ -39,10 +39,6 @@ class MoveCursorControlsModeKeyboardInputHandler @Inject constructor(
             else -> return
         }
 
-        player.checkCursorBounds(gameWorld);
-    }
-
-    companion object {
-        private const val SURVIVAL_CURSOR_RANGE = 4
+        gameWorld.checkPlayerCursorBounds()
     }
 }
\ No newline at end of file
index 70ae1585c75a9f5ed3f974ddbb147c8871481ecb..45de0309800a7a53a8a20d4d562f8a813b274877 100644 (file)
@@ -1,12 +1,12 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
index 0311c8831fb22dd753d08db23564e9a8f5b19235..e72ba870a48e069252ec782c38544a3e830fe811 100644 (file)
@@ -1,18 +1,18 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.game.objects.container.ContainerController
-import ru.deadsoftware.cavedroid.game.save.GameSaveLoader
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository
+import ru.fredboy.cavedroid.game.controller.container.ContainerController
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
@@ -20,10 +20,11 @@ import javax.inject.Inject
 class PauseGameKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
     private val dropController: DropController,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWorld: GameWorld,
     private val containerController: ContainerController,
     private val gameWindowsManager: GameWindowsManager,
+    private val saveDataRepository: SaveDataRepository,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
@@ -36,7 +37,7 @@ class PauseGameKeyboardInputHandler @Inject constructor(
             return
         }
 
-        GameSaveLoader.save(mainConfig, dropController, mobsController, containerController, gameWorld)
+        saveDataRepository.save(mainConfig.gameFolder, dropController, mobController, containerController, gameWorld)
         mainConfig.caveGame.quitGame()
     }
 }
\ No newline at end of file
index d22cd947ee0b78616fc6bbcc5fad042f60fd0870..09287586e9ba363ba4efd8b2126bcfedfe535f83 100644 (file)
@@ -1,17 +1,17 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class SelectHotbarSlotKeyboardInputHandler @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
@@ -20,7 +20,7 @@ class SelectHotbarSlotKeyboardInputHandler @Inject constructor(
     }
 
     override fun handle(action: KeyboardInputAction) {
-        mobsController.player.inventory.activeSlot = (action.actionKey as KeyboardInputActionKey.SelectHotbarSlot).slot
+        mobController.player.inventory.activeSlot = (action.actionKey as KeyboardInputActionKey.SelectHotbarSlot).slot
     }
 
 }
\ No newline at end of file
index d8c5acc9fe323e98b66e616f3a858ffa4a7a504d..f98e2ec80522e8d29bc3d67de51e2fe25805bccd 100644 (file)
@@ -1,32 +1,30 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class StopSwimKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
-    private val gameWorld: GameWorld,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Up && !action.isKeyDown &&
-                mobsController.player.swim &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                mobController.player.swim &&
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
-        mobsController.player.swim = false
+        mobController.player.swim = false
     }
 
 }
\ No newline at end of file
index 20cc82ecaef5f48d5b01000c4d4dc7b732ad1c22..aa18a7e52c7764f8a319ef68727aebf4c002775f 100644 (file)
@@ -1,38 +1,38 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class SwimUpKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWorld: GameWorld,
 ) : IKeyboardInputHandler {
 
     private fun checkSwim(): Boolean {
-        return gameWorld.getForeMap(mobsController.player.mapX, mobsController.player.lowerMapY).isFluid()
+        return gameWorld.getForeMap(mobController.player.mapX, mobController.player.lowerMapY).isFluid()
     }
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return action.actionKey is KeyboardInputActionKey.Up && action.isKeyDown &&
-                !mobsController.player.swim &&
-                !mobsController.player.canJump() &&
-                checkSwim() && !mobsController.player.isFlyMode &&
-                (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
+                !mobController.player.swim &&
+                !mobController.player.canJump &&
+                checkSwim() && !mobController.player.isFlyMode &&
+                (mobController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
     override fun handle(action: KeyboardInputAction) {
-        mobsController.player.swim = true
+        mobController.player.swim = true
     }
 
 }
\ No newline at end of file
index f8e0177faddbc6239b91f1f564a5d9061ebba94b..3ce25517194550b58716f623738b23442ed3dbe1 100644 (file)
@@ -1,20 +1,20 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class ToggleControlsModeKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
@@ -23,10 +23,10 @@ class ToggleControlsModeKeyboardInputHandler @Inject constructor(
     }
 
     override fun handle(action: KeyboardInputAction) {
-        if (mobsController.player.controlMode == Player.ControlMode.WALK) {
-            mobsController.player.controlMode = Player.ControlMode.CURSOR
+        if (mobController.player.controlMode == Player.ControlMode.WALK) {
+            mobController.player.controlMode = Player.ControlMode.CURSOR
         } else {
-            mobsController.player.controlMode = Player.ControlMode.WALK
+            mobController.player.controlMode = Player.ControlMode.WALK
         }
     }
 
index 7cf08ed10656cf8c531bb63831146d3d0614c193..69cf4268ef3f04ec40e05cb88475e1b91bf12e7d 100644 (file)
@@ -1,11 +1,11 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
index 64a11165e5b882548d1b4e3077cb92d2cc73379f..c86884275e610f8bfdd73e0564978f357444385a 100644 (file)
@@ -1,17 +1,17 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class ToggleGameModeKeyboardInputHandler @Inject constructor(
-    private val mobsController: MobsController
+    private val mobController: MobController
 ) : IKeyboardInputHandler {
 
 
@@ -20,10 +20,10 @@ class ToggleGameModeKeyboardInputHandler @Inject constructor(
     }
 
     override fun handle(action: KeyboardInputAction) {
-        if (mobsController.player.gameMode == 1) {
-            mobsController.player.gameMode = 0
-        } else if (mobsController.player.gameMode == 0) {
-            mobsController.player.gameMode = 1
+        if (mobController.player.gameMode == 1) {
+            mobController.player.gameMode = 0
+        } else if (mobController.player.gameMode == 0) {
+            mobController.player.gameMode = 1
         }
     }
 
index 2cd6638c01bb6c9e29604e2c9a1f28449ba9a4a7..af03856ebfbc4fdea66ad409dc49333c03a4d359 100644 (file)
@@ -1,11 +1,11 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
index 43a7122970acf6c94dec1c149539c82e2209d273..f4fb7cc201ad53279523a078dec216aab9d45cee 100644 (file)
@@ -1,26 +1,26 @@
 package ru.deadsoftware.cavedroid.game.input.handler.keyboard
 
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindKeyboardInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindKeyboardInputHandler
 class TurnOnFlyModeKeyboardInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobsController: MobController,
 ) : IKeyboardInputHandler {
 
     override fun checkConditions(action: KeyboardInputAction): Boolean {
         return mobsController.player.gameMode == 1 && action.actionKey is KeyboardInputActionKey.Up &&
                 !mobsController.player.swim &&
-                !mobsController.player.isFlyMode && !mobsController.player.canJump() && action.isKeyDown &&
+                !mobsController.player.isFlyMode && !mobsController.player.canJump && action.isKeyDown &&
                 (mobsController.player.controlMode == Player.ControlMode.WALK || !mainConfig.isTouch)
     }
 
index 3b925b09b58f53bcb5b7de2865f3e37b4a87f3fb..120f2799259fd3ea67e2851259c357e320eb9a19 100644 (file)
@@ -1,20 +1,20 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
 import com.badlogic.gdx.graphics.g2d.TextureRegion
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 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.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.AbstractInventoryWindow
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.AbstractInventoryWindowWithCraftGrid
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem.Companion.isNoneOrNull
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 abstract class AbstractInventoryItemsMouseInputHandler(
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
     private val gameWindowsManager: GameWindowsManager,
     private val windowType: GameUiWindow,
 ) : IMouseInputHandler {
@@ -31,8 +31,7 @@ abstract class AbstractInventoryItemsMouseInputHandler(
     }
 
     protected fun updateCraftResult(window: AbstractInventoryWindowWithCraftGrid) {
-        window.craftResult = gameItemsHolder.craftItem(window.craftingItems.map(InventoryItem::item))
-            ?: gameItemsHolder.fallbackItem.toInventoryItem()
+        window.craftResult = itemsRepository.getCraftingResult(window.craftingItems.map(InventoryItem::item))
     }
 
     private fun reduceCraftItems(window: AbstractInventoryWindowWithCraftGrid) {
@@ -40,7 +39,7 @@ abstract class AbstractInventoryItemsMouseInputHandler(
             if (window.craftingItems[i].amount > 1) {
                 window.craftingItems[i].amount--
             } else {
-                window.craftingItems[i] = gameItemsHolder.fallbackItem.toInventoryItem()
+                window.craftingItems[i] = itemsRepository.fallbackItem.toInventoryItem()
             }
         }
     }
@@ -53,18 +52,18 @@ abstract class AbstractInventoryItemsMouseInputHandler(
     ) {
         if (action.actionKey is MouseInputActionKey.Screen) {
             if (!action.actionKey.touchUp) {
-                window.onLeftCLick(items, gameItemsHolder, index, action.actionKey.pointer)
+                window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
             } else {
                 if (action.actionKey.pointer == window.selectItemPointer) {
-                    window.onLeftCLick(items, gameItemsHolder, index, action.actionKey.pointer)
+                    window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
                 } else {
-                    window.onRightClick(items, gameItemsHolder, index)
+                    window.onRightClick(items, itemsRepository, index)
                 }
             }
         } else if (action.actionKey is MouseInputActionKey.Left) {
-            window.onLeftCLick(items, gameItemsHolder, index)
+            window.onLeftCLick(items, itemsRepository, index)
         } else {
-            window.onRightClick(items, gameItemsHolder, index)
+            window.onRightClick(items, itemsRepository, index)
         }
     }
 
@@ -83,14 +82,14 @@ abstract class AbstractInventoryItemsMouseInputHandler(
 
         if (!selectedItem.isNoneOrNull()) {
             selectedItem.amount += items[index].amount
-            items[index] = gameItemsHolder.fallbackItem.toInventoryItem()
+            items[index] = itemsRepository.fallbackItem.toInventoryItem()
         } else {
             if (action.actionKey is MouseInputActionKey.Screen) {
                 if (!action.actionKey.touchUp) {
-                    window.onLeftCLick(items, gameItemsHolder, index, action.actionKey.pointer)
+                    window.onLeftCLick(items, itemsRepository, index, action.actionKey.pointer)
                 }
             } else if (action.actionKey is MouseInputActionKey.Left) {
-                window.onLeftCLick(items, gameItemsHolder, index)
+                window.onLeftCLick(items, itemsRepository, index)
             }
         }
 
index dc242a89ec058d4959e61c48a2d93ad056f8f985..338eb816d2129dced0dd8d7fd259ac4a1b8fd08f 100644 (file)
@@ -1,23 +1,21 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
+import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class AttackMouseInputHandler @Inject constructor(
-    private val mobsController: MobsController,
-    private val gameWorld: GameWorld,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
 ) : IMouseInputHandler {
@@ -31,9 +29,9 @@ class AttackMouseInputHandler @Inject constructor(
 
     override fun handle(action: MouseInputAction) {
         if (action.actionKey.touchUp) {
-            mobsController.player.stopHitting()
+            mobController.player.stopHitting()
         } else {
-            mobsController.player.startHitting()
+            mobController.player.startHitting()
         };
     }
 }
\ No newline at end of file
index 2b1e934dd16d3901ce86e2b0879580ebda03e7aa..baaabb77017acf10d6a66cf076896b97699483c6 100644 (file)
@@ -2,24 +2,23 @@ package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
 import com.badlogic.gdx.graphics.g2d.TextureRegion
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 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.objects.drop.DropController
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class CloseGameWindowMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
     private val textureRegions: GetTextureRegionByNameUseCase,
 ) : IMouseInputHandler {
@@ -52,8 +51,8 @@ class CloseGameWindowMouseInputHandler @Inject constructor(
         val selectedItem = gameWindowsManager.currentWindow?.selectedItem
         if (selectedItem != null) {
                 dropController.addDrop(
-                    /* x = */ mobsController.player.x + (32f * mobsController.player.direction.basis),
-                    /* y = */ mobsController.player.y,
+                    /* x = */ mobController.player.x + (32f * mobController.player.direction.basis),
+                    /* y = */ mobController.player.y,
                     /* item = */ selectedItem.item,
                     /* count = */ selectedItem.amount,
                 )
index 2d0c229d995379467c189595a713331ef78db869..d309f6e2504617754f700182c6c042cb833c073f 100644 (file)
@@ -3,16 +3,16 @@ package ru.deadsoftware.cavedroid.game.input.handler.mouse
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
 import com.badlogic.gdx.math.MathUtils
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 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.misc.Assets
+import ru.deadsoftware.cavedroid.game.ui.windows.inventory.CreativeInventoryWindow
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 import javax.inject.Inject
 import kotlin.math.abs
 
@@ -21,7 +21,7 @@ import kotlin.math.abs
 class CreativeInventoryScrollMouseInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
     private val gameWindowsManager: GameWindowsManager,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
     private val textureRegions: GetTextureRegionByNameUseCase,
 ) : IMouseInputHandler {
 
@@ -54,7 +54,11 @@ class CreativeInventoryScrollMouseInputHandler @Inject constructor(
 
     private fun clampScrollAmount() {
         gameWindowsManager.creativeScrollAmount =
-            MathUtils.clamp(gameWindowsManager.creativeScrollAmount, 0, gameItemsHolder.getMaxCreativeScrollAmount())
+            MathUtils.clamp(
+                /* value = */ gameWindowsManager.creativeScrollAmount,
+                /* min = */ 0,
+                /* max = */ (gameWindowsManager.currentWindow as CreativeInventoryWindow).getMaxScroll(itemsRepository)
+            )
     }
 
     private fun handleStartOrEndDrag(action: MouseInputAction) {
index ea9941b79f5bb0dff487cf38caa7dae2cc278e42..04fd3a3346b1690c1bae98e174232dd74768518d 100644 (file)
@@ -2,39 +2,39 @@ package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
 import com.badlogic.gdx.math.MathUtils
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.model.block.Block
 import ru.deadsoftware.cavedroid.game.ui.TooltipManager
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
-import ru.fredboy.cavedroid.utils.bl
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.bl
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByIndexUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class CursorMouseInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWorld: GameWorld,
     private val gameWindowsManager: GameWindowsManager,
-    private val gameItemsHolder: GameItemsHolder,
     private val tooltipManager: TooltipManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
+    private val getItemByIndexUseCase: GetItemByIndexUseCase,
 ) : IMouseInputHandler {
 
-    private val player get() = mobsController.player
+    private val player get() = mobController.player
 
     private val creativeInventoryTexture get() = requireNotNull(textureRegions["creative"])
 
@@ -50,9 +50,9 @@ class CursorMouseInputHandler @Inject constructor(
         }
 
         if (player.cursorX.px + 8 < player.x + player.width / 2) {
-            player.setDir(Mob.Direction.LEFT)
+            player.direction = Direction.LEFT
         } else {
-            player.setDir(Mob.Direction.RIGHT)
+            player.direction = Direction.RIGHT
         }
     }
 
@@ -93,9 +93,9 @@ class CursorMouseInputHandler @Inject constructor(
         player.headRotation = getPlayerHeadRotation(worldX, worldY)
 
         if (worldX < player.x + player.width / 2) {
-            player.setDir(Mob.Direction.LEFT)
+            player.direction = Direction.LEFT
         } else {
-            player.setDir(Mob.Direction.RIGHT)
+            player.direction = Direction.RIGHT
         }
     }
 
@@ -115,7 +115,7 @@ class CursorMouseInputHandler @Inject constructor(
 
         val itemIndex = (gameWindowsManager.creativeScrollAmount * GameWindowsConfigs.Creative.itemsInRow +
                 (xOnGrid.toInt() + yOnGrid.toInt() * GameWindowsConfigs.Creative.itemsInRow))
-        val item = gameItemsHolder.getItemFromCreativeInventory(itemIndex)
+        val item = getItemByIndexUseCase[itemIndex]
 
         return item.params.name
     }
@@ -133,7 +133,7 @@ class CursorMouseInputHandler @Inject constructor(
             !mainConfig.isTouch -> handleMouse(action)
         }
 
-        player.checkCursorBounds(gameWorld)
+        gameWorld.checkPlayerCursorBounds()
 
         if (player.controlMode == Player.ControlMode.WALK && mainConfig.isTouch) {
             setPlayerDirectionToCursor()
@@ -148,8 +148,4 @@ class CursorMouseInputHandler @Inject constructor(
         }
     }
 
-    companion object {
-        private const val SURVIVAL_CURSOR_RANGE = 4
-    }
-
 }
\ No newline at end of file
index bc13aaf09bf32ba13638f4e85a31c5d2f658b31c..4efe697b7e700c8533d5ac924369897a1996317f 100644 (file)
@@ -2,7 +2,6 @@ package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
 import com.badlogic.gdx.utils.Timer
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
@@ -10,20 +9,20 @@ import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
 import ru.deadsoftware.cavedroid.game.input.handler.keyboard.DropItemKeyboardInputHandler.Companion.DROP_DISTANCE
 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.objects.drop.Drop
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.drop.model.Drop
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class HotbarMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
     private val textureRegions: GetTextureRegionByNameUseCase,
 ) : IMouseInputHandler {
@@ -47,7 +46,7 @@ class HotbarMouseInputHandler @Inject constructor(
 
     private fun createDrop(item: Item, playerX: Float, playerY: Float, amount: Int) {
         dropController.addDrop(
-            /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobsController.player.direction.basis),
+            /* x = */ playerX + ((DROP_DISTANCE - Drop.DROP_SIZE / 2) * mobController.player.direction.basis),
             /* y = */ playerY,
             /* item = */ item,
             /* count = */ amount
@@ -63,7 +62,7 @@ class HotbarMouseInputHandler @Inject constructor(
     private fun handleHold(action: MouseInputAction) {
 //        buttonHoldTask = null
 //        gameWindowsManager.openInventory()
-        val player = mobsController.player
+        val player = mobController.player
         val actionSlot = getActionSlot(action)
         val currentItem = player.inventory.items[actionSlot]
         val dropAmount = if (currentItem.item.isTool()) currentItem.amount else 1
@@ -83,18 +82,18 @@ class HotbarMouseInputHandler @Inject constructor(
     }
 
     private fun handleUp(action: MouseInputAction) {
-        mobsController.player.inventory.activeSlot = getActionSlot(action)
+        mobController.player.inventory.activeSlot = getActionSlot(action)
     }
 
     private fun handleScroll(action: MouseInputAction) {
         if (action.actionKey !is MouseInputActionKey.Scroll) {
             return
         }
-        mobsController.player.inventory.activeSlot += action.actionKey.amountY.toInt()
-        if (mobsController.player.inventory.activeSlot < 0) {
-            mobsController.player.inventory.activeSlot = Player.HOTBAR_SIZE - 1
-        } else if (mobsController.player.inventory.activeSlot >= Player.HOTBAR_SIZE) {
-            mobsController.player.inventory.activeSlot = 0
+        mobController.player.inventory.activeSlot += action.actionKey.amountY.toInt()
+        if (mobController.player.inventory.activeSlot < 0) {
+            mobController.player.inventory.activeSlot = Player.HOTBAR_SIZE - 1
+        } else if (mobController.player.inventory.activeSlot >= Player.HOTBAR_SIZE) {
+            mobController.player.inventory.activeSlot = 0
         }
     }
 
index d646a01beb768ca85956d1fe54b84b536d0c5935..d10898993297772a7cc385d6892f2f7a36dd4d3a 100644 (file)
@@ -1,26 +1,25 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.ChestInventoryWindow
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class SelectChestInventoryItemMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
-) : AbstractInventoryItemsMouseInputHandler(gameItemsHolder, gameWindowsManager, GameUiWindow.CHEST) {
+    itemsRepository: ItemsRepository,
+) : AbstractInventoryItemsMouseInputHandler(itemsRepository, gameWindowsManager, GameUiWindow.CHEST) {
 
     override val windowTexture get() = requireNotNull(textureRegions["chest"])
 
@@ -37,11 +36,11 @@ class SelectChestInventoryItemMouseInputHandler @Inject constructor(
         var itemIndex = xOnGrid + yOnGrid * GameWindowsConfigs.Chest.itemsInRow
         itemIndex += GameWindowsConfigs.Chest.hotbarCells
 
-        if (itemIndex >= mobsController.player.inventory.size) {
-            itemIndex -= mobsController.player.inventory.size
+        if (itemIndex >= mobController.player.inventory.size) {
+            itemIndex -= mobController.player.inventory.size
         }
 
-        handleInsidePlaceableCell(action, mobsController.player.inventory.items, window, itemIndex)
+        handleInsidePlaceableCell(action, mobController.player.inventory.items, window, itemIndex)
     }
 
     override fun handle(action: MouseInputAction) {
index aef073b0135d41f7a4247082bcfd9e585caf94e3..a67cd1b9b403d482ad04f52bed56c086057e7674 100644 (file)
@@ -1,26 +1,25 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.CraftingInventoryWindow
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class SelectCraftingInventoryItemMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
-) : AbstractInventoryItemsMouseInputHandler(gameItemsHolder, gameWindowsManager, GameUiWindow.CRAFTING_TABLE) {
+    itemsRepository: ItemsRepository,
+) : AbstractInventoryItemsMouseInputHandler(itemsRepository, gameWindowsManager, GameUiWindow.CRAFTING_TABLE) {
 
     override val windowTexture get() = requireNotNull(textureRegions["crafting_table"])
 
@@ -30,11 +29,11 @@ class SelectCraftingInventoryItemMouseInputHandler @Inject constructor(
         var itemIndex = xOnGrid + yOnGrid * GameWindowsConfigs.Crafting.itemsInRow
         itemIndex += GameWindowsConfigs.Crafting.hotbarCells
 
-        if (itemIndex >= mobsController.player.inventory.size) {
-            itemIndex -= mobsController.player.inventory.size
+        if (itemIndex >= mobController.player.inventory.size) {
+            itemIndex -= mobController.player.inventory.size
         }
 
-        handleInsidePlaceableCell(action, mobsController.player.inventory.items, window, itemIndex)
+        handleInsidePlaceableCell(action, mobController.player.inventory.items, window, itemIndex)
     }
 
     private fun handleInsideCraft(action: MouseInputAction, xOnCraft: Int, yOnCraft: Int) {
index 65a86b1c62ef839420109c79df79ffd2223128f0..3ec81013fce494a75890c7a3a6ba743f7a74dac4 100644 (file)
@@ -1,27 +1,26 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 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.ui.windows.GameWindowsConfigs
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
+import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.usecase.GetItemByIndexUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class SelectCreativeInventoryItemMouseInputHandler @Inject constructor(
-    private val gameItemsHolder: GameItemsHolder,
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
+    private val getItemByIndexUseCase: GetItemByIndexUseCase,
 ) : IMouseInputHandler {
 
     private val creativeInventoryTexture get() = requireNotNull(textureRegions["creative"])
@@ -49,8 +48,8 @@ class SelectCreativeInventoryItemMouseInputHandler @Inject constructor(
 
         val itemIndex = (gameWindowsManager.creativeScrollAmount * GameWindowsConfigs.Creative.itemsInRow +
                 (xOnGrid.toInt() + yOnGrid.toInt() * GameWindowsConfigs.Creative.itemsInRow))
-        val item = gameItemsHolder.getItemFromCreativeInventory(itemIndex)
-        mobsController.player.inventory.addItem(item)
+        val item = getItemByIndexUseCase[itemIndex]
+        mobController.player.inventory.addItem(item)
     }
 
 }
\ No newline at end of file
index 5cd846a6086325fe8815d14226ee927ed94324bd..25fe630521a7839e183ddeb11871857cbe20f3df 100644 (file)
@@ -1,28 +1,27 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
-import ru.deadsoftware.cavedroid.game.objects.container.Furnace
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.FurnaceInventoryWindow
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem.Companion.isNoneOrNull
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class SelectFurnaceInventoryItemMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
-) : AbstractInventoryItemsMouseInputHandler(gameItemsHolder, gameWindowsManager, GameUiWindow.FURNACE) {
+    itemsRepository: ItemsRepository
+) : AbstractInventoryItemsMouseInputHandler(itemsRepository, gameWindowsManager, GameUiWindow.FURNACE) {
 
     override val windowTexture get() = requireNotNull(textureRegions["furnace"])
 
@@ -32,11 +31,11 @@ class SelectFurnaceInventoryItemMouseInputHandler @Inject constructor(
         var itemIndex = xOnGrid + yOnGrid * GameWindowsConfigs.Furnace.itemsInRow
         itemIndex += GameWindowsConfigs.Furnace.hotbarCells
 
-        if (itemIndex >= mobsController.player.inventory.size) {
-            itemIndex -= mobsController.player.inventory.size
+        if (itemIndex >= mobController.player.inventory.size) {
+            itemIndex -= mobController.player.inventory.size
         }
 
-        handleInsidePlaceableCell(action, mobsController.player.inventory.items, window, itemIndex)
+        handleInsidePlaceableCell(action, mobController.player.inventory.items, window, itemIndex)
     }
 
     private fun handleInsideFuel(action: MouseInputAction) {
index ec0db60b5cc0a57853b7565866d7e2f729e7f333..9b76241b35423071c129a7d213acdc7707ff1c94 100644 (file)
@@ -1,26 +1,25 @@
 package ru.deadsoftware.cavedroid.game.input.handler.mouse
 
-import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 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 ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class SelectSurvivalInventoryItemMouseInputHandler @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
-) : AbstractInventoryItemsMouseInputHandler(gameItemsHolder, gameWindowsManager, GameUiWindow.SURVIVAL_INVENTORY) {
+    private val itemsRepository: ItemsRepository,
+) : AbstractInventoryItemsMouseInputHandler(itemsRepository, gameWindowsManager, GameUiWindow.SURVIVAL_INVENTORY) {
 
     override val windowTexture get() = requireNotNull(textureRegions["survival"])
 
@@ -30,11 +29,11 @@ class SelectSurvivalInventoryItemMouseInputHandler @Inject constructor(
         var itemIndex = xOnGrid + yOnGrid * GameWindowsConfigs.Survival.itemsInRow
         itemIndex += GameWindowsConfigs.Survival.hotbarCells
 
-        if (itemIndex >= mobsController.player.inventory.size) {
-            itemIndex -= mobsController.player.inventory.size
+        if (itemIndex >= mobController.player.inventory.size) {
+            itemIndex -= mobController.player.inventory.size
         }
 
-        handleInsidePlaceableCell(action, mobsController.player.inventory.items, window, itemIndex)
+        handleInsidePlaceableCell(action, mobController.player.inventory.items, window, itemIndex)
     }
 
     private fun handleInsideCraft(action: MouseInputAction, xOnCraft: Int, yOnCraft: Int) {
index 400eeae094164aca9894b936c66117e20cba0e4d..fd52882904a3187c5a731d12de7dea6ee7d3a8ae 100644 (file)
@@ -3,8 +3,6 @@ package ru.deadsoftware.cavedroid.game.input.handler.mouse
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.utils.Timer
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.actions.placeToBackgroundAction
 import ru.deadsoftware.cavedroid.game.actions.placeToForegroundAction
@@ -15,23 +13,23 @@ import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
 import ru.deadsoftware.cavedroid.game.input.isInsideHotbar
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.item.Item
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.model.item.Item
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class UseItemMouseInputHandler @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val useItemActionMap: Map<String, @JvmSuppressWildcards IUseItemAction>,
     private val placeBlockActionMap: Map<String, @JvmSuppressWildcards IPlaceBlockAction>,
     private val useBlockActionMap: Map<String, @JvmSuppressWildcards IUseBlockAction>,
     private val gameWindowsManager: GameWindowsManager,
     private val gameWorld: GameWorld,
-    private val gameItemsHolder: GameItemsHolder,
     private val textureRegions: GetTextureRegionByNameUseCase,
 ) : IMouseInputHandler {
 
@@ -52,7 +50,7 @@ class UseItemMouseInputHandler @Inject constructor(
     private fun handleHold(action: MouseInputAction) {
         cancelHold()
 
-        val player = mobsController.player
+        val player = mobController.player
         val item = player.inventory.activeItem.item
         player.startHitting(false)
         player.stopHitting()
@@ -78,21 +76,21 @@ class UseItemMouseInputHandler @Inject constructor(
     }
 
     private fun tryUseBlock() {
-        val block = gameWorld.getForeMap(mobsController.player.cursorX, mobsController.player.cursorY)
+        val block = gameWorld.getForeMap(mobController.player.cursorX, mobController.player.cursorY)
             .takeIf { !it.isNone() }
-            ?: gameWorld.getBackMap(mobsController.player.cursorX, mobsController.player.cursorY)
+            ?: gameWorld.getBackMap(mobController.player.cursorX, mobController.player.cursorY)
                 .takeIf { !it.isNone() }
             ?: return
 
         useBlockActionMap[block.params.key]?.perform(
             block = block,
-            x = mobsController.player.cursorX,
-            y = mobsController.player.cursorY
+            x = mobController.player.cursorX,
+            y = mobController.player.cursorY
         )
     }
 
     private fun handleUp(action: MouseInputAction) {
-        val player = mobsController.player
+        val player = mobController.player
         val item = player.inventory.activeItem.item
         cancelHold()
 
@@ -110,7 +108,7 @@ class UseItemMouseInputHandler @Inject constructor(
                 ?: Gdx.app.error(TAG, "use item action ${item.useActionKey} not found");
         } else if (item is Item.Food && player.health < player.maxHealth) {
             player.heal(item.heal)
-            player.decreaseCurrentItemCount(gameItemsHolder)
+            player.decreaseCurrentItemCount()
         } else {
             tryUseBlock()
         }
index 90cba3cd17cb89273d6d9b309eb890009cc81e2d..7cd22628bf818e25f7a00f3037bd2d4d091afdb5 100644 (file)
@@ -3,24 +3,24 @@ package ru.deadsoftware.cavedroid.game.input.handler.touch
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindMouseInputHandler
 import com.badlogic.gdx.utils.TimeUtils
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.*
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindMouseInputHandler
 class JoystickInputHandler @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
     private val gameWorld: GameWorld,
     private val textureRegions: GetTextureRegionByNameUseCase,
@@ -34,8 +34,8 @@ class JoystickInputHandler @Inject constructor(
             if (!value) {
                 resetVelocity()
                 if (TimeUtils.timeSinceMillis(activateTimeMs) < 200L &&
-                    mobsController.player.controlMode != Player.ControlMode.CURSOR) {
-                    mobsController.player.jump()
+                    mobController.player.controlMode != Player.ControlMode.CURSOR) {
+                    mobController.player.jump()
                 }
             } else {
                 activateTimeMs = TimeUtils.millis()
@@ -44,10 +44,10 @@ class JoystickInputHandler @Inject constructor(
         }
 
     private fun resetVelocity() {
-        mobsController.player.velocity.x = 0f
+        mobController.player.velocity.x = 0f
 
-        if (mobsController.player.isFlyMode) {
-            mobsController.player.velocity.y = 0f
+        if (mobController.player.isFlyMode) {
+            mobController.player.velocity.y = 0f
         }
     }
 
@@ -82,23 +82,23 @@ class JoystickInputHandler @Inject constructor(
             return
         }
 
-        val pastCursorX = mobsController.player.cursorX
-        val pastCursorY = mobsController.player.cursorY
+        val pastCursorX = mobController.player.cursorX
+        val pastCursorY = mobController.player.cursorY
 
         if (Math.abs(joystick.activeX - joystick.centerX) >= Joystick.RADIUS / 2) {
-            mobsController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
+            mobController.player.cursorX += if (joystick.activeX > joystick.centerX) 1 else -1
             cursorTimeoutMs = TimeUtils.millis()
         }
 
         if (Math.abs(joystick.activeY - joystick.centerY) >= Joystick.RADIUS / 2) {
-            mobsController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
+            mobController.player.cursorY += if (joystick.activeY > joystick.centerY) 1 else -1
             cursorTimeoutMs = TimeUtils.millis()
         }
 
-        mobsController.player.checkCursorBounds(gameWorld)
+        gameWorld.checkPlayerCursorBounds()
 
-        if (mobsController.player.cursorX != pastCursorX || mobsController.player.cursorY != pastCursorY) {
-            mobsController.player.blockDamage = 0f
+        if (mobController.player.cursorX != pastCursorX || mobController.player.cursorY != pastCursorY) {
+            mobController.player.blockDamage = 0f
         }
     }
 
@@ -107,7 +107,7 @@ class JoystickInputHandler @Inject constructor(
             return
         }
 
-        if (mobsController.player.controlMode == Player.ControlMode.CURSOR) {
+        if (mobController.player.controlMode == Player.ControlMode.CURSOR) {
             handleCursor()
             return
         }
@@ -115,22 +115,20 @@ class JoystickInputHandler @Inject constructor(
         val joystick = mainConfig.joystick ?: return
         val joyVector = joystick.getVelocityVector()
 
-        if (mobsController.player.isFlyMode) {
+        if (mobController.player.isFlyMode) {
             joyVector.scl(2f);
         }
 
-        mobsController.player.velocity.x = joyVector.x
+        mobController.player.velocity.x = joyVector.x
 
-        mobsController.player.setDir(
-            if (joyVector.x < 0) {
-                Mob.Direction.LEFT
-            } else {
-                Mob.Direction.RIGHT
-            }
-        )
+        mobController.player.direction = if (joyVector.x < 0) {
+            Direction.LEFT
+        } else {
+            Direction.RIGHT
+        }
 
-        if (mobsController.player.isFlyMode) {
-            mobsController.player.velocity.y = joyVector.y
+        if (mobController.player.isFlyMode) {
+            mobController.player.velocity.y = joyVector.y
         }
     }
 
index 8d18d070703931aeafdb4a41867d66e7c4b2cc35..9538d09347cf7a0f43f089af434a13348f4a5a2e 100644 (file)
@@ -1,9 +1,9 @@
 package ru.deadsoftware.cavedroid.game.input.mapper
 
 import com.badlogic.gdx.Input
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.action.KeyboardInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.KeyboardInputActionKey
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
index 5ef450a3b700502f4b3a0b16cd7e95251c3bc53d..57ca0337809d32d896ef460c707576f8d98eade5 100644 (file)
@@ -4,9 +4,9 @@ import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.Input
 import com.badlogic.gdx.math.Rectangle
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.input.action.MouseInputAction
 import ru.deadsoftware.cavedroid.game.input.action.keys.MouseInputActionKey
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/FallingBlock.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/FallingBlock.kt
deleted file mode 100644 (file)
index 288fb76..0000000
+++ /dev/null
@@ -1,96 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs
-
-import com.badlogic.gdx.graphics.g2d.SpriteBatch
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.world.GameWorld
-import ru.fredboy.cavedroid.utils.bl
-import ru.fredboy.cavedroid.utils.px
-
-class FallingBlock(
-    private val blockKey: String,
-    x: Float,
-    y: Float,
-) : Mob(x, y, 1.px, 1.px, Direction.RIGHT, Type.FALLING_BLOCK, Int.MAX_VALUE) {
-
-    private var _block: Block? = null
-
-    init {
-        velocity.y = 1f
-    }
-
-    override fun changeDir() = Unit
-
-    override fun getSpeed() = 0f
-
-    override fun jump() = Unit
-
-    override fun ai(
-        gameWorld: GameWorld,
-        gameItemsHolder: GameItemsHolder,
-        mobsController: MobsController,
-        delta: Float
-    ) {
-        if (_block == null) {
-            _block = gameItemsHolder.getBlock(blockKey)
-        }
-
-        if (velocity.isZero) {
-            gameWorld.setForeMap(x.bl, y.bl, _block)
-            kill()
-        }
-    }
-
-    override fun draw(
-        spriteBatch: SpriteBatch,
-        x: Float,
-        y: Float,
-        delta: Float
-    ) {
-        _block?.draw(spriteBatch, x, y)
-    }
-
-    override fun getSaveData(): SaveDataDto.FallingBlockSaveData {
-        return SaveDataDto.FallingBlockSaveData(
-            version = SAVE_DATA_VERSION,
-            x = x,
-            y = y,
-            width = width,
-            height = height,
-            velocityX = velocity.x,
-            velocityY = velocity.y,
-            type = mType,
-            animDelta = mAnimDelta,
-            anim = mAnim,
-            direction = mDirection,
-            dead = mDead,
-            canJump = mCanJump,
-            flyMode = mFlyMode,
-            maxHealth = mMaxHealth,
-            health = mHealth,
-            blockKey = blockKey,
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-
-        fun fromSaveData(saveData: SaveDataDto.FallingBlockSaveData): FallingBlock {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return FallingBlock(saveData.blockKey, saveData.x, saveData.y).apply {
-                velocity.x = saveData.velocityX
-                velocity.y = saveData.velocityY
-                mAnimDelta = saveData.animDelta
-                mAnim = saveData.anim
-                mDirection = saveData.direction
-                mDead = saveData.dead
-                mCanJump = saveData.canJump
-                mFlyMode = saveData.flyMode
-                mMaxHealth = saveData.maxHealth
-                mHealth = saveData.health
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobSaveDataMapper.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobSaveDataMapper.kt
deleted file mode 100644 (file)
index d7b7517..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs
-
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
-
-fun fromSaveData(
-    saveData: SaveDataDto.MobSaveDataDto,
-    getPigSprites: GetPigSpritesUseCase,
-): Mob {
-    return when (saveData) {
-        is SaveDataDto.PigSaveData -> Pig.fromSaveData(getPigSprites, saveData)
-        is SaveDataDto.FallingBlockSaveData -> FallingBlock.fromSaveData(saveData)
-
-        is SaveDataDto.PlayerSaveData -> throw IllegalArgumentException("Cannot load player as regular Mob")
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobsController.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/MobsController.kt
deleted file mode 100644 (file)
index d435469..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs
-
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.ui.TooltipManager
-import ru.deadsoftware.cavedroid.misc.Saveable
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPlayerSpritesUseCase
-import java.util.*
-import javax.inject.Inject
-
-@GameScope
-class MobsController @Inject constructor(
-    gameItemsHolder: GameItemsHolder,
-    tooltipManager: TooltipManager,
-    getPlayerSprites: GetPlayerSpritesUseCase,
-) : Saveable {
-
-    private val _mobs = LinkedList<Mob>()
-
-    var player: Player = Player(gameItemsHolder, tooltipManager, getPlayerSprites())
-        private set
-
-    val mobs: List<Mob>
-        get() = _mobs
-
-    fun addMob(mob: Mob) {
-        _mobs.add(mob)
-    }
-
-    override fun getSaveData(): SaveDataDto.MobsControllerSaveData {
-        return SaveDataDto.MobsControllerSaveData(
-            version = SAVE_DATA_VERSION,
-            mobs = _mobs.map(Mob::getSaveData),
-            player = player.getSaveData(),
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-
-        private const val TAG = "MobsController"
-
-        fun fromSaveData(
-            saveData: SaveDataDto.MobsControllerSaveData,
-            gameItemsHolder: GameItemsHolder,
-            tooltipManager: TooltipManager,
-            getPigSprites: GetPigSpritesUseCase,
-            getPlayerSprites: GetPlayerSpritesUseCase,
-        ): MobsController {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return MobsController(gameItemsHolder, tooltipManager, getPlayerSprites)
-                .apply {
-                    _mobs.addAll(saveData.mobs.map { mob -> Mob.fromSaveData(mob, getPigSprites) })
-                    player = Player.fromSaveData(saveData.player, gameItemsHolder, tooltipManager, getPlayerSprites)
-                }
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/PeacefulMob.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/PeacefulMob.kt
deleted file mode 100644 (file)
index b0e5bc6..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs
-
-import com.badlogic.gdx.math.MathUtils
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.world.GameWorld
-
-abstract class PeacefulMob(x: Float, y: Float, width: Float, height: Float, direction: Direction, maxHealth: Int, )
-    : Mob(x, y, width, height, direction, Type.MOB, maxHealth) {
-
-    override fun ai(world: GameWorld, gameItemsHolder: GameItemsHolder, mobsController: MobsController, delta: Float) {
-        if (MathUtils.randomBoolean(delta)) {
-            if (velocity.x != 0f) {
-                velocity.x = 0f
-            } else {
-                changeDir()
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/Pig.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/Pig.kt
deleted file mode 100644 (file)
index dde127d..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs
-
-import com.badlogic.gdx.graphics.Color
-import com.badlogic.gdx.graphics.g2d.SpriteBatch
-import com.badlogic.gdx.math.Vector2
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.misc.utils.colorFromHexString
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
-import ru.fredboy.cavedroid.domain.assets.model.MobSprite
-import ru.fredboy.cavedroid.domain.assets.usecase.GetPigSpritesUseCase
-
-class Pig(
-    private val sprite: MobSprite.Pig,
-    x: Float,
-    y: Float
-) : PeacefulMob(x, y, WIDTH, HEIGHT, randomDir(), MAX_HEALTH) {
-
-    override fun getSpeed(): Float {
-        return SPEED
-    }
-    
-    override fun changeDir() {
-        switchDir()
-        velocity = Vector2(direction.basis * speed, 0f)
-    }
-
-    override fun jump() {
-        velocity.y = JUMP_VELOCITY
-    }
-
-    override fun damage(damage: Int) {
-        super.damage(damage)
-
-        if (damage > 0) {
-            if (canJump()) {
-                jump()
-            }
-        }
-    }
-
-    override fun getDrop(gameItemsHolder: GameItemsHolder): List<InventoryItem> {
-        return listOf(gameItemsHolder.getItem("porkchop_raw").toInventoryItem())
-    }
-
-    override fun draw(
-        spriteBatch: SpriteBatch,
-        x: Float,
-        y: Float,
-        delta: Float
-    ) {
-        updateAnimation(delta)
-
-        val leftLegX = x + sprite.getLeftLegRelativeX(direction.index)
-        val rightLegX = x + sprite.getRightLegRelativeX(direction.index)
-        val legY = y + sprite.getLegsRelativeY()
-
-        sprite.leg.setOrigin(sprite.leg.width / 2, 0f)
-        sprite.leg.setFlip(looksRight(), sprite.leg.isFlipY)
-        sprite.headAndBody.setFlip(looksRight(), sprite.leg.isFlipY)
-
-        val backgroundTintColor = tintColor.cpy().sub(Color(0xAAAAAA shl 8))
-
-        spriteBatch.drawSprite(sprite.leg, leftLegX, legY, -anim, tint = backgroundTintColor)
-        spriteBatch.drawSprite(sprite.leg, rightLegX, legY, -anim, tint = backgroundTintColor)
-        spriteBatch.drawSprite(sprite.headAndBody, x, y, tint = tintColor)
-        spriteBatch.drawSprite(sprite.leg, leftLegX, legY, anim, tint = tintColor)
-        spriteBatch.drawSprite(sprite.leg, rightLegX, legY, anim, tint = tintColor)
-    }
-
-    override fun getSaveData(): SaveDataDto.PigSaveData {
-        return SaveDataDto.PigSaveData(
-            version = SAVE_DATA_VERSION,
-            x = x,
-            y = y,
-            width = width,
-            height = height,
-            velocityX = velocity.x,
-            velocityY = velocity.y,
-            type = mType,
-            animDelta = mAnimDelta,
-            anim = mAnim,
-            direction = mDirection,
-            dead = mDead,
-            canJump = mCanJump,
-            flyMode = mFlyMode,
-            maxHealth = mMaxHealth,
-            health = mHealth
-        )
-    }
-    
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-
-        private const val WIDTH = 25f
-        private const val HEIGHT = 18f
-        private const val SPEED =  48f
-        private const val JUMP_VELOCITY = -133.332f
-        private const val MAX_HEALTH = 10
-
-        fun fromSaveData(
-            getPigSprite: GetPigSpritesUseCase,
-            saveData: SaveDataDto.PigSaveData
-        ): Pig {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return Pig(getPigSprite(), saveData.x, saveData.y).apply {
-                velocity.x = saveData.velocityX
-                velocity.y = saveData.velocityY
-                mAnimDelta = saveData.animDelta
-                mAnim = saveData.anim
-                mDirection = saveData.direction
-                mDead = saveData.dead
-                mCanJump = saveData.canJump
-                mFlyMode = saveData.flyMode
-                mMaxHealth = saveData.maxHealth
-                mHealth = saveData.health
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/mobs/player/Inventory.kt
deleted file mode 100644 (file)
index 91e8be1..0000000
+++ /dev/null
@@ -1,179 +0,0 @@
-package ru.deadsoftware.cavedroid.game.mobs.player
-
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.objects.drop.Drop
-import ru.deadsoftware.cavedroid.game.ui.TooltipManager
-import ru.deadsoftware.cavedroid.misc.Saveable
-
-class Inventory @JvmOverloads constructor(
-    val size: Int,
-    val hotbarSize: Int,
-    gameItemsHolder: GameItemsHolder,
-    tooltipManager: TooltipManager,
-    initialItems: List<InventoryItem>? = null
-) : Saveable {
-
-    @Suppress("UNNECESSARY_LATEINIT")
-    private lateinit var tooltipManager: TooltipManager
-
-    @Suppress("UNNECESSARY_LATEINIT")
-    private lateinit var fallbackItem: InventoryItem
-
-    private val _items: Array<InventoryItem>
-
-    init {
-        fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
-        this.tooltipManager = tooltipManager
-
-        if (size < 0 || hotbarSize < 0 || hotbarSize > size) {
-            throw IllegalArgumentException("Invalid inventory sizes: hotbarSize=$hotbarSize; size=$size")
-        }
-
-        _items = Array(size) { index -> initialItems?.getOrNull(index) ?: InventoryItem(gameItemsHolder.fallbackItem) }
-    }
-
-    val items get() = _items.asList() as MutableList<InventoryItem>
-
-    val hotbarItems get() = items.subList(0, hotbarSize)
-
-    private var _activeSlot = 0
-
-    var activeSlot
-        get() = _activeSlot
-        set(value) {
-            if (value in 0 ..< hotbarSize) {
-                _activeSlot = value
-                showCurrentItemTooltip()
-            }
-        }
-
-    fun showCurrentItemTooltip() {
-        tooltipManager.showHotbarTooltip(activeItem.item.params.name)
-    }
-
-    val activeItem get() = _items[activeSlot]
-
-    fun initItems(gameItemsHolder: GameItemsHolder, tooltipManager: TooltipManager) {
-        this.tooltipManager = tooltipManager
-        fallbackItem = gameItemsHolder.fallbackItem.toInventoryItem()
-        _items.forEach { item ->
-            item.init(gameItemsHolder)
-        }
-    }
-
-    private fun getItemPickSlot(drop: Drop): Int {
-        val item = drop.item
-
-        for (i in _items.indices) {
-            val inventoryItem = _items[i]
-
-            if (item == inventoryItem.item && inventoryItem.canBeAdded()) {
-                return i
-            }
-        }
-
-        for (i in _items.indices) {
-            val inventoryItem = _items[i]
-
-            if (inventoryItem.item.isNone()) {
-                return i
-            }
-        }
-
-        return -1
-    }
-
-    fun canPickItem(drop: Drop): Boolean {
-        return getItemPickSlot(drop) >= 0
-    }
-
-    fun pickDrop(drop: Drop) {
-        val slot = getItemPickSlot(drop).takeIf { it >= 0 } ?: return
-        val inventoryItem = _items[slot]
-
-        if (inventoryItem.item == drop.item) {
-            if (inventoryItem.canBeAdded(drop.amount)) {
-                inventoryItem.add(drop.amount)
-                drop.pickedUp = true
-            } else {
-                val addCount = inventoryItem.item.params.maxStack - inventoryItem.amount
-                inventoryItem.add(addCount)
-                drop.subtract(addCount)
-                pickDrop(drop)
-            }
-        } else {
-            _items[slot] = drop.item.toInventoryItem(drop.amount)
-            if (slot == activeSlot) {
-                showCurrentItemTooltip()
-            }
-            drop.pickedUp = true
-        }
-    }
-
-    fun addItem(item: Item) {
-        _items.copyInto(
-            destination = _items,
-            destinationOffset = 1,
-            startIndex = 0,
-            endIndex = size - 1
-        )
-
-        _items[0] = item.toInventoryItem(item.params.maxStack)
-        showCurrentItemTooltip()
-    }
-
-    @JvmOverloads
-    fun decreaseItemAmount(slot: Int, count: Int = 1) {
-        val item = _items[slot]
-        item.subtract(count)
-        if (item.amount <= 0) {
-            _items[slot] = fallbackItem
-        }
-    }
-
-    @JvmOverloads
-    fun decreaseCurrentItemAmount(count: Int = 1) {
-        decreaseItemAmount(activeSlot, count)
-    }
-
-    fun clear() {
-        for (i in _items.indices) {
-            _items[i] = fallbackItem
-        }
-    }
-
-    override fun getSaveData(): SaveDataDto.InventorySaveData {
-        return SaveDataDto.InventorySaveData(
-            version = SAVE_DATA_VERSION,
-            size = size,
-            hotbarSize = hotbarSize,
-            activeSlot = _activeSlot,
-            items = items.map(InventoryItem::getSaveData)
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-
-        fun fromSaveData(
-            saveData: SaveDataDto.InventorySaveData,
-            gameItemsHolder: GameItemsHolder,
-            tooltipManager: TooltipManager,
-        ): Inventory {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return Inventory(
-                size = saveData.size,
-                hotbarSize = saveData.hotbarSize,
-                gameItemsHolder = gameItemsHolder,
-                tooltipManager = tooltipManager,
-                initialItems = saveData.items.map { item -> InventoryItem.fromSaveData(item, gameItemsHolder) }
-            ).apply {
-                _activeSlot = saveData.activeSlot
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/craft/CraftingRecipe.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/craft/CraftingRecipe.kt
deleted file mode 100644 (file)
index c8b2a86..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package ru.deadsoftware.cavedroid.game.model.craft
-
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.Item
-
-data class CraftingRecipe(
-    val input: List<Regex>,
-    val output: CraftingResult
-)
-
-data class CraftingResult(
-    val item: Item,
-    val amount: Int,
-) {
-    fun toInventoryItem() = InventoryItem(item, amount)
-}
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/mapper/ItemMapper.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/model/mapper/ItemMapper.kt
deleted file mode 100644 (file)
index db8a4a2..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-package ru.deadsoftware.cavedroid.game.model.mapper
-
-import com.badlogic.gdx.graphics.g2d.Sprite
-import dagger.Reusable
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.dto.ItemDto
-import ru.deadsoftware.cavedroid.game.model.item.CommonItemParams
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.game.model.item.Item.*
-import ru.deadsoftware.cavedroid.misc.Assets
-import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
-import ru.deadsoftware.cavedroid.misc.utils.SpriteOrigin
-import ru.deadsoftware.cavedroid.misc.utils.colorFromHexString
-import ru.fredboy.cavedroid.domain.assets.usecase.GetItemTextureUseCase
-import javax.inject.Inject
-
-@Reusable
-class ItemMapper @Inject constructor(
-    private val assetLoader: AssetLoader,
-    private val getItemTexture: GetItemTextureUseCase,
-) {
-
-    fun map(key: String, dto: ItemDto, block: Block?, slabTopBlock: Block.Slab?, slabBottomBlock: Block.Slab?): Item {
-        val params = mapCommonParams(key, dto)
-
-        return when (dto.type) {
-            "normal" -> Normal(params, requireNotNull(loadSprite(dto)))
-            "usable" -> Usable(params, requireNotNull(loadSprite(dto)), requireNotNull(dto.actionKey))
-            "shovel" -> Shovel(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
-            "sword" -> Sword(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
-            "pickaxe" -> Pickaxe(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
-            "axe" -> Axe(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
-            "shears" -> Shears(params, requireNotNull(loadSprite(dto)), dto.mobDamageMultiplier, dto.blockDamageMultiplier, requireNotNull(dto.toolLevel))
-            "block" -> Block(params, requireNotNull(block))
-            "slab" -> Slab(params, requireNotNull(slabTopBlock), requireNotNull(slabBottomBlock))
-            "food" -> Food(params, requireNotNull(loadSprite(dto)), requireNotNull(dto.heal))
-            "none" -> None(params)
-            else -> throw IllegalArgumentException("Unknown item type ${dto.type}")
-        }
-    }
-
-    private fun mapCommonParams(key: String, dto: ItemDto): CommonItemParams {
-        return CommonItemParams(
-            key = key,
-            name = dto.name,
-            inHandSpriteOrigin = SpriteOrigin(
-                x = dto.originX,
-                y = dto.origin_y,
-            ),
-            maxStack = dto.maxStack,
-            burningTimeMs = dto.burningTime,
-            smeltProductKey = dto.smeltProduct,
-        )
-    }
-
-    private fun loadSprite(dto: ItemDto): Sprite? {
-        if (dto.type == "none" || dto.type == "block" || dto.texture == GameItemsHolder.FALLBACK_ITEM_KEY) {
-            return null
-        }
-
-        val texture = getItemTexture[dto.texture]
-        return Sprite(texture)
-            .apply {
-                flip(false, true)
-                dto.tint?.let {
-                    color = colorFromHexString(it)
-                }
-            }
-    }
-
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Chest.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Chest.kt
deleted file mode 100644 (file)
index a9e893b..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-package ru.deadsoftware.cavedroid.game.objects.container
-
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.misc.Saveable
-
-class Chest @JvmOverloads constructor(
-    gameItemsHolder: GameItemsHolder,
-    initialItems: List<InventoryItem>? = null
-) : Container(SIZE, gameItemsHolder, initialItems), Saveable {
-
-    override fun update(gameItemsHolder: GameItemsHolder) {
-        // no-op
-    }
-
-    override fun getSaveData(): SaveDataDto.ChestSaveData {
-        return SaveDataDto.ChestSaveData(
-            version = SAVE_DATA_VERSION,
-            size = size,
-            items = items.map(InventoryItem::getSaveData)
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-        private const val SIZE = 27
-
-        fun fromSaveData(saveData: SaveDataDto.ChestSaveData, gameItemsHolder: GameItemsHolder): Chest {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return Chest(
-                gameItemsHolder = gameItemsHolder,
-                initialItems = saveData.items.map { item -> InventoryItem.fromSaveData(item, gameItemsHolder) }
-            )
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Container.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/Container.kt
deleted file mode 100644 (file)
index 3938ef7..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package ru.deadsoftware.cavedroid.game.objects.container
-
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.misc.Saveable
-
-abstract class Container @JvmOverloads constructor(
-    val size: Int,
-    gameItemsHolder: GameItemsHolder,
-    initialItems: List<InventoryItem>? = null,
-) : Saveable {
-
-    private val _items = Array(size) { index ->
-        initialItems?.getOrNull(index) ?: gameItemsHolder.fallbackItem.toInventoryItem()
-    }
-
-    val items get() = _items.asList() as MutableList<InventoryItem>
-
-    open fun initItems(gameItemsHolder: GameItemsHolder) {
-        _items.forEach { it.init(gameItemsHolder) }
-    }
-
-    abstract fun update(gameItemsHolder: GameItemsHolder)
-
-    abstract override fun getSaveData(): SaveDataDto.ContainerSaveDataDto
-
-    companion object {
-        fun fromSaveData(saveData: SaveDataDto.ContainerSaveDataDto, gameItemsHolder: GameItemsHolder): Container {
-            return when (saveData) {
-                is SaveDataDto.FurnaceSaveData -> Furnace.fromSaveData(saveData, gameItemsHolder)
-                is SaveDataDto.ChestSaveData -> Chest.fromSaveData(saveData, gameItemsHolder)
-
-                is SaveDataDto.InventorySaveData -> {
-                    throw IllegalArgumentException("Cannot load Container from InventorySaveData")
-                }
-            }
-        }
-    }
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/ContainerController.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/container/ContainerController.kt
deleted file mode 100644 (file)
index 4b0d896..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-package ru.deadsoftware.cavedroid.game.objects.container
-
-import com.badlogic.gdx.Gdx
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.misc.Saveable
-import ru.fredboy.cavedroid.utils.px
-import javax.inject.Inject
-
-@GameScope
-class ContainerController @Inject constructor(
-    _dropController: DropController,
-    _gameItemsHolder: GameItemsHolder
-) : Saveable {
-
-    @Suppress("UNNECESSARY_LATEINIT")
-    private lateinit var dropController: DropController
-
-    @Suppress("UNNECESSARY_LATEINIT")
-    private lateinit var gameItemsHolder: GameItemsHolder
-
-    private val containerMap = mutableMapOf<String, Container>()
-
-    val size get() = containerMap.size
-
-    init {
-        dropController = _dropController
-        gameItemsHolder = _gameItemsHolder
-    }
-
-    fun init(dropController: DropController, gameItemsHolder: GameItemsHolder) {
-        this.dropController = dropController
-        this.gameItemsHolder = gameItemsHolder
-        containerMap.forEach { (_, container) -> container.initItems(gameItemsHolder) }
-    }
-
-    fun getContainer(x: Int, y: Int, z: Int): Container? {
-        return containerMap["$x;$y;$z"]
-    }
-
-    fun addContainer(x: Int, y: Int, z: Int, clazz: Class<out Block.Container>) {
-        val container = when (clazz) {
-            Block.Furnace::class.java -> Furnace(gameItemsHolder)
-            Block.Chest::class.java -> Chest(gameItemsHolder)
-            else -> {
-                Gdx.app.error(TAG, "Unknown container class $clazz")
-                return
-            }
-        }
-        containerMap["$x;$y;$z"] = container
-    }
-
-    @JvmOverloads
-    fun destroyContainer(x: Int, y: Int, z: Int, dropItems: Boolean = true) {
-        val container = containerMap.remove("$x;$y;$z") ?: return
-
-        if (!dropItems) {
-            return
-        }
-
-        val xPx = (x + .5f).px
-        val yPx = (y + .5f).px
-
-        container.items.forEach { item ->
-            if (!item.isNoneOrNull()) {
-                dropController.addDrop(xPx, yPx, item)
-            }
-        }
-    }
-
-    fun update() {
-        containerMap.forEach { (_, container) ->
-            container.update(gameItemsHolder)
-        }
-    }
-
-    override fun getSaveData(): SaveDataDto.ContainerControllerSaveData {
-        return SaveDataDto.ContainerControllerSaveData(
-            version = SAVE_DATA_VERSION,
-            containerMap = containerMap.mapValues { (_, container) -> container.getSaveData() },
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-        private const val TAG = "ContainerController"
-
-        fun fromSaveData(
-            saveData: SaveDataDto.ContainerControllerSaveData,
-            dropController: DropController,
-            gameItemsHolder: GameItemsHolder
-        ): ContainerController {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return ContainerController(
-                dropController,
-                gameItemsHolder
-            ).apply {
-                containerMap.putAll(
-                    saveData.containerMap.mapValues { (_, containerSaveData) ->
-                        Container.fromSaveData(containerSaveData, gameItemsHolder)
-                    }
-                )
-            }
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/drop/Drop.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/game/objects/drop/Drop.kt
deleted file mode 100644 (file)
index 2b4f740..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-package ru.deadsoftware.cavedroid.game.objects.drop
-
-import com.badlogic.gdx.math.Intersector
-import com.badlogic.gdx.math.Rectangle
-import com.badlogic.gdx.math.Vector2
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.misc.Saveable
-
-class Drop @JvmOverloads constructor(
-    x: Float,
-    y: Float,
-    _item: Item,
-    _amount: Int = 1,
-) : Rectangle(x, y, DROP_SIZE, DROP_SIZE), Saveable {
-
-    var amount: Int = _amount
-        private set
-
-    val itemKey = _item.params.key
-    val velocity = getInitialVelocity()
-    var pickedUp = false
-
-    @Suppress("UNNECESSARY_LATEINIT")
-    lateinit var item: Item
-        private set
-
-    init {
-        item = _item
-    }
-
-    fun initItem(gameItemsHolder: GameItemsHolder) {
-        if (this::item.isInitialized) {
-            return
-        }
-
-        item = gameItemsHolder.getItem(itemKey)
-    }
-
-    fun canMagnetTo(rectangle: Rectangle): Boolean {
-        val magnetArea = getMagnetArea()
-        return Intersector.overlaps(magnetArea, rectangle)
-    }
-
-    @JvmOverloads
-    fun subtract(count: Int = 1) {
-        if (count < 0) {
-            throw IllegalArgumentException("Can't subtract negative amount")
-        }
-
-        amount -= count
-    }
-
-    private fun getMagnetArea(): Rectangle {
-        return Rectangle(
-            /* x = */ x - MAGNET_DISTANCE,
-            /* y = */ y - MAGNET_DISTANCE,
-            /* width = */ width + MAGNET_DISTANCE * 2,
-            /* height = */ height + MAGNET_DISTANCE * 2,
-        )
-    }
-
-    override fun getSaveData(): SaveDataDto.DropSaveData {
-        return SaveDataDto.DropSaveData(
-            version = SAVE_DATA_VERSION,
-            x = x,
-            y = y,
-            width = width,
-            height = height,
-            velocityX = velocity.x,
-            velocityY = velocity.y,
-            itemKey = itemKey,
-            amount = amount,
-            pickedUp = pickedUp
-        )
-    }
-
-    companion object {
-        private const val SAVE_DATA_VERSION = 1
-
-        private const val MAGNET_DISTANCE = 8f
-
-        const val MAGNET_VELOCITY = 256f
-        const val DROP_SIZE = 8f
-
-        private fun getInitialVelocity(): Vector2 = Vector2(0f, -1f)
-
-        fun fromSaveData(saveData: SaveDataDto.DropSaveData, gameItemsHolder: GameItemsHolder): Drop {
-            saveData.verifyVersion(SAVE_DATA_VERSION)
-
-            return Drop(
-                x = saveData.x,
-                y = saveData.y,
-                _item = gameItemsHolder.getItem(saveData.itemKey),
-                _amount = saveData.amount,
-            ).apply {
-                velocity.x = saveData.velocityX
-                velocity.y = saveData.velocityY
-                pickedUp = saveData.pickedUp
-            }
-        }
-    }
-}
index 55e879d54e3d9e8d68edb83c557c2dae49e25e65..16f9ada952c69a5a3533e1ad107c204f36faaabc 100644 (file)
@@ -5,23 +5,23 @@ import com.badlogic.gdx.graphics.GL20
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.forEachBlockInArea
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageFrameCountUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageSpriteUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindRenderer
 class BackgroundBlocksRenderer @Inject constructor(
     gameWorld: GameWorld,
-    mobsController: MobsController,
+    mobController: MobController,
     getBlockDamageFrameCount: GetBlockDamageFrameCountUseCase,
     getBlockDamageSprite: GetBlockDamageSpriteUseCase
-) : BlocksRenderer(gameWorld, mobsController, getBlockDamageFrameCount, getBlockDamageSprite) {
+) : BlocksRenderer(gameWorld, mobController, getBlockDamageFrameCount, getBlockDamageSprite) {
 
     override val renderLayer get() = RENDER_LAYER
 
index 410f5f5b3aa6a8a51f43a24c97b3f3b89323e666..a16019682db8307e8e13e6060571538f9f941cef 100644 (file)
@@ -5,17 +5,16 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.MathUtils
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.world.GameWorld
-import ru.deadsoftware.cavedroid.misc.Assets
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageFrameCountUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageSpriteUseCase
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 
 abstract class BlocksRenderer(
     protected val gameWorld: GameWorld,
-    protected val mobsController: MobsController,
+    protected val mobsController: MobController,
     protected val getBlockDamageFrameCount: GetBlockDamageFrameCountUseCase,
     protected val getBlockDamageSprite: GetBlockDamageSpriteUseCase,
 ) : IGameRenderer {
index df8c9e1739d59accc85eb21336088384301f3c91..06825c384b377c6d3e3d43fafa96333d664f336c 100644 (file)
@@ -5,17 +5,17 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.debug.DebugInfoStringsProvider
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.drawString
-import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
-import ru.fredboy.cavedroid.utils.bl
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.bl
+import ru.fredboy.cavedroid.common.utils.drawString
+import ru.fredboy.cavedroid.common.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
@@ -23,7 +23,7 @@ import javax.inject.Inject
 class DebugRenderer @Inject constructor(
     private val mainConfig: MainConfig,
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val debugInfoStringsProvider: DebugInfoStringsProvider,
     private val getFont: GetFontUseCase,
 ) : IGameRenderer {
@@ -54,8 +54,8 @@ class DebugRenderer @Inject constructor(
         minimapSize: Float
     ) {
         val mapArea = Rectangle(
-            /* x = */ mobsController.player.x - (minimapSize.px / 2),
-            /* y = */ mobsController.player.y - (minimapSize.px / 2),
+            /* x = */ mobController.player.x - (minimapSize.px / 2),
+            /* y = */ mobController.player.y - (minimapSize.px / 2),
             /* width = */ minimapSize.px,
             /* height = */ minimapSize.px
         )
@@ -67,7 +67,7 @@ class DebugRenderer @Inject constructor(
 
         forEachBlockInArea(mapArea) { x, y ->
             getMinimapColor(x, y)?.let { color ->
-                shapeRenderer.setColor(color)
+                shapeRenderer.color = color
                 shapeRenderer.rect(
                     /* x = */ minimapX + (x - mapArea.x.bl),
                     /* y = */ minimapY + (y - mapArea.y.bl),
index 2dd59dc43f3fa8ca9ebd1b87fb323205d9833883..7e034e3af2f8c3562a406380eb74dd3b32cdeec6 100644 (file)
@@ -3,13 +3,13 @@ package ru.deadsoftware.cavedroid.game.render
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.cycledInsideWorld
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.cycledInsideWorld
+import ru.fredboy.cavedroid.common.utils.drawSprite
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
index 81091d2fe665db4c30c55d49fd42e69cd10f4fc0..9d4cd0ce682ca5bc84300b83c094dde896f3223c 100644 (file)
@@ -3,23 +3,23 @@ package ru.deadsoftware.cavedroid.game.render
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.forEachBlockInArea
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageFrameCountUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetBlockDamageSpriteUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindRenderer
 class ForegroundBlocksRenderer @Inject constructor(
     gameWorld: GameWorld,
-    mobsController: MobsController,
+    mobController: MobController,
     getBlockDamageFrameCount: GetBlockDamageFrameCountUseCase,
     getBlockDamageSprite: GetBlockDamageSpriteUseCase
-) : BlocksRenderer(gameWorld, mobsController, getBlockDamageFrameCount, getBlockDamageSprite) {
+) : BlocksRenderer(gameWorld, mobController, getBlockDamageFrameCount, getBlockDamageSprite) {
 
     override val renderLayer get() = RENDER_LAYER
 
index 096ba4bb8c4cb02168f89364ad1fabcb26d1da4a..07b16fc1b9579a45ed932b3503c579890d1f6194 100644 (file)
@@ -3,26 +3,25 @@ package ru.deadsoftware.cavedroid.game.render
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player
-import ru.deadsoftware.cavedroid.game.mobs.player.Player.ControlMode
 import ru.deadsoftware.cavedroid.game.ui.TooltipManager
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.drawString
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.drawString
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindRenderer
 class HudRenderer @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val tooltipManager: TooltipManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
@@ -40,19 +39,19 @@ class HudRenderer @Inject constructor(
     private val halfHeartTexture get() = requireNotNull(textureRegions[HALF_HEART_KEY])
 
     private fun drawCursor(spriteBatch: SpriteBatch, viewport: Rectangle) {
-        val cursorX = mobsController.player.cursorX
-        val cursorY = mobsController.player.cursorY
+        val cursorX = mobController.player.cursorX
+        val cursorY = mobController.player.cursorY
 
         if (gameWorld.hasForeAt(cursorX, cursorY) ||
             gameWorld.hasBackAt(cursorX, cursorY) ||
-            mobsController.player.controlMode == ControlMode.CURSOR
+            mobController.player.controlMode == Player.ControlMode.CURSOR
         ) {
             spriteBatch.draw(cursorTexture, cursorX.px - viewport.x, cursorY.px - viewport.y)
         }
     }
 
     private fun drawHealth(spriteBatch: SpriteBatch, x: Float, y: Float) {
-        val player = mobsController.player
+        val player = mobController.player
 
         if (player.gameMode == 1) {
             return
@@ -81,7 +80,7 @@ class HudRenderer @Inject constructor(
     }
 
     private fun drawHotbarItems(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer,  hotbarX: Float) {
-        mobsController.player.inventory.items.asSequence().take(HotbarConfig.hotbarCells)
+        mobController.player.inventory.items.asSequence().take(HotbarConfig.hotbarCells)
             .forEachIndexed { index, item ->
                 if (item.item.isNone()) {
                     return@forEachIndexed
@@ -94,8 +93,8 @@ class HudRenderer @Inject constructor(
                     x = hotbarX + HotbarConfig.horizontalMargin +
                             index * (HotbarConfig.itemSeparatorWidth + HotbarConfig.itemSlotSpace),
                     y = HotbarConfig.verticalMargin,
-                    getStringWidth = getStringWidth,
-                    getStringHeight = getStringHeight,
+                    getStringWidth = getStringWidth::invoke,
+                    getStringHeight = getStringHeight::invoke,
                 )
             }
     }
@@ -104,7 +103,7 @@ class HudRenderer @Inject constructor(
         spriteBatch.draw(
             /* region = */ hotbarSelectorTexture,
             /* x = */ hotbarX - HotbarSelectorConfig.horizontalPadding
-                    + mobsController.player.inventory.activeSlot * (HotbarConfig.itemSeparatorWidth + HotbarConfig.itemSlotSpace),
+                    + mobController.player.inventory.activeSlot * (HotbarConfig.itemSeparatorWidth + HotbarConfig.itemSlotSpace),
             /* y = */ -HotbarSelectorConfig.verticalPadding
         )
     }
index b1f188cea0dc89f549faade2b70b8e269f2fa579..3a8a6bea1f4cc980dc476c6b4f1f0c4921d6a5c3 100644 (file)
@@ -3,19 +3,19 @@ package ru.deadsoftware.cavedroid.game.render
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.world.GameWorld
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.cycledInsideWorld
-import ru.fredboy.cavedroid.utils.px
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.cycledInsideWorld
+import ru.fredboy.cavedroid.common.utils.px
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Mob
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 @BindRenderer
 class MobsRenderer @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWorld: GameWorld,
 ) : IGameRenderer {
 
@@ -28,7 +28,7 @@ class MobsRenderer @Inject constructor(
     }
 
     override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
-        val player = mobsController.player
+        val player = mobController.player
         player.draw(
             /* spriteBatch = */ spriteBatch,
             /* x = */ player.x - viewport.x - player.width / 2,
@@ -36,7 +36,7 @@ class MobsRenderer @Inject constructor(
             /* delta = */ delta
         )
 
-        mobsController.mobs.forEach { mob ->
+        mobController.mobs.forEach { mob ->
             drawMob(spriteBatch, viewport, mob, delta)
         }
     }
index aaa513c53d1cd71badf9915754f6ed5ba180e4fd..42b6528abedbdcc28b4260f17163fd60c2474784 100644 (file)
@@ -5,26 +5,23 @@ import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.input.Joystick
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.mobs.player.Player.ControlMode
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
-import ru.deadsoftware.cavedroid.misc.Assets
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
-import ru.deadsoftware.cavedroid.misc.utils.ArrayMapExtensions.component1
-import ru.deadsoftware.cavedroid.misc.utils.ArrayMapExtensions.component2
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.drawSprite
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTouchButtonsUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Player
 import javax.inject.Inject
 
 @GameScope
 @BindRenderer
 class TouchControlsRenderer @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getTouchButtons: GetTouchButtonsUseCase,
@@ -76,7 +73,7 @@ class TouchControlsRenderer @Inject constructor(
         }
 
         // FIXME: Add pressed state for buttons
-        if (mobsController.player.controlMode == ControlMode.CURSOR) {
+        if (mobController.player.controlMode == Player.ControlMode.CURSOR) {
             val altKeyRect = touchControlsMap["alt"]?.rectangle ?: return
             spriteBatch.draw(shadeTexture, altKeyRect.x, altKeyRect.y, altKeyRect.width, altKeyRect.height)
         }
index 945bb1ec458991b9e4487636895f53914c77d376..4372aa898af6c86f7849231db5c9d7f8cf0a0475 100644 (file)
@@ -4,11 +4,11 @@ import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
 import ru.deadsoftware.cavedroid.game.render.windows.*
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.misc.annotations.multibinding.BindRenderer
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
index da96fb48d2f0d35b828db7a46b2255682811f07c..9552f44c644590e40bf2f9f63c036094405e3c4f 100644 (file)
@@ -4,11 +4,11 @@ import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.graphics.g2d.BitmapFont
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.Item
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
+import ru.fredboy.cavedroid.common.utils.drawSprite
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.Item
 
 abstract class AbstractWindowRenderer {
 
@@ -45,8 +45,15 @@ abstract class AbstractWindowRenderer {
             val itemX = gridX + (index % itemsInRow) * cellWidth
             val itemY = gridY + (index / itemsInRow) * cellHeight
 
-            inventoryItem?.draw(spriteBatch, shapeRenderer, font, itemX, itemY, getStringWidth, getStringHeight)
-                ?: item?.let { spriteBatch.drawSprite(it.sprite, itemX, itemY) }
+            inventoryItem?.draw(
+                spriteBatch = spriteBatch,
+                shapeRenderer = shapeRenderer,
+                font = font,
+                x = itemX,
+                y = itemY,
+                getStringWidth = getStringWidth::invoke,
+                getStringHeight = getStringHeight::invoke
+            ) ?: item?.let { spriteBatch.drawSprite(it.sprite, itemX, itemY) }
         }
     }
 
index 0b2698a79c13d8ca707d09374efe16aa54242029..31a4a3652b63d87e203ad6a68595e7165f659e8c 100644 (file)
@@ -3,30 +3,23 @@ package ru.deadsoftware.cavedroid.game.render.windows
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
-import com.badlogic.gdx.math.MathUtils
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.ChestInventoryWindow
-import ru.deadsoftware.cavedroid.game.ui.windows.inventory.SurvivalInventoryWindow
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
-import kotlin.math.atan
 
 @GameScope
 class ChestWindowRenderer @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
@@ -68,7 +61,7 @@ class ChestWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Chest.itemsGridMarginLeft,
             gridY = windowY + GameWindowsConfigs.Chest.itemsGridMarginTop,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .drop(GameWindowsConfigs.Chest.hotbarCells)
                 .take(GameWindowsConfigs.Chest.itemsInCol * GameWindowsConfigs.Chest.itemsInRow)
                 .asIterable(),
@@ -85,7 +78,7 @@ class ChestWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Chest.itemsGridMarginLeft,
             gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Chest.hotbarOffsetFromBottom,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .take(GameWindowsConfigs.Chest.hotbarCells)
                 .asIterable(),
             itemsInRow = GameWindowsConfigs.Chest.hotbarCells,
@@ -100,8 +93,8 @@ class ChestWindowRenderer @Inject constructor(
             font = getFont(),
             x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
             y = Gdx.input.y * (viewport.height / Gdx.graphics.height),
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
     }
 
index 7542e06bfa2d926b882e344eb46ed2fbb7e6a2ae..7af40ab8c067d637836e89d3f7cadb4e92e10d6b 100644 (file)
@@ -4,27 +4,25 @@ import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.CraftingInventoryWindow
-import ru.deadsoftware.cavedroid.misc.Assets
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 class CraftingWindowRenderer @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
     private val getStringHeight: GetStringHeightUseCase,
@@ -50,7 +48,7 @@ class CraftingWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Crafting.itemsGridMarginLeft,
             gridY = windowY + GameWindowsConfigs.Crafting.itemsGridMarginTop,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .drop(GameWindowsConfigs.Crafting.hotbarCells)
                 .take(GameWindowsConfigs.Crafting.itemsInCol * GameWindowsConfigs.Crafting.itemsInRow)
                 .asIterable(),
@@ -67,7 +65,7 @@ class CraftingWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Crafting.itemsGridMarginLeft,
             gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Crafting.hotbarOffsetFromBottom,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .take(GameWindowsConfigs.Crafting.hotbarCells)
                 .asIterable(),
             itemsInRow = GameWindowsConfigs.Crafting.hotbarCells,
@@ -83,7 +81,7 @@ class CraftingWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Crafting.craftOffsetX,
             gridY = windowY + GameWindowsConfigs.Crafting.craftOffsetY,
-            items = window.craftingItems.asSequence().map {  it ?: gameItemsHolder.fallbackItem.toInventoryItem()}.asIterable(),
+            items = window.craftingItems,
             itemsInRow = GameWindowsConfigs.Crafting.craftGridSize,
             cellWidth = GameWindowsConfigs.Crafting.itemsGridColWidth,
             cellHeight = GameWindowsConfigs.Crafting.itemsGridRowHeight,
@@ -91,14 +89,14 @@ class CraftingWindowRenderer @Inject constructor(
             getStringHeight = getStringHeight
         )
 
-        window.craftResult?.draw(
+        window.craftResult.draw(
             spriteBatch = spriteBatch,
             shapeRenderer = shapeRenderer,
             font = getFont(),
             x = windowX + GameWindowsConfigs.Crafting.craftResultOffsetX,
             y = windowY + GameWindowsConfigs.Crafting.craftResultOffsetY,
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
 
         window.selectedItem?.drawSelected(
@@ -106,8 +104,8 @@ class CraftingWindowRenderer @Inject constructor(
             font = getFont(),
             x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
             y = Gdx.input.y * (viewport.height / Gdx.graphics.height),
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
     }
 
index 5b9e88108ffdd6f187602f08ec3bc7e323f4754f..e7841efd0aa72d8f3a425cef7fc332ca8300e5fd 100644 (file)
@@ -3,25 +3,26 @@ package ru.deadsoftware.cavedroid.game.render.windows
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
+import ru.deadsoftware.cavedroid.game.ui.windows.inventory.CreativeInventoryWindow
+import ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 import kotlin.math.min
 
 @GameScope
 class CreativeWindowRenderer @Inject constructor(
     private val gameWindowsManager: GameWindowsManager,
-    private val gameItemsHolder: GameItemsHolder,
-    private val mobsController: MobsController,
+    private val itemsRepository: ItemsRepository,
+    private val mobController: MobController,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
     private val getStringHeight: GetStringHeightUseCase,
@@ -39,7 +40,8 @@ class CreativeWindowRenderer @Inject constructor(
 
         val windowX = viewport.width / 2 - creativeWindow.regionWidth / 2
         val windowY = viewport.height / 2 - creativeWindow.regionHeight / 2
-        val oneScrollAmount = GameWindowsConfigs.Creative.scrollIndicatorFullHeight / gameItemsHolder.getMaxCreativeScrollAmount()
+        val oneScrollAmount = GameWindowsConfigs.Creative.scrollIndicatorFullHeight /
+                (gameWindowsManager.currentWindow as CreativeInventoryWindow).getMaxScroll(itemsRepository)
 
         spriteBatch.draw(creativeWindow, windowX, windowY)
         spriteBatch.draw(
@@ -49,7 +51,7 @@ class CreativeWindowRenderer @Inject constructor(
                     + (gameWindowsManager.creativeScrollAmount * oneScrollAmount)
         )
 
-        val allItems = gameItemsHolder.getAllItems()
+        val allItems = itemsRepository.getAllItems()
         val startIndex = gameWindowsManager.creativeScrollAmount * GameWindowsConfigs.Creative.itemsInRow
         val endIndex = min(startIndex + GameWindowsConfigs.Creative.itemsOnPage, allItems.size)
         val items = sequence {
@@ -78,7 +80,7 @@ class CreativeWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Creative.itemsGridMarginLeft,
             gridY = windowY + creativeWindow.regionHeight - GameWindowsConfigs.Creative.playerInventoryOffsetFromBottom,
-            items = mobsController.player.inventory.items.asSequence().take(GameWindowsConfigs.Creative.invItems).asIterable(),
+            items = mobController.player.inventory.items.asSequence().take(GameWindowsConfigs.Creative.invItems).asIterable(),
             itemsInRow = GameWindowsConfigs.Creative.invItems,
             cellWidth = GameWindowsConfigs.Creative.itemsGridColWidth,
             cellHeight = GameWindowsConfigs.Creative.itemsGridRowHeight,
index ff676dd7cb47c02982d0353944a749e1bb9963b2..c279d1f97a6c15660b0c3a2a5213448149c75248 100644 (file)
@@ -5,26 +5,24 @@ import com.badlogic.gdx.graphics.g2d.Sprite
 import com.badlogic.gdx.graphics.g2d.SpriteBatch
 import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.Rectangle
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
 import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.FurnaceInventoryWindow
-import ru.deadsoftware.cavedroid.misc.utils.drawSprite
-import ru.deadsoftware.cavedroid.misc.utils.withScissors
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.drawSprite
+import ru.fredboy.cavedroid.common.utils.withScissors
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 class FurnaceWindowRenderer @Inject constructor(
-    private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
@@ -54,7 +52,7 @@ class FurnaceWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Furnace.itemsGridMarginLeft,
             gridY = windowY + GameWindowsConfigs.Furnace.itemsGridMarginTop,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .drop(GameWindowsConfigs.Furnace.hotbarCells)
                 .take(GameWindowsConfigs.Furnace.itemsInCol * GameWindowsConfigs.Furnace.itemsInRow)
                 .asIterable(),
@@ -71,7 +69,7 @@ class FurnaceWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Furnace.itemsGridMarginLeft,
             gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Furnace.hotbarOffsetFromBottom,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .take(GameWindowsConfigs.Furnace.hotbarCells)
                 .asIterable(),
             itemsInRow = GameWindowsConfigs.Furnace.hotbarCells,
@@ -81,45 +79,46 @@ class FurnaceWindowRenderer @Inject constructor(
             getStringHeight = getStringHeight
         )
 
-        window.furnace.fuel?.draw(
+        window.furnace.fuel.draw(
             spriteBatch = spriteBatch,
             shapeRenderer = shapeRenderer,
             font = getFont(),
             x = windowX + GameWindowsConfigs.Furnace.smeltFuelMarginLeft,
             y = windowY + GameWindowsConfigs.Furnace.smeltFuelMarginTop,
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
 
-        window.furnace.input?.draw(
+        window.furnace.input.draw(
             spriteBatch = spriteBatch,
             shapeRenderer = shapeRenderer,
             font = getFont(),
             x = windowX + GameWindowsConfigs.Furnace.smeltInputMarginLeft,
             y = windowY + GameWindowsConfigs.Furnace.smeltInputMarginTop,
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
 
-        window.furnace.result?.draw(
+        window.furnace.result.draw(
             spriteBatch = spriteBatch,
             shapeRenderer = shapeRenderer,
             font = getFont(),
             x = windowX + GameWindowsConfigs.Furnace.smeltResultOffsetX,
             y = windowY + GameWindowsConfigs.Furnace.smeltResultOffsetY,
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
 
         if (window.furnace.isActive) {
             val burn = GameWindowsConfigs.Furnace.fuelBurnHeight * window.furnace.burnProgress
 
             spriteBatch.withScissors(
-                mainConfig = mainConfig,
                 x = windowX + GameWindowsConfigs.Furnace.fuelBurnMarginLeft,
                 y = windowY + GameWindowsConfigs.Furnace.fuelBurnMarginTop + burn,
                 width = furnaceBurn.width,
                 height = GameWindowsConfigs.Furnace.fuelBurnHeight,
+                viewportWidth = viewport.width,
+                viewportHeight = viewport.height,
             ) {
                 spriteBatch.drawSprite(
                     sprite = furnaceBurn,
@@ -132,11 +131,12 @@ class FurnaceWindowRenderer @Inject constructor(
                 val progress = GameWindowsConfigs.Furnace.progressWidth * window.furnace.smeltProgress
 
                 spriteBatch.withScissors(
-                    mainConfig = mainConfig,
                     x = windowX + GameWindowsConfigs.Furnace.progressMarginLeft,
                     y = windowY + GameWindowsConfigs.Furnace.progressMarginTop,
                     width = progress,
-                    height = furnaceProgress.height
+                    height = furnaceProgress.height,
+                    viewportWidth = viewport.width,
+                    viewportHeight = viewport.height,
                 ) {
                     spriteBatch.drawSprite(
                         sprite = furnaceProgress,
@@ -152,8 +152,8 @@ class FurnaceWindowRenderer @Inject constructor(
             font = getFont(),
             x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
             y = Gdx.input.y * (viewport.height / Gdx.graphics.height),
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
     }
 
index 4f8e947d914b8120b4afa26d7167aebf3f0ba196..1084a7c478635620fc0ce1af36a66e5f7f17200b 100644 (file)
@@ -6,29 +6,28 @@ import com.badlogic.gdx.graphics.glutils.ShapeRenderer
 import com.badlogic.gdx.math.MathUtils
 import com.badlogic.gdx.math.Rectangle
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.Mob
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
 import ru.deadsoftware.cavedroid.game.render.WindowsRenderer
 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 ru.fredboy.cavedroid.common.di.GameScope
 import ru.fredboy.cavedroid.domain.assets.usecase.GetFontUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringHeightUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetStringWidthUseCase
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.controller.mob.model.Direction
 import javax.inject.Inject
 import kotlin.math.atan
 
 @GameScope
 class SurvivalWindowRenderer @Inject constructor(
     private val mainConfig: MainConfig,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWindowsManager: GameWindowsManager,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
     private val textureRegions: GetTextureRegionByNameUseCase,
     private val getStringWidth: GetStringWidthUseCase,
     private val getStringHeight: GetStringHeightUseCase,
@@ -50,24 +49,23 @@ class SurvivalWindowRenderer @Inject constructor(
         val h = mouseX.toDouble() - portraitX.toDouble()
         val v = mouseY.toDouble() - portraitY.toDouble()
 
-        mobsController.player.setDir(
-            if (mouseX < portraitX + mobsController.player.width / 2)
-                Mob.Direction.LEFT
-            else
-                Mob.Direction.RIGHT
-        )
+        mobController.player.direction = if (mouseX < portraitX + mobController.player.width / 2) {
+            Direction.LEFT
+        } else {
+            Direction.RIGHT
+        }
 
-        mobsController.player.headRotation = atan(v / h).toFloat() * MathUtils.radDeg
+        mobController.player.headRotation = atan(v / h).toFloat() * MathUtils.radDeg
     }
 
     private fun drawPlayerPortrait(spriteBatch: SpriteBatch, windowX: Float, windowY: Float, delta: Float) {
         val portraitX = windowX + GameWindowsConfigs.Survival.portraitMarginLeft +
-                (GameWindowsConfigs.Survival.portraitWidth / 2 - mobsController.player.width / 2)
+                (GameWindowsConfigs.Survival.portraitWidth / 2 - mobController.player.width / 2)
         val portraitY = windowY + GameWindowsConfigs.Survival.portraitMarginTop +
-                (GameWindowsConfigs.Survival.portraitHeight / 2 - mobsController.player.height / 2)
+                (GameWindowsConfigs.Survival.portraitHeight / 2 - mobController.player.height / 2)
 
         setPortraitHeadRotation(portraitX, portraitY)
-        mobsController.player.draw(spriteBatch, portraitX, portraitY, delta)
+        mobController.player.draw(spriteBatch, portraitX, portraitY, delta)
     }
 
     override fun draw(spriteBatch: SpriteBatch, shapeRenderer: ShapeRenderer, viewport: Rectangle, delta: Float) {
@@ -87,7 +85,7 @@ class SurvivalWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
             gridY = windowY + GameWindowsConfigs.Survival.itemsGridMarginTop,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .drop(GameWindowsConfigs.Survival.hotbarCells)
                 .take(GameWindowsConfigs.Survival.itemsInCol * GameWindowsConfigs.Survival.itemsInRow)
                 .asIterable(),
@@ -104,7 +102,7 @@ class SurvivalWindowRenderer @Inject constructor(
             font = getFont(),
             gridX = windowX + GameWindowsConfigs.Survival.itemsGridMarginLeft,
             gridY = windowY + windowTexture.regionHeight - GameWindowsConfigs.Survival.hotbarOffsetFromBottom,
-            items = mobsController.player.inventory.items.asSequence()
+            items = mobController.player.inventory.items.asSequence()
                 .take(GameWindowsConfigs.Survival.hotbarCells)
                 .asIterable(),
             itemsInRow = GameWindowsConfigs.Survival.hotbarCells,
@@ -124,7 +122,7 @@ class SurvivalWindowRenderer @Inject constructor(
                 if (index % 3 > 1 || index / 3 > 1) {
                     null
                 } else {
-                    it ?: gameItemsHolder.fallbackItem.toInventoryItem()
+                    it
                 }
             }.asIterable(),
             itemsInRow = GameWindowsConfigs.Survival.craftGridSize,
@@ -134,14 +132,14 @@ class SurvivalWindowRenderer @Inject constructor(
             getStringHeight = getStringHeight
         )
 
-        window.craftResult?.draw(
+        window.craftResult.draw(
             spriteBatch = spriteBatch,
             shapeRenderer = shapeRenderer,
             font = getFont(),
             x = windowX + GameWindowsConfigs.Survival.craftResultOffsetX,
             y = windowY + GameWindowsConfigs.Survival.craftResultOffsetY,
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
 
         window.selectedItem?.drawSelected(
@@ -149,8 +147,8 @@ class SurvivalWindowRenderer @Inject constructor(
             font = getFont(),
             x = Gdx.input.x * (viewport.width / Gdx.graphics.width),
             y = Gdx.input.y * (viewport.height / Gdx.graphics.height),
-            getStringWidth = getStringWidth,
-            getStringHeight = getStringHeight,
+            getStringWidth = getStringWidth::invoke,
+            getStringHeight = getStringHeight::invoke,
         )
     }
 
index a8f5a9bf4276a63532f2cc4ffd9aba352b6e8738..1388c08371b4674c0f0d389a46184c371a7721e7 100644 (file)
@@ -1,14 +1,11 @@
 package ru.deadsoftware.cavedroid.game.ui
 
 import com.badlogic.gdx.utils.Timer
-import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
+import ru.fredboy.cavedroid.common.di.GameScope
 import javax.inject.Inject
 
 @GameScope
-class TooltipManager @Inject constructor(
-    private val mainConfig: MainConfig
-) {
+class TooltipManager @Inject constructor() {
 
     private val resetTask = object : Timer.Task() {
         override fun run() {
index 8d32f94e098322301c342a0308e9c7b43208f1a9..cb46460913ec90fb65f70a276d11df6c7bb1699f 100644 (file)
@@ -1,22 +1,22 @@
 package ru.deadsoftware.cavedroid.game.ui.windows
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.objects.container.Chest
-import ru.deadsoftware.cavedroid.game.objects.drop.DropController
-import ru.deadsoftware.cavedroid.game.objects.container.Furnace
 import ru.deadsoftware.cavedroid.game.ui.TooltipManager
 import ru.deadsoftware.cavedroid.game.ui.windows.inventory.*
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
+import ru.fredboy.cavedroid.game.controller.drop.DropController
+import ru.fredboy.cavedroid.game.controller.mob.MobController
 import javax.inject.Inject
 
 @GameScope
 class GameWindowsManager @Inject constructor(
     private val tooltipManager: TooltipManager,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val dropController: DropController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
 ) {
 
     var creativeScrollAmount = 0
@@ -30,10 +30,10 @@ class GameWindowsManager @Inject constructor(
     }
 
     fun openInventory() {
-        if (mobsController.player.gameMode == 1) {
+        if (mobController.player.gameMode == 1) {
             currentWindow = CreativeInventoryWindow()
         } else {
-            currentWindow = SurvivalInventoryWindow(gameItemsHolder)
+            currentWindow = SurvivalInventoryWindow(itemsRepository)
         }
     }
 
@@ -46,13 +46,13 @@ class GameWindowsManager @Inject constructor(
     }
 
     fun openCrafting() {
-        currentWindow = CraftingInventoryWindow(gameItemsHolder)
+        currentWindow = CraftingInventoryWindow(itemsRepository)
     }
 
     fun closeWindow() {
         (currentWindow as? AbstractInventoryWindowWithCraftGrid)?.let { window ->
             window.craftingItems.forEach { item ->
-                dropController.addDrop(mobsController.player.x, mobsController.player.y, item)
+                dropController.addDrop(mobController.player.x, mobController.player.y, item)
             }
         }
 
index ed15baca1d5d49baa0d1daf5942dffb3b3c21443..6ceff75a933d623515b9a07ab835f1eb1da6811f 100644 (file)
@@ -1,10 +1,10 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
 import com.badlogic.gdx.math.MathUtils
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem.Companion.isNoneOrNull
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem.Companion.isNoneOrNull
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 abstract class AbstractInventoryWindow {
 
@@ -16,7 +16,7 @@ abstract class AbstractInventoryWindow {
 
     fun onLeftCLick(
         items: MutableList<InventoryItem>,
-        gameItemsHolder: GameItemsHolder,
+        itemsRepository: ItemsRepository,
         index: Int,
         pointer: Int = -1
     ) {
@@ -42,12 +42,12 @@ abstract class AbstractInventoryWindow {
         }
 
         val item = items[index]
-        items[index] = selectedItem ?: gameItemsHolder.fallbackItem.toInventoryItem()
+        items[index] = selectedItem ?: itemsRepository.fallbackItem.toInventoryItem()
         selectedItem = item
         selectItemPointer = pointer
     }
 
-    fun onRightClick(items: MutableList<InventoryItem>, gameItemsHolder: GameItemsHolder, index: Int) {
+    fun onRightClick(items: MutableList<InventoryItem>, itemsRepository: ItemsRepository, index: Int) {
         val clickedItem = items[index]
         val selectedItem = selectedItem
 
@@ -56,7 +56,7 @@ abstract class AbstractInventoryWindow {
             this.selectedItem = half
             clickedItem.subtract(half.amount)
             if (clickedItem.amount == 0) {
-                items[index] = gameItemsHolder.fallbackItem.toInventoryItem()
+                items[index] = itemsRepository.fallbackItem.toInventoryItem()
             }
             return
         }
index 066ca37a0317fe09de127a2bdc7c0e9dc9a65865..12908f138c19276a7d74acdab04b405174fc68c8 100644 (file)
@@ -1,13 +1,13 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 abstract class AbstractInventoryWindowWithCraftGrid(
-    gameItemsHolder: GameItemsHolder,
+    itemsRepository: ItemsRepository,
 ) : AbstractInventoryWindow() {
 
-    private val _items = Array(10) { gameItemsHolder.fallbackItem.toInventoryItem() }
+    private val _items = Array(10) { itemsRepository.fallbackItem.toInventoryItem() }
 
     val items get() = _items.asList()
 
index 6f4a4feb78134850a44a6cd21f9181e998272f54..7900c7e6b5d5201058b0554791808de47723050d 100644 (file)
@@ -1,8 +1,8 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.objects.container.Chest
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.game.controller.container.model.Chest
 
 class ChestInventoryWindow(val chest: Chest) : AbstractInventoryWindow() {
 
index cd7c0ffcf62e3961b339e232e506ce5f61d63715..0ccc011f02020e24107a8f58e58bc61a0ad5c37b 100644 (file)
@@ -1,12 +1,12 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 class CraftingInventoryWindow(
-    gameItemsHolder: GameItemsHolder
-) : AbstractInventoryWindowWithCraftGrid(gameItemsHolder) {
+    itemsRepository: ItemsRepository
+) : AbstractInventoryWindowWithCraftGrid(itemsRepository) {
 
     override val type = GameUiWindow.CRAFTING_TABLE
 
index a38fd2970d9c3b9c99e330047ec267f43fe049aa..88b67cdba9f33fba2c9e453c5e95eca5e2e6130c 100644 (file)
@@ -1,11 +1,17 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
+import ru.deadsoftware.cavedroid.game.ui.windows.GameWindowsConfigs
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 class CreativeInventoryWindow() : AbstractInventoryWindow() {
 
     override val type = GameUiWindow.CREATIVE_INVENTORY
 
     override var selectedItem: InventoryItem? = null
+
+    fun getMaxScroll(itemsRepository: ItemsRepository): Int {
+        return itemsRepository.getAllItems().size / GameWindowsConfigs.Creative.itemsInRow
+    }
 }
\ No newline at end of file
index 42f7038f4313f4caea875042c925b44d0cdc93e9..38851ba620e50eb05d5c829014074b9758cf26ae 100644 (file)
@@ -1,8 +1,8 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
-import ru.deadsoftware.cavedroid.game.objects.container.Furnace
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.game.controller.container.model.Furnace
 
 class FurnaceInventoryWindow(
     val furnace: Furnace,
index ce250fc9e3a16600bb7c782aa6f4147d3f803840..4c778346c0c8a85b034d6ba033ca878e99f8eec8 100644 (file)
@@ -1,12 +1,12 @@
 package ru.deadsoftware.cavedroid.game.ui.windows.inventory
 
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
 import ru.deadsoftware.cavedroid.game.GameUiWindow
-import ru.deadsoftware.cavedroid.game.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.model.item.InventoryItem
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
 
 class SurvivalInventoryWindow(
-    gameItemsHolder: GameItemsHolder
-) : AbstractInventoryWindowWithCraftGrid(gameItemsHolder) {
+    itemsRepository: ItemsRepository
+) : AbstractInventoryWindowWithCraftGrid(itemsRepository) {
 
     override val type = GameUiWindow.SURVIVAL_INVENTORY
 
index e92b9e2ffb6f6278a01a2fe9d4d82c63454368a4..f829871cffb3faf1afda85bf4d15327fcddf10ec 100644 (file)
@@ -1,23 +1,24 @@
 package ru.deadsoftware.cavedroid.game.world
 
 import com.badlogic.gdx.utils.Timer.Task
-import ru.deadsoftware.cavedroid.game.GameScope
 import ru.deadsoftware.cavedroid.game.actions.getRequiresBlockAction
 import ru.deadsoftware.cavedroid.game.actions.updateblock.IUpdateBlockAction
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 
 @GameScope
 class GameWorldBlocksLogicControllerTask @Inject constructor(
     private val gameWorld: GameWorld,
     private val updateBlockActions: Map<String, @JvmSuppressWildcards IUpdateBlockAction>,
-    private val mobsController: MobsController,
+    private val mobController: MobController,
 ) : Task() {
 
     private var currentRelativeChunk = 0
 
     private fun getChunkStart(): Int {
-        val playerX = mobsController.player.mapX
+        val playerX = mobController.player.mapX
         val playerChunk = playerX / CHUNK_WIDTH
         val currentChunk = playerChunk - CHUNKS / 2 + currentRelativeChunk
 
index 211543db102dbb3158d97f62b8aa9c0e1bf8078b..7efcd3ec163b04cb5ba2bc374eb2e192f1fb8f06 100644 (file)
@@ -1,11 +1,12 @@
 package ru.deadsoftware.cavedroid.game.world
 
 import com.badlogic.gdx.utils.Timer
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.game.model.block.Block
-import ru.fredboy.cavedroid.utils.bl
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.bl
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import java.util.PriorityQueue
 import javax.inject.Inject
 import kotlin.math.min
@@ -14,8 +15,8 @@ import kotlin.reflect.KClass
 @GameScope
 class GameWorldFluidsLogicControllerTask @Inject constructor(
     private val gameWorld: GameWorld,
-    private val mobsController: MobsController,
-    private val gameItemsHolder: GameItemsHolder,
+    private val mobController: MobController,
+    private val itemsRepository: ItemsRepository,
 ) : Timer.Task() {
 
     private var updateTick: Short = 0;
@@ -27,9 +28,9 @@ class GameWorldFluidsLogicControllerTask @Inject constructor(
     }
 
     init {
-        val waters = gameItemsHolder.getBlocksByType(Block.Water::class.java)
+        val waters = itemsRepository.getBlocksByType(Block.Water::class.java)
             .sortedBy(Block.Water::state)
-        val lavas = gameItemsHolder.getBlocksByType(Block.Lava::class.java)
+        val lavas = itemsRepository.getBlocksByType(Block.Lava::class.java)
             .sortedBy(Block.Lava::state)
 
         fluidStatesMap[Block.Water::class] = waters
@@ -101,13 +102,13 @@ class GameWorldFluidsLogicControllerTask @Inject constructor(
             fluidCanFlowThere(currentFluid, targetBlock) -> UpdateCommand(nextStateFluid, x, y)
 
             currentFluid.isWater() && targetBlock is Block.Lava && targetBlock.state > 0 ->
-                UpdateCommand(100) { gameWorld.setForeMap(x, y, gameItemsHolder.getBlock("cobblestone")) }
+                UpdateCommand(100) { gameWorld.setForeMap(x, y, itemsRepository.getBlockByKey("cobblestone")) }
 
             currentFluid.isWater() && targetBlock.isLava() ->
-                UpdateCommand(100) { gameWorld.setForeMap(x, y, gameItemsHolder.getBlock("obsidian")) }
+                UpdateCommand(100) { gameWorld.setForeMap(x, y, itemsRepository.getBlockByKey("obsidian")) }
 
             currentFluid.isLava() && targetBlock.isWater() ->
-                UpdateCommand(200) { gameWorld.setForeMap(x, y, gameItemsHolder.getBlock("stone")) }
+                UpdateCommand(200) { gameWorld.setForeMap(x, y, itemsRepository.getBlockByKey("stone")) }
 
             else -> null
         }
@@ -143,7 +144,7 @@ class GameWorldFluidsLogicControllerTask @Inject constructor(
     }
 
     private fun fluidUpdater() {
-        val midScreen = mobsController.player.x.bl
+        val midScreen = mobController.player.x.bl
 
         for (y in gameWorld.height - 1 downTo 0) {
             for (x in 0 ..< min(gameWorld.width / 2, 32)) {
index f016c678a484b35e530058a1e2bc7a5107ea9596..86c4514e0187d3c15cbe81eea6c15f55db75534b 100644 (file)
@@ -1,24 +1,25 @@
 package ru.deadsoftware.cavedroid.game.world
 
 import com.badlogic.gdx.utils.Timer
-import ru.deadsoftware.cavedroid.game.GameItemsHolder
-import ru.deadsoftware.cavedroid.game.GameScope
-import ru.deadsoftware.cavedroid.game.mobs.MobsController
-import ru.deadsoftware.cavedroid.misc.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.common.di.GameScope
+import ru.fredboy.cavedroid.common.utils.forEachBlockInArea
+import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.game.controller.mob.MobController
+import ru.fredboy.cavedroid.game.world.GameWorld
 import javax.inject.Inject
 import kotlin.math.max
 
 @GameScope
 class GameWorldMobDamageControllerTask @Inject constructor(
-    private val mobsController: MobsController,
+    private val mobController: MobController,
     private val gameWorld: GameWorld,
-    private val gameItemsHolder: GameItemsHolder,
+    private val itemsRepository: ItemsRepository,
 ) : Timer.Task() {
 
     override fun run() {
         sequence {
-            yield(mobsController.player)
-            yieldAll(mobsController.mobs)
+            yield(mobController.player)
+            yieldAll(mobController.mobs)
         }.forEach { mob ->
             forEachBlockInArea(mob) { x, y ->
                 val foregroundBlock = gameWorld.getForeMap(x, y)
index 99e1022ae0c9d44184136623a6b58788893db41b..6a759ab8afc61d1b67dfb928640b73750869a5c1 100644 (file)
@@ -6,6 +6,7 @@ import ru.deadsoftware.cavedroid.menu.MenuScope
 import ru.deadsoftware.cavedroid.menu.objects.ButtonRenderer
 import ru.deadsoftware.cavedroid.misc.utils.AssetLoader
 import ru.fredboy.cavedroid.domain.assets.usecase.GetTextureRegionByNameUseCase
+import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository
 import javax.inject.Inject
 
 @MenuScope
@@ -13,6 +14,7 @@ class MenusFactory @Inject constructor(
     private val mainConfig: MainConfig,
     private val assetLoader: AssetLoader,
     private val getTextureRegionByName: GetTextureRegionByNameUseCase,
+    private val saveDataRepository: SaveDataRepository,
 ) {
 
     fun getMainMenu(
@@ -21,7 +23,16 @@ class MenusFactory @Inject constructor(
         buttonRenderer: ButtonRenderer,
         menuInput: MenuProc.Input,
     ): MenuMain {
-        return MenuMain(width, height, buttonRenderer, mainConfig, menuInput, assetLoader, getTextureRegionByName)
+        return MenuMain(
+            width,
+            height,
+            buttonRenderer,
+            mainConfig,
+            menuInput,
+            assetLoader,
+            getTextureRegionByName,
+            saveDataRepository
+        ).apply { init() }
     }
 
     fun getMenuNewGame(
@@ -30,7 +41,15 @@ class MenusFactory @Inject constructor(
         buttonRenderer: ButtonRenderer,
         menuInput: MenuProc.Input,
     ): MenuNewGame {
-        return MenuNewGame(width, height, buttonRenderer, mainConfig, menuInput, assetLoader, getTextureRegionByName)
+        return MenuNewGame(
+            width,
+            height,
+            buttonRenderer,
+            mainConfig,
+            menuInput,
+            assetLoader,
+            getTextureRegionByName
+        ).apply { init() }
     }
 
     fun getMenuOptions(
@@ -39,7 +58,15 @@ class MenusFactory @Inject constructor(
         buttonRenderer: ButtonRenderer,
         menuInput: MenuProc.Input,
     ): MenuOptions {
-        return MenuOptions(width, height, buttonRenderer, mainConfig, menuInput, assetLoader, getTextureRegionByName)
+        return MenuOptions(
+            width,
+            height,
+            buttonRenderer,
+            mainConfig,
+            menuInput,
+            assetLoader,
+            getTextureRegionByName
+        ).apply { init() }
     }
 
 }
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/Saveable.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/Saveable.kt
deleted file mode 100644 (file)
index d350f1f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package ru.deadsoftware.cavedroid.misc
-
-import ru.deadsoftware.cavedroid.game.model.dto.SaveDataDto
-
-interface Saveable {
-    fun getSaveData(): SaveDataDto
-}
index 558dc96a14c6f8a4e0d8ab36375b94af635f5c9b..e2c9e2725b7221f42a89b22323c21a6d7dc6ec8c 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.input.IKeyboardInputHandler
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoSet
 
 @BindsIntoSet(
index af9b608ea05c656f26b349cc57a446f0436cbf18..8263fe588cab7b3f8b53bb1f673054ad230cc14f 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.input.IMouseInputHandler
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoSet
 
 @BindsIntoSet(
index 89f2dd0bd44c45955b22209d6f84919b9435e298..9535dac0b8d95403bf3c9c569f069fd00ecd102b 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.actions.placeblock.IPlaceBlockAction
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
 
 @BindsIntoMapStringKey(
index c1d96a91033c05ae0989a79d4b52cf6906b8cb13..1632b41f524843b503ea651c5d4693411e8847c6 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.render.IGameRenderer
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoSet
 
 @BindsIntoSet(
index 310d69eef74de04b5b7d6246acda46ad90917733..9c0c8bb6889c70cf744ae759cdd9382c9a72cfa7 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.actions.updateblock.IUpdateBlockAction
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
 
 @BindsIntoMapStringKey(
index 46353ca6f9e073b9565d1128596a5db6937065e4..b02afac219652bb0490d4ecbb0061ecff7663f37 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.actions.useblock.IUseBlockAction
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
 
 @BindsIntoMapStringKey(
index 7f17bfcb3199e116ce1030c4ee15fd2ba97b59a2..fd63378cca2e95c13d6aefa8e4a312db04a2007f 100644 (file)
@@ -1,6 +1,7 @@
 package ru.deadsoftware.cavedroid.misc.annotations.multibinding
 
 import ru.deadsoftware.cavedroid.game.actions.useitem.IUseItemAction
+import ru.deadsoftware.cavedroid.misc.annotations.multibind.MultibindingConfig
 import ru.fredboy.automultibind.annotations.BindsIntoMapStringKey
 
 @BindsIntoMapStringKey(
index 12427bd39fda3571fe94e27fcca21f429fe85bbd..12bf84b5a3a2ede867c677f3c9017cfaf29e817d 100644 (file)
@@ -1,4 +1,4 @@
-package ru.deadsoftware.cavedroid.misc.annotations.multibinding
+package ru.deadsoftware.cavedroid.misc.annotations.multibind
 
 data object MultibindingConfig {
     const val GENERATED_MODULES_PACKAGE = "ru.deadsoftware.cavedroid.generated.module"
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ArrayMapExtensions.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ArrayMapExtensions.kt
deleted file mode 100644 (file)
index 70a5dc6..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package ru.deadsoftware.cavedroid.misc.utils
-
-import com.badlogic.gdx.utils.ObjectMap
-
-object ArrayMapExtensions {
-    operator fun <K, V> ObjectMap.Entry<K, V>.component1(): K = this.key
-
-    operator fun <K, V> ObjectMap.Entry<K, V>.component2(): V = this.value
-}
index dff4d90a2aff2f6ba69e5019f548054cf56fefdd..b2f7059acc50b756d8330a42503bab6e9f1d6b8a 100644 (file)
@@ -3,7 +3,6 @@ package ru.deadsoftware.cavedroid.misc.utils
 import com.badlogic.gdx.Gdx
 import com.badlogic.gdx.files.FileHandle
 import ru.deadsoftware.cavedroid.MainConfig
-import ru.deadsoftware.cavedroid.game.GameScope
 import java.io.File
 import javax.inject.Inject
 import javax.inject.Singleton
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/GdxExtensions.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/GdxExtensions.kt
deleted file mode 100644 (file)
index 1c80048..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-package ru.deadsoftware.cavedroid.misc.utils
-
-import com.badlogic.gdx.Graphics
-
-val Graphics.ratio get() = width.toFloat() / height.toFloat()
\ No newline at end of file
diff --git a/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ItemUtils.kt b/core/src/main/kotlin/ru/deadsoftware/cavedroid/misc/utils/ItemUtils.kt
deleted file mode 100644 (file)
index 8e1f730..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-package ru.deadsoftware.cavedroid.misc.utils
-
-import ru.deadsoftware.cavedroid.game.GameItemsHolder.Companion.FALLBACK_ITEM_KEY
-import ru.deadsoftware.cavedroid.game.model.item.Item
-
-fun Item.isFallback(): Boolean {
-    return this.params.key == FALLBACK_ITEM_KEY
-}
index d443c88c8effc565a02b4579ba047d8602fcd2a3..47932ac60ec14ee431097acbc5512073cdf81ea1 100644 (file)
@@ -2,10 +2,30 @@ include("android")
 include("desktop")
 include("core")
 
-include("core:base")
+/**
+ * Global modules
+ */
+include("core:common")
 
 // data modules
 include("core:data:assets")
+include("core:data:items")
+include("core:data:save")
 
-//domain modules
+// domain modules
 include("core:domain:assets")
+include("core:domain:items")
+include("core:domain:save")
+
+/**
+ * Game scope modules
+ */
+include("core:game")
+
+// controller modules
+include("core:game:controller:drop")
+include("core:game:controller:container")
+include("core:game:controller:mob")
+
+// world module
+include("core:game:world")