From d1f894a802b4977169f3d86e9ca41e380c201250 Mon Sep 17 00:00:00 2001 From: gahusb Date: Thu, 11 Jun 2026 01:53:36 +0900 Subject: [PATCH] =?UTF-8?q?feat(combat-ui):=20=EC=83=81=EB=8B=A8=20TopBar?= =?UTF-8?q?=20(=EB=A7=89=C2=B7=EA=B3=A8=EB=93=9C=C2=B7=EC=9C=A0=EB=AC=BC?= =?UTF-8?q?=C2=B7=EB=AA=A8=EB=93=A0=EB=8D=B1=EB=B3=B4=EA=B8=B0=20=ED=86=B5?= =?UTF-8?q?=ED=95=A9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- tools/deck/gen-slaydeck.mjs | 87 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 45 deletions(-) diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index 8853f35..a287fae 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -571,21 +571,6 @@ function upsertUi() { ], })); - add(entity({ - id: guid('hud', hud.length), - path: '/ui/DefaultGroup/DeckHud/AllDeckButton', - modelId: 'uibutton', - entryId: 'UIButton', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent', - displayOrder: 4, - components: [ - transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 188, y: 58 }, pos: { x: 470, y: 135 }, align: ALIGN_CENTER }), - sprite({ color: DARK, type: 1, raycast: true }), - button(), - text({ value: '모든덱보기', fontSize: 23, bold: true, color: GOLD, alignment: 0 }), - ], - })); - emit('DeckHud', hud); const inspect = []; @@ -944,35 +929,47 @@ function upsertUi() { ], })); } - for (const [suffix, pos, value, color] of [ - ['Floor', { x: -820, y: 480 }, '층 1/3', GOLD], - ['Gold', { x: 820, y: 480 }, '골드 0', { r: 0.98, g: 0.85, b: 0.4, a: 1 }], - ]) { - combat.push(entity({ - id: guid('cmb', cmbN++), - path: `/ui/DefaultGroup/CombatHud/${suffix}`, - modelId: 'uitext', - entryId: 'UIText', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 9, - components: [ - transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 240, y: 44 }, pos }), - sprite({ color: TRANSPARENT }), - text({ value, fontSize: 26, bold: true, color, alignment: 4 }), - ], - })); - } combat.push(entity({ - id: guid('cmb', cmbN++), - path: '/ui/DefaultGroup/CombatHud/Relics', - modelId: 'uitext', - entryId: 'UIText', - componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + id: guid('cmb', 200), + path: '/ui/DefaultGroup/CombatHud/TopBar', + modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', displayOrder: 9, components: [ - transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1000, y: 40 }, pos: { x: 0, y: 430 } }), - sprite({ color: TRANSPARENT }), - text({ value: '유물: 없음', fontSize: 22, bold: true, color: { r: 0.8, g: 0.7, b: 0.95, a: 1 }, alignment: 4 }), + transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 1200, y: 52 }, pos: { x: 0, y: 486 }, align: ALIGN_CENTER }), + sprite({ color: { r: 0.06, g: 0.07, b: 0.1, a: 0.82 }, type: 1 }), + ], + })); + const topTexts = [ + ['Floor', -520, 160, '막 1/3', GOLD], + ['Gold', -360, 160, '골드 0', { r: 0.98, g: 0.85, b: 0.4, a: 1 }], + ['Relics', 60, 560, '유물: 없음', { r: 0.8, g: 0.7, b: 0.95, a: 1 }], + ]; + topTexts.forEach(([suffix, x, w, value, color], ti) => { + combat.push(entity({ + id: guid('cmb', 201 + ti), + path: `/ui/DefaultGroup/CombatHud/TopBar/${suffix}`, + modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: ti, + components: [ + transform({ parentW: 1200, parentH: 52, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: w, y: 40 }, pos: { x: x, y: 0 } }), + sprite({ color: TRANSPARENT }), + text({ value, fontSize: suffix === 'Relics' ? 18 : 22, bold: true, color, alignment: 4 }), + ], + })); + }); + combat.push(entity({ + id: guid('cmb', 205), + path: '/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton', + modelId: 'uibutton', entryId: 'UIButton', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent', + displayOrder: 3, + components: [ + transform({ parentW: 1200, parentH: 52, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 150, y: 40 }, pos: { x: 510, y: 0 } }), + sprite({ color: DARK, type: 1, raycast: true }), + button(), + text({ value: '모든덱보기', fontSize: 18, bold: true, color: GOLD, alignment: 0 }), ], })); const result = entity({ @@ -1887,7 +1884,7 @@ if inspectClose ~= nil and inspectClose.ButtonComponent ~= nil then end self.DeckInspectCloseHandler = inspectClose:ConnectEvent(ButtonClickEvent, function() self:CloseDeckInspect() end) end -local allDeckButton = _EntityService:GetEntityByPath("/ui/DefaultGroup/DeckHud/AllDeckButton") +local allDeckButton = _EntityService:GetEntityByPath("/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton") if allDeckButton ~= nil and allDeckButton.ButtonComponent ~= nil then if self.AllDeckHandler ~= nil then allDeckButton:DisconnectEvent(ButtonClickEvent, self.AllDeckHandler) @@ -2392,8 +2389,8 @@ end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], N self.TargetIndex = slot self:RenderCombat() end`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]), - method('RenderRun', `self:SetText("/ui/DefaultGroup/CombatHud/Floor", "막 " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength)) -self:SetText("/ui/DefaultGroup/CombatHud/Gold", "골드 " .. string.format("%d", self.Gold))`), + method('RenderRun', `self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Floor", "막 " .. string.format("%d", self.Floor) .. "/" .. string.format("%d", self.RunLength)) +self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Gold", "골드 " .. string.format("%d", self.Gold))`), method('OfferReward', `local pool = {} for id, _ in pairs(self.Cards) do table.insert(pool, id) @@ -2483,7 +2480,7 @@ end if names == "" then names = "없음" end -self:SetText("/ui/DefaultGroup/CombatHud/Relics", "유물: " .. names)`), +self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Relics", "유물: " .. names)`), method('ShowMap', `self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", false) self:SetEntityEnabled("/ui/DefaultGroup/CardHand", false) self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", false)