Added multiple background sets for battle.

This commit is contained in:
lightheel 2025-08-08 12:37:32 -04:00
parent 6a6369ae9e
commit 16cd7abce8

View File

@ -204,7 +204,8 @@ fun BattleScreen(
activeCharacter: APIBattleCharacter?, activeCharacter: APIBattleCharacter?,
opponentCharacter: APIBattleCharacter?, opponentCharacter: APIBattleCharacter?,
onAttackClick: () -> Unit, onAttackClick: () -> Unit,
context: android.content.Context? = null context: android.content.Context? = null,
selectedBackgroundSet: Int = 0
) { ) {
val battleSystem = remember { ArenaBattleSystem() } val battleSystem = remember { ArenaBattleSystem() }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
@ -617,7 +618,8 @@ fun BattleScreen(
}, },
coroutineScope = coroutineScope, coroutineScope = coroutineScope,
hidePlayerAttackSprite = hidePlayerAttackSprite, hidePlayerAttackSprite = hidePlayerAttackSprite,
hideEnemyAttackSprite = hideEnemyAttackSprite hideEnemyAttackSprite = hideEnemyAttackSprite,
selectedBackgroundSet = selectedBackgroundSet
) )
} }
1 -> { 1 -> {
@ -638,7 +640,8 @@ fun BattleScreen(
pendingOpponentDamage = opponentDamage pendingOpponentDamage = opponentDamage
}, },
coroutineScope = coroutineScope, coroutineScope = coroutineScope,
hidePlayerAttackSprite = hidePlayerAttackSprite hidePlayerAttackSprite = hidePlayerAttackSprite,
selectedBackgroundSet = selectedBackgroundSet
) )
} }
2 -> { 2 -> {
@ -650,7 +653,8 @@ fun BattleScreen(
attackAnimationProgress = battleSystem.attackProgress, attackAnimationProgress = battleSystem.attackProgress,
activeCharacter = opponentCharacter, activeCharacter = opponentCharacter,
playerCharacter = activeCharacter, playerCharacter = activeCharacter,
hideEnemyAttackSprite = hideEnemyAttackSprite hideEnemyAttackSprite = hideEnemyAttackSprite,
selectedBackgroundSet = selectedBackgroundSet
) )
} }
} }
@ -745,7 +749,8 @@ fun MiddleBattleView(
onSetPendingDamage: (Float, Float) -> Unit, onSetPendingDamage: (Float, Float) -> Unit,
coroutineScope: kotlinx.coroutines.CoroutineScope, coroutineScope: kotlinx.coroutines.CoroutineScope,
hidePlayerAttackSprite: Boolean, hidePlayerAttackSprite: Boolean,
hideEnemyAttackSprite: Boolean hideEnemyAttackSprite: Boolean,
selectedBackgroundSet: Int = 0
) { ) {
// Track previous character ID to detect transitions // Track previous character ID to detect transitions
var previousCharacterId by remember { mutableStateOf<String?>(null) } var previousCharacterId by remember { mutableStateOf<String?>(null) }
@ -758,7 +763,8 @@ fun MiddleBattleView(
) { ) {
// Animated background - positioned underneath all other sprites // Animated background - positioned underneath all other sprites
MultiLayerAnimatedBattleBackground( MultiLayerAnimatedBattleBackground(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize(),
backgroundSetIndex = selectedBackgroundSet
) )
// Top section: HP bars and HP numbers // Top section: HP bars and HP numbers
@ -1168,7 +1174,8 @@ fun PlayerBattleView(
opponent: APIBattleCharacter?, opponent: APIBattleCharacter?,
onSetPendingDamage: (Float, Float) -> Unit, onSetPendingDamage: (Float, Float) -> Unit,
coroutineScope: kotlinx.coroutines.CoroutineScope, coroutineScope: kotlinx.coroutines.CoroutineScope,
hidePlayerAttackSprite: Boolean hidePlayerAttackSprite: Boolean,
selectedBackgroundSet: Int = 0
) { ) {
// Track previous character ID to detect transitions // Track previous character ID to detect transitions
var previousCharacterId by remember { mutableStateOf<String?>(null) } var previousCharacterId by remember { mutableStateOf<String?>(null) }
@ -1180,7 +1187,7 @@ fun PlayerBattleView(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
// Multi-layer animated battle background // Multi-layer animated battle background
MultiLayerAnimatedBattleBackground(modifier = Modifier.fillMaxSize()) MultiLayerAnimatedBattleBackground(modifier = Modifier.fillMaxSize(), backgroundSetIndex = selectedBackgroundSet)
// Top section: HP bar and HP numbers // Top section: HP bar and HP numbers
Column( Column(
@ -1356,7 +1363,8 @@ fun EnemyBattleView(
attackAnimationProgress: Float, attackAnimationProgress: Float,
activeCharacter: APIBattleCharacter? = null, activeCharacter: APIBattleCharacter? = null,
playerCharacter: APIBattleCharacter? = null, playerCharacter: APIBattleCharacter? = null,
hideEnemyAttackSprite: Boolean hideEnemyAttackSprite: Boolean,
selectedBackgroundSet: Int = 0
) { ) {
// Track previous character ID to detect transitions // Track previous character ID to detect transitions
var previousCharacterId by remember { mutableStateOf<String?>(null) } var previousCharacterId by remember { mutableStateOf<String?>(null) }
@ -1367,7 +1375,7 @@ fun EnemyBattleView(
modifier = Modifier.fillMaxSize() modifier = Modifier.fillMaxSize()
) { ) {
// Multi-layer animated battle background // Multi-layer animated battle background
MultiLayerAnimatedBattleBackground(modifier = Modifier.fillMaxSize()) MultiLayerAnimatedBattleBackground(modifier = Modifier.fillMaxSize(), backgroundSetIndex = selectedBackgroundSet)
// Top section: Enemy HP bar and HP numbers // Top section: Enemy HP bar and HP numbers
Column( Column(
@ -1537,6 +1545,9 @@ fun BattlesScreen() {
var selectedStage by remember { mutableStateOf("") } var selectedStage by remember { mutableStateOf("") }
var currentStage by remember { mutableStateOf("rookie") } var currentStage by remember { mutableStateOf("rookie") }
// Random background set selection
var selectedBackgroundSet by remember { mutableStateOf(0) }
// Sprite animation tester state // Sprite animation tester state
var showSpriteTester by remember { mutableStateOf(false) } var showSpriteTester by remember { mutableStateOf(false) }
var spriteTesterView by remember { mutableStateOf("entry") } // "entry" or "testing" var spriteTesterView by remember { mutableStateOf("entry") } // "entry" or "testing"
@ -1970,6 +1981,8 @@ fun BattlesScreen() {
onClick = { onClick = {
activeCharacter?.let { activeCharacter?.let {
selectedOpponent = opponent selectedOpponent = opponent
// Randomly select background set (0, 1, or 2)
selectedBackgroundSet = kotlin.random.Random.nextInt(3)
RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 0, 0, opponent.name, 0) { apiResult -> RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 0, 0, opponent.name, 0) { apiResult ->
currentView = "battle-main" currentView = "battle-main"
} }
@ -2008,6 +2021,8 @@ fun BattlesScreen() {
onClick = { onClick = {
activeCharacter?.let { activeCharacter?.let {
selectedOpponent = opponent selectedOpponent = opponent
// Randomly select background set (0, 1, or 2)
selectedBackgroundSet = kotlin.random.Random.nextInt(3)
RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 1, 0, opponent.name, 1) { apiResult -> RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 1, 0, opponent.name, 1) { apiResult ->
currentView = "battle-main" currentView = "battle-main"
} }
@ -2046,6 +2061,8 @@ fun BattlesScreen() {
onClick = { onClick = {
activeCharacter?.let { activeCharacter?.let {
selectedOpponent = opponent selectedOpponent = opponent
// Randomly select background set (0, 1, or 2)
selectedBackgroundSet = kotlin.random.Random.nextInt(3)
RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 2, 0, opponent.name, 2) { apiResult -> RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 2, 0, opponent.name, 2) { apiResult ->
currentView = "battle-main" currentView = "battle-main"
} }
@ -2084,6 +2101,8 @@ fun BattlesScreen() {
onClick = { onClick = {
activeCharacter?.let { activeCharacter?.let {
selectedOpponent = opponent selectedOpponent = opponent
// Randomly select background set (0, 1, or 2)
selectedBackgroundSet = kotlin.random.Random.nextInt(3)
RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 3, 0, opponent.name, 3) { apiResult -> RetrofitHelper().getPVPWinner(context, 0, 2, it.name, 3, 0, opponent.name, 3) { apiResult ->
currentView = "battle-main" currentView = "battle-main"
} }
@ -2118,7 +2137,8 @@ fun BattlesScreen() {
// This will be called when the battle is over // This will be called when the battle is over
currentView = "battle-results" currentView = "battle-results"
}, },
context = context context = context,
selectedBackgroundSet = selectedBackgroundSet
) )
} }
@ -2298,9 +2318,36 @@ fun AnimatedBattleBackground(
} }
} }
// Data class to define background sets
data class BackgroundSet(
val backLayer: String,
val middleLayer: String,
val frontLayer: String
)
// Define the three background sets
val backgroundSets = listOf(
BackgroundSet(
backLayer = "BattleBg_0018_BattleBg_0013.png",
middleLayer = "BattleBg_0015_BattleBg_0012.png",
frontLayer = "BattleBg_0005_BattleBg_0011.png"
),
BackgroundSet(
backLayer = "BattleBg_0014_BattleBg_0013.png",
middleLayer = "BattleBg_0010_BattleBg_0012.png",
frontLayer = "BattleBg_0011_BattleBg_0011.png"
),
BackgroundSet(
backLayer = "BattleBg_0019_BattleBg_0013.png",
middleLayer = "BattleBg_0004_BattleBg_0012.png",
frontLayer = "BattleBg_0009_BattleBg_0011.png"
)
)
@Composable @Composable
fun MultiLayerAnimatedBattleBackground( fun MultiLayerAnimatedBattleBackground(
modifier: Modifier = Modifier modifier: Modifier = Modifier,
backgroundSetIndex: Int = 0
) { ) {
val context = LocalContext.current val context = LocalContext.current
var backLayerBitmap by remember { mutableStateOf<android.graphics.Bitmap?>(null) } var backLayerBitmap by remember { mutableStateOf<android.graphics.Bitmap?>(null) }
@ -2324,33 +2371,34 @@ fun MultiLayerAnimatedBattleBackground(
} }
// Load all three background layers from external storage // Load all three background layers from external storage
LaunchedEffect(Unit) { LaunchedEffect(backgroundSetIndex) {
try { try {
val externalDir = Environment.getExternalStorageDirectory() val externalDir = Environment.getExternalStorageDirectory()
val selectedSet = backgroundSets[backgroundSetIndex]
// Back layer (BattleBg_0018_BattleBg_0013.png) // Back layer
val backLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/BattleBg_0018_BattleBg_0013.png") val backLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/${selectedSet.backLayer}")
if (backLayerFile.exists()) { if (backLayerFile.exists()) {
backLayerBitmap = BitmapFactory.decodeFile(backLayerFile.absolutePath) backLayerBitmap = BitmapFactory.decodeFile(backLayerFile.absolutePath)
println("Successfully loaded back layer background: ${backLayerFile.absolutePath}") println("Successfully loaded back layer background (Set ${backgroundSetIndex + 1}): ${backLayerFile.absolutePath}")
} else { } else {
println("Back layer background file not found: ${backLayerFile.absolutePath}") println("Back layer background file not found: ${backLayerFile.absolutePath}")
} }
// Middle layer (BattleBg_0015_BattleBg_0012.png) // Middle layer
val middleLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/BattleBg_0015_BattleBg_0012.png") val middleLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/${selectedSet.middleLayer}")
if (middleLayerFile.exists()) { if (middleLayerFile.exists()) {
middleLayerBitmap = BitmapFactory.decodeFile(middleLayerFile.absolutePath) middleLayerBitmap = BitmapFactory.decodeFile(middleLayerFile.absolutePath)
println("Successfully loaded middle layer background: ${middleLayerFile.absolutePath}") println("Successfully loaded middle layer background (Set ${backgroundSetIndex + 1}): ${middleLayerFile.absolutePath}")
} else { } else {
println("Middle layer background file not found: ${middleLayerFile.absolutePath}") println("Middle layer background file not found: ${middleLayerFile.absolutePath}")
} }
// Front layer (BattleBg_0005_BattleBg_0011.png) // Front layer
val frontLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/BattleBg_0005_BattleBg_0011.png") val frontLayerFile = File(externalDir, "VBHelper/battle_sprites/extracted_battlebgs/${selectedSet.frontLayer}")
if (frontLayerFile.exists()) { if (frontLayerFile.exists()) {
frontLayerBitmap = BitmapFactory.decodeFile(frontLayerFile.absolutePath) frontLayerBitmap = BitmapFactory.decodeFile(frontLayerFile.absolutePath)
println("Successfully loaded front layer background: ${frontLayerFile.absolutePath}") println("Successfully loaded front layer background (Set ${backgroundSetIndex + 1}): ${frontLayerFile.absolutePath}")
} else { } else {
println("Front layer background file not found: ${frontLayerFile.absolutePath}") println("Front layer background file not found: ${frontLayerFile.absolutePath}")
} }