import dagger.Reusable
import ru.fredboy.cavedroid.data.save.model.SaveDataDto
import ru.fredboy.cavedroid.domain.items.usecase.GetItemByKeyUseCase
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerFactory
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerWorldAdapter
import ru.fredboy.cavedroid.entity.container.model.Chest
import ru.fredboy.cavedroid.entity.container.model.ContainerCoordinates
import ru.fredboy.cavedroid.entity.container.model.Furnace
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropAdapter
import ru.fredboy.cavedroid.game.controller.container.ContainerController
import javax.inject.Inject
)
}
- fun mapContainerController(saveDataDto: SaveDataDto.ContainerControllerSaveDataDto): ContainerController {
+ fun mapContainerController(
+ saveDataDto: SaveDataDto.ContainerControllerSaveDataDto,
+ containerWorldAdapter: ContainerWorldAdapter,
+ containerFactory: ContainerFactory,
+ dropAdapter: DropAdapter,
+ ): ContainerController {
saveDataDto.verifyVersion(SAVE_DATA_VERSION)
return ContainerController(
getItemByKeyUseCase = getItemByKeyUseCase,
- containerWorldAdapter = TODO("containerWorldAdapter"),
- containerFactory = TODO("ContainerFactory"),
- dropAdapter = TODO("DropAdapter")
+ containerWorldAdapter = containerWorldAdapter,
+ containerFactory = containerFactory,
+ dropAdapter = dropAdapter
).apply {
saveDataDto.containerMap.forEach { (key, value) ->
val container = when (value) {
import dagger.Reusable
import ru.fredboy.cavedroid.data.save.model.SaveDataDto
import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropWorldAdapter
import ru.fredboy.cavedroid.game.controller.drop.DropController
import javax.inject.Inject
)
}
- fun mapDropController(saveDataDto: SaveDataDto.DropControllerSaveDataDto): DropController {
+ fun mapDropController(
+ saveDataDto: SaveDataDto.DropControllerSaveDataDto,
+ dropWorldAdapter: DropWorldAdapter,
+ ): DropController {
saveDataDto.verifyVersion(SAVE_DATA_VERSION)
return DropController(
initialDrop = saveDataDto.drops.map(dropMapper::mapDrop),
- dropWorldAdapter = TODO("dropWorldAdapter"),
+ dropWorldAdapter = dropWorldAdapter,
itemsRepository = itemsRepository,
)
}
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.entity.mob.abstraction.MobWorldAdapter
import ru.fredboy.cavedroid.entity.mob.model.FallingBlock
import ru.fredboy.cavedroid.entity.mob.model.Pig
import ru.fredboy.cavedroid.game.controller.mob.MobController
)
}
- fun mapMobController(saveDataDto: SaveDataDto.MobControllerSaveDataDto): MobController {
+ fun mapMobController(
+ saveDataDto: SaveDataDto.MobControllerSaveDataDto,
+ mobWorldAdapter: MobWorldAdapter,
+ ): MobController {
saveDataDto.verifyVersion(SAVE_DATA_VERSION)
return MobController(
mobAssetsRepository = mobAssetsRepository,
getFallbackItemUseCase = getFallbackItemUseCase,
- mobWorldAdapter = TODO("mobWorldAdapter"),
+ mobWorldAdapter = mobWorldAdapter,
).apply {
(mobs as MutableList).addAll(saveDataDto.mobs.mapNotNull { mob ->
when (mob) {
import ru.fredboy.cavedroid.data.save.model.SaveDataDto
import ru.fredboy.cavedroid.domain.items.model.block.Block
import ru.fredboy.cavedroid.domain.items.repository.ItemsRepository
-import ru.fredboy.cavedroid.domain.save.model.GameSaveData
+import ru.fredboy.cavedroid.domain.save.model.GameMapSaveData
import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerFactory
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerWorldAdapter
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropAdapter
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropWorldAdapter
+import ru.fredboy.cavedroid.entity.mob.abstraction.MobWorldAdapter
import ru.fredboy.cavedroid.game.controller.container.ContainerController
import ru.fredboy.cavedroid.game.controller.drop.DropController
import ru.fredboy.cavedroid.game.controller.mob.MobController
val height = map[0].size
val blocks = sequence {
- for (y in 0 ..< height) {
- for (x in 0 ..< width) {
+ for (y in 0..<height) {
+ for (x in 0..<width) {
yield(map[x][y])
}
}
val height = ByteBuffer.wrap(bytes, 1 + Int.SIZE_BYTES, Int.SIZE_BYTES).getInt()
val blocks = buildList {
- for (i in 1 + (Int.SIZE_BYTES shl 1) .. bytes.lastIndex step Int.SIZE_BYTES + 1) {
+ for (i in 1 + (Int.SIZE_BYTES shl 1)..bytes.lastIndex step Int.SIZE_BYTES + 1) {
val run = ByteBuffer.wrap(bytes, i, Int.SIZE_BYTES).getInt()
val blockId = bytes[i + Int.SIZE_BYTES].toUByte().toInt()
- for (j in 0 ..< run) {
+ for (j in 0..<run) {
add(itemsRepository.getBlockByKey(dict[blockId]))
}
}
}
- private fun loadMap(
- itemsRepository: ItemsRepository,
+ private fun internalLoadMap(
savesPath: String
): Pair<Array<Array<Block>>, Array<Array<Block>>> {
val dict = Gdx.files.absolute("$savesPath$DICT_FILE").readString().split("\n")
val dropBytes = ProtoBuf.encodeToByteArray(dropControllerMapper.mapSaveData(dropController as DropController))
val mobsBytes = ProtoBuf.encodeToByteArray(mobControllerMapper.mapSaveData(mobController as MobController))
- val containersBytes = ProtoBuf.encodeToByteArray(containerControllerMapper.mapSaveData(containerController as ContainerController))
+ val containersBytes =
+ ProtoBuf.encodeToByteArray(containerControllerMapper.mapSaveData(containerController as ContainerController))
dropFile.writeBytes(dropBytes, false)
mobsFile.writeBytes(mobsBytes, false)
saveMap(gameWorld, savesPath)
}
- override fun load(gameDataFolder: String): GameSaveData {
+ override fun loadMap(gameDataFolder: String): GameMapSaveData {
val savesPath = "$gameDataFolder$SAVES_DIR"
+ val (foreMap, backMap) = internalLoadMap(savesPath)
+ return GameMapSaveData(foreMap, backMap)
+ }
- val dropFile = Gdx.files.absolute("$savesPath$DROP_FILE")
- val mobsFile = Gdx.files.absolute("$savesPath$MOBS_FILE")
+ override fun loadContainerController(
+ gameDataFolder: String,
+ containerWorldAdapter: ContainerWorldAdapter,
+ containerFactory: ContainerFactory,
+ dropAdapter: DropAdapter
+ ): ContainerController {
+ val savesPath = "$gameDataFolder$SAVES_DIR"
val containersFile = Gdx.files.absolute("$savesPath$CONTAINERS_FILE")
+ val containersBytes = containersFile.readBytes()
+ return ProtoBuf.decodeFromByteArray<SaveDataDto.ContainerControllerSaveDataDto>(
+ containersBytes
+ ).let { saveData ->
+ containerControllerMapper.mapContainerController(
+ saveDataDto = saveData,
+ containerWorldAdapter = containerWorldAdapter,
+ containerFactory = containerFactory,
+ dropAdapter = dropAdapter
+ )
+ }
+ }
+
+ override fun loadDropController(gameDataFolder: String, dropWorldAdapter: DropWorldAdapter): DropController {
+ val savesPath = "$gameDataFolder$SAVES_DIR"
+ val dropFile = Gdx.files.absolute("$savesPath$DROP_FILE")
val dropBytes = dropFile.readBytes()
- val mobsBytes = mobsFile.readBytes()
- val containersBytes = containersFile.readBytes()
- val dropController = ProtoBuf.decodeFromByteArray<SaveDataDto.DropControllerSaveDataDto>(dropBytes)
+ return ProtoBuf.decodeFromByteArray<SaveDataDto.DropControllerSaveDataDto>(dropBytes)
.let { saveData ->
- dropControllerMapper.mapDropController(saveData)
+ dropControllerMapper.mapDropController(
+ saveDataDto = saveData,
+ dropWorldAdapter = dropWorldAdapter
+ )
}
+ }
- val mobController = ProtoBuf.decodeFromByteArray<SaveDataDto.MobControllerSaveDataDto>(mobsBytes)
- .let { saveData ->
- mobControllerMapper.mapMobController(saveData)
- }
+ override fun loadMobController(gameDataFolder: String, mobWorldAdapter: MobWorldAdapter): MobController {
+ val savesPath = "$gameDataFolder$SAVES_DIR"
+ val mobsFile = Gdx.files.absolute("$savesPath$MOBS_FILE")
+ val mobsBytes = mobsFile.readBytes()
- val containerController = ProtoBuf.decodeFromByteArray<SaveDataDto.ContainerControllerSaveDataDto>(containersBytes)
+ return ProtoBuf.decodeFromByteArray<SaveDataDto.MobControllerSaveDataDto>(mobsBytes)
.let { saveData ->
- containerControllerMapper.mapContainerController(saveData)
+ mobControllerMapper.mapMobController(
+ saveDataDto = saveData,
+ mobWorldAdapter = mobWorldAdapter
+ )
}
-
- val (foreMap, backMap) = loadMap(itemsRepository, savesPath)
-
- return GameSaveData(mobController, dropController, containerController, foreMap, backMap)
}
- override fun exists(gameDataFolder: String,): Boolean {
+ override fun exists(gameDataFolder: String): Boolean {
val savesPath = "$gameDataFolder$SAVES_DIR"
return Gdx.files.absolute("$savesPath$DROP_FILE").exists() &&
useModule(":core:domain:assets")
useModule(":core:domain:world")
+ useModule(":core:entity:container")
+ useModule(":core:entity:drop")
+ useModule(":core:entity:mob")
+
useModule(":core:game:controller:container")
useModule(":core:game:controller:drop")
useModule(":core:game:controller:mob")
--- /dev/null
+package ru.fredboy.cavedroid.domain.save.model
+
+import ru.fredboy.cavedroid.domain.items.model.block.Block
+
+class GameMapSaveData(
+ private var foreMap: Array<Array<Block>>?,
+ private var backMap: Array<Array<Block>>?
+) {
+ fun retrieveForeMap(): Array<Array<Block>> {
+ val value = requireNotNull(foreMap)
+ foreMap = null
+ return value
+ }
+
+ fun retrieveBackMap(): Array<Array<Block>> {
+ val value = requireNotNull(backMap)
+ backMap = null
+ return value
+ }
+
+ fun isEmpty() = foreMap == null && backMap == null
+}
package ru.fredboy.cavedroid.domain.save.model
-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
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(): MobController {
return value
}
- fun retrieveForeMap(): Array<Array<Block>> {
- val value = requireNotNull(foreMap)
- foreMap = null
- return value
- }
-
- fun retrieveBackMap(): Array<Array<Block>> {
- val value = requireNotNull(backMap)
- backMap = null
- return value
- }
-
fun isEmpty(): Boolean {
return mobController == null &&
dropController == null &&
- containerController == null &&
- foreMap == null &&
- backMap == null
+ containerController == null
}
-
-
}
\ No newline at end of file
package ru.fredboy.cavedroid.domain.save.repository
-import ru.fredboy.cavedroid.domain.save.model.GameSaveData
+import ru.fredboy.cavedroid.domain.save.model.GameMapSaveData
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerFactory
+import ru.fredboy.cavedroid.entity.container.abstraction.ContainerWorldAdapter
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropAdapter
+import ru.fredboy.cavedroid.entity.drop.abstraction.DropWorldAdapter
+import ru.fredboy.cavedroid.entity.mob.abstraction.MobWorldAdapter
import ru.fredboy.cavedroid.game.controller.container.ContainerController
import ru.fredboy.cavedroid.game.controller.drop.DropController
import ru.fredboy.cavedroid.game.controller.mob.MobController
gameWorld: GameWorld
)
- fun load(
+ fun loadMap(
+ gameDataFolder: String
+ ): GameMapSaveData
+
+ fun loadContainerController(
+ gameDataFolder: String,
+ containerWorldAdapter: ContainerWorldAdapter,
+ containerFactory: ContainerFactory,
+ dropAdapter: DropAdapter,
+ ): ContainerController
+
+ fun loadDropController(
+ gameDataFolder: String,
+ dropWorldAdapter: DropWorldAdapter,
+ ): DropController
+
+ fun loadMobController(
gameDataFolder: String,
- ): GameSaveData
+ mobWorldAdapter: MobWorldAdapter,
+ ): MobController
fun exists(gameDataFolder: String): Boolean
import dagger.Module;
import dagger.Provides;
-import org.jetbrains.annotations.Nullable;
import ru.deadsoftware.cavedroid.MainConfig;
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.domain.items.usecase.GetItemByKeyUseCase;
-import ru.fredboy.cavedroid.domain.save.model.GameSaveData;
+import ru.fredboy.cavedroid.domain.save.model.GameMapSaveData;
import ru.fredboy.cavedroid.domain.save.repository.SaveDataRepository;
import ru.fredboy.cavedroid.entity.container.abstraction.ContainerFactory;
import ru.fredboy.cavedroid.entity.container.abstraction.ContainerWorldAdapter;
import ru.fredboy.cavedroid.entity.drop.abstraction.DropAdapter;
import ru.fredboy.cavedroid.entity.drop.abstraction.DropWorldAdapter;
+import ru.fredboy.cavedroid.entity.mob.abstraction.MobWorldAdapter;
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.entity.mob.abstraction.MobWorldAdapter;
import ru.fredboy.cavedroid.game.world.GameWorld;
@Module
public class GameModule {
- @Nullable
- private static GameSaveData data;
-
- public static boolean loaded = false;
-
- private static void load(MainConfig mainConfig, SaveDataRepository saveDataRepository) {
- if (loaded) {
- return;
- }
+ private static boolean needLoad = false;
- data = saveDataRepository.load(mainConfig.getGameFolder());
-
- loaded = true;
- }
-
- private static void makeDataNullIfEmpty() {
- if (data != null && data.isEmpty()) {
- data = null;
- }
+ public static void setNeedLoad(final boolean needLoad) {
+ GameModule.needLoad = needLoad;
}
@Provides
@GameScope
public static DropController provideDropController(MainConfig mainConfig,
SaveDataRepository saveDataRepository,
- DropWorldAdapter dropWorldAdapter,
- ItemsRepository itemsRepository) {
- load(mainConfig, saveDataRepository);
- DropController controller = data != null
- ? data.retrieveDropController()
+ ItemsRepository itemsRepository,
+ DropWorldAdapter dropWorldAdapter) {
+
+ DropController controller = needLoad
+ ? saveDataRepository.loadDropController(mainConfig.getGameFolder(), dropWorldAdapter)
: new DropController(itemsRepository, dropWorldAdapter);
- makeDataNullIfEmpty();
+
return controller;
}
GetItemByKeyUseCase getItemByKeyUseCase,
ContainerWorldAdapter containerWorldAdapter,
ContainerFactory containerFactory,
- DropAdapter dropAdapter
- ) {
- load(mainConfig, saveDataRepository);
- ContainerController controller = data != null
- ? data.retrieveContainerController()
+ DropAdapter dropAdapter) {
+ ContainerController controller = needLoad
+ ? saveDataRepository.loadContainerController(mainConfig.getGameFolder(), containerWorldAdapter, containerFactory, dropAdapter)
: new ContainerController(getItemByKeyUseCase, containerWorldAdapter, containerFactory, dropAdapter);
- makeDataNullIfEmpty();
+
return controller;
}
SaveDataRepository saveDataRepository,
MobAssetsRepository mobAssetsRepository,
GetFallbackItemUseCase getFallbackItemUseCase,
- MobWorldAdapter mobWorldAdapter
- ) {
- load(mainConfig, saveDataRepository);
- MobController controller = data != null
- ? data.retrieveMobsController()
+ MobWorldAdapter mobWorldAdapter) {
+
+ return needLoad
+ ? saveDataRepository.loadMobController(mainConfig.getGameFolder(), mobWorldAdapter)
: new MobController(mobAssetsRepository, getFallbackItemUseCase, mobWorldAdapter);
- makeDataNullIfEmpty();
- return controller;
}
@Provides
@GameScope
public static GameWorld provideGameWorld(MainConfig mainConfig,
SaveDataRepository saveDataRepository,
- ItemsRepository itemsRepository
- ) {
- load(mainConfig, saveDataRepository);
- Block[][] fm = data != null ? data.retrieveForeMap() : null;
- Block[][] bm = data != null ? data.retrieveBackMap() : null;
- makeDataNullIfEmpty();
+ ItemsRepository itemsRepository) {
+
+ final GameMapSaveData mapData = needLoad ? saveDataRepository.loadMap(mainConfig.getGameFolder()) : null;
+
+ Block[][] fm = mapData != null ? mapData.retrieveForeMap() : null;
+ Block[][] bm = mapData != null ? mapData.retrieveBackMap() : null;
+
return new GameWorld(itemsRepository, fm, bm);
}
mGameProc.dispose();
}
- GameModule.loaded = true;
+ GameModule.setNeedLoad(false);
GameComponent gameComponent = DaggerGameComponent.builder()
.mainComponent(mMainConfig.getMainComponent()).build();
mGameProc.dispose();
}
- GameModule.loaded = false;
+ GameModule.setNeedLoad(true);
GameComponent gameComponent = DaggerGameComponent.builder()
.mainComponent(mMainConfig.getMainComponent()).build();