Added BGM to battles.

This commit is contained in:
lightheel 2025-11-17 17:52:53 -05:00
parent c774fd1536
commit eb82c2afc1

View File

@ -49,6 +49,8 @@ import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.content.Intent import android.content.Intent
import android.net.Uri import android.net.Uri
import android.media.MediaPlayer
import android.os.Environment
//import androidx.compose.animation.core.animateFloatAsState //import androidx.compose.animation.core.animateFloatAsState
//import androidx.compose.animation.core.tween //import androidx.compose.animation.core.tween
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
@ -231,6 +233,9 @@ fun BattleScreen(
val battleSystem = remember { ArenaBattleSystem() } val battleSystem = remember { ArenaBattleSystem() }
val coroutineScope = rememberCoroutineScope() val coroutineScope = rememberCoroutineScope()
// Background music MediaPlayer
var mediaPlayer by remember { mutableStateOf<MediaPlayer?>(null) }
// Initialize HP when battle starts // Initialize HP when battle starts
LaunchedEffect(activeCharacter, opponentCharacter) { LaunchedEffect(activeCharacter, opponentCharacter) {
val playerMaxHP = activeCharacter?.baseHp?.toFloat() ?: 100f val playerMaxHP = activeCharacter?.baseHp?.toFloat() ?: 100f
@ -238,6 +243,61 @@ fun BattleScreen(
battleSystem.initializeHP(playerMaxHP, opponentMaxHP) battleSystem.initializeHP(playerMaxHP, opponentMaxHP)
} }
// Start background music when battle starts
LaunchedEffect(Unit) {
context?.let { ctx ->
try {
// Get external storage directory
val externalDir = Environment.getExternalStorageDirectory()
val musicDir = File(externalDir, "VBHelper/extracted_audio/background_music")
// Pick a random BGM file (bgm_001.wav to bgm_004.wav)
val bgmNumber = kotlin.random.Random.nextInt(1, 5) // 1 to 4
val bgmFileName = String.format("bgm_%03d.wav", bgmNumber)
val bgmFile = File(musicDir, bgmFileName)
if (bgmFile.exists()) {
println("BATTLESCREEN: Starting background music: $bgmFileName")
val player = MediaPlayer().apply {
setDataSource(bgmFile.absolutePath)
prepare()
setOnCompletionListener {
// Stop after one playthrough
println("BATTLESCREEN: Background music completed, stopping")
it.release()
mediaPlayer = null
}
start()
}
mediaPlayer = player
} else {
println("BATTLESCREEN: Background music file not found: ${bgmFile.absolutePath}")
}
} catch (e: Exception) {
println("BATTLESCREEN: Error starting background music: ${e.message}")
e.printStackTrace()
}
}
}
// Clean up MediaPlayer when battle ends or composable is disposed
DisposableEffect(Unit) {
onDispose {
mediaPlayer?.let { player ->
try {
if (player.isPlaying) {
player.stop()
}
player.release()
println("BATTLESCREEN: Background music stopped and released")
} catch (e: Exception) {
println("BATTLESCREEN: Error stopping background music: ${e.message}")
}
}
mediaPlayer = null
}
}
// Pending damage state for API integration // Pending damage state for API integration
var pendingPlayerDamage by remember { mutableStateOf(0f) } var pendingPlayerDamage by remember { mutableStateOf(0f) }
var pendingOpponentDamage by remember { mutableStateOf(0f) } var pendingOpponentDamage by remember { mutableStateOf(0f) }
@ -2307,9 +2367,13 @@ fun BattlesScreen() {
} }
} }
// Exit button // Exit button - stop music before exiting
Button( Button(
onClick = { currentView = "main" }, onClick = {
// Stop background music before exiting
// Note: Music will also be stopped by DisposableEffect in BattleScreen
currentView = "main"
},
modifier = Modifier.align(Alignment.TopCenter), modifier = Modifier.align(Alignment.TopCenter),
colors = ButtonDefaults.buttonColors(containerColor = Color.Red) colors = ButtonDefaults.buttonColors(containerColor = Color.Red)
) { ) {