From 18da7a7983ba2c3b09ac36017259c29ddbb26cd0 Mon Sep 17 00:00:00 2001 From: gahusb Date: Thu, 2 Jul 2026 13:57:22 +0900 Subject: [PATCH] =?UTF-8?q?docs:=20=EB=AA=AC=EC=8A=A4=ED=84=B0=20=EC=A2=85?= =?UTF-8?q?=EB=B3=84=20=EB=AA=A8=EB=8D=B8=20=EC=82=B0=EC=B6=9C=EB=AC=BC=20?= =?UTF-8?q?=EA=B7=9C=EC=B9=99(RULES=20=C2=A71)=C2=B7README=20=EB=B0=98?= =?UTF-8?q?=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RULES §1 표에 Models/Monsters/.model 행 + 보조 생성기 3종 갱신. README 디렉토리 구조·기능 표(몬스터 종별 모델)·재생성 명령 반영. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_011xhLoQbJvQYL65kBtDNDTy --- README.md | 15 ++++++++++----- RULES.md | 8 +++++--- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index d3a64e6..d680fe3 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,8 @@ git pull slaymaple/ ├── data/ # 게임 데이터 단일 소스 (생성기가 읽어 주입). 맵은 정적 데이터 없음(절차 생성) │ ├── cards.json # 카드 166장(1~3차 전직 계열별 + 저주) + 클래스별 시작 덱 -│ ├── enemies.json # 적 18종(일반/정예/보스, 디버프 인텐트 포함) +│ ├── enemies.json # 적 18종(일반/정예/보스, 디버프 인텐트 + 외형 appearance) +│ ├── encounters.json # 맵별 몬스터 로스터(map01~05 × combat/elite/boss) │ ├── potions.json # 물약 6종 + 드랍률·슬롯·상점가 │ ├── relics.json # 유물 19종(StS 효과 × 메이플 장비) + 시작 유물 + 풀 │ ├── cardframes.json # 커스텀 카드 프레임 3종(전사/마법사/도적 × normal/unique/legend) + 보상 등급 가중치 @@ -68,16 +69,17 @@ slaymaple/ │ ├── MapCamera.codeblock # 맵별 카메라 적용 │ ├── PlayerLock.codeblock # 전투맵 플레이어 입력·이동 잠금 │ ├── LobbyNpc.codeblock # 로비 NPC 상호작용(근접·클릭) -│ └── LobbyMobility.codeblock # 로비 이동·공격 해제 + 카메라 추종 +│ ├── LobbyMobility.codeblock # 로비 이동·공격 해제 + 카메라 추종 +│ └── Models/Monsters/ # 적 종별 모델 .model (산출물 — 외형·EnemyId 베이크) ├── map/ # 맵 6종 (산출물) │ ├── lobby.map # 로비 허브 맵 (마을 배경, NPC 4종, 전투 없음) │ └── map01.map ~ map05.map # 5막 전투/맵 노드 (공식 배경 + STS풍 우측 배치) ├── tools/ # 결정적 생성기·도구 (주체별 폴더, 단일 소스) │ ├── deck/ # gen-slaydeck.mjs(★컨트롤러+common 생성 오케스트레이터) · cb/(codeblock Lua 메서드 20모듈: boot·screens·combat·hand·npc·navigation·layout·shop·reward·soul 등) · lib/(공유 상수·데이터·헬퍼) · legacy/(옛 UI emit 휴면) -│ ├── map/ # gen-maps.mjs(맵 배경/타일) · gen-lobby-map.mjs(로비 맵+NPC) · gen-map-encounters.mjs(노드별 몬스터 그룹) · rogue-map.mjs(절차 생성 JS 미러)+test +│ ├── map/ # gen-maps.mjs(맵 배경/타일) · gen-lobby-map.mjs(로비 맵+NPC) · gen-map-encounters.mjs(encounters.json 로스터 기반 종별 모델 인스턴스 배치) · rogue-map.mjs(절차 생성 JS 미러)+test │ ├── camera/ # gen-camera.mjs(맵별 고정 카메라 codeblock) │ ├── player/ # gen-player-lock.mjs(전투맵 입력 잠금) · freeze-turn-player.mjs(모델 이동 정지) · gen-lobby-npc.mjs(LobbyNpc·LobbyMobility codeblock) -│ ├── monster/ # gen-combat-monster.mjs(EnemyId 마커) · freeze-turn-monsters.mjs(필드 AI 정지) +│ ├── monster/ # gen-monster-models.mjs(적 종별 .model) · gen-combat-monster.mjs(자기등록 codeblock) · freeze-turn-monsters.mjs(레거시 AI 정지) · lib/monster-model.mjs(공용 빌더)+test │ ├── balance/ # sim-balance.mjs(전투 밸런스 몬테카를로 시뮬) · sim-balance.test.mjs │ ├── verify/ # count·uimap·cbgap(카운트/UIGroup 매핑/재연결 GAP) · cardkinds(카드 kind↔효과) · cbprops(미선언 self 대입) · cbset(메서드 집합 무손실) · diffcheck(바이트동일) │ └── git/ # gitea-pr.mjs(UTF-8 안전 PR 생성/수정/머지 — RULES.md 참조) @@ -127,6 +129,7 @@ slaymaple/ | **버프/디버프** | StS 표준 — **힘**(+N 영구)·**약화**(주는 피해 −25%)·**취약**(받는 피해 +50%)·**독**(매 행동 틱). 양방향(적 디버프 인텐트 포함), 인텐트는 최종 예상치 표시 | | **전투 연출** | 공격 이펙트·**몬스터 데미지 팝업(자릿수 스킨)**·드래그 타깃 마커·적 개별 차례·**공격/피격/독뎀 모션**(아바타 상태 전이·몬스터 hit 클립·런지/넉백) | | **절차 생성 맵** | 막 시작마다 **경로 생성**(런마다 다름, **가로 진행**). 층 규칙: 1~2층 전투만 → 3층~ 상점/휴식 → 4층~ 엘리트/**유물 방** → 보스 수렴. 점선 경로·상태 4단·층 카운터. 노드 타입별 **몬스터 랜덤 구성**(일반 1~3 / 엘리트 / 보스) + intent 랜덤 행동 | +| **몬스터 종별 모델** | 적 종별 전용 `.model`(프리팹) — 외형(stand/hit/die)·EnemyId 베이크, 태생 AI-free. 맵 배치는 **`data/encounters.json` 맵별 로스터**대로 해당 모델 인스턴스 생성(외형=정체성 고정). 능력치·행동은 `enemies.json`, 외형은 `appearance`, 배치는 `encounters.json`로 관심사 분리 | | **유물 19종 / 물약 6종** | 유물: StS 효과 × 메이플 장비 외형, TopBar 아이콘 + 마우스오버 툴팁, 8종 훅. 물약: 승리 40% 드랍·상점·슬롯 메뉴. 보물 방=상자 연출 → 유물+메소 | | **카드 프레임·등급** | 커스텀 프레임 3종(전사/마법사/도적 × normal/unique/legend), 카드 5개 사이트 통합 레이아웃. 보상 등급 가중 추첨 70/25/5 | | **영혼(Soul) 메타 성장** | 승천과 별개의 영구 강화 화폐. 2차 전직 상태로 보스 클리어 시 적립 → 로비 영혼 상점 4종 해금(시작 메소 +60·HP +15·덱 정제·시작 유물 +1). **UserDataStorage 영구 저장** | @@ -179,7 +182,9 @@ node tools/map/gen-lobby-map.mjs # 로비 맵 + NPC 배치 node tools/player/gen-lobby-npc.mjs # 로비 codeblock(LobbyNpc·LobbyMobility) node tools/camera/gen-camera.mjs # 맵별 카메라 node tools/player/gen-player-lock.mjs # 전투맵 입력 잠금 -node tools/monster/gen-combat-monster.mjs # 몬스터 EnemyId 마커 +node tools/monster/gen-monster-models.mjs # 적 종별 모델 .model (외형=enemies.json appearance) +node tools/monster/gen-combat-monster.mjs # 자기등록 마커 codeblock +node tools/map/gen-map-encounters.mjs # encounters.json 로스터 기반 맵 몬스터 배치 ``` > 산출물 검증은 내용 출력 없이 카운트만: `node tools/verify/count.mjs ...`. 정적 가드 — 카드 kind↔효과 `cardkinds.mjs` · 미선언 self 대입 `cbprops.mjs` · UI 경로 재연결 GAP `cbgap.mjs` · 리팩터 바이트동일 `diffcheck.mjs` (자세한 가드는 [`RULES.md`](RULES.md)). diff --git a/RULES.md b/RULES.md index 9ea2832..de2071d 100644 --- a/RULES.md +++ b/RULES.md @@ -16,6 +16,7 @@ Claude Code는 `CLAUDE.md`가 이 파일을 임포트하므로 자동 적용된 | `Global/common.gamelogic` | ~1KB | 〃 | 〃 | | `map/map01.map`~`map05.map`, `map/lobby.map` | 각 ~210KB | `tools/map/`·`tools/monster/`·`tools/camera/`·`tools/player/` (↓ 보조 생성기) | 해당 생성기 | | `RootDesk/MyDesk/CombatMonster.codeblock` | ~2KB | `tools/monster/gen-combat-monster.mjs` | `node tools/monster/gen-combat-monster.mjs` | +| `RootDesk/MyDesk/Models/Monsters/.model` (적 종별, 최대 18종) | 각 ~5KB | `data/enemies.json`(`appearance`) + `tools/monster/gen-monster-models.mjs` | `node tools/monster/gen-monster-models.mjs` | | `RootDesk/MyDesk/PlayerLock.codeblock` | ~2KB | `tools/player/gen-player-lock.mjs` | `node tools/player/gen-player-lock.mjs` | | `RootDesk/MyDesk/MapCamera.codeblock` | ~2KB | `tools/camera/gen-camera.mjs` (값: `data/camera.json`) | `node tools/camera/gen-camera.mjs` | | `RootDesk/MyDesk/LobbyNpc.codeblock`·`LobbyMobility.codeblock` | 각 ~2-3KB | `tools/player/gen-lobby-npc.mjs` | `node tools/player/gen-lobby-npc.mjs` | @@ -31,9 +32,10 @@ Claude Code는 `CLAUDE.md`가 이 파일을 임포트하므로 자동 적용된 - `tools/camera/gen-camera.mjs` → `MapCamera.codeblock` + map01~05 카메라 부착 (값 `data/camera.json`) - `tools/map/gen-maps.mjs` → `map02~05` + `Global/SectorConfig.config` (map01 템플릿 클론) - `tools/map/gen-lobby-map.mjs` → `map/lobby.map` + `SectorConfig.config` - - `tools/map/gen-map-encounters.mjs` → map01~05 노드 타입별 몬스터 그룹 재구성 - - `tools/monster/gen-combat-monster.mjs` → `CombatMonster.codeblock` + map01~05 부착 - - `tools/monster/freeze-turn-monsters.mjs` → 몬스터 `.model`·맵 AI 컴포넌트 제거 + - `tools/monster/gen-monster-models.mjs` → `Models/Monsters/.model`(적 종별, 외형·EnemyId 베이크·태생 AI-free). 단일 소스 `data/enemies.json`의 `appearance`. `appearance` 미보유 적은 스킵(메이커 저작 모델 `HolodragonKing`·`Model_monster-43`은 예외 — 이 생성기 대상 아님). 공용 빌더 `tools/monster/lib/monster-model.mjs`. + - `tools/map/gen-map-encounters.mjs` → map01~05에 `data/encounters.json` 로스터 기반 **종별 모델 인스턴스** 배치(외형=정체성 고정). 준비도 가드: 로스터에 `appearance` 미보유 적이 있는 맵은 재생성 스킵(기존 보존). 값 검증 `node --test tools/monster/monster-model.test.mjs`. + - `tools/monster/gen-combat-monster.mjs` → `CombatMonster.codeblock`(자기등록 마커)만 생성. 맵 부착값(EnemyId/Group)은 `gen-map-encounters.mjs`가 인스턴스에 직접 기록. + - `tools/monster/freeze-turn-monsters.mjs` → 레거시 공용 몬스터 `.model`·맵 AI 컴포넌트 제거(신규 종별 모델은 태생 frozen — 대상 아님). - `tools/player/gen-player-lock.mjs` → `PlayerLock.codeblock` + map01~05 부착 - `tools/player/gen-lobby-npc.mjs` → `LobbyNpc.codeblock`·`LobbyMobility.codeblock` - `tools/player/freeze-turn-player.mjs` → `Global/DefaultPlayer.model` 이동 0 고정