Polish release candidate QA flow

This commit is contained in:
2026-06-28 13:24:28 +09:00
parent 87a25ffbc1
commit 99843135c9
6 changed files with 554 additions and 301 deletions

View File

@@ -1126,6 +1126,7 @@ type BattleObjectiveResult = {
id: string;
label: string;
achieved: boolean;
status: 'active' | 'done' | 'failed';
detail: string;
rewardGold: number;
};
@@ -4597,6 +4598,7 @@ export class BattleScene extends Phaser.Scene {
id: objective.id,
label: objective.label,
achieved: objective.achieved,
status: objective.status,
detail: objective.detail,
rewardGold: objective.rewardGold
}));
@@ -4630,7 +4632,7 @@ export class BattleScene extends Phaser.Scene {
id: objective.id,
label: objective.label,
achieved: alive,
status: alive ? 'active' : 'failed',
status: alive ? (outcome === 'victory' ? 'done' : 'active') : 'failed',
detail: alive ? `${this.unitName(targetId)} 생존` : `${this.unitName(targetId)} 퇴각`,
rewardGold: objective.rewardGold
};
@@ -4662,7 +4664,7 @@ export class BattleScene extends Phaser.Scene {
label: objective.label,
achieved,
status: achieved ? (outcome === 'victory' ? 'done' : 'active') : 'failed',
detail: inTime ? `${this.turnNumber}/${maxTurn}턴 진행 중` : `${this.turnNumber}/${maxTurn}턴 초과`,
detail: inTime ? (outcome === 'victory' ? `${this.turnNumber}/${maxTurn}턴 달성` : `${this.turnNumber}/${maxTurn}턴 진행 중`) : `${this.turnNumber}/${maxTurn}턴 초과`,
rewardGold: objective.rewardGold
};
}
@@ -4728,7 +4730,7 @@ export class BattleScene extends Phaser.Scene {
bg.setDepth(depth);
bg.setStrokeStyle(1, palette.blue, 0.56);
const title = this.trackResultObject(this.add.text(x + 14, y + 10, '전투 목표', {
const title = this.trackResultObject(this.add.text(x + 14, y + 10, '목표 정산', {
fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif',
fontSize: '19px',
color: '#f2e3bf',
@@ -4738,12 +4740,13 @@ export class BattleScene extends Phaser.Scene {
objectives.forEach((objective, index) => {
const rowY = y + 42 + index * 21;
const mark = objective.achieved ? '완료' : '미달';
const mark = objective.achieved ? '완료' : objective.status === 'failed' ? '미획득' : '보너스';
const color = objective.achieved ? '#a8ffd0' : '#aeb7c2';
const line = this.trackResultObject(this.add.text(x + 16, rowY, `${mark} ${objective.label} ${objective.detail}`, {
const line = this.trackResultObject(this.add.text(x + 16, rowY, `${mark} ${objective.label} · ${objective.detail}`, {
fontFamily: '"Malgun Gothic", "Noto Sans KR", sans-serif',
fontSize: '13px',
color
color,
wordWrap: { width: width - 98, useAdvancedWrap: true }
}));
line.setDepth(depth + 1);
@@ -4780,7 +4783,7 @@ export class BattleScene extends Phaser.Scene {
.join(' ');
const achievedCount = objectives.filter((objective) => objective.achieved).length;
const lines = [
outcome === 'victory' ? `군자금 ${this.resultGold(outcome)} 목표 ${achievedCount}/${objectives.length}` : '패배: 보상 없음',
outcome === 'victory' ? `군자금 ${this.resultGold(outcome)} 목표 보상 ${achievedCount}/${objectives.length}` : '패배: 보상 없음',
mvp ? `MVP ${mvp.unit.name}: 피해 ${mvp.stats.damageDealt}, 격파 ${mvp.stats.defeats}` : 'MVP 없음',
bondSummary ? `공명 성장 ${bondSummary}` : '공명 성장 없음',
outcome === 'victory' ? `전리품: ${battleScenario.itemRewards.join(', ')}` : '재도전하면 목표 보상을 다시 노릴 수 있습니다.'
@@ -8953,8 +8956,8 @@ export class BattleScene extends Phaser.Scene {
private compactSituationMessage(message: string) {
return message
.split('\n')
.slice(0, 2)
.map((line) => (line.length > 18 ? `${line.slice(0, 17)}...` : line))
.slice(0, 3)
.map((line) => (line.length > 30 ? `${line.slice(0, 29)}` : line))
.join('\n');
}
@@ -8966,15 +8969,15 @@ export class BattleScene extends Phaser.Scene {
const leader = battleUnits.find((unit) => unit.id === leaderUnitId);
const leaderProgress = leader && leader.hp > 0 ? `${leader.hp}/${leader.maxHp}` : '완료';
const quickObjective = this.objectiveStates(this.battleOutcome).find((objective) => objective.id === 'quick');
const quickText = quickObjective ? ` · ${quickObjective.label} ${this.objectiveStatusText(quickObjective)}` : '';
const quickText = quickObjective ? ` · 보너스: ${quickObjective.label} ${this.objectiveStatusText(quickObjective)}` : '';
const victoryText =
this.battleOutcome === 'victory'
? `승리: ${battleScenario.victoryConditionLabel} 완료`
: `승리: ${battleScenario.victoryConditionLabel} (${leaderProgress})`;
? `승리 목표 완료: ${battleScenario.victoryConditionLabel}`
: `승리 목표: ${battleScenario.victoryConditionLabel} · ${this.unitName(leaderUnitId)} ${leaderProgress}`;
const defeatText =
this.battleOutcome === 'defeat'
? `패배: ${battleScenario.defeatConditionLabel} 발생`
: `패배: ${battleScenario.defeatConditionLabel}`;
? `패배 조건 발생: ${battleScenario.defeatConditionLabel}`
: `패배 조건: ${battleScenario.defeatConditionLabel}`;
this.objectiveTrackerText.setText(victoryText);
this.objectiveTrackerSubText.setText(`${defeatText}${quickText}`);
@@ -9697,7 +9700,7 @@ export class BattleScene extends Phaser.Scene {
}
debugForceBattleOutcome(outcome: BattleOutcome = 'victory') {
if (!import.meta.env.DEV || this.battleOutcome) {
if (!this.debugToolsEnabled() || this.battleOutcome) {
return;
}
@@ -9740,7 +9743,7 @@ export class BattleScene extends Phaser.Scene {
}
private installDebugHotkeys() {
if (!import.meta.env.DEV) {
if (!this.debugToolsEnabled()) {
return;
}
@@ -9756,6 +9759,16 @@ export class BattleScene extends Phaser.Scene {
});
}
private debugToolsEnabled() {
if (import.meta.env.DEV) {
return true;
}
if (typeof window === 'undefined') {
return false;
}
return new URLSearchParams(window.location.search).has('debug');
}
private updateDebugOverlay() {
if (!this.debugOverlay) {
return;