diff --git a/README.md b/README.md index fbf36e5..677a403 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # SlayMaple [MapleStory Worlds(MSW)](https://maplestoryworlds.nexon.com/) 기반으로 제작하는 **Slay the Spire 풍 덱빌더 로그라이크** 월드. -턴제 카드 전투, 덱 구성, 보상 선택, 맵 노드 진행을 메이플 월드 위에서 구현하는 것을 목표로 합니다. +로비 마을에서 NPC와 상호작용해 런을 시작하고, 턴제 카드 전투·덱 구성·보상 선택·절차 생성 맵 진행·전직·영혼 메타 성장을 메이플 월드 위에서 구현합니다. > 이 저장소는 MSW **로컬 워크스페이스(Local Workspace)** 데이터를 git으로 형상관리하기 위한 것입니다. > 공동작업자는 이 저장소를 통해 월드 데이터를 주고받습니다. (클라우드 공동제작 모드 미사용) @@ -32,9 +32,10 @@ git push ```bash git pull ``` -받아온 뒤, 메이커에서 **로컬 워크스페이스를 다시 로드(reload)** 해야 새 codeblock/모델 파일이 에디터 상태로 반영됩니다. +받아온 뒤, 메이커에서 **로컬 워크스페이스를 다시 로드(reload)** 해야 새 codeblock/모델/맵 파일이 에디터 상태로 반영됩니다. > 💡 같은 파일을 동시에 수정하면 git 충돌이 날 수 있으니, **서로 다른 맵/codeblock/UI를 나눠서** 작업하는 것을 권장합니다. +> ⚠️ git pull 후 reload를 빠뜨리면 메이커의 stale 상태가 디스크를 덮어쓸 수 있습니다. 재생성 후에도 reload → 빌드 콘솔 0 에러 확인. --- @@ -42,107 +43,145 @@ git pull ``` slaymaple/ -├── data/ # 게임 데이터 단일 소스 (생성기가 읽어 주입) -│ ├── cards.json # 카드 32종(클래스·직업별) + 클래스별 시작 덱 -│ ├── enemies.json # 적 정의(일반/정예/보스, 디버프 인텐트 포함) +├── data/ # 게임 데이터 단일 소스 (생성기가 읽어 주입). 맵은 정적 데이터 없음(절차 생성) +│ ├── cards.json # 카드 122장(클래스·2차전직별 + 저주) + 클래스별 시작 덱 +│ ├── enemies.json # 적 12종(일반/정예/보스, 디버프 인텐트 포함) │ ├── potions.json # 물약 6종 + 드랍률·슬롯·상점가 -│ └── relics.json # 유물 19종(StS 효과 × 메이플 장비) + 시작 유물 + 풀 +│ ├── relics.json # 유물 19종(StS 효과 × 메이플 장비) + 시작 유물 + 풀 +│ ├── cardframes.json # 커스텀 카드 프레임 3종(전사/마법사/도적 × normal/unique/legend) + 보상 등급 가중치 +│ └── camera.json # 맵별 카메라 설정값(줌·오프셋·고정 영역) ├── Global/ # 월드 전역 설정 · 공용 모델 · 게임로직 -│ ├── common.gamelogic # SlayDeckController 부착 지점 (카드 UI 전투) +│ ├── common.gamelogic # SlayDeckController 부착 지점 (산출물) │ ├── DefaultPlayer.model # 플레이어 모델 (턴전투용 이동 정지 freeze 적용) -│ ├── *.model # 몬스터 등 공용 모델 (freeze 적용) +│ ├── ChaseMonster.model · MoveMonster.model # 몬스터 공용 모델 +│ ├── SectorConfig.config # 섹터/맵 등록 (lobby + map01~05 = 6 entries) │ ├── WorldConfig.config # 월드 설정 │ └── ... ├── RootDesk/ -│ └── MyDesk/ # 작업용 책상 — codeblock(스크립트)·모델·타일셋 -│ ├── SlayDeckController.codeblock # 게임 전체 컨트롤러 (생성물, 직접 편집 금지) -│ ├── Monster.codeblock # 필드 액션 몬스터 (HP·피격·리스폰, 카드 전투와 별개) -│ ├── MonsterAttack.codeblock · PlayerAttack.codeblock · PlayerHit.codeblock -│ ├── UIPopup.codeblock · UIToast.codeblock -│ └── RectTileData_Henesys.tileset -├── map/ -│ └── map01.map ~ map11.map # 맵 11종 (공식 배경 + STS풍 우측 배치) +│ └── MyDesk/ # 작업용 책상 — codeblock(스크립트)·타일셋 +│ ├── SlayDeckController.codeblock # 게임 전체 컨트롤러 (★산출물, 직접 편집 금지) +│ ├── Monster.codeblock · MonsterAttack.codeblock # 필드 액션 몬스터 (카드 전투와 별개) +│ ├── PlayerAttack.codeblock · PlayerHit.codeblock · UIPopup.codeblock · UIToast.codeblock +│ ├── CombatMonster.codeblock # 맵 몬스터 EnemyId 마커 + /common 자기등록 +│ ├── MapCamera.codeblock # 맵별 카메라 적용 +│ ├── PlayerLock.codeblock # 전투맵 플레이어 입력·이동 잠금 +│ ├── LobbyNpc.codeblock # 로비 NPC 상호작용(근접·클릭) +│ └── LobbyMobility.codeblock # 로비 이동·공격 해제 + 카메라 추종 +├── map/ # 맵 6종 (산출물) +│ ├── lobby.map # 로비 허브 맵 (마을 배경, NPC 4종, 전투 없음) +│ └── map01.map ~ map05.map # 5막 전투/맵 노드 (공식 배경 + STS풍 우측 배치) ├── tools/ # 결정적 생성기·도구 (주체별 폴더, 단일 소스) -│ ├── deck/ # gen-slaydeck.mjs(★게임 전체 생성: 카드/덱·맵·상점·유물·메인메뉴 UI+SlayDeckController+common) · gen-cardhand.mjs(손패 초기 생성) -│ ├── map/ # gen-maps.mjs(맵 생성) · gen-map-encounters.mjs(맵별 인카운터) · rogue-map.mjs(절차 생성 JS 미러+테스트) +│ ├── deck/ # gen-slaydeck.mjs(★게임 전체 생성: 카드/덱·전투·맵노드·상점·유물·로비·메뉴 UI + SlayDeckController + common) · gen-cardhand.mjs +│ ├── map/ # gen-maps.mjs(맵 배경/타일) · gen-lobby-map.mjs(로비 맵+NPC) · gen-map-encounters.mjs(노드별 몬스터 그룹) · rogue-map.mjs(절차 생성 JS 미러)+test │ ├── camera/ # gen-camera.mjs(맵별 고정 카메라 codeblock) -│ ├── player/ # freeze-turn-player.mjs(이동 정지) · gen-player-lock.mjs(입력 차단·시선 고정 codeblock) -│ ├── monster/ # freeze-turn-monsters.mjs(필드 몬스터 AI/이동 정지) -│ ├── balance/ # sim-balance.mjs(밸런스 시뮬·몬테카를로) · sim-balance.test.mjs +│ ├── 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 정지) +│ ├── balance/ # sim-balance.mjs(전투 밸런스 몬테카를로 시뮬) · sim-balance.test.mjs +│ ├── verify/ # count.mjs(산출물 카운트 검증 헬퍼 — 경로 내장) │ └── git/ # gitea-pr.mjs(UTF-8 안전 PR 생성/수정/머지 — RULES.md 참조) -├── ui/ # UI 그룹 (Default / Popup / Toast) +├── ui/ # UI 그룹 (DefaultGroup 8.3MB 산출물 / PopupGroup / ToastGroup) ├── docs/ -│ ├── slaymaple_basic_framework.md # 전투 프레임워크 설계 문서 -│ └── superpowers/specs|plans/ # 각 기능 설계·구현 계획 문서 -├── RULES.md # 협업·AI 에이전트 하네스 규칙 (토큰 가드·PR 절차) +│ ├── slaymaple_basic_framework.md # 전투 프레임워크 설계 문서 +│ ├── ui-generation-structure.md # UI 생성 구조 문서 +│ └── superpowers/specs|plans/ # 각 기능 설계·구현 계획 문서(P1~P15) +├── RULES.md # 협업·AI 에이전트 하네스 규칙 (토큰 가드·검증·PR 절차) ├── CLAUDE.md # Claude Code 자동 로드 (RULES.md 임포트) └── README.md ``` +> ⚠️ **`map/*.map` · `ui/DefaultGroup.ui` · `*.codeblock` · `Global/*.gamelogic`는 생성 산출물**입니다 — 직접 편집하면 다음 재생성 때 사라집니다. 게임 변경은 `data/*.json` 또는 `tools/`의 생성기를 고친 뒤 재생성하세요(자세한 규칙은 [`RULES.md`](RULES.md)). > `.mcp.json`, `.codex/` 는 **Authorization 토큰이 포함**되어 있어 git에서 제외됩니다(`.gitignore`). 각자 로컬에서 직접 구성하세요. --- ## 게임 프레임워크 현황 -**StS2풍 덱빌더 로그라이크가 end-to-end로 완성**됐습니다 — 메인 메뉴(승천 선택) → 캐릭터 선택(전사/마법사) → 절차 생성 맵 → 전투/엘리트/상점/휴식/유물 방 → 보상·전직·덱 성장 → 보스 → 다음 막 → 런 클리어(승천 해금). 게임 전체는 `/common` 엔티티에 부착된 **`SlayDeckController` 단일 컴포넌트**로 동작하며, 모든 산출물(`ui/DefaultGroup.ui` · `SlayDeckController.codeblock` · `common.gamelogic`)은 **`tools/deck/gen-slaydeck.mjs` 단일 소스에서 생성**됩니다(직접 편집 금지, 결정적 출력 — `RULES.md` 참조). 게임 데이터는 **`data/*.json`** 가 단일 소스. +**StS2풍 덱빌더 로그라이크가 end-to-end로 완성**됐고, 이제 **로비 마을을 기점으로 반복 런**이 돕니다: -### 구현된 기능 (배포 퀄리티 P1~P12, PR #34~#47) +``` +로비 맵(NPC 4종) → 모험가 NPC → 캐릭터 선택(전사/도적/마법사) → 절차 생성 맵(5막) + → 전투/엘리트/상점/휴식/유물 방 → 보상·전직·덱 성장 → 보스 → 다음 막 + → 런 클리어(승천 해금) → 로비 복귀(영혼 정산) → 다음 런 … +``` + +게임 전체는 `/common` 엔티티에 부착된 **`SlayDeckController` 단일 컴포넌트**로 동작하며, 모든 산출물(`ui/DefaultGroup.ui` · `SlayDeckController.codeblock` · `common.gamelogic`)은 **`tools/deck/gen-slaydeck.mjs` 단일 소스에서 생성**됩니다(결정적 출력, 직접 편집 금지 — `RULES.md` 참조). 게임 데이터는 **`data/*.json`** 가 단일 소스, 맵 구조는 **런타임 절차 생성**(`GenerateMap` Lua ↔ `tools/map/rogue-map.mjs` JS 미러). + +### 구현된 기능 (배포 퀄리티 P1~P15, PR #34~#57) | 영역 | 내용 | |---|---| -| **캐릭터·전직** | 시작 시 **전사(HP80)/마법사(HP70)** 선택, 클래스별 시작 덱. 보스 클리어 시 [유물] vs [**2차 전직**] — 전사→파이터/페이지/스피어맨, 법사→위자드(불·독)/위자드(썬·콜)/클레릭. 전용 카드는 해당 클래스만 획득(보상·상점 풀 필터) | -| **카드 전투** | 에너지 3·5장 드로우·**드래그 사용**(공격=적에 드롭, 스킬=위로 스윕). 카드 32종 — kind **Attack/Skill/Power**(파워: 소멸·매턴 지속 효과). 메커니즘: 다단히트·방어 무시·자가 디버프·드로·회복·**전체 공격(AoE)**·**독(DoT)** | +| **로비 마을** | 전용 물리 맵 `lobby.map`(마을 배경). **NPC 4종 월드 엔티티** — 모험가(런 시작)·사서(카드 도감)·상인(영혼 상점)·안내원(게시판). 근접 시 머리 위 마크 + `↑`키 **또는 직접 클릭**으로 상호작용. **이동·공격 모션은 로비 맵에서만** 풀림(전투맵은 잠금), 카메라는 로비에서 **플레이어 추종**(전투맵은 고정) | +| **캐릭터·전직** | 시작 시 **전사(HP80)/도적(HP70)/마법사(HP70)** 3종 선택, 클래스별 시작 덱. 보스 클리어 시 [유물] vs [**2차 전직**] — 각 클래스 3종(전사→파이터/페이지/스피어맨, 법사→위자드불독/위자드썬콜/클레릭, 도적→Shiv/Poison/Trickster). 전용 카드는 해당 클래스 풀만 획득 | +| **카드 전투** | 에너지 3·드로우·**드래그 사용**(공격=적에 드롭, 스킬=위로 스윕). 카드 **122장** — kind **Attack/Skill/Power/Status**. 메커니즘: 다단히트·방어 무시·자가 디버프·드로·회복·**전체 공격(AoE)**·**독(DoT)**·**retain**(턴 종료 손패 유지)·**sly discard**(버림 트리거) | | **버프/디버프** | StS 표준 — **힘**(+N 영구)·**약화**(주는 피해 −25%)·**취약**(받는 피해 +50%)·**독**(매 행동 틱). 양방향(적 디버프 인텐트 포함), 인텐트는 최종 예상치 표시 | -| **전투 연출** | 공격 이펙트·데미지 팝업·적 개별 차례·**공격/피격/독뎀 모션**(아바타 상태 전이·몬스터 hit 클립·런지/넉백) | -| **절차 생성 맵** | 막 시작마다 **8층×4열 StS식 경로 생성**(런마다 다름). 층 규칙: 1~2층 전투만 → 3층~ 상점/휴식 → 4층~ 엘리트/**유물 방** → 7층 휴식 가중 → 8층 보스. 점선 경로·상태 4단(현재/방문/도달/잠김)·층 카운터 | -| **유물 방(보물)** | 상자 클릭 → 흔들림 → 열림 연출 → 유물 + 메소 획득 | -| **유물 19종** | StS 효과 × 메이플 장비 외형. TopBar **아이콘 행 + 마우스오버 툴팁**. 훅: combatStart/turnStart/cardPlayed/combatEnd/combatReward/onPlayerDamaged/attackCalc/passive. **장인의 벨트**=물약 슬롯 3→5칸 | -| **물약 6종** | 승리 40% 드랍·상점 판매·슬롯 클릭 → 사용(전투 중)/버리기 메뉴·툴팁 | -| **상점/휴식** | 카드 3종·유물·물약 판매(메소), 휴식=HP 회복 | -| **승천(Ascension)** | A1~A10 누적 모디파이어(적 강화·시작 HP 감소·보상 감소). **UserDataStorage로 유저별 영구 저장**(서버 RPC), 런 클리어 시 다음 단계 해금 | -| **멀티 act** | 보스 클리어→다음 막 텔레포트(맵·인카운터 변경, 적 스케일 `1+(막-1)*0.6`), 3막 클리어 시 런 종료→메뉴 복귀 | -| **밸런스 시뮬** | `tools/balance/sim-balance.mjs` — 전투 규칙 JS 미러(몬테카를로) + `tools/map/rogue-map.mjs`(맵 생성 미러). **테스트 40건** | +| **전투 연출** | 공격 이펙트·**몬스터 데미지 팝업(자릿수 스킨)**·드래그 타깃 마커·적 개별 차례·**공격/피격/독뎀 모션**(아바타 상태 전이·몬스터 hit 클립·런지/넉백) | +| **절차 생성 맵** | 막 시작마다 **경로 생성**(런마다 다름, **가로 진행**). 층 규칙: 1~2층 전투만 → 3층~ 상점/휴식 → 4층~ 엘리트/**유물 방** → 보스 수렴. 점선 경로·상태 4단·층 카운터. 노드 타입별 **몬스터 랜덤 구성**(일반 1~3 / 엘리트 / 보스) + intent 랜덤 행동 | +| **유물 19종 / 물약 6종** | 유물: StS 효과 × 메이플 장비 외형, TopBar 아이콘 + 마우스오버 툴팁, 8종 훅. 물약: 승리 40% 드랍·상점·슬롯 메뉴. 보물 방=상자 연출 → 유물+메소 | +| **카드 프레임·등급** | 커스텀 프레임 3종(전사/마법사/도적 × normal/unique/legend), 카드 5개 사이트 통합 레이아웃. 보상 등급 가중 추첨 70/25/5 | +| **영혼(Soul) 메타 성장** | 승천과 별개의 영구 강화 화폐. 2차 전직 상태로 보스 클리어 시 적립 → 로비 영혼 상점 4종 해금(시작 메소 +60·HP +15·덱 정제·시작 유물 +1). **UserDataStorage 영구 저장** | +| **승천(Ascension)** | A1~A10 누적 모디파이어(적 강화·시작 HP 감소·보상 감소). UserDataStorage 유저별 영구 저장, 런 클리어 시 다음 단계 해금 | +| **멀티 act** | **5막** 진행(보스 클리어→다음 막 텔레포트, 맵·인카운터 변경, 적 스케일 `1+(막-1)*0.45`), 5막 클리어 시 런 종료 | +| **경제** | 화폐 표기 **메소**(코인 아이콘), 카드/유물/물약 메소 가격. 내부 식별자는 Gold 유지 | +| **밸런스 시뮬** | `tools/balance/sim-balance.mjs` — 전투 규칙 JS 미러(몬테카를로) + `tools/map/rogue-map.mjs`(맵 생성 미러) + node 단위테스트 | > ⚠️ 수치(적 스탯·경제·승천 배율)는 1차 조정 상태입니다. 정밀 밸런싱은 `sim-balance.mjs`로 검증하며 진행합니다. +> ℹ️ 도적(Silent) 카드 88장은 효과·프레임은 적용됐으나 **카드 아이콘(image/fx) 미할당** 상태입니다(전사·마법사 카드는 실 스킬 아이콘 적용 완료). ### 유용한 스크립트 호출 `/common` 엔티티(또는 Play Test 컨텍스트)에서: ```lua local c = _EntityService:GetEntityByPath("/common").SlayDeckController -c:SelectClass("warrior") -- 또는 "magician" -c:StartNewGame() -- 캐릭터 선택 → 런 시작 -c:PickNode("r1c2") -- 맵 노드 선택 (절차 생성 그리드 id) / "boss" -c:PlayCard(1) -- 손패 slot 카드 사용 -c:EndPlayerTurn() -- 턴 종료 → 적 턴 → 다음 턴 -c:PickReward(1) -- 보상 카드 1택(0=건너뛰기) -c:BuyCard(1) / c:BuyRelic() / c:BuyPotion() -- 상점 구매 -c:SetJob("fighter") -- 전직 (보스 보상 선택 화면에서) -c:AdjustAscension(1) -- 메뉴에서 승천 단계 +1 +-- 로비 +c:OnLobbyNpcInteract("run") -- 모험가(런 시작) / "codex"(도감) / "shop"(영혼상점) / "board"(게시판) +c:ShowLobby() -- 로비 맵 복귀 + 상태 초기화 +-- 런 +c:SelectClass("warrior") -- "warrior" / "bandit" / "magician" +c:StartNewGame() -- 캐릭터 선택 → 런 시작(map01 텔레포트) +c:PickNode("r1c2") -- 맵 노드 선택(절차 생성 그리드 id) / "boss" +c:PlayCard(1) -- 손패 slot 카드 사용 +c:EndPlayerTurn() -- 턴 종료 → 적 턴 → 다음 턴 +c:PickReward(1) -- 보상 카드 1택(0=건너뛰기) +c:BuyCard(1) / c:BuyRelic() / c:BuyPotion() -- 상점 구매(메소) +c:SetJob("fighter") -- 전직 (보스 보상 선택 화면) +c:AdjustAscension(1) -- 메뉴에서 승천 단계 +1 ``` -밸런스 검증: `node tools/balance/sim-balance.mjs [N] [--seed S]` · 테스트: `node --test tools/balance/sim-balance.test.mjs`. +밸런스 검증: `node tools/balance/sim-balance.mjs [N] [--seed S]` · 테스트: `node --test tools/balance/sim-balance.test.mjs tools/map/rogue-map.test.mjs`. 상세 설계는 [`docs/slaymaple_basic_framework.md`](docs/slaymaple_basic_framework.md) 및 `docs/superpowers/specs/` 참조. +### 산출물 재생성 +```bash +node tools/deck/gen-slaydeck.mjs # 게임 전체(UI·컨트롤러·common·맵 인카운터) +node tools/map/gen-maps.mjs # map01~05 배경/타일 +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/verify/count.mjs ...` (자세한 가드는 [`RULES.md`](RULES.md)). + --- ## 아키텍처 메모 -현재 게임 전체 로직이 `SlayDeckController` 단일 codeblock에 모여 있습니다. 초기 설계 문서가 제안한 3분할(`SlayCardCatalog`/`SlayRunState`/`SlayCombatManager`)은 **기능적으로 모두 구현**됐으나 아직 한 컴포넌트 안에 있습니다. 시스템이 더 커지면 그때 분리를 고려합니다. 카드/적/맵/유물 데이터는 이미 `data/*.json`로 외부화돼 있습니다. +현재 게임 전체 로직이 `SlayDeckController` 단일 codeblock에 모여 있습니다. 초기 설계의 3분할(`SlayCardCatalog`/`SlayRunState`/`SlayCombatManager`)은 **기능적으로 모두 구현**됐으나 아직 한 컴포넌트 안에 있습니다. 맵 NPC·카메라·입력 잠금 등 **맵 단위 동작은 별도 codeblock**(LobbyNpc/LobbyMobility/MapCamera/PlayerLock/CombatMonster)으로 분리해 각 맵 루트/엔티티에 부착합니다. 카드/적/맵/유물/프레임/카메라 데이터는 `data/*.json`로 외부화돼 있습니다. + +> ⚠️ **전투 규칙과 맵 생성은 Lua(gen-slaydeck 내장)와 JS 미러(sim-balance/rogue-map)로 이중 구현**입니다. 한쪽을 고치면 반드시 다른 쪽도 동기화하고 테스트하세요(`RULES.md` §6). --- ## 향후 개선 계획 (후속 후보) -- [x] 전투 루프 · 런 루프 · 절차 생성 맵 · 상점/휴식/유물 방 · 유물 19종 · 물약 · 버프/디버프 · Power · 전직(전사/법사 2차) · 승천+개인 저장 · 전투 모션 **(P1~P12 완료)** -- [ ] **런 이어하기** — 진행 중 런 직렬화 저장(승천에서 도입한 UserDataStorage 확장, 메뉴의 "이어하기" 활성화) -- [ ] **카드 제거/업그레이드** — 상점 카드 제거 슬롯, 휴식 노드에서 카드 강화(StS 스타일 +수치) +- [x] 전투 루프 · 런 루프 · 절차 생성 맵 · 상점/휴식/유물 방 · 유물 19종 · 물약 · 버프/디버프 · Power · 전직(전사/법사/도적 2차) · 승천+개인 저장 · 전투 모션 · 커스텀 프레임 · **반복 런·로비 맵·NPC·영혼·메소·카메라 추종 (P1~P15 완료)** +- [ ] **도적 카드 아이콘** — Silent 88장에 실 스킬 아이콘(image/fx) 할당, 2차 전직 설명 한글화 +- [ ] **런 이어하기** — 진행 중 런 직렬화 저장(UserDataStorage 확장, 메뉴 "이어하기" 활성화) +- [ ] **카드 제거/업그레이드** — 상점 카드 제거 슬롯, 휴식 노드에서 카드 강화 - [ ] **이벤트 노드(?)** — 랜덤 텍스트 이벤트(선택지·리스크/리워드) -- [ ] **3차 전직** — 2막 보스 보상으로 확장(크루세이더/나이트/버서커, 메이지 3차 등) -- [ ] **도적·궁수 클래스** — 캐릭터 선택 슬롯 확장(도적 잠금 해제), 클래스별 카드 풀 -- [ ] **정밀 밸런싱** — 첫 인카운터 승률 100% 완화, 직업별 카드 효율 튜닝(`sim-balance.mjs` 리포트 기반) -- [ ] **상점 보장 규칙** — 막당 상점 최소 1회 등장(현재 가중 랜덤이라 미등장 가능) -- [ ] **연출 보강** — 사운드(타격·획득), EndTurn 버튼 적 턴 중 시각 비활성화, 맵 화면에 유물/물약 표시 -- [ ] **승천 확장** — A10 초과 단계, 승천별 기록(클리어 횟수) 표시 +- [ ] **3차 전직** — 후반 막 보상으로 확장 +- [ ] **궁수 등 추가 클래스** — 캐릭터 선택 슬롯 확장 +- [ ] **정밀 밸런싱** — 첫 인카운터 승률 완화·직업별 카드 효율 튜닝(`sim-balance.mjs` 리포트 기반) +- [ ] **상점 보장 규칙** — 막당 상점 최소 1회 등장 +- [ ] **연출 보강** — 사운드(타격·획득), 맵 화면에 유물/물약 표시 --- @@ -153,5 +192,5 @@ c:AdjustAscension(1) -- 메뉴에서 승천 단계 +1 ``` 2. MSW Maker에서 이 폴더를 **로컬 워크스페이스 경로**로 지정해 월드 열기 3. `.mcp.json` / `.codex/` 는 git에 없으므로, 본인 토큰으로 직접 생성 (MCP·Codex 사용 시) -4. 작업 전 항상 `git pull`, 작업 후 `git add/commit/push` +4. 작업 전 항상 `git pull` + 메이커 reload, 작업 후 `git add/commit/push` 5. **AI 에이전트(Claude Code 등)로 작업한다면 [`RULES.md`](RULES.md) 필독** — 생성 산출물 접근 금지(토큰 가드)·검증 절차·PR 도구(`tools/git/gitea-pr.mjs`) 규칙. Claude Code는 `CLAUDE.md`가 자동 적용