Android build v1.0.58 stadium added
This commit is contained in:
+36
-10
@@ -67,6 +67,14 @@ export type DualScreenCombatState = {
|
||||
paused: boolean
|
||||
targetGroup: 0 | 1 | 2
|
||||
speedMultiplier: 1 | 2
|
||||
stadium?: {
|
||||
dampeningPercent: number
|
||||
roundIndex: number
|
||||
playerWins: number
|
||||
opponentWins: number
|
||||
survivalSeconds: number
|
||||
opponentSurvivalSeconds: number
|
||||
}
|
||||
}
|
||||
|
||||
export type DualScreenWorkshopState = {
|
||||
@@ -138,6 +146,11 @@ function memberHotEffects(member: PartyMember) {
|
||||
: []
|
||||
}
|
||||
|
||||
function formatDualTime(seconds: number) {
|
||||
const total = Math.max(0, Math.floor(seconds))
|
||||
return `${Math.floor(total / 60)}:${String(total % 60).padStart(2, '0')}`
|
||||
}
|
||||
|
||||
export function DualScreenProvider({ children }: { children: ReactNode }) {
|
||||
const [enabled, setEnabledState] = useState(
|
||||
() => localStorage.getItem(STORAGE_KEY) === 'true',
|
||||
@@ -446,21 +459,34 @@ export function DualScreenBottomDisplay() {
|
||||
{state.opponentParty && <small>{state.opponentClassName}</small>}
|
||||
</div>
|
||||
<div className="dual-controls-progress">
|
||||
<span>{state.opponentParty ? 'Live PvP' : `Encounter ${state.encounterIndex + 1}/${state.encounterCount}`}</span>
|
||||
<span>{state.stadium ? `Round ${state.stadium.roundIndex} | ${state.stadium.playerWins}-${state.stadium.opponentWins}` : state.opponentParty ? 'Live PvP' : `Encounter ${state.encounterIndex + 1}/${state.encounterCount}`}</span>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
{state.opponentParty ? (
|
||||
<>
|
||||
<section className="dual-opponent-progress">
|
||||
<div>
|
||||
<p className="eyebrow">Opponent Clear</p>
|
||||
<strong>{Math.max(0, Math.floor(state.opponentEnemyHealth ?? 0))} / {state.encounterMaxHealth}</strong>
|
||||
</div>
|
||||
<div className="bar enemy-health boss-bar">
|
||||
<span style={{ width: `${Math.max(0, ((state.opponentEnemyHealth ?? 0) / state.encounterMaxHealth) * 100)}%` }} />
|
||||
</div>
|
||||
</section>
|
||||
{state.stadium ? (
|
||||
<section className="dual-opponent-progress stadium">
|
||||
<div>
|
||||
<p className="eyebrow">Dampening</p>
|
||||
<strong>{state.stadium.dampeningPercent}%</strong>
|
||||
</div>
|
||||
<div>
|
||||
<p className="eyebrow">Survival</p>
|
||||
<strong>{formatDualTime(state.stadium.opponentSurvivalSeconds)}</strong>
|
||||
</div>
|
||||
</section>
|
||||
) : (
|
||||
<section className="dual-opponent-progress">
|
||||
<div>
|
||||
<p className="eyebrow">Opponent Clear</p>
|
||||
<strong>{Math.max(0, Math.floor(state.opponentEnemyHealth ?? 0))} / {state.encounterMaxHealth}</strong>
|
||||
</div>
|
||||
<div className="bar enemy-health boss-bar">
|
||||
<span style={{ width: `${Math.max(0, ((state.opponentEnemyHealth ?? 0) / state.encounterMaxHealth) * 100)}%` }} />
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
<section className={`dual-opponent-party-grid ${state.opponentParty.length > 6 ? 'raid' : ''}`}>
|
||||
{state.opponentParty.map((member) => (
|
||||
|
||||
Reference in New Issue
Block a user