From df9957580efa2f23cf7f56336e6ae437e2312d7d Mon Sep 17 00:00:00 2001 From: cmclark00 Date: Tue, 1 Apr 2025 05:12:04 -0400 Subject: [PATCH] Add perfect clear tracking to StatsManager and fix XP calculation --- .../java/com/pixelmintdrop/MainActivity.kt | 22 +++++++++++++++---- .../model/PlayerProgressionManager.kt | 17 +++++++++----- .../com/pixelmintdrop/model/StatsManager.kt | 17 ++++++++++++++ .../main/res/layout-land/activity_main.xml | 2 +- .../main/res/layout-land/activity_stats.xml | 2 +- app/src/main/res/layout/activity_main.xml | 2 +- app/src/main/res/layout/activity_stats.xml | 2 +- 7 files changed, 50 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/com/pixelmintdrop/MainActivity.kt b/app/src/main/java/com/pixelmintdrop/MainActivity.kt index 5096312..9384137 100644 --- a/app/src/main/java/com/pixelmintdrop/MainActivity.kt +++ b/app/src/main/java/com/pixelmintdrop/MainActivity.kt @@ -301,7 +301,14 @@ class MainActivity : AppCompatActivity(), statsManager.updateSessionStats(finalScore, gameBoard.lines, piecesPlaced, timePlayedMs, currentLevel) // Handle progression - XP earned, potential level up - val xpGained = progressionManager.calculateGameXP(finalScore, gameBoard.lines, currentLevel, timePlayedMs, statsManager.getSessionQuads(), 0) + val xpGained = progressionManager.calculateGameXP( + score = finalScore, + lines = gameBoard.lines, + level = currentLevel, + timePlayedMs = timePlayedMs, + quadCount = statsManager.getSessionQuads(), + perfectClearCount = statsManager.getSessionPerfectClears() + ) val newRewards = progressionManager.addXP(xpGained) // Show progression screen if player earned XP @@ -471,9 +478,9 @@ class MainActivity : AppCompatActivity(), score = score, lines = gameBoard.lines, level = currentLevel, - gameTime = gameTime, + timePlayedMs = gameTime, quadCount = statsManager.getSessionQuads(), - perfectClearCount = 0 // Implement perfect clear tracking if needed + perfectClearCount = statsManager.getSessionPerfectClears() ) // Add XP and check for rewards @@ -911,7 +918,14 @@ class MainActivity : AppCompatActivity(), statsManager.updateSessionStats(finalScore, gameBoard.lines, piecesPlaced, timePlayedMs, currentLevel) // Handle progression - XP earned, potential level up - val xpGained = progressionManager.calculateGameXP(finalScore, gameBoard.lines, currentLevel, timePlayedMs, statsManager.getSessionQuads(), 0) + val xpGained = progressionManager.calculateGameXP( + score = finalScore, + lines = gameBoard.lines, + level = currentLevel, + timePlayedMs = timePlayedMs, + quadCount = statsManager.getSessionQuads(), + perfectClearCount = statsManager.getSessionPerfectClears() + ) val newRewards = progressionManager.addXP(xpGained) // Show progression screen if player earned XP diff --git a/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt b/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt index 7529fef..a83f326 100644 --- a/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt +++ b/app/src/main/java/com/pixelmintdrop/model/PlayerProgressionManager.kt @@ -95,13 +95,13 @@ class PlayerProgressionManager(context: Context) { */ fun calculateGameXP(score: Int, lines: Int, level: Int, timePlayedMs: Long, quadCount: Int, perfectClearCount: Int): Long { - val scoreXP = score * SCORE_XP_MULTIPLIER - val linesXP = lines * LINES_XP_MULTIPLIER * level - val quadBonus = quadCount * QUAD_XP_BONUS * (1 - (level - 1) * 0.05).coerceAtLeast(0.5) - val perfectClearBonus = perfectClearCount * PERFECT_CLEAR_XP_BONUS - val timeBonus = (timePlayedMs / 1000) * TIME_XP_MULTIPLIER + val scoreXP = (score * SCORE_XP_MULTIPLIER).toLong() + val linesXP = (lines * LINES_XP_MULTIPLIER).toLong() + val quadBonus = (quadCount * QUAD_XP_BONUS).toLong() + val perfectClearBonus = (perfectClearCount * 100).toLong() + val timeBonus = (timePlayedMs * TIME_XP_MULTIPLIER).toLong() - return (scoreXP + linesXP + quadBonus + perfectClearBonus + timeBonus).toLong() + return scoreXP + linesXP + quadBonus + perfectClearBonus + timeBonus } /** @@ -318,6 +318,11 @@ class PlayerProgressionManager(context: Context) { THEME_MINIMALIST to 20, THEME_GALAXY to 25 ) + + private const val SCORE_XP_MULTIPLIER = 0.1 + private const val LINES_XP_MULTIPLIER = 5 + private const val QUAD_XP_BONUS = 50 + private const val TIME_XP_MULTIPLIER = 0.01 } /** diff --git a/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt b/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt index 63b0e6f..cd61161 100644 --- a/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt +++ b/app/src/main/java/com/pixelmintdrop/model/StatsManager.kt @@ -35,6 +35,10 @@ class StatsManager(context: Context) { private var sessionTriples: Int = 0 private var sessionQuads: Int = 0 + // Perfect clear stats + private var sessionPerfectClears: Int = 0 + private var totalPerfectClears: Int = 0 + init { loadStats() } @@ -54,6 +58,9 @@ class StatsManager(context: Context) { totalDoubles = prefs.getInt(KEY_TOTAL_DOUBLES, 0) totalTriples = prefs.getInt(KEY_TOTAL_TRIPLES, 0) totalQuads = prefs.getInt(KEY_TOTAL_QUADS, 0) + + // Load perfect clear stats + totalPerfectClears = prefs.getInt(KEY_TOTAL_PERFECT_CLEARS, 0) } private fun saveStats() { @@ -70,6 +77,7 @@ class StatsManager(context: Context) { .putInt(KEY_TOTAL_DOUBLES, totalDoubles) .putInt(KEY_TOTAL_TRIPLES, totalTriples) .putInt(KEY_TOTAL_QUADS, totalQuads) + .putInt(KEY_TOTAL_PERFECT_CLEARS, totalPerfectClears) .apply() } @@ -83,6 +91,7 @@ class StatsManager(context: Context) { sessionDoubles = 0 sessionTriples = 0 sessionQuads = 0 + sessionPerfectClears = 0 } fun updateSessionStats(score: Int, lines: Int, pieces: Int, time: Long, level: Int) { @@ -157,6 +166,10 @@ class StatsManager(context: Context) { fun getSessionTriples(): Int = sessionTriples fun getSessionQuads(): Int = sessionQuads + // Getters for perfect clear stats + fun getSessionPerfectClears(): Int = sessionPerfectClears + fun getTotalPerfectClears(): Int = totalPerfectClears + fun resetStats() { // Reset all lifetime stats totalGames = 0 @@ -174,6 +187,9 @@ class StatsManager(context: Context) { totalTriples = 0 totalQuads = 0 + // Reset perfect clear stats + totalPerfectClears = 0 + // Save the reset stats saveStats() } @@ -192,5 +208,6 @@ class StatsManager(context: Context) { private const val KEY_TOTAL_DOUBLES = "total_doubles" private const val KEY_TOTAL_TRIPLES = "total_triples" private const val KEY_TOTAL_QUADS = "total_quads" + private const val KEY_TOTAL_PERFECT_CLEARS = "total_perfect_clears" } } \ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml index 582437e..eb8a729 100644 --- a/app/src/main/res/layout-land/activity_main.xml +++ b/app/src/main/res/layout-land/activity_main.xml @@ -592,7 +592,7 @@ android:fontFamily="sans-serif" />