diff --git a/UPDATES.md b/UPDATES.md index 36ebc59..98eda07 100644 --- a/UPDATES.md +++ b/UPDATES.md @@ -1,9 +1,13 @@ --- -updatedAt: 2026-09-06T21:34:36+09:00 +updatedAt: 2026-09-06T22:30:18+09:00 --- ## 2026년 9월 6일 +### 종합력 계산의 기본 능력치 보정 + +`FIXED` 카드 기본 능력치의 소수점 처리를 올림으로 수정했습니다. 일부 편성에서 종합력과 패시브·의상·보드·메모리·멤버 강화 효과가 실제 게임보다 소폭 낮게 계산되던 문제를 해결했습니다. + ### 악곡별 점수 계산 정확도 개선 `IMPROVED` 388개 채보의 기본 점수를 악곡·난이도별 공식으로 계산하도록 개선했습니다. 비가시 채보 지점을 포함한 점수 환산 기준을 반영했으며, 배치 분석과 조합 탐색에서 적용 여부를 ‘곡별 공식’으로 표시합니다. 코로네 곡 Expert도 원본 채보의 비가시 지점을 직접 집계해 반영했습니다. diff --git a/scripts/collect-holodoridb.mjs b/scripts/collect-holodoridb.mjs index e06583e..e8571f9 100644 --- a/scripts/collect-holodoridb.mjs +++ b/scripts/collect-holodoridb.mjs @@ -604,10 +604,12 @@ const cardSummary = { .sort(([left], [right]) => Number(card[right]) - Number(card[left]))[0][1]; const maxLevel = cardRecord.progression.levels.at(-1); const parameterBaseValue = Number(maxLevel?.parameterBaseValue ?? 0); + // Round each base stat up before applying awakening and other bonuses. + // Verified against the in-game unit power breakdown (2026-09-06). const statsAtMaxLevel = { - performance: Math.round(parameterBaseValue * Number(card.performancePermilMultiply ?? 0) / 1000), - technique: Math.round(parameterBaseValue * Number(card.techniquePermilMultiply ?? 0) / 1000), - sense: Math.round(parameterBaseValue * Number(card.sensePermilMultiply ?? 0) / 1000) + performance: Math.ceil(parameterBaseValue * Number(card.performancePermilMultiply ?? 0) / 1000), + technique: Math.ceil(parameterBaseValue * Number(card.techniquePermilMultiply ?? 0) / 1000), + sense: Math.ceil(parameterBaseValue * Number(card.sensePermilMultiply ?? 0) / 1000) }; return { diff --git a/src/lib/data/cards-summary.json b/src/lib/data/cards-summary.json index 225bf93..0cdbd70 100644 --- a/src/lib/data/cards-summary.json +++ b/src/lib/data/cards-summary.json @@ -273,8 +273,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 6983, - "sense": 10345 + "technique": 6984, + "sense": 10346 } }, "details": { @@ -433,9 +433,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, + "performance": 6984, "technique": 6184, - "sense": 10345 + "sense": 10346 } }, "details": { @@ -700,8 +700,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 10345, - "sense": 6983 + "technique": 10346, + "sense": 6984 } }, "details": { @@ -958,8 +958,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 6983, - "sense": 10345 + "technique": 6984, + "sense": 10346 } }, "details": { @@ -1078,8 +1078,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, - "technique": 10345, + "performance": 6984, + "technique": 10346, "sense": 6184 } }, @@ -1329,8 +1329,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 6983, - "sense": 10345 + "technique": 6984, + "sense": 10346 } }, "details": { @@ -1489,8 +1489,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, - "technique": 6983, + "performance": 10346, + "technique": 6984, "sense": 6184 } }, @@ -1620,7 +1620,7 @@ "statsAtMaxLevel": { "performance": 9484, "technique": 6971, - "sense": 7255 + "sense": 7256 } }, "details": { @@ -1892,9 +1892,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6696, + "performance": 6697, "technique": 7264, - "sense": 9701 + "sense": 9702 } }, "details": { @@ -2182,7 +2182,7 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 7255, + "performance": 7256, "technique": 6971, "sense": 9484 } @@ -2449,8 +2449,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 10345, - "sense": 6983 + "technique": 10346, + "sense": 6984 } }, "details": { @@ -2593,8 +2593,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, - "technique": 10345, + "performance": 6984, + "technique": 10346, "sense": 6184 } }, @@ -3165,8 +3165,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6696, - "technique": 9701, + "performance": 6697, + "technique": 9702, "sense": 7264 } }, @@ -3310,9 +3310,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, + "performance": 10346, "technique": 6184, - "sense": 6983 + "sense": 6984 } }, "details": { @@ -3601,7 +3601,7 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6971, - "technique": 7255, + "technique": 7256, "sense": 9484 } }, @@ -4091,9 +4091,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 9701, + "performance": 9702, "technique": 7264, - "sense": 6696 + "sense": 6697 } }, "details": { @@ -4502,8 +4502,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, - "technique": 10345, + "performance": 6984, + "technique": 10346, "sense": 6184 } }, @@ -4881,9 +4881,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, + "performance": 10346, "technique": 6184, - "sense": 6983 + "sense": 6984 } }, "details": { @@ -5042,9 +5042,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 9701, + "performance": 9702, "technique": 7264, - "sense": 6696 + "sense": 6697 } }, "details": { @@ -5163,9 +5163,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6696, + "performance": 6697, "technique": 7264, - "sense": 9701 + "sense": 9702 } }, "details": { @@ -5438,8 +5438,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 7264, - "technique": 9701, - "sense": 6696 + "technique": 9702, + "sense": 6697 } }, "details": { @@ -5599,8 +5599,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 7264, - "technique": 6696, - "sense": 9701 + "technique": 6697, + "sense": 9702 } }, "details": { @@ -6332,8 +6332,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 7264, - "technique": 9701, - "sense": 6696 + "technique": 9702, + "sense": 6697 } }, "details": { @@ -6736,7 +6736,7 @@ "statsAtMaxLevel": { "performance": 6971, "technique": 9484, - "sense": 7255 + "sense": 7256 } }, "details": { @@ -7032,7 +7032,7 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 7255, + "performance": 7256, "technique": 9484, "sense": 6971 } @@ -7169,8 +7169,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 9701, - "technique": 6696, + "performance": 9702, + "technique": 6697, "sense": 7264 } }, @@ -7751,7 +7751,7 @@ "statsAtMaxLevel": { "performance": 6971, "technique": 9484, - "sense": 7255 + "sense": 7256 } }, "details": { @@ -8169,7 +8169,7 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6971, - "technique": 7255, + "technique": 7256, "sense": 9484 } }, @@ -8418,9 +8418,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, + "performance": 10346, "technique": 6184, - "sense": 6983 + "sense": 6984 } }, "details": { @@ -8540,8 +8540,8 @@ "maxLevel": 80, "statsAtMaxLevel": { "performance": 6184, - "technique": 6983, - "sense": 10345 + "technique": 6984, + "sense": 10346 } }, "details": { @@ -8869,8 +8869,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, - "technique": 10345, + "performance": 6984, + "technique": 10346, "sense": 6184 } }, @@ -9288,8 +9288,8 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, - "technique": 6983, + "performance": 10346, + "technique": 6984, "sense": 6184 } }, @@ -9570,9 +9570,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 6983, + "performance": 6984, "technique": 6184, - "sense": 10345 + "sense": 10346 } }, "details": { @@ -9731,9 +9731,9 @@ "power": { "maxLevel": 80, "statsAtMaxLevel": { - "performance": 10345, + "performance": 10346, "technique": 6184, - "sense": 6983 + "sense": 6984 } }, "details": { @@ -9869,8 +9869,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 5923, - "sense": 8974 + "technique": 5924, + "sense": 8975 } }, "details": { @@ -9991,7 +9991,7 @@ "statsAtMaxLevel": { "performance": 5692, "technique": 8246, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -10120,7 +10120,7 @@ "statsAtMaxLevel": { "performance": 8246, "technique": 5692, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -10240,8 +10240,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 8974, - "sense": 5923 + "technique": 8975, + "sense": 5924 } }, "details": { @@ -10368,7 +10368,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 5692, "sense": 8246 } @@ -10489,7 +10489,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 8246, "sense": 5692 } @@ -10612,7 +10612,7 @@ "statsAtMaxLevel": { "performance": 8246, "technique": 5692, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -10739,9 +10739,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 9154, - "sense": 4935 + "performance": 5812, + "technique": 9155, + "sense": 4936 } }, "details": { @@ -10860,7 +10860,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 5692, "sense": 8246 } @@ -10981,7 +10981,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 8246, "sense": 5692 } @@ -11102,9 +11102,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 9154, - "sense": 4935 + "performance": 5812, + "technique": 9155, + "sense": 4936 } }, "details": { @@ -11232,8 +11232,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 5923, - "sense": 8974 + "technique": 5924, + "sense": 8975 } }, "details": { @@ -11352,8 +11352,8 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8974, - "technique": 5923, + "performance": 8975, + "technique": 5924, "sense": 5046 } }, @@ -11483,7 +11483,7 @@ "statsAtMaxLevel": { "performance": 8246, "technique": 5692, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -11611,7 +11611,7 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 8246, - "technique": 6174, + "technique": 6175, "sense": 5692 } }, @@ -11731,9 +11731,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 4935, - "sense": 9154 + "performance": 5812, + "technique": 4936, + "sense": 9155 } }, "details": { @@ -11860,9 +11860,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5579, - "technique": 6061, - "sense": 8429 + "performance": 5580, + "technique": 6062, + "sense": 8430 } }, "details": { @@ -11981,7 +11981,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 8246, "sense": 5692 } @@ -12103,8 +12103,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 5923, - "sense": 8974 + "technique": 5924, + "sense": 8975 } }, "details": { @@ -12231,9 +12231,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 4935, - "technique": 9154, - "sense": 5811 + "performance": 4936, + "technique": 9155, + "sense": 5812 } }, "details": { @@ -12352,9 +12352,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 9154, - "technique": 5811, - "sense": 4935 + "performance": 9155, + "technique": 5812, + "sense": 4936 } }, "details": { @@ -12483,7 +12483,7 @@ "statsAtMaxLevel": { "performance": 8246, "technique": 5692, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -12602,8 +12602,8 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5923, - "technique": 8974, + "performance": 5924, + "technique": 8975, "sense": 5046 } }, @@ -12732,7 +12732,7 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5692, - "technique": 6174, + "technique": 6175, "sense": 8246 } }, @@ -12861,8 +12861,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 8974, - "sense": 5923 + "technique": 8975, + "sense": 5924 } }, "details": { @@ -12981,9 +12981,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8974, + "performance": 8975, "technique": 5046, - "sense": 5923 + "sense": 5924 } }, "details": { @@ -13102,9 +13102,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 9154, - "technique": 5811, - "sense": 4935 + "performance": 9155, + "technique": 5812, + "sense": 4936 } }, "details": { @@ -13232,8 +13232,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 8062, - "technique": 5925, - "sense": 6167 + "technique": 5926, + "sense": 6168 } }, "details": { @@ -13360,8 +13360,8 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8974, - "technique": 5923, + "performance": 8975, + "technique": 5924, "sense": 5046 } }, @@ -13481,7 +13481,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 5692, "sense": 8246 } @@ -13610,9 +13610,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 4935, - "sense": 9154 + "performance": 5812, + "technique": 4936, + "sense": 9155 } }, "details": { @@ -13731,9 +13731,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8974, + "performance": 8975, "technique": 5046, - "sense": 5923 + "sense": 5924 } }, "details": { @@ -13854,7 +13854,7 @@ "statsAtMaxLevel": { "performance": 8246, "technique": 5692, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -13981,9 +13981,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 9154, - "technique": 4935, - "sense": 5811 + "performance": 9155, + "technique": 4936, + "sense": 5812 } }, "details": { @@ -14110,8 +14110,8 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5923, - "technique": 8974, + "performance": 5924, + "technique": 8975, "sense": 5046 } }, @@ -14231,7 +14231,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 5692, "sense": 8246 } @@ -14352,9 +14352,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5923, + "performance": 5924, "technique": 5046, - "sense": 8974 + "sense": 8975 } }, "details": { @@ -14482,7 +14482,7 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5692, - "technique": 6174, + "technique": 6175, "sense": 8246 } }, @@ -14602,9 +14602,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 9154, - "sense": 4935 + "performance": 5812, + "technique": 9155, + "sense": 4936 } }, "details": { @@ -14724,8 +14724,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5046, - "technique": 5923, - "sense": 8974 + "technique": 5924, + "sense": 8975 } }, "details": { @@ -14845,7 +14845,7 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 5692, - "technique": 6174, + "technique": 6175, "sense": 8246 } }, @@ -14965,9 +14965,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 4935, - "sense": 9154 + "performance": 5812, + "technique": 4936, + "sense": 9155 } }, "details": { @@ -15094,9 +15094,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 9154, - "technique": 5811, - "sense": 4935 + "performance": 9155, + "technique": 5812, + "sense": 4936 } }, "details": { @@ -15223,7 +15223,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 8246, "sense": 5692 } @@ -15344,9 +15344,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 4935, - "sense": 9154 + "performance": 5812, + "technique": 4936, + "sense": 9155 } }, "details": { @@ -15473,7 +15473,7 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 6174, + "performance": 6175, "technique": 8246, "sense": 5692 } @@ -15602,9 +15602,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8429, - "technique": 5579, - "sense": 6061 + "performance": 8430, + "technique": 5580, + "sense": 6062 } }, "details": { @@ -15723,9 +15723,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 4935, - "technique": 5811, - "sense": 9154 + "performance": 4936, + "technique": 5812, + "sense": 9155 } }, "details": { @@ -15845,8 +15845,8 @@ "maxLevel": 70, "statsAtMaxLevel": { "performance": 8062, - "technique": 5925, - "sense": 6167 + "technique": 5926, + "sense": 6168 } }, "details": { @@ -15975,7 +15975,7 @@ "statsAtMaxLevel": { "performance": 5692, "technique": 8246, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -16104,7 +16104,7 @@ "statsAtMaxLevel": { "performance": 5692, "technique": 8246, - "sense": 6174 + "sense": 6175 } }, "details": { @@ -16223,9 +16223,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5925, + "performance": 5926, "technique": 8062, - "sense": 6167 + "sense": 6168 } }, "details": { @@ -16352,9 +16352,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 8429, - "technique": 6061, - "sense": 5579 + "performance": 8430, + "technique": 6062, + "sense": 5580 } }, "details": { @@ -16473,9 +16473,9 @@ "power": { "maxLevel": 70, "statsAtMaxLevel": { - "performance": 5811, - "technique": 9154, - "sense": 4935 + "performance": 5812, + "technique": 9155, + "sense": 4936 } }, "details": { @@ -16594,8 +16594,8 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4803, - "technique": 6023, + "performance": 4804, + "technique": 6024, "sense": 4618 } }, @@ -16753,8 +16753,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4444, - "technique": 7000, - "sense": 3774 + "technique": 7001, + "sense": 3775 } }, "details": { @@ -16832,8 +16832,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6165, - "technique": 4716, - "sense": 4531 + "technique": 4717, + "sense": 4532 } }, "details": { @@ -16910,9 +16910,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 7137, - "technique": 4434, - "sense": 3614 + "performance": 7138, + "technique": 4435, + "sense": 3615 } }, "details": { @@ -17148,8 +17148,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4618, - "technique": 4803, - "sense": 6023 + "technique": 4804, + "sense": 6024 } }, "details": { @@ -17226,7 +17226,7 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4266, + "performance": 4267, "technique": 6446, "sense": 4635 } @@ -17305,9 +17305,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4104, - "technique": 4625, - "sense": 6585 + "performance": 4105, + "technique": 4626, + "sense": 6586 } }, "details": { @@ -17384,8 +17384,8 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 7000, - "technique": 3774, + "performance": 7001, + "technique": 3775, "sense": 4444 } }, @@ -17463,9 +17463,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4716, + "performance": 4717, "technique": 6165, - "sense": 4531 + "sense": 4532 } }, "details": { @@ -17622,8 +17622,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4618, - "technique": 4803, - "sense": 6023 + "technique": 4804, + "sense": 6024 } }, "details": { @@ -17700,9 +17700,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4531, + "performance": 4532, "technique": 6165, - "sense": 4716 + "sense": 4717 } }, "details": { @@ -17781,7 +17781,7 @@ "statsAtMaxLevel": { "performance": 6446, "technique": 4635, - "sense": 4266 + "sense": 4267 } }, "details": { @@ -17858,9 +17858,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4434, - "technique": 7137, - "sense": 3614 + "performance": 4435, + "technique": 7138, + "sense": 3615 } }, "details": { @@ -17937,9 +17937,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 6023, + "performance": 6024, "technique": 4618, - "sense": 4803 + "sense": 4804 } }, "details": { @@ -18174,7 +18174,7 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4266, + "performance": 4267, "technique": 6446, "sense": 4635 } @@ -18253,9 +18253,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 3774, + "performance": 3775, "technique": 4444, - "sense": 7000 + "sense": 7001 } }, "details": { @@ -18333,8 +18333,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6725, - "technique": 4019, - "sense": 4539 + "technique": 4020, + "sense": 4540 } }, "details": { @@ -18411,8 +18411,8 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4803, - "technique": 6023, + "performance": 4804, + "technique": 6024, "sense": 4618 } }, @@ -18490,8 +18490,8 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4716, - "technique": 4531, + "performance": 4717, + "technique": 4532, "sense": 6165 } }, @@ -18569,9 +18569,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4625, - "technique": 6585, - "sense": 4104 + "performance": 4626, + "technique": 6586, + "sense": 4105 } }, "details": { @@ -18648,8 +18648,8 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4539, - "technique": 4019, + "performance": 4540, + "technique": 4020, "sense": 6725 } }, @@ -18727,9 +18727,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 3614, - "technique": 4434, - "sense": 7137 + "performance": 3615, + "technique": 4435, + "sense": 7138 } }, "details": { @@ -18807,8 +18807,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4618, - "technique": 6023, - "sense": 4803 + "technique": 6024, + "sense": 4804 } }, "details": { @@ -18965,8 +18965,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6165, - "technique": 4716, - "sense": 4531 + "technique": 4717, + "sense": 4532 } }, "details": { @@ -19043,9 +19043,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4625, - "technique": 6585, - "sense": 4104 + "performance": 4626, + "technique": 6586, + "sense": 4105 } }, "details": { @@ -19123,8 +19123,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4618, - "technique": 4803, - "sense": 6023 + "technique": 4804, + "sense": 6024 } }, "details": { @@ -19201,9 +19201,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 3774, + "performance": 3775, "technique": 4444, - "sense": 7000 + "sense": 7001 } }, "details": { @@ -19281,8 +19281,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6725, - "technique": 4019, - "sense": 4539 + "technique": 4020, + "sense": 4540 } }, "details": { @@ -19438,9 +19438,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 3614, - "technique": 7137, - "sense": 4434 + "performance": 3615, + "technique": 7138, + "sense": 4435 } }, "details": { @@ -19518,7 +19518,7 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6446, - "technique": 4266, + "technique": 4267, "sense": 4635 } }, @@ -19756,7 +19756,7 @@ "statsAtMaxLevel": { "performance": 4635, "technique": 6446, - "sense": 4266 + "sense": 4267 } }, "details": { @@ -19834,8 +19834,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6165, - "technique": 4716, - "sense": 4531 + "technique": 4717, + "sense": 4532 } }, "details": { @@ -19913,8 +19913,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 4444, - "technique": 3774, - "sense": 7000 + "technique": 3775, + "sense": 7001 } }, "details": { @@ -19991,9 +19991,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 6023, + "performance": 6024, "technique": 4618, - "sense": 4803 + "sense": 4804 } }, "details": { @@ -20149,7 +20149,7 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4266, + "performance": 4267, "technique": 4635, "sense": 6446 } @@ -20307,9 +20307,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 6585, - "technique": 4104, - "sense": 4625 + "performance": 6586, + "technique": 4105, + "sense": 4626 } }, "details": { @@ -20386,7 +20386,7 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4266, + "performance": 4267, "technique": 4635, "sense": 6446 } @@ -20466,8 +20466,8 @@ "maxLevel": 60, "statsAtMaxLevel": { "performance": 6725, - "technique": 4539, - "sense": 4019 + "technique": 4540, + "sense": 4020 } }, "details": { @@ -20544,9 +20544,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 7137, - "technique": 4434, - "sense": 3614 + "performance": 7138, + "technique": 4435, + "sense": 3615 } }, "details": { @@ -20623,9 +20623,9 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4625, - "technique": 4104, - "sense": 6585 + "performance": 4626, + "technique": 4105, + "sense": 6586 } }, "details": { @@ -20781,7 +20781,7 @@ "power": { "maxLevel": 60, "statsAtMaxLevel": { - "performance": 4266, + "performance": 4267, "technique": 4635, "sense": 6446 } diff --git a/src/lib/engine/unit-power.test.ts b/src/lib/engine/unit-power.test.ts index 86b6f00..0058cef 100644 --- a/src/lib/engine/unit-power.test.ts +++ b/src/lib/engine/unit-power.test.ts @@ -1,7 +1,51 @@ import test from 'node:test'; import assert from 'node:assert/strict'; +import { readFileSync } from 'node:fs'; import { calculateUnitPower, type UnitPowerCard } from './unit-power.ts'; +test('실제 카드 데이터로 2026-09-06 인게임 종합력의 모든 항목을 재현한다', () => { + const catalog = JSON.parse(readFileSync(new URL('../data/cards-summary.json', import.meta.url), 'utf8')) as { + cards: (UnitPowerCard & { details: { costume: { name: string; description: string } } })[]; + }; + const findCard = (id: string) => { + const found = catalog.cards.find((entry) => entry.id === id); + assert.ok(found, id); + return found; + }; + // Screenshot formation: Fubuki, Matsuri, Botan, Kobo, Flare; Baelz costume. + // Only the effective board stats are retained from the supplied backup. + const ids = [ + 'card-00006-5-uniq-0007-00', 'card-00007-5-uniq-0008-00', + 'card-00032-5-uniq-0026-00', 'card-03009-5-uniq-0041-00', + 'card-00021-5-uniq-0017-00' + ]; + const awakenings = [3, 3, 5, 3, 2]; + const flats = [[4914, 5109, 5721], [4797, 5240, 5604], [4794, 4989, 5811], [4964, 5159, 5771], [4597, 5040, 5404]]; + const result = calculateUnitPower( + ids.map((id, index) => ({ card: findCard(id), awakening: awakenings[index] })), + findCard('card-04012-5-uniq-0051-00').details.costume, + { + flatByCardId: Object.fromEntries(ids.map((id, index) => [id, { + performance: flats[index][0], technique: flats[index][1], sense: flats[index][2] + }])), + rateByCardId: Object.fromEntries(ids.map((id) => [id, { performance: 28, technique: 28, sense: 28 }])) + }, + 58, + 4.13 + ); + assert.deepEqual(result, { + overallPower: 371616, + baseParameterTotal: 117966, + potentialTotal: 11805, + passiveTotal: 34087, + outfitTotal: 71524, + boardTotal: 114256, + memoryTotal: 7536, + memberPowerUpTotal: 14442, + outfitScoreSupportPercent: 0 + }); +}); + function card(id: string, passive: string, awakenedPassive = passive): UnitPowerCard { return { id,