diff --git a/IWantToHeal-Thor-v1.1.34.apk b/IWantToHeal-Thor-v1.1.34.apk deleted file mode 100644 index 0f3fcd5..0000000 Binary files a/IWantToHeal-Thor-v1.1.34.apk and /dev/null differ diff --git a/IWantToHeal-Thor-v1.1.35.apk b/IWantToHeal-Thor-v1.1.35.apk deleted file mode 100644 index eac6f64..0000000 Binary files a/IWantToHeal-Thor-v1.1.35.apk and /dev/null differ diff --git a/IWantToHeal-Thor-v1.1.33.apk b/IWantToHeal-Thor-v1.1.37.apk similarity index 94% rename from IWantToHeal-Thor-v1.1.33.apk rename to IWantToHeal-Thor-v1.1.37.apk index c4ec986..fb87aaf 100644 Binary files a/IWantToHeal-Thor-v1.1.33.apk and b/IWantToHeal-Thor-v1.1.37.apk differ diff --git a/android/app/build.gradle b/android/app/build.gradle index e097e18..7664bfa 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -7,8 +7,8 @@ android { applicationId "com.warren.iwanttoheal" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 117 - versionName "1.1.36" + versionCode 118 + versionName "1.1.37" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. diff --git a/src/modes/iwt2/screens/BossArenaScreen.tsx b/src/modes/iwt2/screens/BossArenaScreen.tsx index ceb55ac..4bfd642 100644 --- a/src/modes/iwt2/screens/BossArenaScreen.tsx +++ b/src/modes/iwt2/screens/BossArenaScreen.tsx @@ -48,6 +48,7 @@ import { import { createIwt2PvpNormalizedGearProgress } from '../content/pvpGearNormalization' type ArenaStatus = 'playing' | 'paused' | 'victory' | 'defeat' +type PvpResultReason = 'opponent-defeated' | null type OverlayAction = 'primary' | 'requeue' | 'menu' type OverlayNavEntry = { action: OverlayAction @@ -143,6 +144,7 @@ export function BossArenaScreen({ bossId, bossIds, difficulty, modeLabel, save, )) const [abilityCooldowns, setAbilityCooldowns] = useState>({}) const [status, setStatus] = useState('playing') + const [pvpResultReason, setPvpResultReason] = useState(null) const [selectedOverlayAction, setSelectedOverlayAction] = useState('primary') const [selectedPartyId, setSelectedPartyId] = useState('player-healer') const [dropAwards, setDropAwards] = useState([]) @@ -226,16 +228,19 @@ export function BossArenaScreen({ bossId, bossIds, difficulty, modeLabel, save, setDropAwards([]) setPetAwards([]) setSelectedOverlayAction('primary') + setPvpResultReason(null) setStatus('playing') }, [activeGearProgress, arenaBounds, bossId, bossIds, combinedBossHealthScale, combinedDamageScale, pvpRoguelike, roguelikeBuffs, roguelikeContentType, roguelikeStage]) - const showOverlay = useCallback((nextStatus: Exclude) => { + const showOverlay = useCallback((nextStatus: Exclude, nextPvpResultReason: PvpResultReason = null) => { setSelectedOverlayAction('primary') + setPvpResultReason(nextPvpResultReason) statusRef.current = nextStatus setStatus(nextStatus) }, []) const resumeArena = useCallback(() => { + setPvpResultReason(null) statusRef.current = 'playing' setStatus('playing') }, []) @@ -336,7 +341,7 @@ export function BossArenaScreen({ bossId, bossIds, difficulty, modeLabel, save, return } if (action === 'back') { - if (statusRef.current === 'paused') resumeArena() + if (device === 'pc' && statusRef.current === 'paused') resumeArena() return } } @@ -421,15 +426,21 @@ export function BossArenaScreen({ bossId, bossIds, difficulty, modeLabel, save, onSaveUpdated(updatedSave) } - if (next.bosses.every((boss) => boss.health <= 0)) { - if (pvpRoguelike && roguelikeRun) { - statusRef.current = 'victory' - setStatus('victory') - roguelikeRun.onVictory() - } else { - showOverlay('victory') - } - } else if (next.party.every((member) => member.health <= 0)) { + const playerCleared = next.bosses.every((boss) => boss.health <= 0) + const playerDefeated = next.party.every((member) => member.health <= 0) + const opponentCleared = Boolean(nextOpponentState?.bosses.every((boss) => boss.health <= 0)) + const opponentDefeated = Boolean(nextOpponentState?.party.every((member) => member.health <= 0)) + if (!pvpRoguelike && playerCleared) { + showOverlay('victory') + } else if (pvpRoguelike && playerDefeated) { + showOverlay('defeat') + } else if (pvpRoguelike && playerCleared && opponentDefeated) { + showOverlay('victory', 'opponent-defeated') + } else if (pvpRoguelike && playerCleared && opponentCleared && roguelikeRun) { + statusRef.current = 'victory' + setStatus('victory') + roguelikeRun.onVictory() + } else if (!pvpRoguelike && playerDefeated) { showOverlay('defeat') } @@ -465,7 +476,9 @@ export function BossArenaScreen({ bossId, bossIds, difficulty, modeLabel, save, ? 'Rematch' : 'Restart' const overlayTitle = status === 'victory' - ? `${bossTitle} Down` + ? pvpResultReason === 'opponent-defeated' + ? 'CPU Rival Falls' + : `${bossTitle} Down` : status === 'defeat' ? 'Party Defeated' : 'Arena Paused'