Files
HolodoriCalc/docs/research/unit-power-target-mismatch-2026-09-30.md
T
dal4segno d35ee95843
Publish GitHub Pages output / publish (push) Canceled after 42s
fix: rank performance passive targets by awakened base performance
2026-09-30 02:19:31 +09:00

113 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 종합력 불일치 조사 — 2026-09-30
## 제공 화면의 차이
편성: 후부키(기본 ★5) 5개화, 마츠리(기본 ★5) 4개화, 보탄(기본 ★5) 5개화, 아냐(수영복 ★5) 5개화, 코보(기본 ★5) 4개화. 리더 의상은 벨즈의 레디언트 치즈.
| 항목 | 계산기 | 게임 | 게임 − 계산기 |
| --- | ---: | ---: | ---: |
| 멤버 파라미터(기본 + 개화) | 129,771 | 129,771 | 0 |
| 의상 | 71,524 | 71,524 | 0 |
| 보드 | 123,637 | 123,637 | 0 |
| 패시브 | 46,712 | 47,017 | 305 |
| 메모리 | 8,442 | 8,442 | 0 |
| 멤버 강화 | 21,334 | 21,352 | 18 |
| 종합력 | 401,420 | 401,743 | 323 |
## 확인된 원인
`src/lib/engine/unit-power.ts`의 `targetIndexes()`는 지정 인원 패시브 대상을 개화 후 전체 파라미터 합계 내림차순으로 고른다. 이번 편성에서 대상 선택이 달라질 수 있는 것은 아냐의 퓨어 2명 퍼포먼스 +43% 패시브다. 나머지 패시브는 조건에 맞는 인원이 정확히 2명이거나 자기 자신을 대상으로 한다.
| 퓨어 멤버 | 개화 후 전체 파라미터 | 개화 후 퍼포먼스 |
| --- | ---: | ---: |
| 후부키 | 25,975 | 10,909 |
| 아냐 | 25,867 | 11,381 |
| 코보 | 26,031 | 10,673 |
현재 코드는 코보·후부키를 선택한다. 소스 파일을 변경하지 않고 Node의 메모리상 모듈에서 정렬 기준만 해당 능력치로 바꾸면 아냐·후부키가 선택되며, 패시브 합계가 **46,712 → 47,017**로 게임 화면과 정확히 일치한다. 다른 기본·의상·메모리 계산은 동일하다. 패시브 증가율은 대상별로 합산한 뒤 능력치마다 올림하므로, 아냐 패시브를 단독 계산한 차이 304와 편성 전체 차이 305는 다르다.
멤버 강화는 메모리를 제외한 파라미터·패시브·의상·보드 합계에 5.74%를 적용하므로 패시브 오차가 강화 항목에도 전파된다. 최초 조사에서는 멤버별 보드 분배 원본이 없어 강화값의 멤버별 올림까지 재현하지 못했으나, 아래 추가 검증에서 백업을 사용하여 정확히 재현했다.
## DB 확인과 검증 범위
- `scripts/game-db-source.mjs`로 현재 해시 고정 Android DB를 검증해서 읽었다. 마스터 버전: `546b8e2e37db368c6731e148b88611cef105bbaa66ff567f5c1584711ef979a4`.
- `LivePassiveSkillLevel` 및 `LivePassiveSkillEffect`에서 `card-03005-5-uniq-0084-00`의 레벨 2 효과가 퍼포먼스 +430‰임을 확인했다.
- `LiveSkillEffectTarget`의 대상은 퓨어 2명이다. 이 레코드에는 대상 정렬 기준이 없어 DB만으로 일반적인 선정 규칙을 확정할 수 없다.
- 이번 화면은 아냐·후부키 적용 결과를 지지한다. 모든 편성에서 해당 능력치 순인지, 보드 등을 포함한 다른 기준인지 확정하려면 추가 실측 또는 게임 실행 코드 확인이 필요하다.
- 기존 `unit-power.test.ts` 9개는 모두 통과하지만, 마지막 테스트가 전체 파라미터 순이라는 기존 가정을 명시적으로 고정하고 있어 이번 불일치를 잡지 못한다.
- 조사는 계산식과 기존 데이터 읽기 및 메모리상 비교 실험으로 수행했다. 서비스 계산 코드, 데이터 추출 기준, 배포는 변경하지 않았다.
## 사용자 백업 및 개별 카드 화면 추가 검증
사용자가 제공한 `holodori-backup-2026-09-29.json`의 보드 노드, 커넥트 카드 배치와 개화, 메모리 35개(65‰), 멤버 강화 5.74%를 사용했다. 곡은 Play Dice! (벨즈 솔로), 리더는 벨즈, 의상은 기존과 같다. 원본 백업은 저장소로 복사하지 않았다.
새 편성 화면 순서는 마츠리·코보·보탄·아냐·후부키다. `calculateBoardEffects()`로 실제 저장 설정을 계산한 뒤, `calculateUnitPower()`의 대상 정렬만 메모리상에서 해당 능력치 내림차순으로 바꾸고 멤버별 중간값을 출력했다. 서비스 소스 파일은 수정하지 않았다.
| 멤버 | 기존 전체 파라미터 정렬 | 퍼포먼스 정렬 실험 | 게임 카드 아래 표시 |
| --- | ---: | ---: | ---: |
| 마츠리 | 86,694 | 86,694 | 86,694 |
| 코보 | 83,648 | 78,796 | 78,796 |
| 보탄 | 74,998 | 74,998 | 74,998 |
| 아냐 | 70,727 | 75,902 | 75,902 |
| 후부키 | 85,353 | 85,353 | 85,353 |
| 합계 | 401,420 | 401,743 | 401,743 |
게임 화면과 대조한 멤버별 계산 내역:
- 코보의 패시브 합계: 12,921 → 8,332 (−4,589), 멤버 강화: 4,449 → 4,186 (−263).
- 아냐의 패시브 합계: 0 → 4,894 (+4,894), 멤버 강화: 3,748 → 4,029 (+281).
- 편성 패시브 합계: +305, 멤버 강화 합계: +18, 종합력 합계: +323.
- 변경 후 `passiveTotal = 47017`, `memberPowerUpTotal = 21352`, `overallPower = 401743`. 다른 모든 항목도 기존 게임 상세 화면과 일치한다.
다섯 카드가 모두 일치하므로 단순히 총합만 우연히 일치한 것이 아니라, 이번 편성에서 아냐의 패시브가 아냐·후부키에 적용되고 코보에는 적용되지 않는다는 것을 뒷받침한다. 새 화면 중앙의 2,705,919는 유닛 스코어이므로 종합력과 직접 비교하지 않았다.
### 개별 카드 상세로 구분되는 가설
| 멤버 | 게임 상세 토털 | 게임 상세 퍼포먼스 |
| --- | ---: | ---: |
| 후부키 | 39,480 | 15,250 |
| 아냐 | 39,357 | 15,878 |
| 코보 | 39,528 | 15,034 |
게임 상세 토털도 코보 > 후부키 > 아냐이므로 **해당 화면의 토털 상위 2명을 고른다는 가설 역시 이번 관측과 맞지 않는다**. 퍼포먼스는 아냐 > 후부키 > 코보로 실제 적용 대상과 일치한다. 새 편성의 퓨어 등장 순서는 코보·아냐·후부키이므로, 단순히 앞의 두 퓨어를 고른다는 가설도 맞지 않는다.
남은 한계: 개화 후 기본 퍼포먼스 순위와 게임 상세 퍼포먼스 순위가 같으므로, 어느 단계의 퍼포먼스를 기준으로 하는지는 이 자료만으로 구별되지 않는다. 이를 구분하려면 두 기준의 순위가 뒤집히는 다른 편성이 필요하다. 센스·테크닉·전체 파라미터 증가 및 스코어 서포트 패시브의 일반 규칙은 별도로 검증해야 한다.
## 두 퍼포먼스 기준을 구분할 추가 실험 편성
사용자 요청으로 같은 백업의 보유 퓨어 카드에서 기본 퍼포먼스와 보드 반영 퍼포먼스 순위가 역전되는 쌍을 검색했다. 기존 편성에서 **코보만 기본 ★5 후레아 2개화로 교체**하면 된다. 후레아 카드 ID는 `card-00021-5-uniq-0017-00`이다. 백업은 소유 여부·개화만 기록하므로 실제 카드 레벨은 확인이 필요하다. 아래 값은 모두 Lv.80 기준이다.
편성: 마츠리 4개화 / 후레아 2개화 / 보탄 5개화 / 수영복 아냐 5개화 / 후부키 5개화. 아냐 외에는 기본 ★5 카드. Play Dice!, 벨즈 리더, 레디언트 치즈 의상, 백업 보드·커넥트, 메모리 35개 및 강화 5.74% 유지.
카드 상세 표시값의 후보식 `개화 후 스탯 + 리더·곡 조건을 넣지 않은 단일 카드 보드 고정치 + ceil(개화 후 스탯 × 해당 보드 비율)`은 제공된 후부키·아냐·코보의 세 능력치, 총 9개 표시값 모두와 일치했다. `calculateBoardEffects(summary, memberBoards, [card], '', null, connections)`로 해당 보드 값을 계산했다. 이 일치는 관측된 세 카드에 대한 검증이며 모든 카드 상세 표시 규칙을 일반적으로 증명한 것은 아니다.
| 퓨어 후보 | 개화 후 기본 퍼포먼스 | 보드 반영 상세 퍼포먼스 |
| --- | ---: | ---: |
| 수영복 아냐 | 11,381 | 15,878 (기존 화면 확인) |
| 기본 후레아 | 11,381 | 14,581 (백업으로 예측) |
| 기본 후부키 | 10,909 | 15,250 (기존 화면 확인) |
아냐·후레아의 기본 퍼포먼스 동률은 두 명 모두 상위 2명에 들어가므로 결과에 영향을 주지 않는다. 경계인 후레아·후부키의 순위가 역전된다.
| 예측 항목 | 기본 퍼포먼스 순 선정 | 상세 퍼포먼스 순 선정 |
| --- | ---: | ---: |
| 아냐 패시브 대상 | 아냐·후레아 | 아냐·후부키 |
| 마츠리 종합력 | 86,694 | 86,694 |
| 후레아 종합력 | 75,814 | 70,639 |
| 보탄 종합력 | 74,998 | 74,998 |
| 아냐 종합력 | 75,902 | 75,902 |
| 후부키 종합력 | 80,393 | 85,353 |
| 패시브 합계 | 42,530 | 42,327 |
| 멤버 강화 | 20,922 | 20,910 |
| 종합력 합계 | 393,801 | 393,586 |
예측은 서비스 파일을 수정하지 않고 기존 엔진을 메모리상에서 변형하여 대상 정렬만 바꾼 결과다. 효과량 자체는 두 가설 모두 개화 후 기본 스탯을 기준으로 계산한다. 현재의 전체 파라미터 정렬 코드도 우연히 393,586을 출력하지만 아냐 70,727 / 후레아 75,814로 내부 적용 대상이 다르다. 따라서 총합만 대조하지 말고 카드 아래 개별 종합력이 보이는 화면도 확인해야 한다.
요청할 실측: 후레아 카드 상세(Lv.80, 2개화, 퍼포먼스 14,581 예상), 위 편성의 카드별 종합력 화면, 유닛 스코어 상세의 종합력·패시브·강화 항목. 백업 이후 보드나 강화가 변했다면 같은 시점 설정으로 예측을 다시 계산한다. 관측이 한 가설과 일치해도 다른 모든 스킬 유형의 일반 규칙까지 확정하는 것은 아니다.
## 사용자 검증 및 수정
사용자는 후레아의 스펙이 예상과 일치하며 기본 수치 기준으로 적용됨을 확인했다. 이후 정렬 기준 수정 요청에 따라 지정 인원 퍼포먼스 증가 패시브의 대상을 **개화 후 기본 퍼포먼스** 내림차순으로 선택하도록 수정했다. 보드·의상·다른 패시브는 대상 선정 수치에 포함하지 않는다. 아직 검증하지 않은 테크닉·센스·전체 파라미터 및 스코어 서포트의 선정 기준은 이번 변경에 포함하지 않았다.
기존 전체 파라미터 우선 가정 테스트를 바로잡고, 코보 편성 401,743 및 후레아 편성 393,801의 항목별 결과를 회귀 테스트에 추가했다. 두 편성을 역순으로 넣어도 같은 값인지 검증한다. 사용자 백업 전체 대신 재현에 필요한 효과별 보드 수치만 테스트에 보존했다.