From f52aead768fc9d5c6ce5c3f29e4b66dbf6a5bd63 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 12:32:20 +0000 Subject: [PATCH 1/2] Refactor stall and enemy definitions into registries Consolidated scattered data and behavioral logic for stalls and enemies into StallRegistry and EnemyRegistry. - Moved base stats, costs, and descriptions to registries. - Relocated behavioral logic (firing, damage modifiers, special behaviors) to registry definitions. - Centralized sprite coordinate mapping. - Simplified MainViewModel, UI components, and tests by delegating to registries. - Fixed a bug where Satay's fire rate was ignored due to rotation updates. - Ensured weapons.png asset is preserved. Co-authored-by: candour <4670475+candour@users.noreply.github.com> --- .../com/messark/hawkerrush/MainActivity.kt | 15 +- .../com/messark/hawkerrush/MainViewModel.kt | 227 +++------- .../messark/hawkerrush/model/GameModels.kt | 77 +--- .../hawkerrush/model/TutorialModels.kt | 76 ---- .../messark/hawkerrush/registry/Registry.kt | 416 ++++++++++++++++++ .../hawkerrush/ui/components/GameBoard.kt | 7 +- .../ui/components/GameControlPanel.kt | 30 +- .../hawkerrush/ui/components/StallConsole.kt | 80 +++- .../hawkerrush/ui/components/StallSlot.kt | 19 +- .../ui/components/TutorialOverlay.kt | 7 +- .../ui/constants/SpriteConstants.kt | 19 +- app/src/main/res/drawable-nodpi/weapons.png | Bin 0 -> 126669 bytes .../messark/hawkerrush/MilestoneBoostTest.kt | 4 +- 13 files changed, 599 insertions(+), 378 deletions(-) create mode 100644 app/src/main/java/com/messark/hawkerrush/registry/Registry.kt create mode 100644 app/src/main/res/drawable-nodpi/weapons.png diff --git a/app/src/main/java/com/messark/hawkerrush/MainActivity.kt b/app/src/main/java/com/messark/hawkerrush/MainActivity.kt index 32460dd..fb74868 100644 --- a/app/src/main/java/com/messark/hawkerrush/MainActivity.kt +++ b/app/src/main/java/com/messark/hawkerrush/MainActivity.kt @@ -18,6 +18,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.ColorMatrix import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalHapticFeedback @@ -55,20 +57,25 @@ fun SpriteButton( pressedRect: androidx.compose.ui.unit.IntRect? = null, onClick: () -> Unit, onTriggerHaptic: () -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, + enabled: Boolean = true ) { val interactionSource = remember { MutableInteractionSource() } val isPressed by interactionSource.collectIsPressedAsState() val context = LocalContext.current + val disabledColorFilter = remember { + ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }) + } val bitmap = remember { BitmapFactory.decodeResource(context.resources, R.drawable.buttons).asImageBitmap() } - val currentRect = if (isPressed && pressedRect != null) pressedRect else normalRect + val currentRect = if (enabled && isPressed && pressedRect != null) pressedRect else normalRect Box( modifier = modifier .clickable( + enabled = enabled, interactionSource = interactionSource, indication = null, onClick = { @@ -83,7 +90,8 @@ fun SpriteButton( image = bitmap, srcOffset = IntOffset(currentRect.left, currentRect.top), srcSize = IntSize(currentRect.width, currentRect.height), - dstSize = IntSize(size.width.toInt(), size.height.toInt()) + dstSize = IntSize(size.width.toInt(), size.height.toInt()), + colorFilter = if (!enabled) disabledColorFilter else null ) } } @@ -613,6 +621,7 @@ fun GameScreen( onCycleTargetMode = { viewModel.cycleTargetMode() }, onStartWave = { viewModel.startWave() }, onShowStallTutorial = { viewModel.showStallTutorial(it) }, + onTriggerHaptic = { viewModel.triggerHaptic() }, waveActive = gameState.waveActive, modifier = Modifier.weight(LayoutConstants.CONTROL_PANEL_HEIGHT_FRACTION) ) diff --git a/app/src/main/java/com/messark/hawkerrush/MainViewModel.kt b/app/src/main/java/com/messark/hawkerrush/MainViewModel.kt index fd1cd77..dd8961b 100644 --- a/app/src/main/java/com/messark/hawkerrush/MainViewModel.kt +++ b/app/src/main/java/com/messark/hawkerrush/MainViewModel.kt @@ -5,8 +5,8 @@ import androidx.compose.ui.graphics.Color import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.messark.hawkerrush.model.* +import com.messark.hawkerrush.registry.* import com.messark.hawkerrush.utils.* -import com.messark.hawkerrush.utils.LegendaryNames import kotlinx.coroutines.* import kotlinx.coroutines.flow.* import java.time.Instant @@ -32,13 +32,7 @@ class MainViewModel @JvmOverloads constructor( ) private val _availableStalls = MutableStateFlow( - listOf( - Stall("t1", "Teh Tarik", baseName = "Teh Tarik", cost = 150, color = Color.Blue, stallType = StallType.TEH_TARIK, range = 3f, description = "Creates slowing puddles"), - Stall("t2", "Satay", baseName = "Satay", cost = 200, color = Color.Red, stallType = StallType.SATAY, range = 2.5f, damage = 20, fireRateMs = 1500, description = "Area chili sauce damage"), - Stall("t3", "Chicken Rice", baseName = "Chicken Rice", cost = 100, color = Color.Yellow, stallType = StallType.CHICKEN_RICE, range = 4f, damage = 15, fireRateMs = 700, description = "High single-target damage"), - Stall("t4", "Durian", baseName = "Durian", cost = 300, color = Color(0xFF4CAF50), stallType = StallType.DURIAN, range = 3f, damage = 120, fireRateMs = 2000, description = "Massive damage, slow fire"), - Stall("t5", "Ice Kachang", baseName = "Ice Kachang", cost = 250, color = Color.Cyan, stallType = StallType.ICE_KACHANG, range = 3.5f, damage = 2, fireRateMs = 1500, freezeDurationMs = 500L, description = "Freezes enemies in place") - ) + StallRegistry.all().map { it.toStall() } ) val availableStalls: StateFlow> = _availableStalls.asStateFlow() @@ -134,15 +128,21 @@ class MainViewModel @JvmOverloads constructor( val newEnemyTypes = enemyList.distinct().filter { !settings.shownTutorials.contains("enemy_${it.name.lowercase()}") } if (newEnemyTypes.isNotEmpty()) { val firstNewEnemy = newEnemyTypes.first() - val tutorial = TutorialContent.ENEMY_TUTORIALS[firstNewEnemy] - if (tutorial != null) { - _gameState.update { it.copy(activeTutorial = tutorial) } - // Mark as shown - settingsRepository.updateSettings { - it.copy(shownTutorials = it.shownTutorials + "enemy_${firstNewEnemy.name.lowercase()}") - } - return@launch + val enemyDef = EnemyRegistry.get(firstNewEnemy) + val tutorial = TutorialData( + id = "enemy_${firstNewEnemy.name.lowercase()}", + type = TutorialType.ENEMY, + title = enemyDef.name, + description = enemyDef.description, + enemyType = firstNewEnemy + ) + + _gameState.update { it.copy(activeTutorial = tutorial) } + // Mark as shown + settingsRepository.updateSettings { + it.copy(shownTutorials = it.shownTutorials + "enemy_${firstNewEnemy.name.lowercase()}") } + return@launch } } @@ -181,7 +181,15 @@ class MainViewModel @JvmOverloads constructor( } fun showStallTutorial(stallType: StallType) { - val tutorial = TutorialContent.STALL_TUTORIALS[stallType] ?: return + val def = StallRegistry.get(stallType) + val tutorial = TutorialData( + id = "stall_${stallType.name.lowercase()}", + type = TutorialType.STALL, + title = def.tutorialTitle, + signatureMove = def.signatureMove, + description = def.tutorialDescription, + stallType = stallType + ) _gameState.update { it.copy(activeTutorial = tutorial) } } @@ -244,13 +252,7 @@ class MainViewModel @JvmOverloads constructor( } private fun getEnemyHP(type: EnemyType, wave: Int): Int { - val baseHp = when (type) { - EnemyType.SALARYMAN -> 50 - EnemyType.TOURIST -> 100 - EnemyType.AUNTIE -> 150 - EnemyType.DELIVERY_RIDER -> 500 - } - return (baseHp * Math.pow(1.1, (wave - 1).toDouble())).toInt() + return EnemyRegistry.get(type).getHp(wave) } private fun startGameLoop() { @@ -323,29 +325,13 @@ class MainViewModel @JvmOverloads constructor( val type = state.enemiesToSpawnList.first() val remainingSpawnList = state.enemiesToSpawnList.drop(1) - val enemyHealth = getEnemyHP(type, state.currentWave) - - val speed = when (type) { - EnemyType.SALARYMAN -> 0.08f - EnemyType.TOURIST -> 0.04f - EnemyType.AUNTIE -> 0.03f - EnemyType.DELIVERY_RIDER -> 0.06f - } - val firstTarget = path.getOrNull(1) ?: startPos val isFacingLeft = firstTarget.q + firstTarget.r / 2f < startPos.q + startPos.r / 2f - val newEnemy = Enemy( - id = UUID.randomUUID().toString(), - type = type, - health = enemyHealth, - maxHealth = enemyHealth, + val newEnemy = EnemyRegistry.get(type).toEnemy( + wave = state.currentWave, position = PreciseAxialCoordinate(startPos.q.toFloat(), startPos.r.toFloat()), - baseSpeed = speed, - currentSpeed = speed, path = path, - currentPathIndex = 0, - reward = if (type == EnemyType.DELIVERY_RIDER) 100 else 20, isFacingLeft = isFacingLeft ) return state.copy( @@ -372,33 +358,23 @@ class MainViewModel @JvmOverloads constructor( val updatedEnemies = state.enemies.mapNotNull { enemy -> if (enemy.isDead) return@mapNotNull null + val enemyDef = EnemyRegistry.get(enemy.type) + var freezeDuration = enemy.freezeDurationMs if (freezeDuration > 0) { freezeDuration = Math.max(0, freezeDuration - 32) } - var isStopped = enemy.isStopped - var stopDurationMs = enemy.stopDurationMs - var lastStopMs = enemy.lastStopMs var speedBoostDuration = enemy.speedBoostDurationMs - - if (enemy.type == EnemyType.TOURIST) { - if (isStopped) { - stopDurationMs -= 32 - if (stopDurationMs <= 0) { - isStopped = false - lastStopMs = currentTimeMs - } - } else if (currentTimeMs - lastStopMs > 8000) { - isStopped = true - stopDurationMs = 2000L - } - } - if (speedBoostDuration > 0) { speedBoostDuration = Math.max(0, speedBoostDuration - 32) } + val behaviorUpdatedEnemy = enemyDef.updateSpecialBehavior(enemy, currentTimeMs) + var isStopped = behaviorUpdatedEnemy.isStopped + var stopDurationMs = behaviorUpdatedEnemy.stopDurationMs + var lastStopMs = behaviorUpdatedEnemy.lastStopMs + state.puddles.forEach { puddle -> if (axialDistance(enemy.position, puddle.position) < 0.8 && puddle.sourceStallCoord != null && @@ -422,12 +398,7 @@ class MainViewModel @JvmOverloads constructor( var speedMultiplier = 1.0f state.puddles.forEach { puddle -> if (axialDistance(enemy.position, puddle.position) < 0.8) { - speedMultiplier = when (enemy.type) { - EnemyType.DELIVERY_RIDER -> 0.2f // double slow (80% reduction) - EnemyType.AUNTIE -> 0.8f // half slow (20% reduction) - else -> 0.6f // normal slow (40% reduction) - } - + speedMultiplier = enemyDef.getPuddleSlowMultiplier(enemy.type) } } @@ -530,80 +501,17 @@ class MainViewModel @JvmOverloads constructor( } if (target != null) { - var updatedStall = stall.copy(lastFiredMs = currentTimeMs) - when (stall.stallType) { - StallType.CHICKEN_RICE -> { - newProjectiles.add(Projectile( - id = UUID.randomUUID().toString(), - position = stallPos, - targetEnemyId = target.id, - targetPosition = target.position, - damage = stall.damage, - color = stall.color, - sourceStallType = StallType.CHICKEN_RICE, - sourceStallCoord = coord, - sourceStallId = stall.id - )) - } - StallType.TEH_TARIK -> { - newPuddles.add(StickyPuddle( - id = UUID.randomUUID().toString(), - position = target.position, - spawnTimeMs = currentTimeMs, - durationMs = stall.effectDurationMs, - sourceStallCoord = coord, - sourceStallId = stall.id - )) - } - StallType.SATAY -> { - val dq = target.position.q - coord.q - val dr = target.position.r - coord.r - val angle = Math.atan2(dr.toDouble(), dq.toDouble()).toFloat() - updatedStall = updatedStall.copy(rotation = angle) - newProjectiles.add(Projectile( - id = UUID.randomUUID().toString(), - position = stallPos, - targetEnemyId = null, - targetPosition = target.position, - damage = stall.damage, - color = Color.White, - speed = 0.3f, - aoeRadius = stall.aoeRadius, - isArc = true, - startPosition = stallPos, - sourceStallType = StallType.SATAY, - sourceStallCoord = coord, - sourceStallId = stall.id - )) + val stallDef = StallRegistry.get(stall.stallType) + val fireResult = stallDef.fire(stall, coord, target, currentTimeMs) + var updatedStall = (fireResult as? FireResult.NewProjectile)?.updatedStall ?: stall + updatedStall = updatedStall.copy(lastFiredMs = currentTimeMs) + + when (fireResult) { + is FireResult.NewProjectile -> { + newProjectiles.add(fireResult.projectile) } - StallType.ICE_KACHANG -> { - newProjectiles.add(Projectile( - id = UUID.randomUUID().toString(), - position = stallPos, - targetEnemyId = target.id, - targetPosition = target.position, - damage = stall.damage, - color = stall.color, - isFreeze = true, - freezeDurationMs = stall.freezeDurationMs, - sourceStallType = StallType.ICE_KACHANG, - sourceStallCoord = coord, - sourceStallId = stall.id - )) - } - StallType.DURIAN -> { - newProjectiles.add(Projectile( - id = UUID.randomUUID().toString(), - position = stallPos, - targetEnemyId = target.id, - targetPosition = target.position, - damage = stall.damage, - color = stall.color, - aoeRadius = stall.aoeRadius, - sourceStallType = StallType.DURIAN, - sourceStallCoord = coord, - sourceStallId = stall.id - )) + is FireResult.NewPuddle -> { + newPuddles.add(fireResult.puddle) } } updatedHexes[coord] = tile.copy(stall = updatedStall) @@ -639,19 +547,15 @@ class MainViewModel @JvmOverloads constructor( if (dist < proj.speed) { // Visual Effect - if (proj.aoeRadius > 0) { - val (effectColor, effectType, duration) = when { - proj.isArc -> Triple(Color.Red.copy(alpha = 0.3f), VisualEffectType.GAS_CLOUD, 500L) // Satay - proj.color == Color(0xFF4CAF50) -> Triple(Color(0xFFCDDC39).copy(alpha = 0.5f), VisualEffectType.EXPANDING_CIRCLE, 150L) // Durian (greeny-yellow) - else -> Triple(proj.color.copy(alpha = 0.5f), VisualEffectType.EXPANDING_CIRCLE, 150L) - } + if (proj.aoeRadius > 0 && proj.sourceStallType != null) { + val stallDef = StallRegistry.get(proj.sourceStallType) newVisualEffects.add(VisualEffect( id = UUID.randomUUID().toString(), position = targetPos, - color = effectColor, + color = stallDef.visualEffectColor ?: proj.color.copy(alpha = 0.5f), startTimeMs = currentTimeMs, - durationMs = duration, - type = effectType + durationMs = stallDef.visualEffectDuration, + type = stallDef.visualEffectType )) } @@ -693,20 +597,12 @@ class MainViewModel @JvmOverloads constructor( var freezeDuration = proj.freezeDurationMs // Apply modifiers - when (proj.sourceStallType) { - StallType.SATAY -> { - if (enemy.type == EnemyType.TOURIST) damage *= 2f - else if (enemy.type == EnemyType.AUNTIE) damage *= 0.5f - } - StallType.DURIAN -> { - if (enemy.type == EnemyType.DELIVERY_RIDER) damage *= 1.5f - else if (enemy.type == EnemyType.SALARYMAN) speedBoostDuration = 2000L - } - StallType.ICE_KACHANG -> { - if (enemy.type == EnemyType.SALARYMAN) freezeDuration *= 2 - else if (enemy.type == EnemyType.TOURIST) freezeDuration /= 2 - } - else -> {} + if (proj.sourceStallType != null) { + val stallDef = StallRegistry.get(proj.sourceStallType) + damage = stallDef.applyDamageModifiers(enemy, damage) + freezeDuration = stallDef.getFreezeModifier(enemy, freezeDuration) + val boost = stallDef.getSpeedBoost(enemy) + if (boost > 0) speedBoostDuration = boost } val damageDealt = damage.toInt() @@ -852,6 +748,7 @@ class MainViewModel @JvmOverloads constructor( if (state.gold >= upgradeCost) { val upgradeCategories = mutableListOf(0, 1, 2).apply { shuffle() } + val stallDef = StallRegistry.get(stall.stallType) while (upgradeCategories.isNotEmpty()) { val upgradeTypeIndex = upgradeCategories.removeAt(0) @@ -869,11 +766,7 @@ class MainViewModel @JvmOverloads constructor( 0 -> { if (kotlin.random.Random.nextBoolean()) { currentCategoryName = "Damage" - val damageIncrease = if (stall.stallType == StallType.CHICKEN_RICE) { - (baseStall.damage * 0.3f).toInt() + 2 - } else { - (baseStall.damage * 0.2f).toInt() + 1 - } + val damageIncrease = stallDef.getUpgradeDamageIncrease(baseStall.damage) newDamage += damageIncrease val newLevel = mutableUpgrades.getOrDefault("Damage", 0) + 1 if (newLevel % 10 == 0) { @@ -937,7 +830,7 @@ class MainViewModel @JvmOverloads constructor( } StallType.CHICKEN_RICE -> { currentCategoryName = "Damage" - val damageIncrease = (baseStall.damage * 0.3f).toInt() + 2 + val damageIncrease = stallDef.getUpgradeDamageIncrease(baseStall.damage) newDamage += damageIncrease val newLevel = mutableUpgrades.getOrDefault("Damage", 0) + 1 if (newLevel % 10 == 0) { diff --git a/app/src/main/java/com/messark/hawkerrush/model/GameModels.kt b/app/src/main/java/com/messark/hawkerrush/model/GameModels.kt index d70da38..c27dedc 100644 --- a/app/src/main/java/com/messark/hawkerrush/model/GameModels.kt +++ b/app/src/main/java/com/messark/hawkerrush/model/GameModels.kt @@ -1,6 +1,7 @@ package com.messark.hawkerrush.model import androidx.compose.ui.graphics.Color +import com.messark.hawkerrush.registry.StallRegistry data class AxialCoordinate(val q: Int, val r: Int) @@ -98,80 +99,10 @@ data class Stall( return Math.round(cost * (0.2f + nextUpgradeIndex * 0.1f)).toInt() } - fun getUpgradeBenefit(category: String, level: Int, baseStall: Stall): String { + fun getUpgradeBenefit(category: String, level: Int): String { if (level <= 0) return "" - - return when (category) { - "Damage" -> { - var currentDamage = baseStall.damage - val increasePerLevel = if (stallType == StallType.CHICKEN_RICE) { - (baseStall.damage * 0.3f).toInt() + 2 - } else { - (baseStall.damage * 0.2f).toInt() + 1 - } - for (l in 1..level) { - currentDamage += increasePerLevel - if (l % 10 == 0) { - currentDamage = Math.round(currentDamage * 1.25f) - } - } - val percentage = Math.round(((currentDamage - baseStall.damage).toFloat() / baseStall.damage) * 100) - "+$percentage%" - } - "Rate" -> { - var currentRate = baseStall.fireRateMs - val rateReduction = (baseStall.fireRateMs * 0.1f).toLong() - for (l in 1..level) { - currentRate = Math.max(50L, currentRate - rateReduction) - if (l % 10 == 0) { - currentRate = Math.max(50L, Math.round(currentRate * 0.75)) - } - } - val percentage = Math.round(((baseStall.fireRateMs - currentRate).toFloat() / baseStall.fireRateMs) * 100) - "+$percentage%" - } - "Range" -> { - var currentRange = baseStall.range - for (l in 1..level) { - currentRange += 0.5f - if (l % 10 == 0) { - currentRange *= 1.25f - } - } - "+${String.format("%.1f", currentRange - baseStall.range)}" - } - "Radius" -> { - var currentRadius = baseStall.aoeRadius - for (l in 1..level) { - currentRadius += 0.2f - if (l % 10 == 0) { - currentRadius *= 1.25f - } - } - "+${String.format("%.1f", currentRadius - baseStall.aoeRadius)}" - } - "Duration" -> { - var currentDuration = baseStall.effectDurationMs - for (l in 1..level) { - currentDuration += 500 - if (l % 10 == 0) { - currentDuration = Math.round(currentDuration * 1.25f).toLong() - } - } - "+${currentDuration - baseStall.effectDurationMs}ms" - } - "Effect" -> { - var currentEffect = baseStall.freezeDurationMs - for (l in 1..level) { - currentEffect += 100 - if (l % 10 == 0) { - currentEffect = Math.round(currentEffect * 1.25f).toLong() - } - } - "+${currentEffect - baseStall.freezeDurationMs}ms" - } - else -> "" - } + val stallDef = StallRegistry.get(stallType) + return stallDef.getUpgradeBenefit(category, level, stallDef) } } diff --git a/app/src/main/java/com/messark/hawkerrush/model/TutorialModels.kt b/app/src/main/java/com/messark/hawkerrush/model/TutorialModels.kt index 3266ee7..7dbe1d9 100644 --- a/app/src/main/java/com/messark/hawkerrush/model/TutorialModels.kt +++ b/app/src/main/java/com/messark/hawkerrush/model/TutorialModels.kt @@ -13,79 +13,3 @@ data class TutorialData( val enemyType: EnemyType? = null, val stallType: StallType? = null ) - -object TutorialContent { - val ENEMY_TUTORIALS = mapOf( - EnemyType.SALARYMAN to TutorialData( - id = "enemy_salaryman", - type = TutorialType.ENEMY, - title = "Salaryman", - description = "The fast-paced office worker. They move quickly across the grid, eager to reach their destination. Their high speed makes them difficult to hit, but they don't have much health.", - enemyType = EnemyType.SALARYMAN - ), - EnemyType.TOURIST to TutorialData( - id = "enemy_tourist", - type = TutorialType.ENEMY, - title = "Tourist", - description = "A curious visitor who frequently stops to take pictures of the local sights. While stationary, they are easy targets for your stalls, but they have more health than a Salaryman.", - enemyType = EnemyType.TOURIST - ), - EnemyType.AUNTIE to TutorialData( - id = "enemy_auntie", - type = TutorialType.ENEMY, - title = "Auntie", - description = "A veteran of the hawker scene. She moves slowly and deliberately, but possesses high health. It takes sustained fire from multiple stalls to stop her progress.", - enemyType = EnemyType.AUNTIE - ), - EnemyType.DELIVERY_RIDER to TutorialData( - id = "enemy_delivery_rider", - type = TutorialType.ENEMY, - title = "Delivery Rider", - description = "A formidable boss on two wheels. He has massive health and moves at a significant speed. He is particularly cautious on wet surfaces, slowing down considerably when passing through sticky puddles.", - enemyType = EnemyType.DELIVERY_RIDER - ) - ) - - val STALL_TUTORIALS = mapOf( - StallType.SATAY to TutorialData( - id = "stall_satay", - type = TutorialType.STALL, - title = "Uncle's Satay Stall (AoE Damage)", - signatureMove = "The Chili Conflagration", - description = "Wah, smells so shiok! Behind this unassuming grill, the Satay Uncle is fanning a fiery revolution. Watch out for his signature Chili Conflagration—the chili isn't just spicy; it's explosive. He loads up a massive spoon and, with a precision usually reserved for satay-counting, launches a gigantic splash of his secret, explosive chili sauce. When it hits, it covers a wide circle, dousing groups of enemies in a sticky, burning chili storm that eats away at their health (and their willpower). If you need a crowd-control burn, this Uncle is the OG.", - stallType = StallType.SATAY - ), - StallType.CHICKEN_RICE to TutorialData( - id = "stall_chicken_rice", - type = TutorialType.STALL, - title = "Ah Hock’s Chicken Rice Stand (Single-Target DPS)", - signatureMove = "The Garlic-Ginger Gatling Gun", - description = "Ah Hock’s Chicken Rice is famous for two things: the tenderest steamed chicken and the single-minded focus of his attacks. Don’t be fooled by the simple setup; this stand is your base single-target workhorse. When an enemy is targeted, Ah Hock deploys his Garlic-Ginger Gatling Gun. Instead of bullets, he’s launching high-velocity, precision-aimed balls of marinated meat, dousing targets in flavor-infused damage. It’s consistent, it’s powerful, and it never runs out of stock. A classic choice that never fails.", - stallType = StallType.CHICKEN_RICE - ), - StallType.ICE_KACHANG to TutorialData( - id = "stall_ice_kachang", - type = TutorialType.STALL, - title = "Auntie's Ice Kachang Cart (Stun/Freezer)", - signatureMove = "The Absolute Zero Brain Freeze", - description = "Want something to really chill out the enemies? Then you need the Auntie at the Ice Kachang Cart! She’s taken traditional dessert techniques to the cryo-level. Her specialized ice shaver can launch a massive, compacted ball of shaved ice, syrup, and cold, cold, red beans, aimed precisely at the lead enemy. Upon impact, it doesn't just damage; it delivers an Absolute Zero Brain Freeze. The target is frozen solid, encased in a giant colorful ice cube, completely immobilized for several precious seconds. A perfect stall for controlling boss units.", - stallType = StallType.ICE_KACHANG - ), - StallType.TEH_TARIK to TutorialData( - id = "stall_teh_tarik", - type = TutorialType.STALL, - title = "Teh Tarik Maestro (Movement Slow)", - signatureMove = "The Perpetual Tarik Puddle", - description = "Welcome to the Teh Tarik Maestro, where the art of 'pulling' tea is a high-level tactical maneuver. This Maestro doesn't just make your enemies slower; he makes the very ground they walk on sticky. Utilizing a massive pair of custom cups, he performs a continuous, mesmerizing 'tarik' high in the air. Each 'pull' perfectly places a wide, frothy Perpetual Tarik Puddle of viscous, sweet milk tea. The tea is so thick and syrupy that enemies stepping into it are immediately bogged down, their speed cut in half as they struggle through the delicious, sticky mess. A crowd favorite for slowing the rush.", - stallType = StallType.TEH_TARIK - ), - StallType.DURIAN to TutorialData( - id = "stall_durian", - type = TutorialType.STALL, - title = "The King Durian Bunker (High Damage/Slight AoE)", - signatureMove = "The Spiky Cataclysm", - description = "They call the Durian the King of Fruits, and this stall is the King of Damage. The King Durian Bunker is fortified with armor-plating and smells… well, like a durian. When the King’s crew makes a sale, they aren't selling just fruit; they are deploying a localized explosive. Using a heavy-duty pneumatic launcher, they fire an overripe, spikey Durian bomb into the largest cluster of enemies. Upon impact, it delivers a high-damage, single-target blow, followed immediately by a Spiky Cataclysm AoE explosion as the potent, heavy aroma bursts outward. It’s high-cost and slow-reloading, but the raw damage (and the scent) is devastating.", - stallType = StallType.DURIAN - ) - ) -} diff --git a/app/src/main/java/com/messark/hawkerrush/registry/Registry.kt b/app/src/main/java/com/messark/hawkerrush/registry/Registry.kt new file mode 100644 index 0000000..fca0d81 --- /dev/null +++ b/app/src/main/java/com/messark/hawkerrush/registry/Registry.kt @@ -0,0 +1,416 @@ +package com.messark.hawkerrush.registry + +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.unit.IntRect +import com.messark.hawkerrush.model.* +import java.util.* + +sealed class FireResult { + data class NewProjectile(val projectile: Projectile, val updatedStall: Stall? = null) : FireResult() + data class NewPuddle(val puddle: StickyPuddle) : FireResult() +} + +data class StallDefinition( + val type: StallType, + val name: String, + val cost: Int, + val color: Color, + val range: Float, + val damage: Int, + val fireRateMs: Long, + val description: String, + val tutorialTitle: String, + val signatureMove: String, + val tutorialDescription: String, + val spriteRect: IntRect, + val aoeRadius: Float = 0f, + val effectDurationMs: Long = 0L, + val freezeDurationMs: Long = 0L, + val projectileSpeed: Float = 0.2f, + val isArc: Boolean = false, + val projectileColor: Color = color, + val visualEffectType: VisualEffectType = VisualEffectType.EXPANDING_CIRCLE, + val visualEffectColor: Color? = null, + val visualEffectDuration: Long = 150L +) { + fun getUpgradeDamageIncrease(baseDamage: Int): Int { + return if (type == StallType.CHICKEN_RICE) { + (baseDamage * 0.3f).toInt() + 2 + } else { + (baseDamage * 0.2f).toInt() + 1 + } + } + + fun applyDamageModifiers(enemy: Enemy, baseDamage: Float): Float { + return when (type) { + StallType.SATAY -> when (enemy.type) { + EnemyType.TOURIST -> baseDamage * 2f + EnemyType.AUNTIE -> baseDamage * 0.5f + else -> baseDamage + } + StallType.DURIAN -> when (enemy.type) { + EnemyType.DELIVERY_RIDER -> baseDamage * 1.5f + else -> baseDamage + } + else -> baseDamage + } + } + + fun getFreezeModifier(enemy: Enemy, baseDuration: Long): Long { + if (type != StallType.ICE_KACHANG) return 0L + return when (enemy.type) { + EnemyType.SALARYMAN -> baseDuration * 2 + EnemyType.TOURIST -> baseDuration / 2 + else -> baseDuration + } + } + + fun getSpeedBoost(enemy: Enemy): Long { + if (type == StallType.DURIAN && enemy.type == EnemyType.SALARYMAN) { + return 2000L + } + return 0L + } + + fun fire( + stall: Stall, + stallCoord: AxialCoordinate, + target: Enemy, + currentTimeMs: Long + ): FireResult { + val stallPos = PreciseAxialCoordinate(stallCoord.q.toFloat(), stallCoord.r.toFloat()) + return when (type) { + StallType.TEH_TARIK -> FireResult.NewPuddle( + StickyPuddle( + id = UUID.randomUUID().toString(), + position = target.position, + spawnTimeMs = currentTimeMs, + durationMs = stall.effectDurationMs, + sourceStallCoord = stallCoord, + sourceStallId = stall.id + ) + ) + StallType.SATAY -> { + val dq = target.position.q - stallCoord.q + val dr = target.position.r - stallCoord.r + val angle = Math.atan2(dr.toDouble(), dq.toDouble()).toFloat() + FireResult.NewProjectile( + projectile = Projectile( + id = UUID.randomUUID().toString(), + position = stallPos, + targetEnemyId = null, + targetPosition = target.position, + damage = stall.damage, + color = Color.White, + speed = projectileSpeed, + aoeRadius = stall.aoeRadius, + isArc = true, + startPosition = stallPos, + sourceStallType = StallType.SATAY, + sourceStallCoord = stallCoord, + sourceStallId = stall.id + ), + updatedStall = stall.copy(rotation = angle) + ) + } + else -> FireResult.NewProjectile( + projectile = Projectile( + id = UUID.randomUUID().toString(), + position = stallPos, + targetEnemyId = target.id, + targetPosition = target.position, + damage = stall.damage, + color = stall.color, + isFreeze = type == StallType.ICE_KACHANG, + freezeDurationMs = stall.freezeDurationMs, + aoeRadius = stall.aoeRadius, + sourceStallType = type, + sourceStallCoord = stallCoord, + sourceStallId = stall.id + ) + ) + } + } + + fun toStall(id: String = UUID.randomUUID().toString()): Stall { + return Stall( + id = id, + name = name, + baseName = name, + cost = cost, + color = color, + range = range, + damage = damage, + fireRateMs = fireRateMs, + stallType = type, + description = description, + aoeRadius = aoeRadius, + effectDurationMs = effectDurationMs, + freezeDurationMs = freezeDurationMs + ) + } + + fun getUpgradeBenefit(category: String, level: Int, baseStall: StallDefinition): String { + if (level <= 0) return "" + + return when (category) { + "Damage" -> { + var currentDamage = baseStall.damage + val increasePerLevel = getUpgradeDamageIncrease(baseStall.damage) + for (l in 1..level) { + currentDamage += increasePerLevel + if (l % 10 == 0) { + currentDamage = Math.round(currentDamage * 1.25f) + } + } + val percentage = Math.round(((currentDamage - baseStall.damage).toFloat() / baseStall.damage) * 100) + "+$percentage%" + } + "Rate" -> { + var currentRate = baseStall.fireRateMs + val rateReduction = (baseStall.fireRateMs * 0.1f).toLong() + for (l in 1..level) { + currentRate = Math.max(50L, currentRate - rateReduction) + if (l % 10 == 0) { + currentRate = Math.max(50L, Math.round(currentRate * 0.75)) + } + } + val percentage = Math.round(((baseStall.fireRateMs - currentRate).toFloat() / baseStall.fireRateMs) * 100) + "+$percentage%" + } + "Range" -> { + var currentRange = baseStall.range + for (l in 1..level) { + currentRange += 0.5f + if (l % 10 == 0) { + currentRange *= 1.25f + } + } + "+${String.format("%.1f", currentRange - baseStall.range)}" + } + "Radius" -> { + var currentRadius = baseStall.aoeRadius + for (l in 1..level) { + currentRadius += 0.2f + if (l % 10 == 0) { + currentRadius *= 1.25f + } + } + "+${String.format("%.1f", currentRadius - baseStall.aoeRadius)}" + } + "Duration" -> { + var currentDuration = baseStall.effectDurationMs + for (l in 1..level) { + currentDuration += 500 + if (l % 10 == 0) { + currentDuration = Math.round(currentDuration * 1.25f).toLong() + } + } + "+${currentDuration - baseStall.effectDurationMs}ms" + } + "Effect" -> { + var currentEffect = baseStall.freezeDurationMs + for (l in 1..level) { + currentEffect += 100 + if (l % 10 == 0) { + currentEffect = Math.round(currentEffect * 1.25f).toLong() + } + } + "+${currentEffect - baseStall.freezeDurationMs}ms" + } + else -> "" + } + } +} + +data class EnemyDefinition( + val type: EnemyType, + val name: String, + val description: String, + val baseHp: Int, + val baseSpeed: Float, + val reward: Int, + val spriteRow: Int +) { + fun getPuddleSlowMultiplier(enemyType: EnemyType): Float { + return when (enemyType) { + EnemyType.DELIVERY_RIDER -> 0.2f + EnemyType.AUNTIE -> 0.8f + else -> 0.6f + } + } + + fun updateSpecialBehavior(enemy: Enemy, currentTimeMs: Long): Enemy { + if (type == EnemyType.TOURIST) { + var isStopped = enemy.isStopped + var stopDurationMs = enemy.stopDurationMs + var lastStopMs = enemy.lastStopMs + + if (isStopped) { + stopDurationMs -= 32 + if (stopDurationMs <= 0) { + isStopped = false + lastStopMs = currentTimeMs + } + } else if (currentTimeMs - lastStopMs > 8000) { + isStopped = true + stopDurationMs = 2000L + } + return enemy.copy(isStopped = isStopped, stopDurationMs = stopDurationMs, lastStopMs = lastStopMs) + } + return enemy + } + + fun getHp(wave: Int): Int { + return (baseHp * Math.pow(1.1, (wave - 1).toDouble())).toInt() + } + + fun toEnemy(id: String = UUID.randomUUID().toString(), wave: Int, position: PreciseAxialCoordinate, path: List, isFacingLeft: Boolean): Enemy { + val hp = getHp(wave) + return Enemy( + id = id, + type = type, + health = hp, + maxHealth = hp, + position = position, + baseSpeed = baseSpeed, + currentSpeed = baseSpeed, + path = path, + currentPathIndex = 0, + reward = reward, + isFacingLeft = isFacingLeft + ) + } +} + +object StallRegistry { + private val definitions = mapOf( + StallType.TEH_TARIK to StallDefinition( + type = StallType.TEH_TARIK, + name = "Teh Tarik", + cost = 150, + color = Color.Blue, + range = 3f, + damage = 10, + fireRateMs = 1000L, + description = "Creates slowing puddles", + tutorialTitle = "Teh Tarik Maestro (Movement Slow)", + signatureMove = "The Perpetual Tarik Puddle", + tutorialDescription = "Welcome to the Teh Tarik Maestro, where the art of 'pulling' tea is a high-level tactical maneuver. This Maestro doesn't just make your enemies slower; he makes the very ground they walk on sticky. Utilizing a massive pair of custom cups, he performs a continuous, mesmerizing 'tarik' high in the air. Each 'pull' perfectly places a wide, frothy Perpetual Tarik Puddle of viscous, sweet milk tea. The tea is so thick and syrupy that enemies stepping into it are immediately bogged down, their speed cut in half as they struggle through the delicious, sticky mess. A crowd favorite for slowing the rush.", + spriteRect = IntRect(22, 41, 330, 451), + effectDurationMs = 3000L + ), + StallType.SATAY to StallDefinition( + type = StallType.SATAY, + name = "Satay", + cost = 200, + color = Color.Red, + range = 2.5f, + damage = 20, + fireRateMs = 1500, + description = "Area chili sauce damage", + tutorialTitle = "Uncle's Satay Stall (AoE Damage)", + signatureMove = "The Chili Conflagration", + tutorialDescription = "Wah, smells so shiok! Behind this unassuming grill, the Satay Uncle is fanning a fiery revolution. Watch out for his signature Chili Conflagration—the chili isn't just spicy; it's explosive. He loads up a massive spoon and, with a precision usually reserved for satay-counting, launches a gigantic splash of his secret, explosive chili sauce. When it hits, it covers a wide circle, dousing groups of enemies in a sticky, burning chili storm that eats away at their health (and their willpower). If you need a crowd-control burn, this Uncle is the OG.", + spriteRect = IntRect(358, 41, 666, 451), + aoeRadius = 1.0f, + projectileSpeed = 0.3f, + isArc = true, + projectileColor = Color.White, + visualEffectType = VisualEffectType.GAS_CLOUD, + visualEffectColor = Color.Red.copy(alpha = 0.3f), + visualEffectDuration = 500L + ), + StallType.CHICKEN_RICE to StallDefinition( + type = StallType.CHICKEN_RICE, + name = "Chicken Rice", + cost = 100, + color = Color.Yellow, + range = 4f, + damage = 15, + fireRateMs = 700, + description = "High single-target damage", + tutorialTitle = "Ah Hock’s Chicken Rice Stand (Single-Target DPS)", + signatureMove = "The Garlic-Ginger Gatling Gun", + tutorialDescription = "Ah Hock’s Chicken Rice is famous for two things: the tenderest steamed chicken and the single-minded focus of his attacks. Don’t be fooled by the simple setup; this stand is your base single-target workhorse. When an enemy is targeted, Ah Hock deploys his Garlic-Ginger Gatling Gun. Instead of bullets, he’s launching high-velocity, precision-aimed balls of marinated meat, dousing targets in flavor-infused damage. It’s consistent, it’s powerful, and it never runs out of stock. A classic choice that never fails.", + spriteRect = IntRect(22, 500, 330, 930) + ), + StallType.DURIAN to StallDefinition( + type = StallType.DURIAN, + name = "Durian", + cost = 300, + color = Color(0xFF4CAF50), + range = 3f, + damage = 120, + fireRateMs = 2000, + description = "Massive damage, slow fire", + tutorialTitle = "The King Durian Bunker (High Damage/Slight AoE)", + signatureMove = "The Spiky Cataclysm", + tutorialDescription = "They call the Durian the King of Fruits, and this stall is the King of Damage. The King Durian Bunker is fortified with armor-plating and smells… well, like a durian. When the King’s crew makes a sale, they aren't selling just fruit; they are deploying a localized explosive. Using a heavy-duty pneumatic launcher, they fire an overripe, spikey Durian bomb into the largest cluster of enemies. Upon impact, it delivers a high-damage, single-target blow, followed immediately by a Spiky Cataclysm AoE explosion as the potent, heavy aroma bursts outward. It’s high-cost and slow-reloading, but the raw damage (and the scent) is devastating.", + spriteRect = IntRect(33, 961, 341, 1318), + aoeRadius = 1.0f, + visualEffectColor = Color(0xFFCDDC39).copy(alpha = 0.5f) + ), + StallType.ICE_KACHANG to StallDefinition( + type = StallType.ICE_KACHANG, + name = "Ice Kachang", + cost = 250, + color = Color.Cyan, + range = 3.5f, + damage = 2, + fireRateMs = 1500, + description = "Freezes enemies in place", + tutorialTitle = "Auntie's Ice Kachang Cart (Stun/Freezer)", + signatureMove = "The Absolute Zero Brain Freeze", + tutorialDescription = "Want something to really chill out the enemies? Then you need the Auntie at the Ice Kachang Cart! She’s taken traditional dessert techniques to the cryo-level. Her specialized ice shaver can launch a massive, compacted ball of shaved ice, syrup, and cold, cold, red beans, aimed precisely at the lead enemy. Upon impact, it doesn't just damage; it delivers an Absolute Zero Brain Freeze. The target is frozen solid, encased in a giant colorful ice cube, completely immobilized for several precious seconds. A perfect stall for controlling boss units.", + spriteRect = IntRect(358, 500, 666, 930), + freezeDurationMs = 500L + ) + ) + + fun get(type: StallType): StallDefinition = definitions[type]!! + fun all(): List = definitions.values.toList() +} + +object EnemyRegistry { + private val definitions = mapOf( + EnemyType.SALARYMAN to EnemyDefinition( + type = EnemyType.SALARYMAN, + name = "Salaryman", + description = "The fast-paced office worker. They move quickly across the grid, eager to reach their destination. Their high speed makes them difficult to hit, but they don't have much health.", + baseHp = 50, + baseSpeed = 0.08f, + reward = 20, + spriteRow = 2 + ), + EnemyType.TOURIST to EnemyDefinition( + type = EnemyType.TOURIST, + name = "Tourist", + description = "A curious visitor who frequently stops to take pictures of the local sights. While stationary, they are easy targets for your stalls, but they have more health than a Salaryman.", + baseHp = 100, + baseSpeed = 0.04f, + reward = 20, + spriteRow = 1 + ), + EnemyType.AUNTIE to EnemyDefinition( + type = EnemyType.AUNTIE, + name = "Auntie", + description = "A veteran of the hawker scene. She moves slowly and deliberately, but possesses high health. It takes sustained fire from multiple stalls to stop her progress.", + baseHp = 150, + baseSpeed = 0.03f, + reward = 20, + spriteRow = 0 + ), + EnemyType.DELIVERY_RIDER to EnemyDefinition( + type = EnemyType.DELIVERY_RIDER, + name = "Delivery Rider", + description = "A formidable boss on two wheels. He has massive health and moves at a significant speed. He is particularly cautious on wet surfaces, slowing down considerably when passing through sticky puddles.", + baseHp = 500, + baseSpeed = 0.06f, + reward = 100, + spriteRow = 3 + ) + ) + + fun get(type: EnemyType): EnemyDefinition = definitions[type]!! +} diff --git a/app/src/main/java/com/messark/hawkerrush/ui/components/GameBoard.kt b/app/src/main/java/com/messark/hawkerrush/ui/components/GameBoard.kt index 5821b4f..a6b4031 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/components/GameBoard.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/components/GameBoard.kt @@ -26,6 +26,8 @@ import androidx.compose.ui.unit.IntRect import androidx.compose.ui.unit.dp import com.messark.hawkerrush.R import com.messark.hawkerrush.model.* +import com.messark.hawkerrush.registry.EnemyRegistry +import com.messark.hawkerrush.registry.StallRegistry import com.messark.hawkerrush.ui.constants.SpriteConstants import com.messark.hawkerrush.utils.GridUtils import java.util.Comparator @@ -256,7 +258,7 @@ fun GameBoard( // 3. Stalls tile.stall?.let { stall -> - val stallSrcRect = SpriteConstants.STALL_RECTS[stall.stallType] ?: SpriteConstants.STALL_RECTS[StallType.CHICKEN_RICE]!! + val stallSrcRect = StallRegistry.get(stall.stallType).spriteRect drawables.add(DrawableEntity( q = coord.q.toFloat(), @@ -414,7 +416,8 @@ fun GameBoard( enemies.forEach { enemy -> val screenPos = toScreenPrecise(enemy.position.q, enemy.position.r) - val rowIndex = SpriteConstants.ENEMY_ROW_INDICES[enemy.type] ?: 0 + val enemyDef = EnemyRegistry.get(enemy.type) + val rowIndex = enemyDef.spriteRow val frameIndex = ((enemy.animationTimeMs / 500) % SpriteConstants.ENEMY_SPRITE_FRAMES).toInt() val srcRect = IntRect( diff --git a/app/src/main/java/com/messark/hawkerrush/ui/components/GameControlPanel.kt b/app/src/main/java/com/messark/hawkerrush/ui/components/GameControlPanel.kt index 83b1402..fe9cdd3 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/components/GameControlPanel.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/components/GameControlPanel.kt @@ -9,6 +9,7 @@ import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -21,6 +22,8 @@ import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.messark.hawkerrush.MainActivity +import com.messark.hawkerrush.SpriteButton import com.messark.hawkerrush.R import com.messark.hawkerrush.model.Stall import com.messark.hawkerrush.model.StallType @@ -41,6 +44,7 @@ fun GameControlPanel( onCycleTargetMode: () -> Unit, onStartWave: () -> Unit, onShowStallTutorial: (StallType) -> Unit, + onTriggerHaptic: () -> Unit, waveActive: Boolean, modifier: Modifier = Modifier ) { @@ -78,6 +82,7 @@ fun GameControlPanel( onSell = onSellStall, onUpgrade = onUpgradeStall, onCycleTarget = onCycleTargetMode, + onTriggerHaptic = onTriggerHaptic, canAffordUpgrade = gold >= upgradeCost, upgradeCost = upgradeCost, modifier = Modifier.weight(1f).fillMaxWidth() @@ -95,7 +100,10 @@ fun GameControlPanel( modifier = Modifier .size(24.dp) .border(1.dp, Color.White, androidx.compose.foundation.shape.CircleShape) - .clickable { onShowStallTutorial(selectedStall.stallType) }, + .clickable { + onShowStallTutorial(selectedStall.stallType) + onTriggerHaptic() + }, contentAlignment = Alignment.Center ) { Text(text = "?", color = Color.White, fontSize = 14.sp, fontWeight = androidx.compose.ui.text.font.FontWeight.Bold) @@ -131,6 +139,7 @@ fun GameControlPanel( StallSlot( stall = stall, isSelected = selectedStall?.id == stall.id, + canAfford = gold >= stall.cost, onClick = { onStallSelected(stall) }, stallsSheet = stallsSheet ) @@ -138,17 +147,20 @@ fun GameControlPanel( } } - Button( - onClick = onStartWave, - modifier = Modifier.fillMaxWidth().height(40.dp), - enabled = !waveActive, - contentPadding = PaddingValues(0.dp) - ) { + Box(modifier = Modifier.fillMaxWidth().height(40.dp), contentAlignment = Alignment.Center) { + SpriteButton( + normalRect = SpriteConstants.BTN_START_RECT, + onClick = onStartWave, + onTriggerHaptic = onTriggerHaptic, + enabled = !waveActive, + modifier = Modifier.fillMaxSize() + ) Text( text = if (waveActive) "LUNCH RUSH..." else "START LUNCH RUSH", - fontSize = 14.sp + color = Color.White, + fontSize = 14.sp, + modifier = Modifier.padding(bottom = 2.dp) ) } } } - diff --git a/app/src/main/java/com/messark/hawkerrush/ui/components/StallConsole.kt b/app/src/main/java/com/messark/hawkerrush/ui/components/StallConsole.kt index ce6c194..2de76cd 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/components/StallConsole.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/components/StallConsole.kt @@ -3,15 +3,22 @@ package com.messark.hawkerrush.ui.components import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* import androidx.compose.material3.Button +import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Text +import androidx.compose.ui.text.SpanStyle +import androidx.compose.ui.text.buildAnnotatedString +import androidx.compose.ui.text.withStyle import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.messark.hawkerrush.MainActivity +import com.messark.hawkerrush.SpriteButton import com.messark.hawkerrush.model.Stall import com.messark.hawkerrush.model.StallType +import com.messark.hawkerrush.ui.constants.SpriteConstants @Composable fun StallConsole( @@ -20,6 +27,7 @@ fun StallConsole( onSell: () -> Unit, onUpgrade: () -> Unit, onCycleTarget: () -> Unit, + onTriggerHaptic: () -> Unit, canAffordUpgrade: Boolean, upgradeCost: Int, modifier: Modifier = Modifier @@ -42,43 +50,71 @@ fun StallConsole( Text(text = "No upgrades", color = Color.Gray, fontSize = 10.sp) } else { val upgradeText = stall.upgrades.entries.joinToString(", ") { (key, value) -> - val benefit = stall.getUpgradeBenefit(key, value, baseStall) + val benefit = stall.getUpgradeBenefit(key, value) if (benefit.isNotEmpty()) "$key: $value ($benefit)" else "$key: $value" } Text(text = upgradeText, color = Color.Gray, fontSize = 10.sp) } } Column(horizontalAlignment = Alignment.End) { - Text(text = "Target: ${stall.targetMode.name}", color = Color.Cyan, fontSize = 12.sp, modifier = Modifier.clickable { onCycleTarget() }) + Text(text = "Target: ${stall.targetMode.name}", color = Color.Cyan, fontSize = 12.sp) Text(text = "Targets: ${stall.uniqueTargetIds.size} | Kills: ${stall.kills}", color = Color.Green, fontSize = 10.sp) } } Row( modifier = Modifier.fillMaxWidth(), - horizontalArrangement = Arrangement.spacedBy(4.dp) + horizontalArrangement = Arrangement.spacedBy(4.dp), + verticalAlignment = Alignment.CenterVertically ) { - Button( - onClick = onSell, - modifier = Modifier.weight(1f).height(36.dp), - contentPadding = PaddingValues(0.dp) - ) { - Text(text = "SELL $${(stall.totalInvestment * 0.5f).toInt()}", fontSize = 10.sp) + Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.Center) { + SpriteButton( + normalRect = SpriteConstants.BTN_SELL_RECT, + onClick = onSell, + onTriggerHaptic = onTriggerHaptic, + modifier = Modifier.fillMaxWidth().height(36.dp) + ) + Text( + text = "SELL \$${(stall.totalInvestment * 0.5f).toInt()}", + color = Color.White, + fontSize = 9.sp, + modifier = Modifier.padding(bottom = 2.dp) + ) } - Button( - onClick = onUpgrade, - modifier = Modifier.weight(1f).height(36.dp), - enabled = canAffordUpgrade, - contentPadding = PaddingValues(0.dp) - ) { - Text(text = "UPGRADE $$upgradeCost", fontSize = 10.sp) + + Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.Center) { + SpriteButton( + normalRect = SpriteConstants.BTN_UPGRADE_RECT, + onClick = onUpgrade, + onTriggerHaptic = onTriggerHaptic, + enabled = canAffordUpgrade, + modifier = Modifier.fillMaxWidth().height(36.dp) + ) + Text( + text = buildAnnotatedString { + append("UPGRADE ") + withStyle(style = SpanStyle(color = if (canAffordUpgrade) Color.Yellow else Color.Red)) { + append("\$$upgradeCost") + } + }, + fontSize = 9.sp, + modifier = Modifier.padding(bottom = 2.dp) + ) } - Button( - onClick = onCycleTarget, - modifier = Modifier.weight(1f).height(36.dp), - contentPadding = PaddingValues(0.dp) - ) { - Text(text = "TARGET", fontSize = 10.sp) + + Box(modifier = Modifier.weight(1f), contentAlignment = Alignment.Center) { + SpriteButton( + normalRect = SpriteConstants.BTN_TARGET_RECT, + onClick = onCycleTarget, + onTriggerHaptic = onTriggerHaptic, + modifier = Modifier.fillMaxWidth().height(36.dp) + ) + Text( + text = "TARGET", + color = Color.White, + fontSize = 9.sp, + modifier = Modifier.padding(bottom = 2.dp) + ) } } } diff --git a/app/src/main/java/com/messark/hawkerrush/ui/components/StallSlot.kt b/app/src/main/java/com/messark/hawkerrush/ui/components/StallSlot.kt index 251f137..5345da1 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/components/StallSlot.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/components/StallSlot.kt @@ -10,23 +10,25 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ColorFilter +import androidx.compose.ui.graphics.ColorMatrix import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import com.messark.hawkerrush.model.Stall -import com.messark.hawkerrush.model.StallType -import com.messark.hawkerrush.ui.constants.SpriteConstants +import com.messark.hawkerrush.registry.StallRegistry @Composable fun StallSlot( stall: Stall, isSelected: Boolean, + canAfford: Boolean, onClick: () -> Unit, stallsSheet: ImageBitmap ) { - val spriteRect = SpriteConstants.STALL_RECTS[stall.stallType] ?: SpriteConstants.STALL_RECTS[StallType.CHICKEN_RICE]!! + val spriteRect = StallRegistry.get(stall.stallType).spriteRect Box( modifier = Modifier @@ -47,18 +49,21 @@ fun StallSlot( srcOffset = spriteRect.topLeft, srcSize = spriteRect.size, dstOffset = IntOffset.Zero, - dstSize = IntSize(size.width.toInt(), size.height.toInt()) + dstSize = IntSize(size.width.toInt(), size.height.toInt()), + colorFilter = if (!canAfford) { + ColorFilter.colorMatrix(ColorMatrix().apply { setToSaturation(0f) }) + } else null ) } Text( text = stall.name, - color = Color.White, + color = if (canAfford) Color.White else Color.Gray, fontSize = 8.sp, maxLines = 1 ) Text( - text = "$${stall.cost}", - color = Color.Yellow, + text = "\$${stall.cost}", + color = if (canAfford) Color.Yellow else Color.Red, fontSize = 9.sp, maxLines = 1 ) diff --git a/app/src/main/java/com/messark/hawkerrush/ui/components/TutorialOverlay.kt b/app/src/main/java/com/messark/hawkerrush/ui/components/TutorialOverlay.kt index e68d4f9..103f94c 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/components/TutorialOverlay.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/components/TutorialOverlay.kt @@ -28,6 +28,8 @@ import com.messark.hawkerrush.R import com.messark.hawkerrush.SpriteButton import com.messark.hawkerrush.model.TutorialData import com.messark.hawkerrush.model.TutorialType +import com.messark.hawkerrush.registry.EnemyRegistry +import com.messark.hawkerrush.registry.StallRegistry import com.messark.hawkerrush.ui.constants.SpriteConstants import kotlinx.coroutines.delay @@ -90,7 +92,8 @@ fun TutorialOverlay( contentAlignment = Alignment.Center ) { if (tutorialData.enemyType != null) { - val rowIndex = SpriteConstants.ENEMY_ROW_INDICES[tutorialData.enemyType] ?: 0 + val enemyDef = EnemyRegistry.get(tutorialData.enemyType) + val rowIndex = enemyDef.spriteRow val srcRect = IntRect( left = frameIndex * SpriteConstants.ENEMY_SPRITE_WIDTH, top = rowIndex * SpriteConstants.ENEMY_SPRITE_HEIGHT, @@ -118,7 +121,7 @@ fun TutorialOverlay( } } } else if (tutorialData.stallType != null) { - val srcRect = SpriteConstants.STALL_RECTS[tutorialData.stallType] ?: IntRect(0, 0, 100, 100) + val srcRect = StallRegistry.get(tutorialData.stallType).spriteRect Canvas(modifier = Modifier.fillMaxSize(0.8f)) { val scale = Math.min(size.width / srcRect.width, size.height / srcRect.height) val drawWidth = srcRect.width * scale diff --git a/app/src/main/java/com/messark/hawkerrush/ui/constants/SpriteConstants.kt b/app/src/main/java/com/messark/hawkerrush/ui/constants/SpriteConstants.kt index 9017aa6..c0ccf2d 100644 --- a/app/src/main/java/com/messark/hawkerrush/ui/constants/SpriteConstants.kt +++ b/app/src/main/java/com/messark/hawkerrush/ui/constants/SpriteConstants.kt @@ -22,26 +22,11 @@ object SpriteConstants { val PILLAR_RECT = IntRect(31, 501, 101, 627) val GOAL_TABLE_RECT = IntRect(1100, 430, 1363, 628) - val STALL_RECTS = mapOf( - StallType.TEH_TARIK to IntRect(22, 41, 330, 451), - StallType.SATAY to IntRect(358, 41, 666, 451), - StallType.CHICKEN_RICE to IntRect(22, 500, 330, 930), - StallType.ICE_KACHANG to IntRect(358, 500, 666, 930), - StallType.DURIAN to IntRect(33, 961, 341, 1318) - ) - // Enemies (from drawable-nodpi/enemies.png) const val ENEMY_SPRITE_WIDTH = 100 const val ENEMY_SPRITE_HEIGHT = 125 const val ENEMY_SPRITE_FRAMES = 3 - val ENEMY_ROW_INDICES = mapOf( - com.messark.hawkerrush.model.EnemyType.AUNTIE to 0, - com.messark.hawkerrush.model.EnemyType.TOURIST to 1, - com.messark.hawkerrush.model.EnemyType.SALARYMAN to 2, - com.messark.hawkerrush.model.EnemyType.DELIVERY_RIDER to 3 - ) - val FX_PUDDLE_RECT = IntRect(1078, 679, 1142, 741) // Buttons (from drawable-nodpi/buttons.png) @@ -55,4 +40,8 @@ object SpriteConstants { val BTN_SAVE_RECT = IntRect(0, 649, 350, 744) val BTN_CANCEL_RECT = IntRect(0, 743, 350, 838) val BTN_CANCEL_CLICK_RECT = IntRect(0, 837, 350, 932) + val BTN_UPGRADE_RECT = IntRect(350, 1, 700, 96) + val BTN_START_RECT = IntRect(350, 182, 700, 277) + val BTN_SELL_RECT = IntRect(350, 369, 700, 463) + val BTN_TARGET_RECT = IntRect(350, 555, 700, 650) } diff --git a/app/src/main/res/drawable-nodpi/weapons.png b/app/src/main/res/drawable-nodpi/weapons.png new file mode 100644 index 0000000000000000000000000000000000000000..12b8cfaf942adf6c3eecfc29d76be49b47a8e257 GIT binary patch literal 126669 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
*He|_#h8Gcwc5_ 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 z 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 360% - val benefit9 = baseStall.getUpgradeBenefit("Damage", 9, baseStall) + val benefit9 = baseStall.getUpgradeBenefit("Damage", 9) assertEquals("+360%", benefit9) // Level 10: (15 + 10 * 6) * 1.25 = 75 * 1.25 = 93.75 -> 94 // Increase is 94 - 15 = 79. 79/15 = 5.266... -> 527% - val benefit10 = baseStall.getUpgradeBenefit("Damage", 10, baseStall) + val benefit10 = baseStall.getUpgradeBenefit("Damage", 10) assertEquals("+527%", benefit10) } From c2ab7ba61d180f99883641768b5ab21f61dcbdec Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Tue, 21 Apr 2026 13:08:32 +0000 Subject: [PATCH 2/2] Refactor stall and enemy definitions into registries Consolidated scattered data and behavioral logic for stalls and enemies into StallRegistry and EnemyRegistry. - Moved base stats, costs, and descriptions to registries. - Relocated behavioral logic (firing, damage modifiers, special behaviors) to registry definitions. - Centralized sprite coordinate mapping. - Simplified MainViewModel, UI components, and tests by delegating to registries. - Fixed a bug where Satay's fire rate was ignored due to rotation updates. - Rebasing on main to ensure no merge conflicts. Co-authored-by: candour <4670475+candour@users.noreply.github.com>