summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-26 23:03:28 +0330
committerA404M <ahmadmahmoudiprogrammer@gmail.com>2025-06-26 23:03:28 +0330
commita7b8fb4551b944487c186da776b7a07f4d7848cb (patch)
tree6b1a658396edba5fcfcd4a752a937378c3f1ea66
parent3699c47c9c5c9323c96d8257de6cdcf19cb5f935 (diff)
fix route bug in new game
better model for storage
-rw-r--r--app/src/main/java/com/a404m/mine_game/MainActivity.kt6
-rw-r--r--app/src/main/java/com/a404m/mine_game/model/Action.kt2
-rw-r--r--app/src/main/java/com/a404m/mine_game/model/GameSettings.kt2
-rw-r--r--app/src/main/java/com/a404m/mine_game/model/GameState.kt4
-rw-r--r--app/src/main/java/com/a404m/mine_game/storage/StorageGame.kt81
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Controls.kt27
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Game.kt4
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Home.kt3
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Route.kt9
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Settings.kt24
-rw-r--r--app/src/main/java/com/a404m/mine_game/ui/page/Splash.kt4
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()
}