diff --git a/data/nodeicons.json b/data/nodeicons.json new file mode 100644 index 0000000..423dc00 --- /dev/null +++ b/data/nodeicons.json @@ -0,0 +1,11 @@ +{ + "icons": { + "combat": "f98db6823e894a4f90308d61f75894ac", + "elite": "793ed8a757534b89a82f460747d2df24", + "boss": "423056cdbbc04f4da131b9721c404d96", + "shop": "da37e1fac55d455b9ade08569f09f798", + "rest": "b86c1b0568bd45f3ae4a4b97e1b4a594", + "treasure": "f8a6d58e20f54e2ca899485055df1ce4" + }, + "background": "d84241f17de344a097f5b96ac914f1d2" +} diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index 18544bc..b2f2324 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -75,6 +75,10 @@ function luaFramesTable() { const cls = Object.entries(CARDFRAMES.classToFrame).map(([c, f]) => `\t${c} = ${luaStr(f)},`).join('\n'); return `self.CardFrames = {\n${frames}\n}\nself.ClassToFrame = {\n${cls}\n}`; } +function luaNodeIconsTable() { + const rows = Object.entries(NODEICONS.icons).map(([t, ruid]) => `\t${t} = ${luaStr(ruid)},`).join('\n'); + return `self.NodeIcons = {\n${rows}\n}`; +} // 맵은 런타임 절차 생성(GenerateMap Lua ↔ tools/map/rogue-map.mjs 미러). 정적 data/map.json 제거됨. const MAP_ROWS = 6; // 걷는 행 1..6, 보스 row 7 (depth 최대 7) @@ -84,6 +88,13 @@ const MAP_COLS = 4; const CHEST_CLOSED_RUID = '43df67920c0d43298e0d93c02c6afa71'; const CHEST_OPEN_RUID = '09c5cee56fd640bf8ae3a18ce50f4759'; +// 노드 맵 아이콘/배경 (공식 maplestory RUID, data/nodeicons.json 단일 소스 — 교체 시 이 파일만 수정 후 재생성) +const NODEICONS = JSON.parse(readFileSync('data/nodeicons.json', 'utf8')); +for (const t of ['combat', 'elite', 'boss', 'shop', 'rest', 'treasure']) { + if (!/^[0-9a-f]{32}$/.test((NODEICONS.icons || {})[t] || '')) throw new Error(`[gen-slaydeck] nodeicons.json icons.${t} RUID 누락/형식오류`); +} +if (!/^[0-9a-f]{32}$/.test(NODEICONS.background || '')) throw new Error('[gen-slaydeck] nodeicons.json background RUID 누락/형식오류'); + const RELICS = JSON.parse(readFileSync('data/relics.json', 'utf8')); if (!RELICS.relics[RELICS.startingRelic]) throw new Error(`[gen-slaydeck] startingRelic 없음: ${RELICS.startingRelic}`); for (const id of RELICS.relicPool) { @@ -2852,6 +2863,7 @@ function writeCodeblocks() { prop('boolean', 'DeckAllOpen', 'false'), prop('any', 'Cards'), prop('any', 'CardFrames'), + prop('any', 'NodeIcons'), prop('any', 'ClassToFrame'), prop('number', 'PlayerHp', '0'), prop('number', 'PlayerMaxHp', '80'), @@ -2904,6 +2916,7 @@ function writeCodeblocks() { ], [ method('OnBeginPlay', `${luaCardsTable(CARDS.cards)} ${luaFramesTable()} +${luaNodeIconsTable()} ${luaSoulShopTable(SOUL_UNLOCKS)} self.SoulUnlocks = {} self.SoulPoints = self.SoulPoints or 0 @@ -3359,6 +3372,7 @@ self.CurrentEnemyId = "" self.PlayerJob = "" ${luaJobsTable(JOBS)} ${luaFramesTable()} +${luaNodeIconsTable()} self:GenerateMap() self:BindButtons() self:AddRelic("${RELICS.startingRelic}")