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,
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.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;
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({
id: guid('map', 1),
path: '/ui/DefaultGroup/MapHud/Title',
modelId: 'uitext',
entryId: 'UIText',
componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent',
displayOrder: 0,
displayOrder: 2,
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 } }),
sprite({ color: TRANSPARENT }),
@@ -1715,32 +1728,19 @@ function upsertUi() {
displayOrder: 5,
components: [
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(),
],
});
nodeEnt.jsonString.enable = false;
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 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) => {
for (let k = 1; k <= 3; k++) {
const t = k / 4;
@@ -5637,37 +5637,13 @@ if node == nil then
return
end
e.Enable = true
local tname = "전투"
local r0 = 0.78
local g0 = 0.36
local b0 = 0.32
if node.type == "elite" then
tname = "엘리트"
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
local ruid = self.NodeIcons[node.type]
if ruid == nil then
ruid = self.NodeIcons["combat"]
end
if e.SpriteGUIRendererComponent ~= nil and ruid ~= nil then
e.SpriteGUIRendererComponent.ImageRUID = ruid
end
self:SetText(base .. "/Label", tname)
local reachable = self:IsReachable(id)
local visited = false
if self.VisitedNodes ~= nil then
@@ -5677,13 +5653,13 @@ if self.VisitedNodes ~= nil then
end
if e.SpriteGUIRendererComponent ~= nil 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
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
e.SpriteGUIRendererComponent.Color = Color(r0, g0, b0, 1)
e.SpriteGUIRendererComponent.Color = Color(1, 1, 1, 1)
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
if e.ButtonComponent ~= nil then

File diff suppressed because it is too large Load Diff