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

@@ -60,7 +60,7 @@ function luaFramesTable() {
}
// 맵은 런타임 절차 생성(GenerateMap Lua ↔ tools/map/rogue-map.mjs 미러). 정적 data/map.json 제거됨.
const MAP_ROWS = 7; // 걷는 행 1..7, 보스 row 8
const MAP_ROWS = 6; // 걷는 행 1..6, 보스 row 7 (depth 최대 7)
const MAP_COLS = 4;
// 보물 상자 스프라이트 (공식 maplestory 리소스, 메이커 선별)
@@ -2414,13 +2414,13 @@ function codeblock(id, name, properties, methods) {
}
function writeCodeblocks() {
const RUN_LENGTH = 3;
const RUN_LENGTH = 5;
const GOLD_PER_WIN = 25;
const CARD_PRICE = 30;
const REST_HEAL = 30;
const RELIC_PRICE = 60;
const ACT_COUNT = 3;
const ACT_MAPS = ['map01', 'map02', 'map03'];
const ACT_COUNT = 5;
const ACT_MAPS = ['map01', 'map02', 'map03', 'map04', 'map05'];
const combat = codeblock('SlayDeckController', 'SlayDeckController', [
prop('any', 'DrawPile'),
prop('any', 'DiscardPile'),
@@ -2773,7 +2773,7 @@ for i = 1, #reg do
end
end
table.sort(list, function(a, b) return a.x < b.x end)
local mult = 1 + (self.Floor - 1) * 0.6
local mult = 1 + (self.Floor - 1) * 0.45
if g == "elite" or g == "boss" then
mult = mult + self:AscEliteBonus()
end
@@ -4335,11 +4335,12 @@ for r = 3, ${MAP_ROWS} do
local id = "r" .. tostring(r) .. "c" .. tostring(c)
local node = self.MapNodes[id]
if node ~= nil then
local eliteParent = false
-- 부모 노드 타입 수집 (rest/shop/elite 는 부모와 같은 타입 연속 금지)
local parentTypes = {}
for pid, pn in pairs(self.MapNodes) do
if pn.row == r - 1 and pn.type == "elite" then
if pn.row == r - 1 then
for i = 1, #pn.next do
if pn.next[i] == id then eliteParent = true end
if pn.next[i] == id then parentTypes[pn.type] = true end
end
end
end
@@ -4353,7 +4354,8 @@ for r = 3, ${MAP_ROWS} do
end
local total = 0
for i = 1, #w do
if w[i][1] == "elite" and eliteParent == true then
local t = w[i][1]
if (t == "elite" or t == "rest" or t == "shop") and parentTypes[t] == true then
w[i][2] = 0
end
total = total + w[i][2]