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 /app/src/main/java | |
| parent | 3699c47c9c5c9323c96d8257de6cdcf19cb5f935 (diff) | |
fix route bug in new game
better model for storage
Diffstat (limited to 'app/src/main/java')
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()      }  |