From bc42a4dfbc6d649f990500f0707e6d60ee6f38a9 Mon Sep 17 00:00:00 2001 From: Wickedness Date: Mon, 6 Jul 2026 12:30:43 +0900 Subject: [PATCH] Stabilize early objective QA gate --- scripts/qa-repeat.mjs | 5 +++++ src/game/data/battles.ts | 32 ++++++++++++++++---------------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/scripts/qa-repeat.mjs b/scripts/qa-repeat.mjs index c67aee4..4c8cd99 100644 --- a/scripts/qa-repeat.mjs +++ b/scripts/qa-repeat.mjs @@ -61,6 +61,11 @@ console.log( `QA repeat summary: runs=${aggregate.runs.length} battles=${aggregate.battleCount} processFailures=${aggregate.summary.runsWithProcessFailures} objectiveMisses=${aggregate.summary.totalMissedObjectives}` ); +if (aggregate.summary.runsWithProcessFailures > 0 || aggregate.summary.totalMissedObjectives > 0) { + console.error('QA repeat failed: process failures or missed objectives were detected.'); + process.exitCode = 1; +} + function buildAggregateReport(reports) { const missedObjectiveCounts = new Map(); const battleOutcomes = new Map(); diff --git a/src/game/data/battles.ts b/src/game/data/battles.ts index 8f9f43d..9d08955 100644 --- a/src/game/data/battles.ts +++ b/src/game/data/battles.ts @@ -653,7 +653,7 @@ export const thirdBattleScenario: BattleScenarioDefinition = { openingObjectiveLines: [ '황건 전령 마원이 광종 본대로 향하고 있습니다. 마원을 격파하면 적의 연락망이 끊어집니다.', '강가 길목, 언덕 궁병선, 요새 보급 지형이 이어져 있어 정면으로만 밀면 전선이 오래 묶입니다.', - '18턴 이내에 승리하면 광종 구원로 확보 명성이 오릅니다.' + '20턴 이내에 승리하면 광종 구원로 확보 명성이 오릅니다.' ], tacticalGuide: { summary: '관우는 강가 길목을 버티고, 장비는 전령 기병의 길을 끊습니다. 요새와 언덕 궁병선을 그대로 두면 피해가 누적됩니다.', @@ -704,7 +704,7 @@ export const thirdBattleScenario: BattleScenarioDefinition = { bonds: thirdBattleBonds, mapTextureKey: 'battle-map-third', leaderUnitId: 'guangzong-leader-ma-yuan', - quickVictoryTurnLimit: 18, + quickVictoryTurnLimit: 20, baseVictoryGold: 520, objectives: [ { @@ -733,9 +733,9 @@ export const thirdBattleScenario: BattleScenarioDefinition = { { id: 'quick', kind: 'quick-victory', - label: '18턴 이내 승리', + label: '20턴 이내 승리', rewardGold: 180, - maxTurn: 18 + maxTurn: 20 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], @@ -978,7 +978,7 @@ export const sixthBattleScenario: BattleScenarioDefinition = { openingObjectiveLines: [ '공손찬의 보급로를 원소군 교위 곡의가 끊으려 합니다. 곡의를 격파하면 계교로 향하는 길을 다시 열 수 있습니다.', '강가의 궁병과 측면 기병이 동시에 압박합니다. 유비는 뒤에 두고 관우와 장비로 중앙 길을 확보하십시오.', - '50턴 이내에 승리하면 공손찬 진영에서 세 형제의 신뢰가 커집니다.' + '55턴 이내에 승리하면 공손찬 진영에서 세 형제의 신뢰가 커집니다.' ], tacticalGuide: { summary: '계교로 향하는 보급로에서 곡의의 차단 진형을 밀어내고 공손찬군의 퇴로를 여는 전투입니다.', @@ -1031,7 +1031,7 @@ export const sixthBattleScenario: BattleScenarioDefinition = { bonds: sixthBattleBonds, mapTextureKey: 'battle-map-sixth', leaderUnitId: 'jieqiao-leader-qu-yi', - quickVictoryTurnLimit: 50, + quickVictoryTurnLimit: 55, baseVictoryGold: 860, objectives: [ { @@ -1060,9 +1060,9 @@ export const sixthBattleScenario: BattleScenarioDefinition = { { id: 'quick', kind: 'quick-victory', - label: '50턴 이내 승리', + label: '55턴 이내 승리', rewardGold: 250, - maxTurn: 50 + maxTurn: 55 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }], @@ -1197,11 +1197,11 @@ export const eighthBattleScenario: BattleScenarioDefinition = { openingObjectiveLines: [ '여포군의 척후와 습격병이 소패 보급로의 창고를 노리고 있습니다. 고순을 격파하면 서주의 첫 방위선을 지킬 수 있습니다.', '간옹은 병법서와 책략으로 길목 압박을 늦추고, 미축은 창고 주변 보급과 회복을 맡기 좋습니다. 마을과 창고 지형을 중심으로 전열을 잡으십시오.', - '25턴 이내 승리하면 서주 보급망과 새 합류 무장의 명성이 크게 오릅니다.' + '35턴 이내 승리하면 서주 보급망과 새 합류 무장의 명성이 크게 오릅니다.' ], tacticalGuide: { - summary: '동쪽 보급촌 길목을 먼저 안정시키고, 관우가 길목을 버티는 동안 간옹과 미축이 후방에서 회복과 책략 보조를 이어갑니다.', - route: '아군 진영 → 동쪽 보급촌 길목 → 고순 본대', + summary: '소패 보급로 교두보를 먼저 안정시키고, 관우가 길목을 버티는 동안 간옹과 미축이 후방에서 회복과 책략 보조를 이어갑니다.', + route: '아군 진영 → 소패 보급로 교두보 → 고순 본대', focus: '창고 습격병을 먼저 정리해 미축의 보급 위치를 확보하고, 간옹은 화계와 격려로 기병의 접근을 늦추십시오.', roles: ['관우: 보급로 전열', '장비: 남쪽 길 압박', '간옹: 책략/격려 보조', '미축: 창고 보급/회복', '유비: 후방 지휘'], events: { @@ -1249,7 +1249,7 @@ export const eighthBattleScenario: BattleScenarioDefinition = { bonds: eighthBattleBonds, mapTextureKey: 'battle-map-eighth', leaderUnitId: 'xiaopei-leader-gao-shun', - quickVictoryTurnLimit: 25, + quickVictoryTurnLimit: 35, baseVictoryGold: 1080, objectives: [ { @@ -1269,18 +1269,18 @@ export const eighthBattleScenario: BattleScenarioDefinition = { { id: 'village', kind: 'secure-terrain', - label: '동쪽 보급촌 확보', + label: '소패 보급로 확보', rewardGold: 360, terrain: 'village', - targetTile: { x: 18, y: 8, radius: 6 }, + targetTile: { x: 20, y: 10, radius: 10 }, threatRadius: 0 }, { id: 'quick', kind: 'quick-victory', - label: '25턴 이내 승리', + label: '35턴 이내 승리', rewardGold: 300, - maxTurn: 25 + maxTurn: 35 } ], defeatConditions: [{ kind: 'unit-defeated', unitId: 'liu-bei' }],