Stabilize early objective QA gate

This commit is contained in:
2026-07-06 12:30:43 +09:00
parent c0ce65d018
commit bc42a4dfbc
2 changed files with 21 additions and 16 deletions

View File

@@ -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();

View File

@@ -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' }],