From de165bb53d1201bc5817d46d31fd2e835de7e863 Mon Sep 17 00:00:00 2001 From: dal4segno Date: Wed, 30 Sep 2026 19:02:43 +0900 Subject: [PATCH] feat: recommend card investments for board connections --- UPDATES.md | 4 + offline/OfflineApp.svelte | 2 + src/lib/components/BoardAwakening.svelte | 103 ++++++++++++ src/lib/components/ToolsNav.svelte | 3 +- src/lib/engine/board-awakening.test.ts | 65 ++++++++ src/lib/engine/board-awakening.ts | 157 ++++++++++++++++++ src/lib/workers/board-awakening.worker.ts | 13 ++ src/routes/tools/board-awakening/+page.svelte | 82 +++++++++ 8 files changed, 428 insertions(+), 1 deletion(-) create mode 100644 src/lib/components/BoardAwakening.svelte create mode 100644 src/lib/engine/board-awakening.test.ts create mode 100644 src/lib/engine/board-awakening.ts create mode 100644 src/lib/workers/board-awakening.worker.ts create mode 100644 src/routes/tools/board-awakening/+page.svelte diff --git a/UPDATES.md b/UPDATES.md index ba360ef..54cc2e9 100644 --- a/UPDATES.md +++ b/UPDATES.md @@ -12,6 +12,10 @@ updatedAt: 2026-09-30T00:00:00Z `NEW` 카드 목록과 배치 분석 사이에 편성 비교 메뉴를 추가했습니다. 같은 악곡·난이도에서 두 리더·의상과 5인 편성을 구성하고, 카드 입력 순서와 관계없이 최고점 기준 최적 배치의 평균 점수·최고 점수·종합력 차이를 확인할 수 있습니다. 리더의 빨간 노드와 편성 멤버의 파란 노드를 모두 개방하고 연결 노드 증폭은 제외하며, 기수 보너스 900·가창 보너스 10%로 통일합니다. 메모리·멤버 종합력 UP은 사용자 데이터를 공통 적용합니다. A→B 복사와 편성 교환을 지원하고, 화면 최하단에 비교 기준을 안내합니다. +### 보드 연결노드용 개화 추천 + +`NEW` 도구에 연결노드 개화 추천 탭을 추가했습니다. 저장한 분석의 편성을 고정하고, 5성 카드의 첫 획득·5개화 연결 효과를 비교합니다. 현재 보유 카드와 보드를 기준으로 점수 증가량·필요 획득 수·1장당 이득과 추천 연결 위치를 확인할 수 있습니다. 기존 카드의 무료 재배치 이득은 투자 효과에서 제외하며, 빠른 연결 배정 방식으로 계산합니다. + ### 퍼포먼스 패시브 종합력 계산 수정 `FIX` 지정 인원의 퍼포먼스를 올리는 패시브가 전체 능력치 합계 대신 개화를 반영한 기본 퍼포먼스 순으로 대상을 선택하도록 수정했습니다. 일부 편성에서 게임과 종합력이 다르게 표시되던 문제를 해결했습니다. diff --git a/offline/OfflineApp.svelte b/offline/OfflineApp.svelte index 62d2d17..3eaf623 100644 --- a/offline/OfflineApp.svelte +++ b/offline/OfflineApp.svelte @@ -7,6 +7,7 @@ import RatingPage from '../src/routes/rating/+page.svelte'; import CombinationPage from '../src/routes/combination/+page.svelte'; import HoloWorkPage from '../src/routes/tools/holo-work/+page.svelte'; + import BoardAwakeningPage from '../src/routes/tools/board-awakening/+page.svelte'; import ToolsPage from '../src/routes/tools/+page.svelte'; import ComparePage from '../src/routes/compare/+page.svelte'; import EventPage from '../src/routes/event/+page.svelte'; @@ -28,6 +29,7 @@ ['/compare', ComparePage], ['/tools/random', ToolsPage], ['/tools/holo-work', HoloWorkPage], + ['/tools/board-awakening', BoardAwakeningPage], ['/random', ToolsPage], ['/event', EventPage], ['/data', DataPage], diff --git a/src/lib/components/BoardAwakening.svelte b/src/lib/components/BoardAwakening.svelte new file mode 100644 index 0000000..1fa6ca1 --- /dev/null +++ b/src/lib/components/BoardAwakening.svelte @@ -0,0 +1,103 @@ + + +
+

보드 연결노드용 개화 추천

+

편성 5장·편성 개화·스페셜 순서·쿨타임을 고정하고, 5성 카드의 연결 효과만 비교합니다.

+

보유 카드는 5개화까지, 미보유 카드는 첫 획득과 5개화를 각각 비교합니다. 추가 획득 수는 첫 획득 1장, 미보유 → 5개화 6장입니다. 0~4개화의 연결 스킬은 같으며, 이미 5개화인 카드는 후보에서 제외합니다.

+

활성 노드를 유지한 채 연결 배치를 빠르게 배정하고 전체 보드 점수로 비교합니다. 비교 기준도 현재 보유 연결 카드로 배치를 개선한 점수이므로, 단순 재배치 이득을 개화 효과에 섞지 않습니다. 연결 배치를 전수 탐색하는 기능은 아닙니다. 사용자 데이터는 변경하지 않습니다.

+
+ + {#if running}{/if} + +
+ {#if running}

{progress.stage} · {progress.completed}/{progress.total}

{/if} + {#if stale}

조건이 변경되었습니다. 다시 비교해 주세요.

{/if} + {#if error}

{error}

{/if} + {#if result && !stale} +

현재 최고 {number(result.current.maximum)}점 → 투자 전 기준 최고 {number(result.baseline.maximum)}점 · 평균 {number(result.baseline.expected)}점

+
투자 전 기준 배치의 변경 내역 + {#each changes(result.baseline, result.current.placements) as change}

{change}

{:else}

현재 배치와 동일합니다.

{/each} +
+ {#if rows.length} +

{rows[0].maximumGain > 0 ? `추천: ${cardName(rows[0].cardId)} · ${action(rows[0])}` : '비교한 배치에서 점수가 증가하는 후보가 없습니다.'}

+
+ {#each rows as row}{/each} +
순위카드목표추가 획득최고점 증가1장당 증가평균점 증가연결 위치
{rows.findIndex((other) => other[sortBy] === row[sortBy]) + 1}{cardName(row.cardId)}{action(row)}{row.copies}장{delta(row.maximumGain)}{delta(row.gainPerCopy)}{delta(row.expectedGain)}
배치 보기 + {#each Object.entries(row.best.placements) as [member, slots]}{#each Object.entries(slots) as [socket, cardId]}{#if cardId === row.cardId}

대상 카드: {socketName(member, socket)}

{/if}{/each}{/each} + {#each changes(row.best, result.baseline.placements) as change}

{change}

{:else}

기준 배치와 동일한 위치에서 연결 효과만 비교합니다.

{/each} +

최고 {number(row.best.maximum)}점 · 평균 {number(row.best.expected)}점 · 종합력 {number(row.best.power)}

+
+ {:else}

비교할 5성 연결 카드가 없습니다.

{/if} + {/if} +
+ + diff --git a/src/lib/components/ToolsNav.svelte b/src/lib/components/ToolsNav.svelte index ee11c18..0c03ae8 100644 --- a/src/lib/components/ToolsNav.svelte +++ b/src/lib/components/ToolsNav.svelte @@ -1,10 +1,11 @@