Fix special missions crash and NaN% stat display

- Fix crash when tapping a completed special mission: onClickCollect
  was ignoring the missionId passed by SpecialMissionsEntry and using
  selectedSpecialMissionId (-1 by default), causing Room to query id=-1
  on a non-nullable Flow which throws when no row exists.
- Fix NaN% in current phase win rate: the guard was checking
  totalBattlesLost==0 but dividing by currentPhaseBattles, producing
  0/0=NaN when total>0 but current phase has no battles yet.
- Guard against empty items list in clearSpecialMission to avoid
  NoSuchElementException from random() on an empty collection.
This commit is contained in:
b13st 2026-06-24 15:21:21 +02:00
parent 81bfec5ac5
commit 2e72b543f6
2 changed files with 10 additions and 9 deletions

View File

@ -45,11 +45,12 @@ class HomeScreenControllerImpl(
.clearSpecialMission(missionId) .clearSpecialMission(missionId)
if (missionStatus.status == SpecialMission.Status.COMPLETED) { if (missionStatus.status == SpecialMission.Status.COMPLETED) {
val randomItem = database val allItems = database.itemDao().getAllItems().first()
.itemDao() if (allItems.isEmpty()) {
.getAllItems() onCleared(null, null)
.first() return@launch
.random() }
val randomItem = allItems.random()
val randomItemAmount = (Random.nextFloat() * 5).roundToInt() val randomItemAmount = (Random.nextFloat() * 5).roundToInt()

View File

@ -142,7 +142,7 @@ fun VBDiMHomeScreen(
ItemDisplay( ItemDisplay(
icon = R.drawable.baseline_swords_24, icon = R.drawable.baseline_swords_24,
textValue = when { textValue = when {
activeMon.totalBattlesLost == 0 -> "0.00 %" activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost == 0 -> "0.00 %"
else -> { else -> {
val battleWinPercentage = val battleWinPercentage =
activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat() activeMon.currentPhaseBattlesWon.toFloat() / (activeMon.currentPhaseBattlesWon + activeMon.currentPhaseBattlesLost).toFloat()
@ -150,7 +150,7 @@ fun VBDiMHomeScreen(
Locale.getDefault(), Locale.getDefault(),
"%.2f", "%.2f",
battleWinPercentage * 100 battleWinPercentage * 100
) + " %" // Specify locale ) + " %"
} }
}, },
definition = stringResource(R.string.home_vbdim_current_phase_win), definition = stringResource(R.string.home_vbdim_current_phase_win),
@ -193,9 +193,9 @@ fun VBDiMHomeScreen(
onClickMission = { missionId -> onClickMission = { missionId ->
selectedSpecialMissionId = missionId selectedSpecialMissionId = missionId
}, },
onClickCollect = { onClickCollect = { missionId ->
homeScreenController homeScreenController
.clearSpecialMission(selectedSpecialMissionId, onClickCollect) .clearSpecialMission(missionId, onClickCollect)
} }
) )
} }