From 2e2cd92192c8ee65658b1df9e4ae99b92871d53a Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Tue, 1 Apr 2025 15:38:39 -0400 Subject: [PATCH] Refactor: Move selectedLevel and randomModeEnabled to ViewModel --- .../java/com/pixelmintdrop/MainActivity.kt | 55 +++++++++++-------- .../pixelmintdrop/MainActivityViewModel.kt | 44 ++++++++++++++- 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/app/src/main/java/com/pixelmintdrop/MainActivity.kt b/app/src/main/java/com/pixelmintdrop/MainActivity.kt index b9ceee7..e353ce2 100644 --- a/app/src/main/java/com/pixelmintdrop/MainActivity.kt +++ b/app/src/main/java/com/pixelmintdrop/MainActivity.kt @@ -86,12 +86,10 @@ class MainActivity : AppCompatActivity(), // Game state private var piecesPlaced = 0 private var gameStartTime = 0L - private var selectedLevel = 1 private val maxLevel = 20 private var lastLines = 0 // Track the previous lines count private var lastLinesGroup = 0 // Track which 10-line group we're in (0-9, 10-19, etc.) private var lastRandomLevel = 0 // Track the level at which we last did a random change - private var isRandomModeEnabled = false private var currentTheme = PlayerProgressionManager.THEME_CLASSIC private val handler = Handler(Looper.getMainLooper()) @@ -241,9 +239,11 @@ class MainActivity : AppCompatActivity(), gameMusic.setEnabled(enabled) }) - // Load random mode setting - isRandomModeEnabled = getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE) - .getBoolean("random_mode_enabled", false) + // Observe Random Mode state + viewModel.isRandomModeEnabled.observe(this, Observer { enabled -> + // Update the switch UI + binding.randomModeSwitch?.isChecked = enabled + }) // Initialize gamepad controller gamepadController = GamepadController(gameView) @@ -397,7 +397,7 @@ class MainActivity : AppCompatActivity(), val newHighScore = highScoreManager.isHighScore(finalScore) statsManager.endSession() // End session after calculations - Log.d(TAG, "Game Over. Score: $finalScore, Level: ${viewModel.currentLevel.value}, Lines: ${gameBoard.lines}, Start Level: $selectedLevel, New High Score: $newHighScore, XP Gained: $xpGained") + Log.d(TAG, "Game Over. Score: $finalScore, Level: ${viewModel.currentLevel.value}, Lines: ${gameBoard.lines}, Start Level: ${viewModel.selectedLevel.value}, New High Score: $newHighScore, XP Gained: $xpGained") // Show appropriate screen: Progression or Game Over directly if (xpGained > 0 || newHighScore) { @@ -480,16 +480,18 @@ class MainActivity : AppCompatActivity(), binding.pauseLevelUpButton.setOnClickListener { gameHaptics.performHapticFeedback(it, HapticFeedbackConstants.VIRTUAL_KEY) - if (selectedLevel < maxLevel) { - selectedLevel++ + val currentSelected = viewModel.selectedLevel.value ?: 1 + if (currentSelected < maxLevel) { + viewModel.setSelectedLevel(currentSelected + 1) updateLevelSelector() } } binding.pauseLevelDownButton.setOnClickListener { gameHaptics.performHapticFeedback(it, HapticFeedbackConstants.VIRTUAL_KEY) - if (selectedLevel > 1) { - selectedLevel-- + val currentSelected = viewModel.selectedLevel.value ?: 1 + if (currentSelected > 1) { + viewModel.setSelectedLevel(currentSelected - 1) updateLevelSelector() } } @@ -531,6 +533,16 @@ class MainActivity : AppCompatActivity(), // Initialize pause menu items for gamepad navigation initPauseMenuNavigation() + + // Set up random mode switch + binding.randomModeSwitch?.apply { + isChecked = viewModel.isRandomModeEnabled.value ?: false + isEnabled = progressionManager.getPlayerLevel() >= 5 + setOnCheckedChangeListener { _, isChecked -> + // Only need to call toggle, ViewModel handles saving + viewModel.toggleRandomMode() + } + } } /** @@ -653,14 +665,11 @@ class MainActivity : AppCompatActivity(), // Set up random mode switch binding.randomModeSwitch?.apply { - isChecked = isRandomModeEnabled + isChecked = viewModel.isRandomModeEnabled.value ?: false isEnabled = progressionManager.getPlayerLevel() >= 5 setOnCheckedChangeListener { _, isChecked -> - isRandomModeEnabled = isChecked - getSharedPreferences("com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE) - .edit() - .putBoolean("random_mode_enabled", isChecked) - .apply() + // Only need to call toggle, ViewModel handles saving + viewModel.toggleRandomMode() } } } @@ -835,8 +844,8 @@ class MainActivity : AppCompatActivity(), * Update the level selector display */ private fun updateLevelSelector() { - binding.pauseLevelText.text = selectedLevel.toString() - gameBoard.updateLevel(selectedLevel) + binding.pauseLevelText.text = viewModel.selectedLevel.value.toString() + gameBoard.updateLevel(viewModel.selectedLevel.value ?: 1) } /** @@ -879,10 +888,10 @@ class MainActivity : AppCompatActivity(), * Start a new game */ private fun startGame() { - Log.d(TAG, "Starting game at level $selectedLevel") + Log.d(TAG, "Starting game at level ${viewModel.selectedLevel.value}") // Reset game state viewModel.resetGame() // Resets score and level in ViewModel - viewModel.setLevel(selectedLevel) // Set initial level from selection + viewModel.setLevel(viewModel.selectedLevel.value ?: 1) // Set initial level from selection piecesPlaced = 0 gameStartTime = System.currentTimeMillis() lastLines = 0 @@ -953,7 +962,7 @@ class MainActivity : AppCompatActivity(), val newHighScore = highScoreManager.isHighScore(finalScore) statsManager.endSession() // End session after calculations - Log.d(TAG, "Game Over. Score: $finalScore, Level: ${viewModel.currentLevel.value}, Lines: ${gameBoard.lines}, Start Level: $selectedLevel, New High Score: $newHighScore, XP Gained: $xpGained") + Log.d(TAG, "Game Over. Score: $finalScore, Level: ${viewModel.currentLevel.value}, Lines: ${gameBoard.lines}, Start Level: ${viewModel.selectedLevel.value}, New High Score: $newHighScore, XP Gained: $xpGained") // Show appropriate screen: Progression or Game Over directly if (xpGained > 0 || newHighScore) { @@ -997,7 +1006,7 @@ class MainActivity : AppCompatActivity(), // Reset session stats statsManager.startNewSession() progressionManager.startNewSession() - gameBoard.updateLevel(selectedLevel) + gameBoard.updateLevel(viewModel.selectedLevel.value ?: 1) } private fun restartGame() { @@ -2007,7 +2016,7 @@ class MainActivity : AppCompatActivity(), binding.comboText.text = gameBoard.getCombo().toString() // If random mode is enabled, check if we should change theme or block skin - if (isRandomModeEnabled) { + if (viewModel.isRandomModeEnabled.value == true) { // Get the current 10-line group (0 for 0-9, 1 for 10-19, etc.) val currentLinesGroup = lines / 10 diff --git a/app/src/main/java/com/pixelmintdrop/MainActivityViewModel.kt b/app/src/main/java/com/pixelmintdrop/MainActivityViewModel.kt index f513892..2bad64a 100644 --- a/app/src/main/java/com/pixelmintdrop/MainActivityViewModel.kt +++ b/app/src/main/java/com/pixelmintdrop/MainActivityViewModel.kt @@ -3,8 +3,11 @@ package com.pixelmintdrop import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import android.content.Context -class MainActivityViewModel : ViewModel() { +class MainActivityViewModel(application: Application) : AndroidViewModel(application) { // Private MutableLiveData for internal updates private val _currentScore = MutableLiveData(0L) @@ -22,6 +25,18 @@ class MainActivityViewModel : ViewModel() { val isMusicEnabled: LiveData = _isMusicEnabled // --------------------------- + // --- Game Settings State --- + private val _selectedLevel = MutableLiveData(1) // Default start level + val selectedLevel: LiveData = _selectedLevel + + private val _isRandomModeEnabled = MutableLiveData(false) + val isRandomModeEnabled: LiveData = _isRandomModeEnabled + // --------------------------- + + init { // Load initial random mode setting + loadSettings() + } + // Example function to update the score (logic would be moved here) fun incrementScore(points: Long) { _currentScore.value = (_currentScore.value ?: 0L) + points @@ -58,5 +73,32 @@ class MainActivityViewModel : ViewModel() { } // -------------------------- + // --- Game Settings Logic --- + fun setSelectedLevel(level: Int) { + _selectedLevel.value = level + } + + fun toggleRandomMode() { + val newValue = !(_isRandomModeEnabled.value ?: false) + _isRandomModeEnabled.value = newValue + saveRandomModeSetting(newValue) + } + + private fun loadSettings() { + val prefs = getApplication().getSharedPreferences( + "com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE + ) + _isRandomModeEnabled.value = prefs.getBoolean("random_mode_enabled", false) + // Load other settings if needed + } + + private fun saveRandomModeSetting(enabled: Boolean) { + val prefs = getApplication().getSharedPreferences( + "com.com.pixelmintgames.pixelmintdrop.preferences", Context.MODE_PRIVATE + ) + prefs.edit().putBoolean("random_mode_enabled", enabled).apply() + } + // --------------------------- + // Add other state variables and logic related to game state here } \ No newline at end of file