Compare commits

..

No commits in common. "103a21d9b74b401694f517fa2618d43d1a51fc36" and "1c57c438ce39747e0ccd39cda8ac03b4dfaa3ef8" have entirely different histories.

14 changed files with 307 additions and 522 deletions

View file

@ -66,7 +66,8 @@ class HighScoreEntryActivity : AppCompatActivity() {
} }
private fun loadThemePreference(): String { private fun loadThemePreference(): String {
return progressionManager.getSelectedTheme() val prefs = getSharedPreferences("mintris_settings", MODE_PRIVATE)
return prefs.getString("selected_theme", PlayerProgressionManager.THEME_CLASSIC) ?: PlayerProgressionManager.THEME_CLASSIC
} }
private fun applyTheme(themeId: String) { private fun applyTheme(themeId: String) {

View file

@ -58,7 +58,8 @@ class HighScoresActivity : AppCompatActivity() {
} }
private fun loadThemePreference(): String { private fun loadThemePreference(): String {
return progressionManager.getSelectedTheme() val prefs = getSharedPreferences("mintris_settings", MODE_PRIVATE)
return prefs.getString("selected_theme", PlayerProgressionManager.THEME_CLASSIC) ?: PlayerProgressionManager.THEME_CLASSIC
} }
private fun applyTheme(themeId: String) { private fun applyTheme(themeId: String) {

View file

@ -91,14 +91,6 @@ class MainActivity : AppCompatActivity() {
themeSelector = binding.themeSelector themeSelector = binding.themeSelector
blockSkinSelector = binding.blockSkinSelector blockSkinSelector = binding.blockSkinSelector
// Set up progression screen
progressionScreen = binding.progressionScreen
progressionScreen.visibility = View.GONE
progressionScreen.onContinue = {
progressionScreen.visibility = View.GONE
binding.gameOverContainer.visibility = View.VISIBLE
}
// Load and apply theme preference // Load and apply theme preference
currentTheme = progressionManager.getSelectedTheme() currentTheme = progressionManager.getSelectedTheme()
applyTheme(currentTheme) applyTheme(currentTheme)
@ -106,17 +98,18 @@ class MainActivity : AppCompatActivity() {
// Load and apply block skin preference // Load and apply block skin preference
gameView.setBlockSkin(progressionManager.getSelectedBlockSkin()) gameView.setBlockSkin(progressionManager.getSelectedBlockSkin())
// Update block skin selector with current selection
blockSkinSelector.updateBlockSkins(
progressionManager.getUnlockedBlocks(),
gameView.getCurrentBlockSkin(),
progressionManager.getPlayerLevel()
)
// Set up game view // Set up game view
gameView.setGameBoard(gameBoard) gameView.setGameBoard(gameBoard)
gameView.setHaptics(gameHaptics) gameView.setHaptics(gameHaptics)
// Set up progression screen
progressionScreen = binding.progressionScreen
progressionScreen.visibility = View.GONE
progressionScreen.onContinue = {
progressionScreen.visibility = View.GONE
binding.gameOverContainer.visibility = View.VISIBLE
}
// Set up theme selector // Set up theme selector
themeSelector.onThemeSelected = { themeId: String -> themeSelector.onThemeSelected = { themeId: String ->
// Apply the new theme // Apply the new theme
@ -358,7 +351,10 @@ class MainActivity : AppCompatActivity() {
var showingHighScore = false var showingHighScore = false
// Show progression screen first with XP animation // Show progression screen first with XP animation
showProgressionScreen(xpGained, newRewards) binding.gameOverContainer.visibility = View.GONE
progressionScreen.visibility = View.VISIBLE
progressionScreen.applyTheme(currentTheme)
progressionScreen.showProgress(progressionManager, xpGained, newRewards, currentTheme)
// Override the continue button behavior if high score needs to be shown // Override the continue button behavior if high score needs to be shown
val originalOnContinue = progressionScreen.onContinue val originalOnContinue = progressionScreen.onContinue
@ -590,55 +586,63 @@ class MainActivity : AppCompatActivity() {
* Apply a theme to the game * Apply a theme to the game
*/ */
private fun applyTheme(themeId: String) { private fun applyTheme(themeId: String) {
// Only apply if the theme is unlocked
if (!progressionManager.isThemeUnlocked(themeId)) return
// Save the selected theme
currentTheme = themeId currentTheme = themeId
val themeColor = when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> Color.WHITE
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#FF00FF")
PlayerProgressionManager.THEME_MONOCHROME -> Color.LTGRAY
PlayerProgressionManager.THEME_RETRO -> Color.parseColor("#FF5A5F")
PlayerProgressionManager.THEME_MINIMALIST -> Color.BLACK
PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#66FCF1")
else -> Color.WHITE
}
// Get background color for the theme
val backgroundColor = when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221")
PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A")
PlayerProgressionManager.THEME_RETRO -> Color.parseColor("#3F2832")
PlayerProgressionManager.THEME_MINIMALIST -> Color.WHITE
PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#0B0C10")
else -> Color.BLACK
}
// Apply background color to root view
binding.root.setBackgroundColor(backgroundColor)
// Apply theme color to title screen
titleScreen.setThemeColor(themeColor)
titleScreen.setBackgroundColor(backgroundColor)
// Apply theme color to game over screen
binding.gameOverContainer.setBackgroundColor(backgroundColor)
binding.gameOverText.setTextColor(themeColor)
binding.scoreText.setTextColor(themeColor)
binding.currentLevelText.setTextColor(themeColor)
binding.linesText.setTextColor(themeColor)
binding.comboText.setTextColor(themeColor)
binding.playAgainButton.setTextColor(themeColor)
binding.playAgainButton.setBackgroundResource(android.R.color.transparent)
binding.playAgainButton.setTextSize(24f)
// Apply theme to progression screen (it will handle its own colors)
progressionScreen.applyTheme(themeId)
// Apply theme color to game view
gameView.setThemeColor(themeColor)
gameView.setBackgroundColor(backgroundColor)
// Save theme preference
progressionManager.setSelectedTheme(themeId) progressionManager.setSelectedTheme(themeId)
// Apply theme to title screen if it's visible
if (titleScreen.visibility == View.VISIBLE) {
titleScreen.applyTheme(themeId)
}
// Apply theme colors based on theme ID
when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> {
// Default black theme
binding.root.setBackgroundColor(Color.BLACK)
}
PlayerProgressionManager.THEME_NEON -> {
// Neon theme with dark purple background
binding.root.setBackgroundColor(Color.parseColor("#0D0221"))
}
PlayerProgressionManager.THEME_MONOCHROME -> {
// Monochrome dark gray
binding.root.setBackgroundColor(Color.parseColor("#1A1A1A"))
}
PlayerProgressionManager.THEME_RETRO -> {
// Retro arcade theme
binding.root.setBackgroundColor(Color.parseColor("#3F2832"))
}
PlayerProgressionManager.THEME_MINIMALIST -> {
// Minimalist white theme
binding.root.setBackgroundColor(Color.WHITE)
// Update text colors for visibility
binding.scoreText.setTextColor(Color.BLACK)
binding.currentLevelText.setTextColor(Color.BLACK)
binding.linesText.setTextColor(Color.BLACK)
binding.comboText.setTextColor(Color.BLACK)
}
PlayerProgressionManager.THEME_GALAXY -> {
// Galaxy dark blue theme
binding.root.setBackgroundColor(Color.parseColor("#0B0C10"))
}
}
// Apply theme to progression screen if it's visible and initialized
if (::progressionScreen.isInitialized && progressionScreen.visibility == View.VISIBLE) {
progressionScreen.applyTheme(themeId)
}
// Apply theme color to the stats button
val textColor = getThemeColor(currentTheme)
binding.statsButton.setTextColor(textColor)
// Update the game view to apply theme
gameView.invalidate()
} }
/** /**
@ -734,16 +738,4 @@ class MainActivity : AppCompatActivity() {
} }
return super.onKeyDown(keyCode, event) return super.onKeyDown(keyCode, event)
} }
private fun showProgressionScreen(xpGained: Long, newRewards: List<String>) {
// Apply theme before showing the screen
progressionScreen.applyTheme(currentTheme)
// Show the progression screen
binding.gameOverContainer.visibility = View.GONE
progressionScreen.visibility = View.VISIBLE
// Display progression data
progressionScreen.showProgress(progressionManager, xpGained, newRewards, currentTheme)
}
} }

View file

@ -44,7 +44,8 @@ class StatsActivity : AppCompatActivity() {
} }
private fun loadThemePreference(): String { private fun loadThemePreference(): String {
return progressionManager.getSelectedTheme() val prefs = getSharedPreferences("mintris_settings", MODE_PRIVATE)
return prefs.getString("selected_theme", PlayerProgressionManager.THEME_CLASSIC) ?: PlayerProgressionManager.THEME_CLASSIC
} }
private fun applyTheme(themeId: String) { private fun applyTheme(themeId: String) {

View file

@ -2,14 +2,12 @@ package com.mintris.game
import android.animation.ValueAnimator import android.animation.ValueAnimator
import android.content.Context import android.content.Context
import android.graphics.BlurMaskFilter
import android.graphics.Canvas import android.graphics.Canvas
import android.graphics.Color import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Paint import android.graphics.Paint
import android.graphics.Rect import android.graphics.Rect
import android.graphics.RectF import android.graphics.RectF
import android.graphics.Shader import android.graphics.BlurMaskFilter
import android.os.Build import android.os.Build
import android.os.Handler import android.os.Handler
import android.os.Looper import android.os.Looper
@ -153,7 +151,6 @@ class GameView @JvmOverloads constructor(
// Block skin // Block skin
private var currentBlockSkin: String = "block_skin_1" private var currentBlockSkin: String = "block_skin_1"
private val blockSkinPaints = mutableMapOf<String, Paint>() private val blockSkinPaints = mutableMapOf<String, Paint>()
private var currentThemeColor = Color.WHITE
private enum class Direction { private enum class Direction {
HORIZONTAL, VERTICAL HORIZONTAL, VERTICAL
@ -176,10 +173,6 @@ class GameView @JvmOverloads constructor(
// Start with paused state // Start with paused state
pause() pause()
// Load saved block skin
val prefs = context.getSharedPreferences("mintris_progression", Context.MODE_PRIVATE)
currentBlockSkin = prefs.getString("selected_block_skin", "block_skin_1") ?: "block_skin_1"
// Connect our callbacks to the GameBoard // Connect our callbacks to the GameBoard
gameBoard.onPieceMove = { onPieceMove?.invoke() } gameBoard.onPieceMove = { onPieceMove?.invoke() }
gameBoard.onPieceLock = { gameBoard.onPieceLock = {
@ -239,7 +232,6 @@ class GameView @JvmOverloads constructor(
blockSkinPaints["block_skin_1"] = Paint().apply { blockSkinPaints["block_skin_1"] = Paint().apply {
color = Color.WHITE color = Color.WHITE
isAntiAlias = true isAntiAlias = true
style = Paint.Style.FILL
} }
// Neon skin // Neon skin
@ -252,8 +244,9 @@ class GameView @JvmOverloads constructor(
// Retro skin // Retro skin
blockSkinPaints["block_skin_3"] = Paint().apply { blockSkinPaints["block_skin_3"] = Paint().apply {
color = Color.parseColor("#FF5A5F") color = Color.parseColor("#FF5A5F")
isAntiAlias = false // Pixelated look isAntiAlias = true
style = Paint.Style.FILL style = Paint.Style.STROKE
strokeWidth = 2f
} }
// Minimalist skin // Minimalist skin
@ -276,9 +269,6 @@ class GameView @JvmOverloads constructor(
*/ */
fun setBlockSkin(skinId: String) { fun setBlockSkin(skinId: String) {
currentBlockSkin = skinId currentBlockSkin = skinId
// Save the selection to SharedPreferences
val prefs = context.getSharedPreferences("mintris_progression", Context.MODE_PRIVATE)
prefs.edit().putString("selected_block_skin", skinId).commit()
invalidate() invalidate()
} }
@ -604,139 +594,61 @@ class GameView @JvmOverloads constructor(
// Create a clone of the paint to avoid modifying the original // Create a clone of the paint to avoid modifying the original
val blockPaint = Paint(paint) val blockPaint = Paint(paint)
// Draw block based on current skin // Special handling for neon skin
when (currentBlockSkin) { if (currentBlockSkin == "block_skin_2") {
"block_skin_1" -> { // Classic // Stronger outer glow for neon skin
// Draw outer glow blockGlowPaint.color = if (isGhost) Color.argb(30, 255, 0, 255) else Color.parseColor("#FF00FF")
blockGlowPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else Color.WHITE blockGlowPaint.maskFilter = BlurMaskFilter(16f, BlurMaskFilter.Blur.OUTER)
canvas.drawRect(left - 2f, top - 2f, right + 2f, bottom + 2f, blockGlowPaint) canvas.drawRect(left - 4f, top - 4f, right + 4f, bottom + 4f, blockGlowPaint)
// Draw block // For neon, use semi-translucent fill with strong glowing edges
blockPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else Color.WHITE blockPaint.style = Paint.Style.FILL_AND_STROKE
blockPaint.alpha = if (isGhost) 30 else 255 blockPaint.strokeWidth = 2f
canvas.drawRect(left, top, right, bottom, blockPaint) blockPaint.maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.NORMAL)
// Draw inner glow if (isGhost) {
glowPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else Color.WHITE blockPaint.color = Color.argb(30, 255, 0, 255)
canvas.drawRect(left + 1f, top + 1f, right - 1f, bottom - 1f, glowPaint) blockPaint.alpha = 30
} else {
blockPaint.color = Color.parseColor("#66004D") // Darker magenta fill
blockPaint.alpha = 170 // More opaque to be more visible
} }
"block_skin_2" -> { // Neon
// Stronger outer glow for neon skin // Draw block with neon effect
blockGlowPaint.color = if (isGhost) Color.argb(30, 255, 0, 255) else Color.parseColor("#FF00FF") canvas.drawRect(left, top, right, bottom, blockPaint)
blockGlowPaint.maskFilter = BlurMaskFilter(16f, BlurMaskFilter.Blur.OUTER)
canvas.drawRect(left - 4f, top - 4f, right + 4f, bottom + 4f, blockGlowPaint) // Draw a brighter border for better visibility
val borderPaint = Paint().apply {
// For neon, use semi-translucent fill with strong glowing edges color = Color.parseColor("#FF00FF")
blockPaint.style = Paint.Style.FILL_AND_STROKE style = Paint.Style.STROKE
blockPaint.strokeWidth = 2f strokeWidth = 3f
blockPaint.maskFilter = BlurMaskFilter(8f, BlurMaskFilter.Blur.NORMAL) alpha = 255
isAntiAlias = true
if (isGhost) { maskFilter = BlurMaskFilter(6f, BlurMaskFilter.Blur.NORMAL)
blockPaint.color = Color.argb(30, 255, 0, 255)
blockPaint.alpha = 30
} else {
blockPaint.color = Color.parseColor("#66004D") // Darker magenta fill
blockPaint.alpha = 170 // More opaque to be more visible
}
// Draw block with neon effect
canvas.drawRect(left, top, right, bottom, blockPaint)
// Draw a brighter border for better visibility
val borderPaint = Paint().apply {
color = Color.parseColor("#FF00FF")
style = Paint.Style.STROKE
strokeWidth = 3f
alpha = 255
isAntiAlias = true
maskFilter = BlurMaskFilter(6f, BlurMaskFilter.Blur.NORMAL)
}
canvas.drawRect(left, top, right, bottom, borderPaint)
// Inner glow for neon blocks
glowPaint.color = if (isGhost) Color.argb(10, 255, 0, 255) else Color.parseColor("#FF00FF")
glowPaint.alpha = if (isGhost) 10 else 100
glowPaint.style = Paint.Style.STROKE
glowPaint.strokeWidth = 2f
glowPaint.maskFilter = BlurMaskFilter(4f, BlurMaskFilter.Blur.NORMAL)
canvas.drawRect(left + 4f, top + 4f, right - 4f, bottom - 4f, glowPaint)
}
"block_skin_3" -> { // Retro
// Draw pixelated block with retro effect
blockPaint.color = if (isGhost) Color.argb(30, 255, 90, 95) else Color.parseColor("#FF5A5F")
blockPaint.alpha = if (isGhost) 30 else 255
// Draw main block
canvas.drawRect(left, top, right, bottom, blockPaint)
// Draw pixelated highlights
val highlightPaint = Paint().apply {
color = Color.parseColor("#FF8A8F")
isAntiAlias = false
style = Paint.Style.FILL
}
// Top and left highlights
canvas.drawRect(left, top, right - 2f, top + 2f, highlightPaint)
canvas.drawRect(left, top, left + 2f, bottom - 2f, highlightPaint)
// Draw pixelated shadows
val shadowPaint = Paint().apply {
color = Color.parseColor("#CC4A4F")
isAntiAlias = false
style = Paint.Style.FILL
}
// Bottom and right shadows
canvas.drawRect(left + 2f, bottom - 2f, right, bottom, shadowPaint)
canvas.drawRect(right - 2f, top + 2f, right, bottom - 2f, shadowPaint)
}
"block_skin_4" -> { // Minimalist
// Draw clean, simple block with subtle border
blockPaint.color = if (isGhost) Color.argb(30, 0, 0, 0) else Color.BLACK
blockPaint.alpha = if (isGhost) 30 else 255
blockPaint.style = Paint.Style.FILL
canvas.drawRect(left, top, right, bottom, blockPaint)
// Draw subtle border
val borderPaint = Paint().apply {
color = Color.parseColor("#333333")
style = Paint.Style.STROKE
strokeWidth = 1f
isAntiAlias = true
}
canvas.drawRect(left, top, right, bottom, borderPaint)
}
"block_skin_5" -> { // Galaxy
// Draw cosmic glow effect
blockGlowPaint.color = if (isGhost) Color.argb(30, 102, 252, 241) else Color.parseColor("#66FCF1")
blockGlowPaint.maskFilter = BlurMaskFilter(20f, BlurMaskFilter.Blur.OUTER)
canvas.drawRect(left - 8f, top - 8f, right + 8f, bottom + 8f, blockGlowPaint)
// Draw main block with gradient
val gradient = LinearGradient(
left, top, right, bottom,
Color.parseColor("#66FCF1"),
Color.parseColor("#45B7AF"),
Shader.TileMode.CLAMP
)
blockPaint.shader = gradient
blockPaint.color = if (isGhost) Color.argb(30, 102, 252, 241) else Color.parseColor("#66FCF1")
blockPaint.alpha = if (isGhost) 30 else 255
blockPaint.style = Paint.Style.FILL
canvas.drawRect(left, top, right, bottom, blockPaint)
// Draw star-like sparkles
if (!isGhost) {
val sparklePaint = Paint().apply {
color = Color.WHITE
style = Paint.Style.FILL
isAntiAlias = true
maskFilter = BlurMaskFilter(4f, BlurMaskFilter.Blur.NORMAL)
}
// Add small white dots for sparkle effect
canvas.drawCircle(left + 4f, top + 4f, 1f, sparklePaint)
canvas.drawCircle(right - 4f, bottom - 4f, 1f, sparklePaint)
}
} }
canvas.drawRect(left, top, right, bottom, borderPaint)
// Inner glow for neon blocks - brighter than before
glowPaint.color = if (isGhost) Color.argb(10, 255, 0, 255) else Color.parseColor("#FF00FF")
glowPaint.alpha = if (isGhost) 10 else 100 // More visible inner glow
glowPaint.style = Paint.Style.STROKE
glowPaint.strokeWidth = 2f
glowPaint.maskFilter = BlurMaskFilter(4f, BlurMaskFilter.Blur.NORMAL)
canvas.drawRect(left + 4f, top + 4f, right - 4f, bottom - 4f, glowPaint)
} else {
// Standard rendering for other skins
// Draw outer glow
blockGlowPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else Color.WHITE
canvas.drawRect(left - 2f, top - 2f, right + 2f, bottom + 2f, blockGlowPaint)
// Draw block with current skin
blockPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else blockPaint.color
blockPaint.alpha = if (isGhost) 30 else 255
canvas.drawRect(left, top, right, bottom, blockPaint)
// Draw inner glow
glowPaint.color = if (isGhost) Color.argb(30, 255, 255, 255) else Color.WHITE
canvas.drawRect(left + 1f, top + 1f, right - 1f, bottom - 1f, glowPaint)
} }
// Draw pulse effect if animation is active and this is a pulsing line // Draw pulse effect if animation is active and this is a pulsing line
@ -1051,26 +963,4 @@ class GameView @JvmOverloads constructor(
} }
pulseAnimator?.start() pulseAnimator?.start()
} }
/**
* Set the theme color for the game view
*/
fun setThemeColor(color: Int) {
currentThemeColor = color
blockPaint.color = color
ghostBlockPaint.color = color
glowPaint.color = color
blockGlowPaint.color = color
borderGlowPaint.color = color
pulsePaint.color = color
invalidate()
}
/**
* Set the background color for the game view
*/
override fun setBackgroundColor(color: Int) {
super.setBackgroundColor(color)
invalidate()
}
} }

View file

@ -46,9 +46,8 @@ class TitleScreen @JvmOverloads constructor(
// Callback for when the user touches the screen // Callback for when the user touches the screen
var onStartGame: (() -> Unit)? = null var onStartGame: (() -> Unit)? = null
// Theme color and background color // Theme color
private var themeColor = Color.WHITE private var themeColor = Color.WHITE
private var backgroundColor = Color.BLACK
// Define tetromino shapes (I, O, T, S, Z, J, L) // Define tetromino shapes (I, O, T, S, Z, J, L)
private val tetrominoShapes = arrayOf( private val tetrominoShapes = arrayOf(
@ -111,7 +110,7 @@ class TitleScreen @JvmOverloads constructor(
init { init {
// Title text settings // Title text settings
titlePaint.apply { titlePaint.apply {
color = themeColor color = Color.WHITE
textSize = 120f textSize = 120f
textAlign = Paint.Align.CENTER textAlign = Paint.Align.CENTER
typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD) typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD)
@ -120,7 +119,7 @@ class TitleScreen @JvmOverloads constructor(
// "Touch to start" text settings // "Touch to start" text settings
promptPaint.apply { promptPaint.apply {
color = themeColor color = Color.WHITE
textSize = 50f textSize = 50f
textAlign = Paint.Align.CENTER textAlign = Paint.Align.CENTER
typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL) typeface = Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL)
@ -130,7 +129,7 @@ class TitleScreen @JvmOverloads constructor(
// High scores text settings // High scores text settings
highScorePaint.apply { highScorePaint.apply {
color = themeColor color = Color.WHITE
textSize = 70f textSize = 70f
textAlign = Paint.Align.LEFT // Changed to LEFT alignment textAlign = Paint.Align.LEFT // Changed to LEFT alignment
typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL) // Changed to monospace typeface = Typeface.create(Typeface.MONOSPACE, Typeface.NORMAL) // Changed to monospace
@ -138,16 +137,16 @@ class TitleScreen @JvmOverloads constructor(
alpha = 200 alpha = 200
} }
// General paint settings for tetrominos // General paint settings for tetrominos (white)
paint.apply { paint.apply {
color = themeColor color = Color.WHITE
style = Paint.Style.FILL style = Paint.Style.FILL
isAntiAlias = true isAntiAlias = true
} }
// Glow paint settings for tetrominos // Glow paint settings for tetrominos
glowPaint.apply { glowPaint.apply {
color = themeColor color = Color.WHITE
style = Paint.Style.FILL style = Paint.Style.FILL
isAntiAlias = true isAntiAlias = true
alpha = 60 alpha = 60
@ -185,8 +184,8 @@ class TitleScreen @JvmOverloads constructor(
try { try {
super.onDraw(canvas) super.onDraw(canvas)
// Draw background using the current background color // Draw background
canvas.drawColor(backgroundColor) canvas.drawColor(Color.BLACK)
// Add any pending tetrominos // Add any pending tetrominos
tetrominos.addAll(tetrominosToAdd) tetrominos.addAll(tetrominosToAdd)
@ -341,7 +340,7 @@ class TitleScreen @JvmOverloads constructor(
glowPaint.color = themeColor glowPaint.color = themeColor
// Update background color // Update background color
backgroundColor = when (themeId) { setBackgroundColor(when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221") PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221")
PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A") PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A")
@ -349,29 +348,8 @@ class TitleScreen @JvmOverloads constructor(
PlayerProgressionManager.THEME_MINIMALIST -> Color.WHITE PlayerProgressionManager.THEME_MINIMALIST -> Color.WHITE
PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#0B0C10") PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#0B0C10")
else -> Color.BLACK else -> Color.BLACK
} })
invalidate() invalidate()
} }
/**
* Set the theme color for the title screen
*/
fun setThemeColor(color: Int) {
themeColor = color
titlePaint.color = color
promptPaint.color = color
highScorePaint.color = color
paint.color = color
glowPaint.color = color
invalidate()
}
/**
* Set the background color for the title screen
*/
override fun setBackgroundColor(color: Int) {
backgroundColor = color
invalidate()
}
} }

View file

@ -5,7 +5,6 @@ import android.content.SharedPreferences
import com.mintris.R import com.mintris.R
import kotlin.math.pow import kotlin.math.pow
import kotlin.math.roundToInt import kotlin.math.roundToInt
import kotlin.math.min
/** /**
* Manages player progression, experience points, and unlockable rewards * Manages player progression, experience points, and unlockable rewards
@ -95,22 +94,21 @@ class PlayerProgressionManager(context: Context) {
*/ */
fun calculateGameXP(score: Int, lines: Int, level: Int, gameTime: Long, fun calculateGameXP(score: Int, lines: Int, level: Int, gameTime: Long,
tetrisCount: Int, perfectClearCount: Int): Long { tetrisCount: Int, perfectClearCount: Int): Long {
// Base XP from score with level multiplier (capped at level 10) // Base XP from score with level multiplier
val cappedLevel = min(level, 10) val scoreXP = (score * (1 + LEVEL_MULTIPLIER * level)).toLong()
val scoreXP = (score * (1 + LEVEL_MULTIPLIER * cappedLevel)).toLong()
// XP from lines cleared (reduced for higher levels) // XP from lines cleared
val linesXP = lines * XP_PER_LINE * (1 - (level - 1) * 0.05).coerceAtLeast(0.5) val linesXP = lines * XP_PER_LINE
// XP from special moves (reduced for higher levels) // XP from special moves
val tetrisBonus = tetrisCount * TETRIS_XP_BONUS * (1 - (level - 1) * 0.05).coerceAtLeast(0.5) val tetrisBonus = tetrisCount * TETRIS_XP_BONUS
val perfectClearBonus = perfectClearCount * PERFECT_CLEAR_XP_BONUS * (1 - (level - 1) * 0.05).coerceAtLeast(0.5) val perfectClearBonus = perfectClearCount * PERFECT_CLEAR_XP_BONUS
// Time bonus (reduced for longer games) // Time bonus (to reward longer gameplay)
val timeBonus = (gameTime / 60000) * TIME_XP_PER_MINUTE * (1 - (gameTime / 3600000) * 0.1).coerceAtLeast(0.5) val timeBonus = (gameTime / 60000) * TIME_XP_PER_MINUTE // XP per minute played
// Calculate total XP // Calculate total XP
return (scoreXP + linesXP + tetrisBonus + perfectClearBonus + timeBonus).toLong() return scoreXP + linesXP + tetrisBonus + perfectClearBonus + timeBonus
} }
/** /**
@ -283,19 +281,21 @@ class PlayerProgressionManager(context: Context) {
private const val KEY_UNLOCKED_THEMES = "unlocked_themes" private const val KEY_UNLOCKED_THEMES = "unlocked_themes"
private const val KEY_UNLOCKED_BLOCKS = "unlocked_blocks" private const val KEY_UNLOCKED_BLOCKS = "unlocked_blocks"
private const val KEY_UNLOCKED_BADGES = "unlocked_badges" private const val KEY_UNLOCKED_BADGES = "unlocked_badges"
private const val KEY_SELECTED_THEME = "selected_theme"
private const val KEY_SELECTED_BLOCK_SKIN = "selected_block_skin" private const val KEY_SELECTED_BLOCK_SKIN = "selected_block_skin"
private const val KEY_SELECTED_THEME = "selected_theme"
// XP constants // XP curve parameters
private const val BASE_XP = 3000L private const val BASE_XP = 4000.0 // Base XP for level 1 (reduced from 5000)
private const val XP_CURVE_FACTOR = 2.0 private const val XP_CURVE_FACTOR = 1.9 // Exponential factor for XP curve (reduced from 2.2)
private const val LEVEL_MULTIPLIER = 0.03
private const val XP_PER_LINE = 40L
private const val TETRIS_XP_BONUS = 150L
private const val PERFECT_CLEAR_XP_BONUS = 300L
private const val TIME_XP_PER_MINUTE = 20L
// Theme constants // XP calculation constants
private const val LEVEL_MULTIPLIER = 0.15 // 15% bonus per level (increased from 10%)
private const val XP_PER_LINE = 15L // Increased from 10
private const val TETRIS_XP_BONUS = 75L // Increased from 50
private const val PERFECT_CLEAR_XP_BONUS = 250L // Increased from 200
private const val TIME_XP_PER_MINUTE = 8L // Increased from 5
// Theme IDs with required levels
const val THEME_CLASSIC = "theme_classic" const val THEME_CLASSIC = "theme_classic"
const val THEME_NEON = "theme_neon" const val THEME_NEON = "theme_neon"
const val THEME_MONOCHROME = "theme_monochrome" const val THEME_MONOCHROME = "theme_monochrome"
@ -326,7 +326,7 @@ class PlayerProgressionManager(context: Context) {
*/ */
fun setSelectedBlockSkin(skinId: String) { fun setSelectedBlockSkin(skinId: String) {
if (unlockedBlocks.contains(skinId)) { if (unlockedBlocks.contains(skinId)) {
prefs.edit().putString(KEY_SELECTED_BLOCK_SKIN, skinId).commit() prefs.edit().putString(KEY_SELECTED_BLOCK_SKIN, skinId).apply()
} }
} }

View file

@ -31,9 +31,6 @@ class ProgressionScreen @JvmOverloads constructor(
private val rewardsContainer: LinearLayout private val rewardsContainer: LinearLayout
private val continueButton: TextView private val continueButton: TextView
// Current theme
private var currentTheme: String = PlayerProgressionManager.THEME_CLASSIC
// Callback for when the player dismisses the screen // Callback for when the player dismisses the screen
var onContinue: (() -> Unit)? = null var onContinue: (() -> Unit)? = null
@ -65,9 +62,6 @@ class ProgressionScreen @JvmOverloads constructor(
newRewards: List<String>, newRewards: List<String>,
themeId: String = PlayerProgressionManager.THEME_CLASSIC themeId: String = PlayerProgressionManager.THEME_CLASSIC
) { ) {
// Update current theme
currentTheme = themeId
// Hide rewards container initially if there are no new rewards // Hide rewards container initially if there are no new rewards
rewardsContainer.visibility = if (newRewards.isEmpty()) View.GONE else View.INVISIBLE rewardsContainer.visibility = if (newRewards.isEmpty()) View.GONE else View.INVISIBLE
@ -80,39 +74,20 @@ class ProgressionScreen @JvmOverloads constructor(
playerLevelText.text = "Player Level: $playerLevel" playerLevelText.text = "Player Level: $playerLevel"
xpGainText.text = "+$xpGained XP" xpGainText.text = "+$xpGained XP"
// Update level up text visibility // Begin animation sequence
val progressionTitle = findViewById<TextView>(R.id.progression_title) xpProgressBar.setXPValues(playerLevel, currentXP, xpForNextLevel)
progressionTitle.visibility = if (newRewards.any { it.contains("Level") }) View.VISIBLE else View.GONE
// Start with initial animations // Animate XP gain text entrance
AnimatorSet().apply { val xpTextAnimator = ObjectAnimator.ofFloat(xpGainText, "alpha", 0f, 1f).apply {
// Fade in the XP gain text duration = 500
val xpTextAnimator = ObjectAnimator.ofFloat(xpGainText, "alpha", 0f, 1f).apply {
duration = 800
interpolator = AccelerateDecelerateInterpolator()
}
// Set up the XP progress bar animation sequence
val xpBarAnimator = ObjectAnimator.ofFloat(xpProgressBar, "alpha", 0f, 1f).apply {
duration = 800
interpolator = AccelerateDecelerateInterpolator()
}
// Play animations in sequence
play(xpTextAnimator)
play(xpBarAnimator).after(xpTextAnimator)
start()
} }
// Set initial progress bar state // Schedule animation for the XP bar after text appears
xpProgressBar.setXPValues(playerLevel, currentXP - xpGained, xpForNextLevel)
// Animate the XP gain after a short delay
postDelayed({ postDelayed({
xpProgressBar.animateXPGain(xpGained, playerLevel, currentXP, xpForNextLevel) xpProgressBar.animateXPGain(xpGained, playerLevel, currentXP, xpForNextLevel)
}, 1000) // Increased delay to 1 second for better visual flow }, 600)
// If there are new rewards, show them with animation after XP bar animation // If there are new rewards, show them with animation
if (newRewards.isNotEmpty()) { if (newRewards.isNotEmpty()) {
// Create reward cards // Create reward cards
rewardsContainer.removeAllViews() rewardsContainer.removeAllViews()
@ -138,12 +113,18 @@ class ProgressionScreen @JvmOverloads constructor(
card.animate() card.animate()
.alpha(1f) .alpha(1f)
.translationY(0f) .translationY(0f)
.setDuration(600) // Increased duration for smoother animation .setDuration(400)
.setStartDelay((i * 200).toLong()) // Increased delay between cards .setStartDelay((i * 150).toLong())
.setInterpolator(OvershootInterpolator()) .setInterpolator(OvershootInterpolator())
.start() .start()
} }
}, 2500) // Increased delay to wait for XP bar animation to finish }, 2000) // Wait for XP bar animation to finish
}
// Start with initial animations
AnimatorSet().apply {
play(xpTextAnimator)
start()
} }
} }
@ -156,17 +137,8 @@ class ProgressionScreen @JvmOverloads constructor(
cardElevation = 4f cardElevation = 4f
useCompatPadding = true useCompatPadding = true
// Set background color based on current theme // Default background color - will be adjusted based on theme
val backgroundColor = when (currentTheme) { setCardBackgroundColor(Color.BLACK)
PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221")
PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A")
PlayerProgressionManager.THEME_RETRO -> Color.parseColor("#3F2832")
PlayerProgressionManager.THEME_MINIMALIST -> Color.WHITE
PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#0B0C10")
else -> Color.BLACK
}
setCardBackgroundColor(backgroundColor)
layoutParams = LinearLayout.LayoutParams( layoutParams = LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT,
@ -195,8 +167,6 @@ class ProgressionScreen @JvmOverloads constructor(
* Apply the current theme to the progression screen * Apply the current theme to the progression screen
*/ */
fun applyTheme(themeId: String) { fun applyTheme(themeId: String) {
currentTheme = themeId
// Get reference to the title text // Get reference to the title text
val progressionTitle = findViewById<TextView>(R.id.progression_title) val progressionTitle = findViewById<TextView>(R.id.progression_title)
val rewardsTitle = findViewById<TextView>(R.id.rewards_title) val rewardsTitle = findViewById<TextView>(R.id.rewards_title)
@ -278,10 +248,10 @@ class ProgressionScreen @JvmOverloads constructor(
} }
} }
// Update XP progress bar theme color // Set theme color on XP progress bar
xpProgressBar.setThemeColor(xpThemeColor) xpProgressBar.setThemeColor(xpThemeColor)
// Update reward card colors // Update card colors for any existing reward cards
updateRewardCardColors(themeId) updateRewardCardColors(themeId)
} }
@ -289,7 +259,8 @@ class ProgressionScreen @JvmOverloads constructor(
* Update colors of existing reward cards to match the theme * Update colors of existing reward cards to match the theme
*/ */
private fun updateRewardCardColors(themeId: String) { private fun updateRewardCardColors(themeId: String) {
val backgroundColor = when (themeId) { // Color for card backgrounds based on theme
val cardBackgroundColor = when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK PlayerProgressionManager.THEME_CLASSIC -> Color.BLACK
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221") PlayerProgressionManager.THEME_NEON -> Color.parseColor("#0D0221")
PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A") PlayerProgressionManager.THEME_MONOCHROME -> Color.parseColor("#1A1A1A")
@ -299,9 +270,28 @@ class ProgressionScreen @JvmOverloads constructor(
else -> Color.BLACK else -> Color.BLACK
} }
// Text color for rewards based on theme
val rewardTextColor = when (themeId) {
PlayerProgressionManager.THEME_CLASSIC -> Color.WHITE
PlayerProgressionManager.THEME_NEON -> Color.parseColor("#FF00FF")
PlayerProgressionManager.THEME_MONOCHROME -> Color.LTGRAY
PlayerProgressionManager.THEME_RETRO -> Color.parseColor("#FF5A5F")
PlayerProgressionManager.THEME_MINIMALIST -> Color.BLACK
PlayerProgressionManager.THEME_GALAXY -> Color.parseColor("#66FCF1")
else -> Color.WHITE
}
// Update each card in the rewards container
for (i in 0 until rewardsContainer.childCount) { for (i in 0 until rewardsContainer.childCount) {
val card = rewardsContainer.getChildAt(i) as? CardView val card = rewardsContainer.getChildAt(i) as? CardView
card?.setCardBackgroundColor(backgroundColor) card?.let {
it.setCardBackgroundColor(cardBackgroundColor)
// Update text color in the card
if (it.childCount > 0 && it.getChildAt(0) is TextView) {
(it.getChildAt(0) as TextView).setTextColor(rewardTextColor)
}
}
} }
} }
} }

View file

@ -99,8 +99,6 @@ class XPProgressBar @JvmOverloads constructor(
*/ */
fun setThemeColor(color: Int) { fun setThemeColor(color: Int) {
themeColor = color themeColor = color
progressPaint.color = color
textPaint.color = color
levelBadgePaint.color = color levelBadgePaint.color = color
invalidate() invalidate()
} }

View file

@ -62,40 +62,36 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="24sp"
android:textStyle="bold" android:fontFamily="sans-serif-light"
android:fontFamily="sans-serif" tools:text="Score: 0" />
tools:text="score: 0" />
<TextView <TextView
android:id="@+id/currentLevelText" android:id="@+id/currentLevelText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="24sp"
android:textStyle="bold" android:fontFamily="sans-serif-light"
android:fontFamily="sans-serif" tools:text="Level: 1" />
tools:text="level: 1" />
<TextView <TextView
android:id="@+id/linesText" android:id="@+id/linesText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="24sp"
android:textStyle="bold" android:fontFamily="sans-serif-light"
android:fontFamily="sans-serif" tools:text="Lines: 0" />
tools:text="lines: 0" />
<TextView <TextView
android:id="@+id/comboText" android:id="@+id/comboText"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="32sp" android:textSize="24sp"
android:textStyle="bold" android:fontFamily="sans-serif-light"
android:fontFamily="sans-serif" tools:text="Combo: 0" />
tools:text="combo: 0" />
</LinearLayout> </LinearLayout>
<!-- Next Piece Preview --> <!-- Next Piece Preview -->
@ -135,18 +131,16 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/game_over" android:text="@string/game_over"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="36sp" android:textSize="24sp"
android:textStyle="bold" android:textStyle="bold" />
android:fontFamily="sans-serif" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/session_stats" android:text="@string/session_stats"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="28sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:layout_marginTop="24dp" /> android:layout_marginTop="24dp" />
<TextView <TextView
@ -155,9 +149,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionLinesText" android:id="@+id/sessionLinesText"
@ -165,9 +157,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionPiecesText" android:id="@+id/sessionPiecesText"
@ -175,9 +165,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionTimeText" android:id="@+id/sessionTimeText"
@ -185,9 +173,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionLevelText" android:id="@+id/sessionLevelText"
@ -195,18 +181,15 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/line_clears" android:text="@string/line_clears"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="28sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:layout_marginTop="16dp" /> android:layout_marginTop="16dp" />
<TextView <TextView
@ -215,9 +198,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionDoublesText" android:id="@+id/sessionDoublesText"
@ -225,9 +206,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionTriplesText" android:id="@+id/sessionTriplesText"
@ -235,9 +214,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/sessionTetrisesText" android:id="@+id/sessionTetrisesText"
@ -245,9 +222,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="4dp" android:layout_marginTop="4dp"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<Button <Button
android:id="@+id/playAgainButton" android:id="@+id/playAgainButton"
@ -256,10 +231,7 @@
android:layout_marginTop="32dp" android:layout_marginTop="32dp"
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/play" android:text="@string/play"
android:textColor="@color/white" android:textColor="@color/white" />
android:textSize="24sp"
android:textStyle="bold"
android:fontFamily="sans-serif" />
</LinearLayout> </LinearLayout>
<!-- Player Progression Screen --> <!-- Player Progression Screen -->
@ -298,9 +270,7 @@
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="24sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif" android:layout_marginEnd="16dp" />
android:layout_marginEnd="16dp"
android:textAllCaps="false" />
<com.mintris.ui.LevelBadge <com.mintris.ui.LevelBadge
android:id="@+id/pauseLevelBadge" android:id="@+id/pauseLevelBadge"
@ -329,10 +299,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/start" android:text="@string/start"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<Button <Button
android:id="@+id/resumeButton" android:id="@+id/resumeButton"
@ -342,10 +309,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/resume" android:text="@string/resume"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<Button <Button
android:id="@+id/pauseRestartButton" android:id="@+id/pauseRestartButton"
@ -355,10 +319,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/restart" android:text="@string/restart"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<Button <Button
android:id="@+id/highScoresButton" android:id="@+id/highScoresButton"
@ -368,10 +329,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/high_scores" android:text="@string/high_scores"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<Button <Button
android:id="@+id/statsButton" android:id="@+id/statsButton"
@ -381,10 +339,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/stats" android:text="@string/stats"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<LinearLayout <LinearLayout
android:id="@+id/levelSelectorContainer" android:id="@+id/levelSelectorContainer"
@ -400,10 +355,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/select_level" android:text="@string/select_level"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="16sp"
android:textStyle="bold" android:textStyle="bold" />
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -418,9 +371,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="" android:text=""
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="24sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
<TextView <TextView
android:id="@+id/pauseLevelText" android:id="@+id/pauseLevelText"
@ -430,8 +381,7 @@
android:text="1" android:text="1"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="24sp"
android:textStyle="bold" android:textStyle="bold" />
android:fontFamily="sans-serif" />
<Button <Button
android:id="@+id/pauseLevelUpButton" android:id="@+id/pauseLevelUpButton"
@ -440,9 +390,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="+" android:text="+"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="24sp" />
android:textStyle="bold"
android:fontFamily="sans-serif" />
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>
@ -470,10 +418,7 @@
android:background="@color/transparent" android:background="@color/transparent"
android:text="@string/sound_on" android:text="@string/sound_on"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp" />
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false" />
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -488,10 +433,7 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/music" android:text="@string/music"
android:textColor="@color/white" android:textColor="@color/white"
android:textSize="24sp" android:textSize="18sp"
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textAllCaps="false"
android:layout_marginEnd="16dp" /> android:layout_marginEnd="16dp" />
<ImageButton <ImageButton

View file

@ -9,11 +9,10 @@
android:id="@+id/available_skins_label" android:id="@+id/available_skins_label"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="block skins" android:text="BLOCK SKINS"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="24sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:gravity="center" android:gravity="center"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />

View file

@ -3,16 +3,16 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:padding="16dp"> android:padding="16dp"
android:background="@color/black">
<TextView <TextView
android:id="@+id/progression_title" android:id="@+id/progression_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="level up" android:text="LEVEL UP"
android:textSize="48sp" android:textSize="24sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:textColor="@color/white" android:textColor="@color/white"
android:gravity="center" android:gravity="center"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
@ -22,10 +22,8 @@
android:id="@+id/player_level_text" android:id="@+id/player_level_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="player level: 1" android:text="Player Level: 1"
android:textSize="36sp" android:textSize="20sp"
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textColor="@color/white" android:textColor="@color/white"
android:gravity="center" android:gravity="center"
android:layout_marginBottom="24dp" /> android:layout_marginBottom="24dp" />
@ -40,11 +38,10 @@
android:id="@+id/xp_gain_text" android:id="@+id/xp_gain_text"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="+0 xp" android:text="+0 XP"
android:textSize="42sp" android:textSize="22sp"
android:textStyle="bold"
android:fontFamily="sans-serif"
android:textColor="#50C878" android:textColor="#50C878"
android:textStyle="bold"
android:gravity="center" android:gravity="center"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
android:layout_marginBottom="24dp" /> android:layout_marginBottom="24dp" />
@ -53,10 +50,9 @@
android:id="@+id/rewards_title" android:id="@+id/rewards_title"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="rewards unlocked" android:text="REWARDS UNLOCKED"
android:textSize="36sp" android:textSize="20sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:textColor="#FFD700" android:textColor="#FFD700"
android:gravity="center" android:gravity="center"
android:layout_marginTop="8dp" android:layout_marginTop="8dp"
@ -80,10 +76,8 @@
android:id="@+id/continue_button" android:id="@+id/continue_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="continue" android:text="CONTINUE"
android:textSize="32sp" android:textSize="18sp"
android:textStyle="bold"
android:fontFamily="sans-serif"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="16dp"

View file

@ -9,11 +9,10 @@
android:id="@+id/available_themes_label" android:id="@+id/available_themes_label"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="available themes" android:text="AVAILABLE THEMES"
android:textColor="@android:color/white" android:textColor="@android:color/white"
android:textSize="24sp" android:textSize="18sp"
android:textStyle="bold" android:textStyle="bold"
android:fontFamily="sans-serif"
android:gravity="center" android:gravity="center"
android:layout_marginBottom="16dp" /> android:layout_marginBottom="16dp" />

View file

@ -1,49 +1,49 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<string name="app_name">mintris</string> <string name="app_name">Mintris</string>
<string name="game_over">game over</string> <string name="game_over">Game Over</string>
<string name="score">score</string> <string name="score">Score</string>
<string name="level">level</string> <string name="level">Level</string>
<string name="lines">lines</string> <string name="lines">Lines</string>
<string name="next">next</string> <string name="next">Next</string>
<string name="play">play again</string> <string name="play">Play Again</string>
<string name="resume">resume</string> <string name="resume">Resume</string>
<string name="pause">pause</string> <string name="pause">PAUSE</string>
<string name="settings">settings</string> <string name="settings">Settings</string>
<string name="start">start game</string> <string name="start">Start Game</string>
<string name="restart">restart</string> <string name="restart">Restart</string>
<string name="select_level">select level</string> <string name="select_level">Select Level</string>
<string name="sound_on">sound: on</string> <string name="sound_on">Sound: On</string>
<string name="sound_off">sound: off</string> <string name="sound_off">Sound: Off</string>
<string name="toggle_music">toggle music</string> <string name="toggle_music">Toggle music</string>
<string name="high_scores">high scores</string> <string name="high_scores">High Scores</string>
<string name="new_high_score">new high score!</string> <string name="new_high_score">New High Score!</string>
<string name="save">save</string> <string name="save">Save</string>
<string name="back">back</string> <string name="back">Back</string>
<!-- Stats Screen --> <!-- Stats Screen -->
<string name="lifetime_stats">lifetime stats</string> <string name="lifetime_stats">Lifetime Stats</string>
<string name="best_performance">best performance</string> <string name="best_performance">Best Performance</string>
<string name="total_games">total games: %d</string> <string name="total_games">Total Games: %d</string>
<string name="total_score">total score: %d</string> <string name="total_score">Total Score: %d</string>
<string name="total_lines">total lines: %d</string> <string name="total_lines">Total Lines: %d</string>
<string name="total_pieces">total pieces: %d</string> <string name="total_pieces">Total Pieces: %d</string>
<string name="total_time">total time: %s</string> <string name="total_time">Total Time: %s</string>
<string name="max_level">max level: %d</string> <string name="max_level">Max Level: %d</string>
<string name="max_score">max score: %d</string> <string name="max_score">Max Score: %d</string>
<string name="max_lines">max lines: %d</string> <string name="max_lines">Max Lines: %d</string>
<string name="stats">stats</string> <string name="stats">Stats</string>
<string name="session_stats">session stats</string> <string name="session_stats">Session Stats</string>
<string name="session_score">score: %d</string> <string name="session_score">Score: %d</string>
<string name="session_lines">lines: %d</string> <string name="session_lines">Lines: %d</string>
<string name="session_pieces">pieces: %d</string> <string name="session_pieces">Pieces: %d</string>
<string name="session_time">time: %s</string> <string name="session_time">Time: %s</string>
<string name="session_level">level: %d</string> <string name="session_level">Level: %d</string>
<string name="line_clears">line clears</string> <string name="line_clears">Line Clears</string>
<string name="singles">singles: %d</string> <string name="singles">Singles: %d</string>
<string name="doubles">doubles: %d</string> <string name="doubles">Doubles: %d</string>
<string name="triples">triples: %d</string> <string name="triples">Triples: %d</string>
<string name="tetrises">tetrises: %d</string> <string name="tetrises">Tetrises: %d</string>
<string name="reset_stats">reset stats</string> <string name="reset_stats">Reset Stats</string>
<string name="music">music</string> <string name="music">Music</string>
</resources> </resources>