feat(node-map): MapHud 배경 이미지+오버레이, 노드 아이콘화(라벨 제거·확대), RenderMapNode ImageRUID+상태 틴트

타입별 공식 아이콘(주황버섯/골렘/발록/돈주머니/모닥불/상자) + 리스항구 배경. 절차 배치·간선·바인딩 불변.
This commit is contained in:
2026-06-15 14:26:28 +09:00
parent 3902c9b1ee
commit 5b41eb78a4
3 changed files with 2553 additions and 7129 deletions

File diff suppressed because one or more lines are too long

View File

@@ -1681,18 +1681,31 @@ function upsertUi() {
displayOrder: 7, displayOrder: 7,
components: [ components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1920, y: 1080 }, pos: { x: 0, y: 0 }, align: ALIGN_CENTER }), transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1920, y: 1080 }, pos: { x: 0, y: 0 }, align: ALIGN_CENTER }),
sprite({ color: { r: 0.05, g: 0.06, b: 0.09, a: 0.9 }, type: 1, raycast: true }), sprite({ dataId: NODEICONS.background, color: { r: 1, g: 1, b: 1, a: 1 }, type: 0, raycast: false }),
], ],
}); });
mapHud.jsonString.enable = false; mapHud.jsonString.enable = false;
map.push(mapHud); map.push(mapHud);
// 배경 위 반투명 어두운 오버레이(노드 가독성). displayOrder 0 = 도트(1)·타이틀(2)·노드(5) 아래.
map.push(entity({
id: guid('map', 990),
path: '/ui/DefaultGroup/MapHud/Overlay',
modelId: 'uisprite',
entryId: 'UISprite',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent',
displayOrder: 0,
components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1920, y: 1080 }, pos: { x: 0, y: 0 }, align: ALIGN_CENTER }),
sprite({ color: { r: 0.04, g: 0.05, b: 0.09, a: 0.5 }, type: 1, raycast: true }),
],
}));
map.push(entity({ map.push(entity({
id: guid('map', 1), id: guid('map', 1),
path: '/ui/DefaultGroup/MapHud/Title', path: '/ui/DefaultGroup/MapHud/Title',
modelId: 'uitext', modelId: 'uitext',
entryId: 'UIText', entryId: 'UIText',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
displayOrder: 0, displayOrder: 2,
components: [ components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 700, y: 60 }, pos: { x: 0, y: 510 } }), transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 700, y: 60 }, pos: { x: 0, y: 510 } }),
sprite({ color: TRANSPARENT }), sprite({ color: TRANSPARENT }),
@@ -1715,32 +1728,19 @@ function upsertUi() {
displayOrder: 5, displayOrder: 5,
components: [ components: [
transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size, pos }), transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size, pos }),
sprite({ color: { r: 0.2, g: 0.22, b: 0.26, a: 1 }, type: 1, raycast: true }), sprite({ color: { r: 1, g: 1, b: 1, a: 1 }, type: 0, raycast: true }),
button(), button(),
], ],
}); });
nodeEnt.jsonString.enable = false; nodeEnt.jsonString.enable = false;
map.push(nodeEnt); map.push(nodeEnt);
map.push(entity({
id: guid('map', mapN++),
path: `${nodePath}/Label`,
modelId: 'uitext',
entryId: 'UIText',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
displayOrder: 0,
components: [
transform({ parentW: size.x, parentH: size.y, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: size.x + 20, y: 30 }, pos: { x: 0, y: 0 } }),
sprite({ color: TRANSPARENT }),
text({ value: label, fontSize: id === 'boss' ? 18 : 15, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }),
],
}));
}; };
for (let r = 1; r <= MAP_ROWS; r++) { for (let r = 1; r <= MAP_ROWS; r++) {
for (let c = 1; c <= MAP_COLS; c++) { for (let c = 1; c <= MAP_COLS; c++) {
pushMapNode(`r${r}c${c}`, { x: nodeX(r), y: nodeY(c) }, { x: 56, y: 56 }, ''); pushMapNode(`r${r}c${c}`, { x: nodeX(r), y: nodeY(c) }, { x: 64, y: 64 }, '');
} }
} }
pushMapNode('boss', BOSS_POS, { x: 72, y: 72 }, '보스'); pushMapNode('boss', BOSS_POS, { x: 88, y: 88 }, '보스');
const pushDots = (dotId, from, to) => { const pushDots = (dotId, from, to) => {
for (let k = 1; k <= 3; k++) { for (let k = 1; k <= 3; k++) {
const t = k / 4; const t = k / 4;
@@ -5637,37 +5637,13 @@ if node == nil then
return return
end end
e.Enable = true e.Enable = true
local tname = "전투" local ruid = self.NodeIcons[node.type]
local r0 = 0.78 if ruid == nil then
local g0 = 0.36 ruid = self.NodeIcons["combat"]
local b0 = 0.32 end
if node.type == "elite" then if e.SpriteGUIRendererComponent ~= nil and ruid ~= nil then
tname = "엘리트" e.SpriteGUIRendererComponent.ImageRUID = ruid
r0 = 0.62
g0 = 0.4
b0 = 0.85
elseif node.type == "shop" then
tname = "상점"
r0 = 0.9
g0 = 0.75
b0 = 0.35
elseif node.type == "rest" then
tname = "휴식"
r0 = 0.4
g0 = 0.75
b0 = 0.45
elseif node.type == "treasure" then
tname = "보물"
r0 = 0.35
g0 = 0.7
b0 = 0.75
elseif node.type == "boss" then
tname = "보스"
r0 = 0.85
g0 = 0.25
b0 = 0.25
end end
self:SetText(base .. "/Label", tname)
local reachable = self:IsReachable(id) local reachable = self:IsReachable(id)
local visited = false local visited = false
if self.VisitedNodes ~= nil then if self.VisitedNodes ~= nil then
@@ -5677,13 +5653,13 @@ if self.VisitedNodes ~= nil then
end end
if e.SpriteGUIRendererComponent ~= nil then if e.SpriteGUIRendererComponent ~= nil then
if id == self.CurrentNodeId then if id == self.CurrentNodeId then
e.SpriteGUIRendererComponent.Color = Color(0.95, 0.8, 0.3, 1) e.SpriteGUIRendererComponent.Color = Color(1, 0.82, 0.3, 1)
elseif visited == true then elseif visited == true then
e.SpriteGUIRendererComponent.Color = Color(0.18, 0.19, 0.22, 0.9) e.SpriteGUIRendererComponent.Color = Color(0.5, 0.5, 0.55, 0.9)
elseif reachable == true then elseif reachable == true then
e.SpriteGUIRendererComponent.Color = Color(r0, g0, b0, 1) e.SpriteGUIRendererComponent.Color = Color(1, 1, 1, 1)
else else
e.SpriteGUIRendererComponent.Color = Color(r0 * 0.45, g0 * 0.45, b0 * 0.45, 0.55) e.SpriteGUIRendererComponent.Color = Color(0.4, 0.4, 0.45, 0.45)
end end
end end
if e.ButtonComponent ~= nil then if e.ButtonComponent ~= nil then

File diff suppressed because it is too large Load Diff