feat(map): 맵 5막화·노드 depth 7·rest/shop/elite 연속 금지 (P14-1)

- ACT_COUNT/RUN_LENGTH 3→5, ACT_MAPS map01~map05 (반복 런 기반 확장)
- MAP_ROWS 7→6 (걷는 행 6 + 보스 = depth 최대 7), 막 배율 0.6→0.45 완화
- 노드 타입 인접 금지를 elite 단독 → rest/shop/elite 3종으로 일반화
  (Lua GenerateMap + rogue-map.mjs JS 미러 동시 수정, 테스트 9/9 통과)
- 맵 파일 생성기 카운트 11→5, map06~map11 삭제, SectorConfig 정리(stale 제거)
- 산출물 재생성(ui/codeblock/map01~05). 검증 헬퍼 tools/verify/count.mjs 추가

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-14 00:13:16 +09:00
parent f67471435e
commit 9e16465218
24 changed files with 2886 additions and 52399 deletions

View File

@@ -2,7 +2,7 @@
// ⚠️ 전투 규칙과 마찬가지로 tools/deck/gen-slaydeck.mjs 의 Lua(GenerateMap)와 로직 동기화 유지할 것.
// (Lua는 math.random, 여기는 주입 rng — 수치 동일성이 아니라 구조 규칙 동일성이 대상)
export const ROWS = 7; // 걷는 행 1..7, 보스는 row 8
export const ROWS = 6; // 걷는 행 1..6, 보스는 row 7 (depth 최대 7)
export const COLS = 4;
export const PATHS = 4;
@@ -64,12 +64,13 @@ export function generateMap(rng) {
const id = nodeId(r, c);
const node = nodes[id];
if (!node) continue;
// elite 부모 검사 (연속 엘리트 방지)
let eliteParent = false;
// 부모 노드 타입 수집 (rest/shop/elite 부모와 같은 타입 연속 금지)
const parentTypes = new Set();
for (const pn of Object.values(nodes)) {
if (pn.row === r - 1 && pn.type === 'elite' && pn.next.includes(id)) eliteParent = true;
if (pn.row === r - 1 && pn.next.includes(id)) parentTypes.add(pn.type);
}
const w = rowWeights(r).map(([t, wt]) => [t, t === 'elite' && eliteParent ? 0 : wt]);
const NO_REPEAT = new Set(['rest', 'shop', 'elite']);
const w = rowWeights(r).map(([t, wt]) => [t, NO_REPEAT.has(t) && parentTypes.has(t) ? 0 : wt]);
const total = w.reduce((s, [, wt]) => s + wt, 0);
const roll = rng() * total;
let acc = 0;