diff options
author | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-26 23:03:28 +0330 |
---|---|---|
committer | A404M <ahmadmahmoudiprogrammer@gmail.com> | 2025-06-26 23:03:28 +0330 |
commit | a7b8fb4551b944487c186da776b7a07f4d7848cb (patch) | |
tree | 6b1a658396edba5fcfcd4a752a937378c3f1ea66 | |
parent | 3699c47c9c5c9323c96d8257de6cdcf19cb5f935 (diff) |
fix route bug in new game
better model for storage
11 files changed, 97 insertions, 69 deletions
diff --git a/app/src/main/java/com/a404m/mine_game/MainActivity.kt b/app/src/main/java/com/a404m/mine_game/MainActivity.kt index 7a7a275..9540fe0 100644 --- a/app/src/main/java/com/a404m/mine_game/MainActivity.kt +++ b/app/src/main/java/com/a404m/mine_game/MainActivity.kt @@ -6,7 +6,6 @@ import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.enableEdgeToEdge import com.a404m.mine_game.core.TAG -import com.a404m.mine_game.model.GameState import com.a404m.mine_game.storage.StorageGame import com.a404m.mine_game.ui.page.Route import com.a404m.mine_game.ui.theme.MineGameTheme @@ -30,9 +29,6 @@ class MainActivity : ComponentActivity() { TAG, "onPause: called" ) - val gameState = GameState.current - if(gameState != null) { - StorageGame.save(gameState) - } + StorageGame.saveAll() } }
\ No newline at end of file diff --git a/app/src/main/java/com/a404m/mine_game/model/Action.kt b/app/src/main/java/com/a404m/mine_game/model/Action.kt index 08d7ecf..2b99351 100644 --- a/app/src/main/java/com/a404m/mine_game/model/Action.kt +++ b/app/src/main/java/com/a404m/mine_game/model/Action.kt @@ -15,7 +15,7 @@ enum class Action( ; companion object{ - var current = OPEN + val default = OPEN fun from(value:Int) = entries.find { it.ordinal == value } } diff --git a/app/src/main/java/com/a404m/mine_game/model/GameSettings.kt b/app/src/main/java/com/a404m/mine_game/model/GameSettings.kt index 2889ce8..014f212 100644 --- a/app/src/main/java/com/a404m/mine_game/model/GameSettings.kt +++ b/app/src/main/java/com/a404m/mine_game/model/GameSettings.kt @@ -43,7 +43,5 @@ data class GameSettings( mines = 10, seed = null, ) - - var current = StorageGame.getGameSettings() ?: default } } diff --git a/app/src/main/java/com/a404m/mine_game/model/GameState.kt b/app/src/main/java/com/a404m/mine_game/model/GameState.kt index 45b2fb7..9bba01a 100644 --- a/app/src/main/java/com/a404m/mine_game/model/GameState.kt +++ b/app/src/main/java/com/a404m/mine_game/model/GameState.kt @@ -226,8 +226,4 @@ class GameState( private const val FLAG_BIT = 0b1000000 } } - - companion object { - var current by mutableStateOf<GameState?>(null) - } } diff --git a/app/src/main/java/com/a404m/mine_game/storage/StorageGame.kt b/app/src/main/java/com/a404m/mine_game/storage/StorageGame.kt index 13b8970..d7e4f67 100644 --- a/app/src/main/java/com/a404m/mine_game/storage/StorageGame.kt +++ b/app/src/main/java/com/a404m/mine_game/storage/StorageGame.kt @@ -1,60 +1,115 @@ package com.a404m.mine_game.storage +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.setValue import com.a404m.mine_game.model.Action import com.a404m.mine_game.model.GameSettings import com.a404m.mine_game.model.GameState object StorageGame : StorageBase("StorageSettings") { + private var gameSettingsState by mutableStateOf(GameSettings.default) + private var lastGameState by mutableStateOf<GameState?>(null) + private var primaryActionState by mutableStateOf(Action.default) + private var hintCountState by mutableIntStateOf(0) + + var gameSettings: GameSettings + get() = gameSettingsState + set(value) { + gameSettingsState = value + saveGameSettings(value) + } + var lastGame: GameState? + get() = lastGameState + set(value) { + lastGameState = value + if (value == null) { + deleteLastGame() + } else { + saveGameState(value) + } + } + var primaryAction: Action + get() = primaryActionState + set(value) { + primaryActionState = value + savePrimaryAction(value) + } + var hintCount: Int + get() = hintCountState + set(value) { + hintCountState = value + saveHintCount(value) + } + + fun init() { + gameSettingsState = readGameSettings() ?: GameSettings.default + lastGameState = readLastGame() + primaryActionState = readPrimaryAction() ?: Action.default + hintCountState = readHintCount() ?: 0 + } + + fun saveAll() { + saveGameSettings(gameSettingsState) + val lastGame = lastGameState + if (lastGame != null) { + saveGameState(lastGame) + } + savePrimaryAction(primaryActionState) + saveHintCount(hintCountState) + } + private const val GAME_SETTINGS_KEY = "game_settings" private const val LAST_GAME_STATE_KEY = "last_game" private const val PRIMARY_ACTION_KEY = "primary_action" private const val HINT_COUNT_KEY = "hint_count" - fun save(value: GameSettings) = save( + private fun saveGameSettings(value: GameSettings) = save( GAME_SETTINGS_KEY, value, ) - fun getGameSettings(): GameSettings? { + private fun readGameSettings(): GameSettings? { val json = getJson(GAME_SETTINGS_KEY) ?: return null return GameSettings(json) } - fun deleteGameSettings() = delete(GAME_SETTINGS_KEY) + private fun deleteGameSettings() = delete(GAME_SETTINGS_KEY) - fun save(value: GameState) = save( + private fun saveGameState(value: GameState) = save( LAST_GAME_STATE_KEY, value, ) - fun getLastGame(): GameState? { + private fun readLastGame(): GameState? { val json = getJson(LAST_GAME_STATE_KEY) ?: return null return GameState(json) } - fun deleteLastGame() = delete(LAST_GAME_STATE_KEY) + private fun deleteLastGame() = delete(LAST_GAME_STATE_KEY) - fun savePrimaryAction(value: Action) = save( + private fun savePrimaryAction(value: Action) = save( PRIMARY_ACTION_KEY, value.ordinal, ) - fun getPrimaryAction(): Action? { + private fun readPrimaryAction(): Action? { val value = getInt(PRIMARY_ACTION_KEY) ?: return null return Action.from(value) } - fun deletePrimaryAction() = delete(PRIMARY_ACTION_KEY) + private fun deletePrimaryAction() = delete(PRIMARY_ACTION_KEY) - fun saveHintCount(value: Action) = save( + private fun saveHintCount(value: Int) = save( HINT_COUNT_KEY, - value.ordinal, + value, ) - fun getHintCount(): Int? = getInt(HINT_COUNT_KEY) + private fun readHintCount(): Int? = getInt(HINT_COUNT_KEY) - fun deleteHintCount() = delete(HINT_COUNT_KEY) + private fun deleteHintCount() = delete(HINT_COUNT_KEY) }
\ No newline at end of file diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Controls.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Controls.kt index 02ea22a..175faac 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Controls.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Controls.kt @@ -9,16 +9,9 @@ import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.a404m.mine_game.model.Action import com.a404m.mine_game.storage.StorageGame import com.a404m.mine_game.ui.utils.ActionChooser import com.a404m.mine_game.ui.utils.CustomScaffold @@ -31,15 +24,6 @@ fun ControlsPage( modifier: Modifier = Modifier, onBack: () -> Unit, ) { - var selectedAction by rememberSaveable { mutableStateOf(Action.current) } - - DisposableEffect(Unit) { - onDispose { - Action.current = selectedAction - StorageGame.savePrimaryAction(selectedAction) - } - } - CustomScaffold( modifier = modifier.fillMaxSize(), topBar = { innerPadding -> @@ -66,10 +50,15 @@ fun ControlsPage( title = "Default Button", ) { ActionChooser( - modifier = Modifier.align(Alignment.CenterHorizontally).padding(top = 10.dp, bottom = 15.dp), - selected = selectedAction, + modifier = Modifier + .align(Alignment.CenterHorizontally) + .padding( + top = 10.dp, + bottom = 15.dp, + ), + selected = StorageGame.primaryAction, onSelect = { - selectedAction = it + StorageGame.primaryAction = it }, ) } diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Game.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Game.kt index aa82b98..3ea7ada 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Game.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Game.kt @@ -84,7 +84,7 @@ fun GamePage( } } - var action by rememberSaveable { mutableStateOf(Action.current) } + var action by rememberSaveable { mutableStateOf(StorageGame.primaryAction) } var zoomOverall by rememberSaveable { mutableFloatStateOf(1f) } var rotationOverall by rememberSaveable { mutableFloatStateOf(0f) } @@ -100,7 +100,7 @@ fun GamePage( DisposableEffect(Unit) { onDispose { - StorageGame.save(gameState) + StorageGame.lastGame = gameState } } diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Home.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Home.kt index 2a97c01..ebb6c9b 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Home.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Home.kt @@ -39,6 +39,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.a404m.mine_game.R import com.a404m.mine_game.model.GameState +import com.a404m.mine_game.storage.StorageGame import com.a404m.mine_game.ui.utils.CustomScaffold import com.a404m.mine_game.utils.getApplicationName @@ -57,7 +58,7 @@ fun HomePage( onGoToLanguage: () -> Unit, onGoToAbout: () -> Unit, ) { - val hasLastGame by remember { derivedStateOf { GameState.current != null } } + val hasLastGame by remember { derivedStateOf { StorageGame.lastGame != null } } CustomScaffold( modifier = modifier.fillMaxSize(), ) { innerPadding -> diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Route.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Route.kt index f622952..13de5b4 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Route.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Route.kt @@ -12,7 +12,6 @@ import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.a404m.mine_game.core.TAG -import com.a404m.mine_game.model.GameSettings import com.a404m.mine_game.model.GameState import com.a404m.mine_game.storage.StorageGame @@ -78,7 +77,7 @@ fun Route( val gameState = remember { if (newGame) { - val gameSettings = GameSettings.current + val gameSettings = StorageGame.gameSettings GameState( width = gameSettings.width, height = gameSettings.height, @@ -86,11 +85,11 @@ fun Route( seed = gameSettings.seed, ) } else { - StorageGame.getLastGame()!! + StorageGame.lastGame!! } } - GameState.current = gameState + StorageGame.lastGame = gameState GamePage( onBack = { @@ -98,7 +97,7 @@ fun Route( }, onNewGame = { navController.navigate(AppRoute.getGameRoute(true)){ - popUpTo(navController.graph.findStartDestination().id){ + popUpTo(AppRoute.getGameStaticRoute()){ inclusive = true } } diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Settings.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Settings.kt index 09c07f1..7756d09 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Settings.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Settings.kt @@ -10,7 +10,6 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll import androidx.compose.material3.Icon @@ -47,10 +46,10 @@ fun SettingsPage( modifier: Modifier = Modifier, onBack: () -> Unit, ) { - var width by rememberSaveable { mutableStateOf(GameSettings.current.width.toString()) } - var height by rememberSaveable { mutableStateOf(GameSettings.current.height.toString()) } - var mines by rememberSaveable { mutableStateOf(GameSettings.current.mines.toString()) } - var seed by rememberSaveable { mutableStateOf(GameSettings.current.seed?.toString() ?: "") } + var width by rememberSaveable { mutableStateOf(StorageGame.gameSettings.width.toString()) } + var height by rememberSaveable { mutableStateOf(StorageGame.gameSettings.height.toString()) } + var mines by rememberSaveable { mutableStateOf(StorageGame.gameSettings.mines.toString()) } + var seed by rememberSaveable { mutableStateOf(StorageGame.gameSettings.seed?.toString() ?: "") } val isWidthValid by remember { derivedStateOf { @@ -86,12 +85,11 @@ fun SettingsPage( actions = { IconButton( onClick = { - GameSettings.current = GameSettings.default - width = GameSettings.current.width.toString() - height = GameSettings.current.height.toString() - mines = GameSettings.current.mines.toString() - seed = GameSettings.current.seed?.toString() ?: "" - StorageGame.deleteGameSettings() + StorageGame.gameSettings = GameSettings.default + width = StorageGame.gameSettings.width.toString() + height = StorageGame.gameSettings.height.toString() + mines = StorageGame.gameSettings.mines.toString() + seed = StorageGame.gameSettings.seed?.toString() ?: "" }, ) { Icon( @@ -110,14 +108,12 @@ fun SettingsPage( showToast("Fix the errors") return@IconButton } - val settings = GameSettings( + StorageGame.gameSettings = GameSettings( width = width.toInt(), height = height.toInt(), mines = mines.toInt(), seed = seed.toIntOrNull(), ) - GameSettings.current = settings - StorageGame.save(settings) }, ) { Icon( diff --git a/app/src/main/java/com/a404m/mine_game/ui/page/Splash.kt b/app/src/main/java/com/a404m/mine_game/ui/page/Splash.kt index 7db68f6..a8bddb9 100644 --- a/app/src/main/java/com/a404m/mine_game/ui/page/Splash.kt +++ b/app/src/main/java/com/a404m/mine_game/ui/page/Splash.kt @@ -19,9 +19,7 @@ fun SplashPage( onGoToHome: () -> Unit, ) { LaunchedEffect(Unit) { - GameSettings.current = StorageGame.getGameSettings() ?: GameSettings.default - GameState.current = StorageGame.getLastGame() - Action.current = StorageGame.getPrimaryAction() ?: Action.OPEN + StorageGame.init() onGoToHome() } |