feat: improve analysis and release v1.0.2
This commit is contained in:
@@ -1,53 +1,146 @@
|
||||
# Holodream Tools
|
||||
# 홀로도리 계산기
|
||||
|
||||
## Card master data
|
||||
홀로라이브 드림즈의 카드와 멤버 성장 상태를 관리하고, 악곡별 최적 배치와 카드 조합을 분석하는 비공식 도구입니다.
|
||||
|
||||
Collect the current card-related master data and Korean, English, and Japanese text from the public HolodoriDB diff repositories:
|
||||
[최신 버전 다운로드](https://github.com/DD4SN/HolodoriCalc/releases/latest) · 한국어 전용 · PC 환경 권장
|
||||
|
||||
```bash
|
||||
npm run data:sync
|
||||
```
|
||||

|
||||
|
||||
The generated manifest, raw relational bundle, and card-by-card bundle are written to `data/holodoridb`. Card artwork, movies, and voices are intentionally excluded.
|
||||
## 주요 기능
|
||||
|
||||
### 카드 표시명 수동 수정
|
||||
- 5성 카드의 타입, 주스탯, 기수와 스킬 정보 조회
|
||||
- 보유 카드와 개화 단계, 메모리, 멤버 강화 수치 저장
|
||||
- 멤버별 보드 노드와 연결 카드 설정
|
||||
- 현재 편성에서 초록 노드의 자원 대비 효율 분석
|
||||
- 특정 악곡과 5인 편성의 최적 배치 및 빈도 감소 조합 분석
|
||||
- 고정 멤버를 기준으로 남은 자리에 들어갈 카드 조합 탐색
|
||||
- 액티브·스페셜 발동 구간과 노트 분포 시각화
|
||||
- 사용자 데이터 백업과 복원
|
||||
- 인터넷 연결 없이 실행 가능한 오프라인 버전 제공
|
||||
|
||||
특별 버전명이나 번역 이름은 `data/card-overrides.csv`에서 관리합니다.
|
||||
## 다운로드 및 실행
|
||||
|
||||
```csv
|
||||
cardId,versionName,displayName
|
||||
card-06002-5-uniq-0066-00,수영복,
|
||||
```
|
||||
1. [최신 Release](https://github.com/DD4SN/HolodoriCalc/releases/latest)를 엽니다.
|
||||
2. `Assets`에서 `HolodoriCalc-offline-v버전.zip`을 내려받습니다.
|
||||
3. ZIP 파일을 원하는 폴더에 완전히 압축 해제합니다.
|
||||
4. 압축을 해제한 폴더의 `index.html`을 실행합니다.
|
||||
|
||||
- `cardId`: 수정할 카드의 고유 ID
|
||||
- `versionName`: 기본 이름 옆에 표시할 짧은 버전명
|
||||
- `displayName`: 기본 멤버 이름을 완전히 바꿀 때만 입력하며, 평소에는 비워 둡니다.
|
||||
> GitHub가 자동으로 제공하는 `Source code (zip)`은 실행용 배포 파일이 아닙니다. 반드시 `HolodoriCalc-offline-...zip`을 받아 주세요.
|
||||
|
||||
수정 후 `npm run data:sync`를 실행하면 카드 목록에 반영됩니다. 이 파일은 원본 데이터를 다시 수집해도 덮어쓰지 않습니다.
|
||||
Chrome 또는 Edge의 최신 버전을 권장합니다. 일부 브라우저는 로컬 HTML의 저장소나 네트워크 접근을 제한할 수 있습니다.
|
||||
|
||||
## 브라우저 데이터
|
||||
## 처음 사용하는 순서
|
||||
|
||||
사용자 데이터는 서버로 전송하지 않고 현재 브라우저의 `localStorage`에 자동 저장합니다. 별도의 `사용자 데이터` 페이지에서 JSON 백업을 내보내거나 가져오고, 전체 데이터를 초기화할 수 있습니다.
|
||||
### 1. 사용자 데이터를 설정합니다
|
||||
|
||||
- 현재 카드 목록의 출력 조건을 자동으로 복원합니다.
|
||||
- `백업 내보내기`로 버전이 포함된 JSON 파일을 내려받을 수 있습니다.
|
||||
- `백업 가져오기`로 다른 브라우저에서 데이터를 복원할 수 있습니다.
|
||||
- `초기화`는 현재 브라우저에 저장된 수집 내역, 저장 덱, 설정을 모두 기본값으로 되돌립니다.
|
||||
상단 메뉴에서 **사용자 데이터 → 카드**로 이동해 보유 카드와 개화 단계를 입력합니다.
|
||||
|
||||
향후 보유 카드와 저장 덱 기능도 `src/lib/models/user-data.ts`의 동일한 버전 데이터에 저장합니다.
|
||||
- 5성 카드는 `0~5` 개화 단계를 설정합니다.
|
||||
- 4성 카드는 보유 여부와 5개화 여부를 설정합니다.
|
||||
- 보유하지 않은 카드는 개화 단계를 변경할 수 없습니다.
|
||||
- 행을 누르면 보유 여부를 빠르게 전환할 수 있습니다.
|
||||
|
||||
홀로드림스 덱 최적화와 스킬 로스 분석을 통합할 웹사이트의 개발 기반입니다. 현재 단계에는 게임 기능을 포함하지 않습니다.
|
||||

|
||||
|
||||
## 구성
|
||||
**사용자 데이터 → 일반**에서는 메모리 보유 수와 멤버 강화 수치를 설정하고, 전체 사용자 데이터를 백업하거나 복원할 수 있습니다.
|
||||
|
||||
### 2. 멤버 보드를 설정합니다
|
||||
|
||||
**사용자 데이터 → 보드**에서 멤버를 선택한 뒤 실제 게임에서 활성화한 노드를 같은 형태로 입력합니다.
|
||||
|
||||
- 빈 공간을 드래그해 보드를 이동합니다.
|
||||
- 마우스 휠로 확대하거나 축소합니다.
|
||||
- 인접하지 않은 노드를 누르면 중심에서 이어지는 최단 경로가 함께 활성화됩니다.
|
||||
- 보드 슬롯에는 보유 카드를 한 장씩 배치할 수 있습니다.
|
||||
- `모든 멤버 초록 3칸 활성화`와 `중앙 연결 노드 자동 배치`로 일반적인 설정을 빠르게 적용할 수 있습니다.
|
||||
|
||||

|
||||
|
||||
같은 페이지의 **초록 노드 효율 분석**에서는 현재 편성을 기준으로 다음 항목을 비교할 수 있습니다.
|
||||
|
||||
- 아직 활성화하지 않은 노드 중 우선 활성화할 노드
|
||||
- 이미 활성화한 노드 중 초기화를 검토할 노드
|
||||
- 종합력 변화, 필요한 연결 노드 수, 자원 소모량과 그린 큐브 효율
|
||||
|
||||
목록의 항목을 누르면 해당 멤버와 노드로 바로 이동합니다.
|
||||
|
||||
### 3. 카드 정보를 확인합니다
|
||||
|
||||
**카드 목록**에서는 타입, 주스탯, 기수, 액티브 확률, 조건부 스킬과 이격 여부로 카드를 필터링할 수 있습니다. 카드 행을 누르면 패시브·액티브·스페셜·의상 효과가 펼쳐집니다.
|
||||
|
||||

|
||||
|
||||
### 4. 5인 편성의 최적 배치를 분석합니다
|
||||
|
||||
**배치 분석**은 선택한 악곡과 5인 조합을 유지하면서 가장 높은 점수를 내는 멤버 순서와 빈도 감소 조합을 찾습니다.
|
||||
|
||||
1. 악곡과 난이도를 선택합니다.
|
||||
2. 5장의 카드와 개화 단계를 설정합니다.
|
||||
3. 필요한 경우 카드별 빈도 감소를 특정 값으로 고정합니다.
|
||||
4. 리더와 리더 의상을 선택합니다.
|
||||
5. `최적 배치 분석`을 누릅니다.
|
||||
|
||||

|
||||
|
||||
분석 결과에서는 최고·평균 점수, 최적 순서, 카드별 빈도 감소율과 함께 다음 시각화 자료를 확인할 수 있습니다.
|
||||
|
||||
- 초당 노트 분포
|
||||
- 멤버별 액티브 발동 구간
|
||||
- 중첩을 반영한 최종 액티브 적용 구간
|
||||
- 멤버별 스페셜 발동 구간
|
||||
|
||||
분석 조건과 마지막 결과는 브라우저에 저장되며, 같은 악곡과 난이도의 조합 탐색에서 **기준 조합**으로 사용할 수 있습니다.
|
||||
|
||||
### 5. 더 좋은 카드 조합을 탐색합니다
|
||||
|
||||
**조합 탐색**은 악곡, 리더, 리더 의상과 최대 4명의 고정 카드를 기준으로 남은 자리에 들어갈 후보를 비교합니다.
|
||||
|
||||
- 고정하지 않은 자리에는 전체 5성 카드가 후보로 들어갑니다.
|
||||
- 자동 후보의 개화 단계와 기수 보너스 덮어쓰기 값을 지정할 수 있습니다.
|
||||
- 보유 카드의 실제 개화가 자동 후보 개화보다 높으면 실제 보유 개화를 우선 적용합니다.
|
||||
- 고정 멤버별 개화, 빈도 감소, 파란 노드 전체 적용 여부와 기수 보너스를 따로 설정할 수 있습니다.
|
||||
- 한 편성에는 같은 인물의 일반 카드와 이격 카드가 동시에 들어가지 않습니다.
|
||||
- 결과는 최고 점수 기준으로 정렬되며 상위 조합의 상세 분석을 펼쳐볼 수 있습니다.
|
||||
|
||||

|
||||
|
||||
`최대 컴퓨팅 자원 활용`을 켜면 탐색 속도가 빨라질 수 있지만, 분석 중 브라우저와 다른 프로그램의 반응이 느려질 수 있습니다.
|
||||
|
||||
## 데이터 저장과 백업
|
||||
|
||||
사용자 데이터와 분석 조건은 서버로 전송하지 않고 현재 브라우저의 `localStorage`에 자동 저장합니다.
|
||||
|
||||
- 브라우저나 사용자 프로필이 달라지면 별도의 데이터로 취급될 수 있습니다.
|
||||
- 브라우저 데이터 삭제 시 저장 내용도 사라질 수 있습니다.
|
||||
- 새 버전으로 이동하기 전 **사용자 데이터 → 일반 → 백업 내보내기**를 권장합니다.
|
||||
- 백업 JSON은 다른 브라우저나 PC의 **백업 가져오기**에서 복원할 수 있습니다.
|
||||
|
||||
## 업데이트
|
||||
|
||||
홈 화면에서 현재 버전과 GitHub의 최신 Release를 비교합니다. 새 버전이 있으면 오프라인 ZIP 다운로드 버튼이 표시됩니다.
|
||||
|
||||
업데이트는 자동으로 파일을 교체하지 않습니다. 새 ZIP을 내려받아 별도 폴더에 압축을 해제한 뒤 `index.html`을 실행해 주세요. 업데이트 전에 사용자 데이터 백업을 권장합니다.
|
||||
|
||||
## 참고
|
||||
|
||||
- 이 프로젝트는 홀로라이브 드림즈의 비공식 팬 제작 도구입니다.
|
||||
- 게임 업데이트와 확보된 데이터 범위에 따라 실제 게임 결과와 차이가 날 수 있습니다.
|
||||
- 분석 결과는 입력한 카드·개화·보드·메모리·멤버 강화 데이터가 정확하다는 전제에서 계산됩니다.
|
||||
- 카드와 악곡의 원본 게임 데이터는 프로젝트가 직접 소유하거나 공식 제공하는 데이터가 아닙니다.
|
||||
|
||||
<details>
|
||||
<summary><strong>개발 환경과 실행 방법</strong></summary>
|
||||
|
||||
### 기술 구성
|
||||
|
||||
- SvelteKit + TypeScript + `@sveltejs/adapter-node`
|
||||
- SQLite + Drizzle ORM
|
||||
- Web Worker를 위한 독립 모듈 경계
|
||||
- Docker Compose 개발 환경(HMR)
|
||||
- 멀티 스테이지 production 이미지
|
||||
- Docker named volume 기반 SQLite 영속 저장소
|
||||
- Web Worker 기반 클라이언트 계산
|
||||
- Docker / Docker Compose
|
||||
|
||||
## Docker 개발 실행
|
||||
계산 엔진은 UI와 분리하며 `UI → Engine → Models` 의존성 방향을 유지합니다.
|
||||
|
||||
### Docker 개발 실행
|
||||
|
||||
```bash
|
||||
docker compose up --build
|
||||
@@ -56,32 +149,9 @@ docker compose up --build
|
||||
- 웹: <http://localhost:5173>
|
||||
- 상태 확인: <http://localhost:5173/api/health>
|
||||
|
||||
소스 파일을 수정하면 Windows의 Docker Desktop에서도 polling 기반 HMR이 동작합니다.
|
||||
종료할 때 `docker compose down`은 SQLite 볼륨을 보존합니다. `docker compose down --volumes`는 저장된 볼륨까지 제거하므로 주의하세요.
|
||||
|
||||
종료:
|
||||
|
||||
```bash
|
||||
docker compose down
|
||||
```
|
||||
|
||||
`docker compose down`은 SQLite 볼륨을 보존합니다. 데이터까지 지우려는 경우에만 `docker compose down --volumes`를 사용하세요.
|
||||
|
||||
## production 실행
|
||||
|
||||
```bash
|
||||
docker compose -f compose.prod.yaml up --build -d
|
||||
```
|
||||
|
||||
- 웹: <http://localhost:3000>
|
||||
- 상태 확인: <http://localhost:3000/api/health>
|
||||
|
||||
종료:
|
||||
|
||||
```bash
|
||||
docker compose -f compose.prod.yaml down
|
||||
```
|
||||
|
||||
## 호스트에서 실행
|
||||
### 호스트에서 실행
|
||||
|
||||
Node.js 22.12 이상이 필요합니다.
|
||||
|
||||
@@ -91,33 +161,53 @@ npm ci
|
||||
npm run dev
|
||||
```
|
||||
|
||||
기본 로컬 DB 경로는 `./data/holodream.db`입니다.
|
||||
|
||||
## 검증 명령
|
||||
### 검증과 빌드
|
||||
|
||||
```bash
|
||||
npm run check
|
||||
npm run build
|
||||
npm run build:offline
|
||||
```
|
||||
|
||||
스키마를 변경한 뒤에는 migration을 생성합니다.
|
||||
릴리즈용 오프라인 ZIP 생성:
|
||||
|
||||
```bash
|
||||
npm run db:generate
|
||||
npm run package:offline
|
||||
```
|
||||
|
||||
생성된 migration은 서버가 시작될 때 자동 적용됩니다. 호스트에서 수동 적용하려면 `npm run db:migrate`를 사용합니다.
|
||||
### Production 실행
|
||||
|
||||
## 디렉터리 경계
|
||||
|
||||
```text
|
||||
src/
|
||||
├─ lib/
|
||||
│ ├─ engine/ # UI 프레임워크에 의존하지 않는 순수 계산 로직
|
||||
│ ├─ models/ # UI·엔진·서버가 공유하는 도메인 타입
|
||||
│ ├─ server/db/ # SQLite/Drizzle 서버 전용 모듈
|
||||
│ └─ workers/ # 무거운 최적화 작업의 Web Worker 진입점
|
||||
└─ routes/ # SvelteKit 화면과 API
|
||||
```bash
|
||||
docker compose -f compose.prod.yaml up --build -d
|
||||
```
|
||||
|
||||
의존성 방향은 `UI → Engine → Models`를 유지합니다. 계산 엔진은 Svelte나 서버 모듈을 import하지 않습니다.
|
||||
- 웹: <http://localhost:3000>
|
||||
- 상태 확인: <http://localhost:3000/api/health>
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary><strong>게임 데이터 갱신과 카드 표시명 수정</strong></summary>
|
||||
|
||||
공개 HolodoriDB diff 저장소에서 카드 관련 마스터 데이터와 한국어·영어·일본어 텍스트를 수집합니다.
|
||||
|
||||
```bash
|
||||
npm run data:sync
|
||||
```
|
||||
|
||||
생성된 데이터는 `data/holodoridb`에 저장합니다. 카드 일러스트, 영상과 음성은 수집 대상에서 제외합니다.
|
||||
|
||||
특별 버전명이나 번역 이름은 `data/card-overrides.csv`에서 관리합니다.
|
||||
|
||||
```csv
|
||||
cardId,versionName,displayName
|
||||
card-06002-5-uniq-0066-00,수영복,
|
||||
```
|
||||
|
||||
- `cardId`: 수정할 카드의 고유 ID
|
||||
- `versionName`: 이름 옆에 표시할 짧은 버전명
|
||||
- `displayName`: 기본 멤버 이름을 완전히 바꿀 때만 입력
|
||||
|
||||
수정 후 `npm run data:sync`를 실행하면 반영됩니다. 이 파일은 원본 데이터를 다시 수집해도 덮어쓰지 않습니다.
|
||||
|
||||
</details>
|
||||
|
||||
Reference in New Issue
Block a user