diff --git a/RootDesk/MyDesk/SlayDeckController.codeblock b/RootDesk/MyDesk/SlayDeckController.codeblock index cfde1d9..451f364 100644 --- a/RootDesk/MyDesk/SlayDeckController.codeblock +++ b/RootDesk/MyDesk/SlayDeckController.codeblock @@ -370,12 +370,35 @@ "Name": null }, "Arguments": [], - "Code": "self:SetEntityEnabled(\"/ui/DefaultGroup/Button_Attack\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/Button_Jump\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/UIJoystick\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/RewardHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/MapHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/ShopHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/RestHud\", false)", + "Code": "self:SetEntityEnabled(\"/ui/DefaultGroup/Button_Attack\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/Button_Jump\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/UIJoystick\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/RewardHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/MapHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/ShopHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/RestHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckInspectHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckAllHud\", false)", "Scope": 2, "ExecSpace": 6, "Attributes": [], "Name": "HideGameHud" }, + { + "Return": { + "Type": "void", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": null + }, + "Arguments": [ + { + "Type": "string", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "state" + } + ], + "Code": "self:HideGameHud()\nself:SetEntityEnabled(\"/ui/DefaultGroup/MainMenu\", state == \"menu\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/CharacterSelectHud\", state == \"charselect\")\nif state == \"map\" then\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/MapHud\", true)\nelseif state == \"combat\" then\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud\", true)\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", true)\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", true)\nelseif state == \"shop\" then\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/ShopHud\", true)\nelseif state == \"rest\" then\n\tself:SetEntityEnabled(\"/ui/DefaultGroup/RestHud\", true)\nend", + "Scope": 2, + "ExecSpace": 6, + "Attributes": [], + "Name": "ShowState" + }, { "Return": { "Type": "void", @@ -385,7 +408,7 @@ "Name": null }, "Arguments": [], - "Code": "self.SelectedClass = \"\"\nself:HideGameHud()\nself:SetEntityEnabled(\"/ui/DefaultGroup/MainMenu\", true)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CharacterSelectHud\", false)\nself:SetText(\"/ui/DefaultGroup/MainMenu/Title\", \"메이플 덱 어드벤처\")\nself:SetText(\"/ui/DefaultGroup/MainMenu/Subtitle\", \"캐릭터를 고르고 덱을 만들어 모험을 시작하세요\")\nself:SetText(\"/ui/DefaultGroup/MainMenu/NewGameButton\", \"새 게임\")\nself:BindMenuButtons()", + "Code": "self.SelectedClass = \"\"\nself:ShowState(\"menu\")\nself:SetText(\"/ui/DefaultGroup/MainMenu/Title\", \"메이플 덱 어드벤처\")\nself:SetText(\"/ui/DefaultGroup/MainMenu/Subtitle\", \"캐릭터를 고르고 덱을 만들어 모험을 시작하세요\")\nself:SetText(\"/ui/DefaultGroup/MainMenu/NewGameButton\", \"새 게임\")\nself:BindMenuButtons()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -415,7 +438,7 @@ "Name": null }, "Arguments": [], - "Code": "self.SelectedClass = \"\"\nself:HideGameHud()\nself:SetEntityEnabled(\"/ui/DefaultGroup/MainMenu\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CharacterSelectHud\", true)\nself:RenderCharacterSelect()", + "Code": "self.SelectedClass = \"\"\nself:ShowState(\"charselect\")\nself:RenderCharacterSelect()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -468,7 +491,7 @@ "Name": null }, "Arguments": [], - "Code": "if self.SelectedClass ~= \"warrior\" then\n\tself:SetText(\"/ui/DefaultGroup/CharacterSelectHud/Status\", \"현재는 전사만 선택할 수 있습니다\")\n\treturn\nend\nself:SetEntityEnabled(\"/ui/DefaultGroup/MainMenu\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CharacterSelectHud\", false)\nself:StartRun()", + "Code": "if self.SelectedClass ~= \"warrior\" then\n\tself:SetText(\"/ui/DefaultGroup/CharacterSelectHud/Status\", \"현재는 전사만 선택할 수 있습니다\")\n\treturn\nend\nself:StartRun()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -528,7 +551,7 @@ "Name": null }, "Arguments": [], - "Code": "self:SetEntityEnabled(\"/ui/DefaultGroup/MapHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", true)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", true)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud\", true)\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.CombatOver = false\nself.DiscardPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6 },\n\tDefend = { name = \"방어\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5 },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10 },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()", + "Code": "self:ShowState(\"combat\")\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/Result\", false)\nself.MaxEnergy = 3\nself.Turn = 0\nself.PlayerBlock = 0\nself.CombatOver = false\nself.DiscardPile = {}\nself.Hand = {}\nself.Cards = {\n\tStrike = { name = \"타격\", cost = 1, desc = \"피해 6\", kind = \"Attack\", damage = 6 },\n\tDefend = { name = \"방어\", cost = 1, desc = \"방어도 5\", kind = \"Skill\", block = 5 },\n\tBash = { name = \"강타\", cost = 2, desc = \"피해 10\", kind = \"Attack\", damage = 10 },\n}\nself.DrawPile = {}\nfor i = 1, #self.RunDeck do\n\tself.DrawPile[i] = self.RunDeck[i]\nend\nself:Shuffle(self.DrawPile)\nself:BuildMonsters()\nself:RenderCombat()\nself:StartPlayerTurn()\nself:ApplyRelics(\"combatStart\")\nself:RenderCombat()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -641,7 +664,7 @@ "Name": null }, "Arguments": [], - "Code": "local endTurn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/EndTurnButton\")\nif endTurn ~= nil and endTurn.ButtonComponent ~= nil then\n\tif self.EndTurnHandler ~= nil then\n\t\tendTurn:DisconnectEvent(ButtonClickEvent, self.EndTurnHandler)\n\t\tself.EndTurnHandler = nil\n\tend\n\tself.EndTurnHandler = endTurn:ConnectEvent(ButtonClickEvent, function() self:EndPlayerTurn() end)\nend\nlocal drawPile = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/DrawPile\")\nif drawPile ~= nil and drawPile.ButtonComponent ~= nil then\n\tif self.DrawPileHandler ~= nil then\n\t\tdrawPile:DisconnectEvent(ButtonClickEvent, self.DrawPileHandler)\n\t\tself.DrawPileHandler = nil\n\tend\n\tself.DrawPileHandler = drawPile:ConnectEvent(ButtonClickEvent, function() self:OpenDeckInspect(\"draw\") end)\nend\nlocal discardPile = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/DiscardPile\")\nif discardPile ~= nil and discardPile.ButtonComponent ~= nil then\n\tif self.DiscardPileHandler ~= nil then\n\t\tdiscardPile:DisconnectEvent(ButtonClickEvent, self.DiscardPileHandler)\n\t\tself.DiscardPileHandler = nil\n\tend\n\tself.DiscardPileHandler = discardPile:ConnectEvent(ButtonClickEvent, function() self:OpenDeckInspect(\"discard\") end)\nend\nlocal inspectClose = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckInspectHud/Close\")\nif inspectClose ~= nil and inspectClose.ButtonComponent ~= nil then\n\tif self.DeckInspectCloseHandler ~= nil then\n\t\tinspectClose:DisconnectEvent(ButtonClickEvent, self.DeckInspectCloseHandler)\n\t\tself.DeckInspectCloseHandler = nil\n\tend\n\tself.DeckInspectCloseHandler = inspectClose:ConnectEvent(ButtonClickEvent, function() self:CloseDeckInspect() end)\nend\nlocal allDeckButton = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/AllDeckButton\")\nif allDeckButton ~= nil and allDeckButton.ButtonComponent ~= nil then\n\tif self.AllDeckHandler ~= nil then\n\t\tallDeckButton:DisconnectEvent(ButtonClickEvent, self.AllDeckHandler)\n\t\tself.AllDeckHandler = nil\n\tend\n\tself.AllDeckHandler = allDeckButton:ConnectEvent(ButtonClickEvent, function() self:OpenAllDeck() end)\nend\nlocal allDeckClose = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckAllHud/Close\")\nif allDeckClose ~= nil and allDeckClose.ButtonComponent ~= nil then\n\tif self.AllDeckCloseHandler ~= nil then\n\t\tallDeckClose:DisconnectEvent(ButtonClickEvent, self.AllDeckCloseHandler)\n\t\tself.AllDeckCloseHandler = nil\n\tend\n\tself.AllDeckCloseHandler = allDeckClose:ConnectEvent(ButtonClickEvent, function() self:CloseAllDeck() end)\nend\nfor i = 1, 5 do\n\tlocal cardEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CardHand/Card\" .. tostring(i))\n\tif cardEntity ~= nil and cardEntity.ButtonComponent ~= nil then\n\t\tcardEntity:ConnectEvent(ButtonClickEvent, function() self:PlayCard(i) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal rc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Reward\" .. tostring(i))\n\tif rc ~= nil and rc.ButtonComponent ~= nil then\n\t\trc:ConnectEvent(ButtonClickEvent, function() self:PickReward(i) end)\n\tend\nend\nlocal skip = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Skip\")\nif skip ~= nil and skip.ButtonComponent ~= nil then\n\tskip:ConnectEvent(ButtonClickEvent, function() self:PickReward(0) end)\nend\nlocal mapNodeIds = { \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"BOSS\" }\nfor i = 1, #mapNodeIds do\n\tlocal nid = mapNodeIds[i]\n\tlocal mn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MapHud/Node_\" .. nid)\n\tif mn ~= nil and mn.ButtonComponent ~= nil then\n\t\tmn:ConnectEvent(ButtonClickEvent, function() self:PickNode(nid) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal sc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Card\" .. tostring(i))\n\tif sc ~= nil and sc.ButtonComponent ~= nil then\n\t\tsc:ConnectEvent(ButtonClickEvent, function() self:BuyCard(i) end)\n\tend\nend\nlocal shopLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Leave\")\nif shopLeave ~= nil and shopLeave.ButtonComponent ~= nil then\n\tshopLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nlocal shopRelic = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Relic\")\nif shopRelic ~= nil and shopRelic.ButtonComponent ~= nil then\n\tshopRelic:ConnectEvent(ButtonClickEvent, function() self:BuyRelic() end)\nend\nlocal restLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RestHud/Leave\")\nif restLeave ~= nil and restLeave.ButtonComponent ~= nil then\n\trestLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nfor i = 1, 4 do\n\tlocal ms = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i))\n\tif ms ~= nil and ms.ButtonComponent ~= nil then\n\t\tms:ConnectEvent(ButtonClickEvent, function() self:SetTarget(i) end)\n\tend\nend", + "Code": "local endTurn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/EndTurnButton\")\nif endTurn ~= nil and endTurn.ButtonComponent ~= nil then\n\tif self.EndTurnHandler ~= nil then\n\t\tendTurn:DisconnectEvent(ButtonClickEvent, self.EndTurnHandler)\n\t\tself.EndTurnHandler = nil\n\tend\n\tself.EndTurnHandler = endTurn:ConnectEvent(ButtonClickEvent, function() self:EndPlayerTurn() end)\nend\nlocal drawPile = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/DrawPile\")\nif drawPile ~= nil and drawPile.ButtonComponent ~= nil then\n\tif self.DrawPileHandler ~= nil then\n\t\tdrawPile:DisconnectEvent(ButtonClickEvent, self.DrawPileHandler)\n\t\tself.DrawPileHandler = nil\n\tend\n\tself.DrawPileHandler = drawPile:ConnectEvent(ButtonClickEvent, function() self:OpenDeckInspect(\"draw\") end)\nend\nlocal discardPile = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckHud/DiscardPile\")\nif discardPile ~= nil and discardPile.ButtonComponent ~= nil then\n\tif self.DiscardPileHandler ~= nil then\n\t\tdiscardPile:DisconnectEvent(ButtonClickEvent, self.DiscardPileHandler)\n\t\tself.DiscardPileHandler = nil\n\tend\n\tself.DiscardPileHandler = discardPile:ConnectEvent(ButtonClickEvent, function() self:OpenDeckInspect(\"discard\") end)\nend\nlocal inspectClose = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckInspectHud/Close\")\nif inspectClose ~= nil and inspectClose.ButtonComponent ~= nil then\n\tif self.DeckInspectCloseHandler ~= nil then\n\t\tinspectClose:DisconnectEvent(ButtonClickEvent, self.DeckInspectCloseHandler)\n\t\tself.DeckInspectCloseHandler = nil\n\tend\n\tself.DeckInspectCloseHandler = inspectClose:ConnectEvent(ButtonClickEvent, function() self:CloseDeckInspect() end)\nend\nlocal allDeckButton = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton\")\nif allDeckButton ~= nil and allDeckButton.ButtonComponent ~= nil then\n\tif self.AllDeckHandler ~= nil then\n\t\tallDeckButton:DisconnectEvent(ButtonClickEvent, self.AllDeckHandler)\n\t\tself.AllDeckHandler = nil\n\tend\n\tself.AllDeckHandler = allDeckButton:ConnectEvent(ButtonClickEvent, function() self:OpenAllDeck() end)\nend\nlocal allDeckClose = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckAllHud/Close\")\nif allDeckClose ~= nil and allDeckClose.ButtonComponent ~= nil then\n\tif self.AllDeckCloseHandler ~= nil then\n\t\tallDeckClose:DisconnectEvent(ButtonClickEvent, self.AllDeckCloseHandler)\n\t\tself.AllDeckCloseHandler = nil\n\tend\n\tself.AllDeckCloseHandler = allDeckClose:ConnectEvent(ButtonClickEvent, function() self:CloseAllDeck() end)\nend\nfor i = 1, 5 do\n\tlocal cardEntity = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CardHand/Card\" .. tostring(i))\n\tif cardEntity ~= nil and cardEntity.ButtonComponent ~= nil then\n\t\tcardEntity:ConnectEvent(ButtonClickEvent, function() self:PlayCard(i) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal rc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Reward\" .. tostring(i))\n\tif rc ~= nil and rc.ButtonComponent ~= nil then\n\t\trc:ConnectEvent(ButtonClickEvent, function() self:PickReward(i) end)\n\tend\nend\nlocal skip = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud/Skip\")\nif skip ~= nil and skip.ButtonComponent ~= nil then\n\tskip:ConnectEvent(ButtonClickEvent, function() self:PickReward(0) end)\nend\nlocal mapNodeIds = { \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"BOSS\" }\nfor i = 1, #mapNodeIds do\n\tlocal nid = mapNodeIds[i]\n\tlocal mn = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MapHud/Node_\" .. nid)\n\tif mn ~= nil and mn.ButtonComponent ~= nil then\n\t\tmn:ConnectEvent(ButtonClickEvent, function() self:PickNode(nid) end)\n\tend\nend\nfor i = 1, 3 do\n\tlocal sc = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Card\" .. tostring(i))\n\tif sc ~= nil and sc.ButtonComponent ~= nil then\n\t\tsc:ConnectEvent(ButtonClickEvent, function() self:BuyCard(i) end)\n\tend\nend\nlocal shopLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Leave\")\nif shopLeave ~= nil and shopLeave.ButtonComponent ~= nil then\n\tshopLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nlocal shopRelic = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud/Relic\")\nif shopRelic ~= nil and shopRelic.ButtonComponent ~= nil then\n\tshopRelic:ConnectEvent(ButtonClickEvent, function() self:BuyRelic() end)\nend\nlocal restLeave = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RestHud/Leave\")\nif restLeave ~= nil and restLeave.ButtonComponent ~= nil then\n\trestLeave:ConnectEvent(ButtonClickEvent, function() self:LeaveNode() end)\nend\nfor i = 1, 4 do\n\tlocal ms = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i))\n\tif ms ~= nil and ms.ButtonComponent ~= nil then\n\t\tms:ConnectEvent(ButtonClickEvent, function() self:SetTarget(i) end)\n\tend\nend", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -724,7 +747,7 @@ "Name": null }, "Arguments": [], - "Code": "self:SetText(\"/ui/DefaultGroup/DeckHud/DrawPile/Count\", tostring(#self.DrawPile))\nself:SetText(\"/ui/DefaultGroup/DeckHud/DiscardPile/Count\", tostring(#self.DiscardPile))\nself:SetText(\"/ui/DefaultGroup/DeckHud/Energy\", \"에너지 \" .. string.format(\"%d\", self.Energy) .. \"/\" .. string.format(\"%d\", self.MaxEnergy))\nlocal inspect = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckInspectHud\")\nif inspect ~= nil and inspect.Enable == true and self.DeckInspectKind ~= \"\" then\n\tself:OpenDeckInspect(self.DeckInspectKind)\nend", + "Code": "self:SetText(\"/ui/DefaultGroup/DeckHud/DrawPile/Count\", tostring(#self.DrawPile))\nself:SetText(\"/ui/DefaultGroup/DeckHud/DiscardPile/Count\", tostring(#self.DiscardPile))\nself:SetText(\"/ui/DefaultGroup/DeckHud/EnergyOrb/Value\", string.format(\"%d\", self.Energy) .. \"/\" .. string.format(\"%d\", self.MaxEnergy))\nlocal inspect = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/DeckInspectHud\")\nif inspect ~= nil and inspect.Enable == true and self.DeckInspectKind ~= \"\" then\n\tself:OpenDeckInspect(self.DeckInspectKind)\nend", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1207,7 +1230,7 @@ "Name": null }, "Arguments": [], - "Code": "for i = 1, 4 do\n\tlocal base = \"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i)\n\tlocal m = self.Monsters[i]\n\tif m ~= nil and m.alive == true then\n\t\tself:SetEntityEnabled(base, true)\n\t\tself:SetText(base .. \"/Name\", m.name)\n\t\tself:SetText(base .. \"/Hp\", string.format(\"%d\", m.hp) .. \"/\" .. string.format(\"%d\", m.maxHp))\n\t\tlocal intent = m.intents[m.intentIdx]\n\t\tlocal t = \"\"\n\t\tif intent ~= nil then\n\t\t\tif intent.kind == \"Attack\" then t = \"공격 \" .. tostring(intent.value)\n\t\t\telseif intent.kind == \"Defend\" then t = \"방어 \" .. tostring(intent.value) end\n\t\tend\n\t\tif i == self.TargetIndex then t = \"[타겟] \" .. t end\n\t\tself:SetText(base .. \"/Intent\", t)\n\t\tself:SetHpBar(base .. \"/HpBarFill\", m.hp, m.maxHp)\n\telse\n\t\tself:SetEntityEnabled(base, false)\n\tend\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerHp\", \"HP \" .. string.format(\"%d\", self.PlayerHp) .. \"/\" .. string.format(\"%d\", self.PlayerMaxHp))\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerBlock\", \"방어 \" .. string.format(\"%d\", self.PlayerBlock))\nself:RenderRun()", + "Code": "for i = 1, 4 do\n\tlocal base = \"/ui/DefaultGroup/CombatHud/MonsterSlot\" .. tostring(i)\n\tlocal m = self.Monsters[i]\n\tif m ~= nil and m.alive == true then\n\t\tself:SetEntityEnabled(base, true)\n\t\tself:SetText(base .. \"/Name\", m.name)\n\t\tself:SetText(base .. \"/Hp\", string.format(\"%d\", m.hp) .. \"/\" .. string.format(\"%d\", m.maxHp))\n\t\tlocal intent = m.intents[m.intentIdx]\n\t\tlocal t = \"\"\n\t\tif intent ~= nil then\n\t\t\tif intent.kind == \"Attack\" then t = \"공격 \" .. tostring(intent.value)\n\t\t\telseif intent.kind == \"Defend\" then t = \"방어 \" .. tostring(intent.value) end\n\t\tend\n\t\tself:SetText(base .. \"/Intent\", t)\n\t\tself:SetEntityEnabled(base .. \"/TargetFrame\", i == self.TargetIndex)\n\t\tlocal intentEntity = _EntityService:GetEntityByPath(base .. \"/Intent\")\n\t\tif intentEntity ~= nil and intentEntity.TextComponent ~= nil and intent ~= nil then\n\t\t\tif intent.kind == \"Attack\" then\n\t\t\t\tintentEntity.TextComponent.FontColor = Color(1, 0.45, 0.35, 1)\n\t\t\telse\n\t\t\t\tintentEntity.TextComponent.FontColor = Color(0.5, 0.75, 1, 1)\n\t\t\tend\n\t\tend\n\t\tself:SetHpBar(base .. \"/HpBarFill\", m.hp, m.maxHp, 140)\n\telse\n\t\tself:SetEntityEnabled(base, false)\n\tend\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerPanel/HpText\", string.format(\"%d\", self.PlayerHp) .. \"/\" .. string.format(\"%d\", self.PlayerMaxHp))\nself:SetHpBar(\"/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill\", self.PlayerHp, self.PlayerMaxHp, 220)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge\", self.PlayerBlock > 0)\nself:SetText(\"/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge/Value\", string.format(\"%d\", self.PlayerBlock))\nself:RenderRun()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1242,9 +1265,16 @@ "SyncDirection": 0, "Attributes": [], "Name": "maxHp" + }, + { + "Type": "number", + "DefaultValue": null, + "SyncDirection": 0, + "Attributes": [], + "Name": "width" } ], - "Code": "local e = _EntityService:GetEntityByPath(path)\nif e == nil or e.UITransformComponent == nil then\n\treturn\nend\nlocal ratio = 0\nif maxHp > 0 then ratio = hp / maxHp end\nif ratio < 0 then ratio = 0 end\nlocal w = 120 * ratio\ne.UITransformComponent.RectSize = Vector2(w, 14)", + "Code": "local e = _EntityService:GetEntityByPath(path)\nif e == nil or e.UITransformComponent == nil then\n\treturn\nend\nlocal ratio = 0\nif maxHp > 0 then ratio = hp / maxHp end\nif ratio < 0 then ratio = 0 end\nlocal w = width * ratio\ne.UITransformComponent.RectSize = Vector2(w, 14)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1305,7 +1335,7 @@ "Name": null }, "Arguments": [], - "Code": "self:SetText(\"/ui/DefaultGroup/CombatHud/Floor\", \"막 \" .. string.format(\"%d\", self.Floor) .. \"/\" .. string.format(\"%d\", self.RunLength))\nself:SetText(\"/ui/DefaultGroup/CombatHud/Gold\", \"골드 \" .. string.format(\"%d\", self.Gold))", + "Code": "self:SetText(\"/ui/DefaultGroup/CombatHud/TopBar/Floor\", \"막 \" .. string.format(\"%d\", self.Floor) .. \"/\" .. string.format(\"%d\", self.RunLength))\nself:SetText(\"/ui/DefaultGroup/CombatHud/TopBar/Gold\", \"골드 \" .. string.format(\"%d\", self.Gold))", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1320,7 +1350,7 @@ "Name": null }, "Arguments": [], - "Code": "local pool = {}\nfor id, _ in pairs(self.Cards) do\n\ttable.insert(pool, id)\nend\nself.RewardChoices = {}\nfor i = 1, 3 do\n\tself.RewardChoices[i] = pool[math.random(1, #pool)]\n\tself:ApplyRewardVisual(i, self.RewardChoices[i])\nend\nlocal hud = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud\")\nif hud ~= nil then\n\thud.Enable = true\nend", + "Code": "self:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", false)\nlocal pool = {}\nfor id, _ in pairs(self.Cards) do\n\ttable.insert(pool, id)\nend\nself.RewardChoices = {}\nfor i = 1, 3 do\n\tself.RewardChoices[i] = pool[math.random(1, #pool)]\n\tself:ApplyRewardVisual(i, self.RewardChoices[i])\nend\nlocal hud = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RewardHud\")\nif hud ~= nil then\n\thud.Enable = true\nend", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1434,7 +1464,7 @@ "Name": null }, "Arguments": [], - "Code": "local names = \"\"\nif self.RunRelics ~= nil then\n\tfor i = 1, #self.RunRelics do\n\t\tlocal r = self.Relics[self.RunRelics[i]]\n\t\tif r ~= nil then\n\t\t\tif names == \"\" then\n\t\t\t\tnames = r.name\n\t\t\telse\n\t\t\t\tnames = names .. \", \" .. r.name\n\t\t\tend\n\t\tend\n\tend\nend\nif names == \"\" then\n\tnames = \"없음\"\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/Relics\", \"유물: \" .. names)", + "Code": "local names = \"\"\nif self.RunRelics ~= nil then\n\tfor i = 1, #self.RunRelics do\n\t\tlocal r = self.Relics[self.RunRelics[i]]\n\t\tif r ~= nil then\n\t\t\tif names == \"\" then\n\t\t\t\tnames = r.name\n\t\t\telse\n\t\t\t\tnames = names .. \", \" .. r.name\n\t\t\tend\n\t\tend\n\tend\nend\nif names == \"\" then\n\tnames = \"없음\"\nend\nself:SetText(\"/ui/DefaultGroup/CombatHud/TopBar/Relics\", \"유물: \" .. names)", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1449,7 +1479,7 @@ "Name": null }, "Arguments": [], - "Code": "self:SetEntityEnabled(\"/ui/DefaultGroup/DeckHud\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CardHand\", false)\nself:SetEntityEnabled(\"/ui/DefaultGroup/CombatHud\", false)\nself:RenderMap()\nlocal hud = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/MapHud\")\nif hud ~= nil then\n\thud.Enable = true\nend", + "Code": "self:ShowState(\"map\")\nself:RenderMap()", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1525,7 +1555,7 @@ "Name": null }, "Arguments": [], - "Code": "local pool = {}\nfor cid, _ in pairs(self.Cards) do\n\ttable.insert(pool, cid)\nend\nself.ShopChoices = {}\nself.ShopBought = { false, false, false }\nfor i = 1, 3 do\n\tself.ShopChoices[i] = pool[math.random(1, #pool)]\nend\nself.ShopRelic = self.RelicPool[math.random(1, #self.RelicPool)]\nself.ShopRelicBought = false\nself:RenderShop()\nlocal hud = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/ShopHud\")\nif hud ~= nil then\n\thud.Enable = true\nend", + "Code": "local pool = {}\nfor cid, _ in pairs(self.Cards) do\n\ttable.insert(pool, cid)\nend\nself.ShopChoices = {}\nself.ShopBought = { false, false, false }\nfor i = 1, 3 do\n\tself.ShopChoices[i] = pool[math.random(1, #pool)]\nend\nself.ShopRelic = self.RelicPool[math.random(1, #self.RelicPool)]\nself.ShopRelicBought = false\nself:RenderShop()\nself:ShowState(\"shop\")", "Scope": 2, "ExecSpace": 6, "Attributes": [], @@ -1593,7 +1623,7 @@ "Name": null }, "Arguments": [], - "Code": "local old = self.PlayerHp\nself.PlayerHp = self.PlayerHp + 30\nif self.PlayerHp > self.PlayerMaxHp then\n\tself.PlayerHp = self.PlayerMaxHp\nend\nlocal healed = self.PlayerHp - old\nself:SetText(\"/ui/DefaultGroup/RestHud/Info\", \"HP \" .. string.format(\"%d\", old) .. \" → \" .. string.format(\"%d\", self.PlayerHp) .. \" (+\" .. string.format(\"%d\", healed) .. \")\")\nself:RenderCombat()\nlocal hud = _EntityService:GetEntityByPath(\"/ui/DefaultGroup/RestHud\")\nif hud ~= nil then\n\thud.Enable = true\nend", + "Code": "local old = self.PlayerHp\nself.PlayerHp = self.PlayerHp + 30\nif self.PlayerHp > self.PlayerMaxHp then\n\tself.PlayerHp = self.PlayerMaxHp\nend\nlocal healed = self.PlayerHp - old\nself:SetText(\"/ui/DefaultGroup/RestHud/Info\", \"HP \" .. string.format(\"%d\", old) .. \" → \" .. string.format(\"%d\", self.PlayerHp) .. \" (+\" .. string.format(\"%d\", healed) .. \")\")\nself:RenderCombat()\nself:ShowState(\"rest\")", "Scope": 2, "ExecSpace": 6, "Attributes": [], diff --git a/docs/superpowers/plans/2026-06-11-combat-ui-overhaul.md b/docs/superpowers/plans/2026-06-11-combat-ui-overhaul.md new file mode 100644 index 0000000..3768631 --- /dev/null +++ b/docs/superpowers/plans/2026-06-11-combat-ui-overhaul.md @@ -0,0 +1,462 @@ +# 전투 화면 UI/HUD 전면 정비 (P1) 구현 계획 + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** 전투 화면을 STS2 배치로 재구성해 UI 겹침 0·시각 위계 확립 (기능 불변, 레이아웃·표시 로직만). + +**Architecture:** 모든 UI/컨트롤러는 `tools/deck/gen-slaydeck.mjs` 단일 소스에서 생성(직접 편집 금지, 루트에서 `node tools/deck/gen-slaydeck.mjs`). UI 엔티티는 `upsertUi()`의 `entity()/transform()/sprite()/text()/button()` 헬퍼, 컨트롤러 Lua는 `method(Name, Code, Args?)` 템플릿 문자열(`${...}`=JS 보간). 좌표계: 부모 중심 원점, anchoredPosition. + +**Tech Stack:** Node.js ESM 생성기, MSW Lua codeblock, JSON 산출물. + +--- + +## 배경 (구현자용) + +- 화면 1920×1080 중심좌표(±960, ±540). `DeckHud`=하단 1280×330(y180 bottom-center), `CardHand`=카드 5장(y180), `CombatHud`=전체 1920×1080. +- 확인된 겹침: `DeckHud/EndTurnButton`(0,135,170×58) ↔ `DeckHud/Energy`(0,90,220×42) 5px; `AllDeckButton`(470,135)이 버린덱(590,8,132×186)과 5px 간격. +- 기존 가시성: `HideGameHud`(전투 HUD 일괄 off)가 이미 존재(사용자 PR) — ShowState는 이를 재사용해 확장. +- guid 네임스페이스: `guid('cmb', N)` — 기존 사용 대역: 0~10(순차 cmbN), 41~144(슬롯 6종×4). **신규는 200+ 사용**(TopBar 200~209, PlayerPanel 210~219, TargetFrame 221~224). +- 생성기 실행 검증은 매 Task: `node --check` + `node tools/deck/gen-slaydeck.mjs` 성공 + 해당 확인 스크립트. 산출물 커밋은 Task 6에서 일괄(중간 Task는 소스만 커밋하고 산출물은 `git checkout -- ui/DefaultGroup.ui Global/common.gamelogic RootDesk/MyDesk/SlayDeckController.codeblock`로 복원). + +## 파일 구조 +| 파일 | 책임 | +|---|---| +| `tools/deck/gen-slaydeck.mjs` | 전 변경(UI 좌표·신규 엔티티·컨트롤러 표시 로직) | +| 산출물 3종 | Task 6에서 재생성·커밋 | + +--- + +## Task 1: 하단 HUD — 에너지 오브(좌)·턴 종료(우) + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1: Energy 텍스트 엔티티를 EnergyOrb 패널로 교체** + +`upsertUi()`에서 `path: '/ui/DefaultGroup/DeckHud/Energy'` 엔티티 push 블록(`add(entity({ ... '에너지 3/3' ... }))`) 전체를 삭제하고, 그 자리에: +```js + add(entity({ + id: guid('hud', hud.length), + path: '/ui/DefaultGroup/DeckHud/EnergyOrb', + modelId: 'uisprite', + entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 3, + components: [ + transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 96, y: 96 }, pos: { x: -560, y: 130 }, align: ALIGN_CENTER }), + sprite({ color: { r: 0.12, g: 0.2, b: 0.34, a: 0.95 }, type: 1 }), + ], + })); + add(entity({ + id: guid('hud', hud.length), + path: '/ui/DefaultGroup/DeckHud/EnergyOrb/Value', + modelId: 'uitext', + entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 0, + components: [ + transform({ parentW: 96, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 92, y: 48 }, pos: { x: 0, y: 6 } }), + sprite({ color: TRANSPARENT }), + text({ value: '3/3', fontSize: 34, bold: true, color: { r: 0.65, g: 0.92, b: 1, a: 1 }, alignment: 4 }), + ], + })); + add(entity({ + id: guid('hud', hud.length), + path: '/ui/DefaultGroup/DeckHud/EnergyOrb/Label', + modelId: 'uitext', + entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 1, + components: [ + transform({ parentW: 96, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 92, y: 24 }, pos: { x: 0, y: -28 } }), + sprite({ color: TRANSPARENT }), + text({ value: '에너지', fontSize: 14, bold: true, color: { r: 0.55, g: 0.7, b: 0.85, a: 1 }, alignment: 4 }), + ], + })); +``` + +- [ ] **Step 2: EndTurnButton 이동·확대** + +`path: '/ui/DefaultGroup/DeckHud/EndTurnButton'` 엔티티의 transform 줄을 +```js + transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 200, y: 64 }, pos: { x: 560, y: 130 }, align: ALIGN_CENTER }), +``` +로 교체하고, 같은 엔티티의 `text({ value: '턴 종료', fontSize: 25, ...` 를 `fontSize: 28,` 로. + +- [ ] **Step 3: RenderPiles 에너지 경로/포맷 갱신** + +`method('RenderPiles', ...)` 안의 +``` +self:SetText("/ui/DefaultGroup/DeckHud/Energy", "에너지 " .. string.format("%d", self.Energy) .. "/" .. string.format("%d", self.MaxEnergy)) +``` +를 +``` +self:SetText("/ui/DefaultGroup/DeckHud/EnergyOrb/Value", string.format("%d", self.Energy) .. "/" .. string.format("%d", self.MaxEnergy)) +``` +로 교체. + +- [ ] **Step 4: 검증** — `node --check tools/deck/gen-slaydeck.mjs` 후 실행: +`node tools/deck/gen-slaydeck.mjs && node -e "const ui=JSON.parse(require('fs').readFileSync('ui/DefaultGroup.ui','utf8'));const p=ui.ContentProto.Entities.map(e=>e.path);console.log('orb:',p.includes('/ui/DefaultGroup/DeckHud/EnergyOrb'),'| oldEnergy gone:',!p.includes('/ui/DefaultGroup/DeckHud/Energy'))"` +Expected: `orb: true | oldEnergy gone: true`. 그 후 산출물 복원: `git checkout -- ui/DefaultGroup.ui Global/common.gamelogic RootDesk/MyDesk/SlayDeckController.codeblock` + +- [ ] **Step 5: Commit** — `git add tools/deck/gen-slaydeck.mjs && git commit -m "feat(combat-ui): 에너지 오브(좌)·턴 종료 버튼(우) 재배치"` + +--- + +## Task 2: 상단 TopBar (막·골드·유물·모든덱보기 통합) + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1: 기존 Floor/Gold/Relics 엔티티 제거** + +`upsertUi()` CombatHud 빌드에서 `['Floor', { x: -820, y: 480 }, ...]`/`['Gold', { x: 820, y: 480 }, ...]` 루프 블록과 `path: '/ui/DefaultGroup/CombatHud/Relics'` push 블록을 삭제. + +- [ ] **Step 2: DeckHud의 AllDeckButton 엔티티 제거** + +`path: '/ui/DefaultGroup/DeckHud/AllDeckButton'` push 블록(레이블 텍스트 포함 엔티티 1개) 삭제. + +- [ ] **Step 3: CombatHud에 TopBar 추가** (Result push 이전 위치에): +```js + combat.push(entity({ + 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: 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 }), + ], + })); +``` + +- [ ] **Step 4: 컨트롤러 경로 갱신** (정확 치환 3건) +- `RenderRun`: `"/ui/DefaultGroup/CombatHud/Floor"` → `"/ui/DefaultGroup/CombatHud/TopBar/Floor"`, `"/ui/DefaultGroup/CombatHud/Gold"` → `"/ui/DefaultGroup/CombatHud/TopBar/Gold"` +- `RenderRelics`(끝부분 SetText): `"/ui/DefaultGroup/CombatHud/Relics"` → `"/ui/DefaultGroup/CombatHud/TopBar/Relics"` +- `BindButtons`: `"/ui/DefaultGroup/DeckHud/AllDeckButton"` → `"/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton"` + +- [ ] **Step 5: 검증** — `node --check` 후 실행: +`node tools/deck/gen-slaydeck.mjs && node -e "const fs=require('fs');const ui=JSON.parse(fs.readFileSync('ui/DefaultGroup.ui','utf8'));const p=ui.ContentProto.Entities.map(e=>e.path);console.log('topbar:',['/TopBar','/TopBar/Floor','/TopBar/Gold','/TopBar/Relics','/TopBar/AllDeckButton'].every(s=>p.includes('/ui/DefaultGroup/CombatHud'+s)),'| old gone:',!p.includes('/ui/DefaultGroup/CombatHud/Floor')&&!p.includes('/ui/DefaultGroup/CombatHud/Relics')&&!p.includes('/ui/DefaultGroup/DeckHud/AllDeckButton'));const cb=fs.readFileSync('RootDesk/MyDesk/SlayDeckController.codeblock','utf8');console.log('paths updated:',cb.includes('TopBar/Floor')&&cb.includes('TopBar/Relics')&&cb.includes('TopBar/AllDeckButton')&&!cb.includes('DeckHud/AllDeckButton'))"` +Expected: 모두 true. 산출물 복원(Task 1과 동일 명령). + +- [ ] **Step 6: Commit** — `git add tools/deck/gen-slaydeck.mjs && git commit -m "feat(combat-ui): 상단 TopBar (막·골드·유물·모든덱보기 통합)"` + +--- + +## Task 3: 플레이어 패널 + SetHpBar 폭 인자 + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1: SetHpBar에 width 인자 추가** + +`method('SetHpBar', ...)` 전체를 다음으로 교체: +```js + method('SetHpBar', `local e = _EntityService:GetEntityByPath(path) +if e == nil or e.UITransformComponent == nil then + return +end +local ratio = 0 +if maxHp > 0 then ratio = hp / maxHp end +if ratio < 0 then ratio = 0 end +local w = width * ratio +e.UITransformComponent.RectSize = Vector2(w, 14)`, [ + { Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'path' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hp' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'maxHp' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'width' }, + ]), +``` +그리고 `RenderCombat` 안의 기존 호출 `self:SetHpBar(base .. "/HpBarFill", m.hp, m.maxHp)` 를 `self:SetHpBar(base .. "/HpBarFill", m.hp, m.maxHp, ${HP_BAR_W})` 로 교체. + +- [ ] **Step 2: PlayerBg/PlayerHp/PlayerBlock 엔티티 제거 → PlayerPanel 추가** + +`upsertUi()`에서 `path: '/ui/DefaultGroup/CombatHud/PlayerBg'` push 블록과 `playerTexts` 배열+루프를 삭제하고, 그 자리에: +```js + const PP = '/ui/DefaultGroup/CombatHud/PlayerPanel'; + combat.push(entity({ + id: guid('cmb', 210), path: PP, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 5, + components: [ + transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 300, y: 96 }, pos: { x: -760, y: -480 }, align: ALIGN_CENTER }), + sprite({ color: PANEL_BG, type: 1 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 211), path: `${PP}/Name`, modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 0, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 280, y: 28 }, pos: { x: 0, y: 28 } }), + sprite({ color: TRANSPARENT }), + text({ value: '플레이어', fontSize: 18, bold: true, color: GOLD, alignment: 4 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 212), path: `${PP}/HpBarBg`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 1, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 16 }, pos: { x: 16, y: -6 } }), + sprite({ color: { r: 0.18, g: 0.05, b: 0.06, a: 1 }, type: 1 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 213), path: `${PP}/HpBarFill`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 2, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0, y: 0.5 }, size: { x: 220, y: 16 }, pos: { x: -94, y: -6 } }), + sprite({ color: { r: 0.3, g: 0.78, b: 0.36, a: 1 }, type: 1 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 214), path: `${PP}/HpText`, modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 3, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 24 }, pos: { x: 16, y: -30 } }), + sprite({ color: TRANSPARENT }), + text({ value: '80/80', fontSize: 16, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), + ], + })); + const blockBadge = entity({ + id: guid('cmb', 215), path: `${PP}/BlockBadge`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 4, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 44, y: 40 }, pos: { x: -122, y: -12 } }), + sprite({ color: { r: 0.32, g: 0.5, b: 0.85, a: 1 }, type: 1 }), + ], + }); + blockBadge.jsonString.enable = false; + combat.push(blockBadge); + combat.push(entity({ + id: guid('cmb', 216), path: `${PP}/BlockBadge/Value`, modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 0, + components: [ + transform({ parentW: 44, parentH: 40, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 44, y: 36 }, pos: { x: 0, y: 0 } }), + sprite({ color: TRANSPARENT }), + text({ value: '0', fontSize: 18, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), + ], + })); +``` + +- [ ] **Step 3: RenderCombat 플레이어부 교체** + +`RenderCombat` 끝의 +``` +self:SetText("/ui/DefaultGroup/CombatHud/PlayerHp", "HP " .. string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp)) +self:SetText("/ui/DefaultGroup/CombatHud/PlayerBlock", "방어 " .. string.format("%d", self.PlayerBlock)) +``` +를 +``` +self:SetText("/ui/DefaultGroup/CombatHud/PlayerPanel/HpText", string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp)) +self:SetHpBar("/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill", self.PlayerHp, self.PlayerMaxHp, 220) +self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge", self.PlayerBlock > 0) +self:SetText("/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge/Value", string.format("%d", self.PlayerBlock)) +``` +로 교체. + +- [ ] **Step 4: 검증** — `node --check` 후 실행+확인: +`node tools/deck/gen-slaydeck.mjs && node -e "const fs=require('fs');const ui=JSON.parse(fs.readFileSync('ui/DefaultGroup.ui','utf8'));const p=ui.ContentProto.Entities.map(e=>e.path);console.log('panel:',p.includes('/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill'),'| old gone:',!p.includes('/ui/DefaultGroup/CombatHud/PlayerHp'));const cb=JSON.parse(fs.readFileSync('RootDesk/MyDesk/SlayDeckController.codeblock','utf8'));const m=cb.ContentProto.Json.Methods.find(x=>x.Name==='SetHpBar');console.log('width arg:',m.Arguments.length===4)"` +Expected: 모두 true. 산출물 복원. + +- [ ] **Step 5: Commit** — `git add tools/deck/gen-slaydeck.mjs && git commit -m "feat(combat-ui): 플레이어 패널(HP바·방어 뱃지) + SetHpBar 폭 인자"` + +--- + +## Task 4: 타겟 프레임 + 몬스터 슬롯 가독성 + 의도 색상 + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1: 슬롯 루프에 TargetFrame 추가 + 가독성 조정** + +`upsertUi()` 몬스터 슬롯 루프(`for (let i = 1; i <= MAX_MONSTERS; i++)`)에서: +1. 슬롯 컨테이너 push 직후, Name push 이전에 추가: +```js + const targetFrame = entity({ + id: guid('cmb', 220 + i), path: `${base}/TargetFrame`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 0, + components: [ + transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W + 16, y: SLOT_H + 12 }, pos: { x: 0, y: 0 } }), + sprite({ color: { r: 0.95, g: 0.78, b: 0.25, a: 0.28 }, type: 1 }), + ], + }); + targetFrame.jsonString.enable = false; + combat.push(targetFrame); +``` +2. Name/Hp/HpBarBg/HpBarFill/Intent의 `displayOrder`를 각각 1/2/3/4/5로 +1. +3. Name `fontSize: 20` → `22`, Hp `fontSize: 18` → `20`. +4. 파일 상단 `const HP_BAR_W = 120;` → `const HP_BAR_W = 140;` (몬스터 바 폭 확대 — HpBarBg/Fill·RenderCombat 보간이 모두 이 상수 사용). + +- [ ] **Step 2: RenderCombat 몬스터부 — [타겟] 제거·TargetFrame·의도 색상** + +`RenderCombat`의 몬스터 루프 본문에서 +``` + if i == self.TargetIndex then t = "[타겟] " .. t end + self:SetText(base .. "/Intent", t) +``` +를 +``` + self:SetText(base .. "/Intent", t) + self:SetEntityEnabled(base .. "/TargetFrame", i == self.TargetIndex) + local intentEntity = _EntityService:GetEntityByPath(base .. "/Intent") + if intentEntity ~= nil and intentEntity.TextComponent ~= nil and intent ~= nil then + if intent.kind == "Attack" then + intentEntity.TextComponent.FontColor = Color(1, 0.45, 0.35, 1) + else + intentEntity.TextComponent.FontColor = Color(0.5, 0.75, 1, 1) + end + end +``` +로 교체. + +- [ ] **Step 3: 검증** — `node --check` 후 실행+확인: +`node tools/deck/gen-slaydeck.mjs && node -e "const fs=require('fs');const ui=JSON.parse(fs.readFileSync('ui/DefaultGroup.ui','utf8'));const tf=ui.ContentProto.Entities.filter(e=>e.path.endsWith('/TargetFrame')).length;const cb=fs.readFileSync('RootDesk/MyDesk/SlayDeckController.codeblock','utf8');console.log('frames:',tf,'| no [타겟]:',!cb.includes('[타겟]'),'| color:',cb.includes('FontColor = Color(1, 0.45'))"` +Expected: `frames: 4 | no [타겟]: true | color: true`. 산출물 복원. + +- [ ] **Step 4: Commit** — `git add tools/deck/gen-slaydeck.mjs && git commit -m "feat(combat-ui): 타겟 프레임·몬스터 슬롯 가독성·의도 색상"` + +--- + +## Task 5: ShowState 가시성 통일 + Result 정리 + +**Files:** Modify `tools/deck/gen-slaydeck.mjs` + +- [ ] **Step 1: ShowState 메서드 추가** (`HideGameHud` 메서드 바로 다음에): +```js + method('ShowState', `self:HideGameHud() +self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", state == "menu") +self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", state == "charselect") +if state == "map" then + self:SetEntityEnabled("/ui/DefaultGroup/MapHud", true) +elseif state == "combat" then + self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", true) + self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", true) + self:SetEntityEnabled("/ui/DefaultGroup/CardHand", true) +elseif state == "shop" then + self:SetEntityEnabled("/ui/DefaultGroup/ShopHud", true) +elseif state == "rest" then + self:SetEntityEnabled("/ui/DefaultGroup/RestHud", true) +end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'state' }]), +``` + +- [ ] **Step 2: 호출부 치환** (각각 정확 치환) +1. `ShowMainMenu`: +``` +self:HideGameHud() +self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", true) +self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", false) +``` +→ `self:ShowState("menu")` +2. `ShowCharacterSelect`: +``` +self:HideGameHud() +self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", false) +self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", true) +``` +→ `self:ShowState("charselect")` +3. `StartNewGame`의 +``` +self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", false) +self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", false) +``` +→ 삭제(StartRun→ShowMap이 ShowState("map")으로 처리). +4. `StartCombat` 첫 4줄 +``` +self:SetEntityEnabled("/ui/DefaultGroup/MapHud", false) +self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", true) +self:SetEntityEnabled("/ui/DefaultGroup/CardHand", true) +self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", true) +``` +→ +``` +self:ShowState("combat") +self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/Result", false) +``` +5. `ShowMap` 첫 3줄(`DeckHud/CardHand/CombatHud` off) → `self:ShowState("map")` (그 아래 `RenderMap`·MapHud enable 블록에서 MapHud enable 부분은 중복되지만 무해 — 기존 `local hud = ...MapHud... hud.Enable = true` 블록은 삭제). +6. `ShowShop` 끝의 ShopHud enable 블록(`local hud = ...ShopHud ... end`) → `self:ShowState("shop")` (RenderShop 호출은 유지). +7. `ShowRest` 끝의 RestHud enable 블록 → `self:ShowState("rest")` (텍스트·RenderCombat 호출 유지). +8. `LeaveNode`는 기존 그대로(ShowMap 경유). + +- [ ] **Step 3: 검증** — `node --check` 후 실행+확인: +`node tools/deck/gen-slaydeck.mjs && node -e "const cb=JSON.parse(require('fs').readFileSync('RootDesk/MyDesk/SlayDeckController.codeblock','utf8'));const names=cb.ContentProto.Json.Methods.map(m=>m.Name);const s=JSON.stringify(cb);console.log('ShowState:',names.includes('ShowState'),'| StartCombat resets Result:',/ShowState\(\\\"combat\\\"\)[\s\S]{0,200}Result/.test(s))"` +Expected: 둘 다 true. 산출물 복원. + +- [ ] **Step 4: Commit** — `git add tools/deck/gen-slaydeck.mjs && git commit -m "feat(combat-ui): ShowState 가시성 통일 + 전투 시작 시 Result 초기화"` + +--- + +## Task 6: 재생성 · 겹침 정적 검사 · 산출물 커밋 + +**Files:** 산출물 3종 + +- [ ] **Step 1: 재생성** — `node tools/deck/gen-slaydeck.mjs` (exit 0) + +- [ ] **Step 2: JSON·중복 id·결정성** +`node -e "const fs=require('fs');for(const f of ['ui/DefaultGroup.ui','Global/common.gamelogic','RootDesk/MyDesk/SlayDeckController.codeblock'])JSON.parse(fs.readFileSync(f,'utf8'));const ui=JSON.parse(fs.readFileSync('ui/DefaultGroup.ui','utf8'));const ids=ui.ContentProto.Entities.map(e=>e.id);console.log('dup:',ids.filter((x,i)=>ids.indexOf(x)!==i).length)"` → `dup: 0` +그리고 `git add -A` 후 `node tools/deck/gen-slaydeck.mjs` 재실행 → `git diff --stat` 비어있음(결정적). + +- [ ] **Step 3: 하단 HUD 겹침 정적 검사** (AABB 페어와이즈): +`node -e "const ui=JSON.parse(require('fs').readFileSync('ui/DefaultGroup.ui','utf8'));const E=ui.ContentProto.Entities;const get=p=>E.find(e=>e.path===p);const box=p=>{const e=get(p);const t=e.jsonString['@components'].find(c=>c['@type']==='MOD.Core.UITransformComponent');return {p,x:t.anchoredPosition.x,y:t.anchoredPosition.y,w:t.RectSize.x,h:t.RectSize.y};};const items=['/ui/DefaultGroup/DeckHud/EnergyOrb','/ui/DefaultGroup/DeckHud/EndTurnButton','/ui/DefaultGroup/DeckHud/DrawPile','/ui/DefaultGroup/DeckHud/DiscardPile'].map(box);const hit=(a,b)=>Math.abs(a.x-b.x)*2<(a.w+b.w)&&Math.abs(a.y-b.y)*2<(a.h+b.h);let bad=0;for(let i=0;i)` → 방어 뱃지 표시 +6. 전체 처치 → 보상 → `s:PickReward(1)` → 맵 복귀 +7. 상점(D)·휴식(C) 화면 +겹침·비침 발견 시 좌표 조정 → 재생성 → reload → 재확인 → 산출물 커밋(`fix(combat-ui): 플레이테스트 좌표 튜닝`). + +--- + +## Self-Review 결과 +- **스펙 커버리지**: §3.1→T1, §3.2→T2, §3.3→T3, §3.4→T4, §3.5→T5(HideGameHud 재사용으로 구현 — 스펙 의도 동일), §3.6→T7에서 확인(채팅 숨김 API는 비차단), 검증§6→T6·T7. 전 항목 매핑. +- **플레이스홀더 없음**: 모든 단계 실제 코드/명령 포함. +- **타입/이름 일관성**: `EnergyOrb/Value`·`TopBar/{Floor,Gold,Relics,AllDeckButton}`·`PlayerPanel/{Name,HpBarBg,HpBarFill,HpText,BlockBadge/Value}`·`TargetFrame`·`SetHpBar(path,hp,maxHp,width)`·`ShowState(state)` — Task 간 일치. guid 대역 200~224 기존(0~10·41~144)과 비충돌. +- **주의**: T2 Step 1에서 Floor/Gold 루프 제거 시 그 루프가 쓰던 `cmbN` 증가가 사라져 후속 Relics/Result id가 변함 — 전부 재생성이라 무해. T5의 ShowMap 치환 시 기존 MapHud enable 블록 삭제 누락하면 중복(무해하나 정리). diff --git a/docs/superpowers/specs/2026-06-11-combat-ui-overhaul-design.md b/docs/superpowers/specs/2026-06-11-combat-ui-overhaul-design.md new file mode 100644 index 0000000..95c0f93 --- /dev/null +++ b/docs/superpowers/specs/2026-06-11-combat-ui-overhaul-design.md @@ -0,0 +1,84 @@ +# 전투 화면 UI/HUD 전면 정비 (P1) — 설계 + +- 날짜: 2026-06-11 +- 대상: `tools/deck/gen-slaydeck.mjs`(UI 좌표·신규 엔티티·SlayDeckController 표시 로직), 생성물(`ui/DefaultGroup.ui`·`SlayDeckController.codeblock`) +- 상태: 승인됨 (배포 퀄리티 로드맵 P1/5) +- 로드맵: P1 UI 정비(본 문서) → P2 카드 비주얼(메이플 스킬) → P3 전투 연출(드래그 타겟·개별 턴·공격 모션) → P4 맵 차별화 → P5 시스템 갭 + +## 1. 배경 / 문제 + +전투 화면 HUD가 기능별로 따로 추가되며 겹침·산만함 발생. 정량 확인된 문제: +- `DeckHud/EndTurnButton`(y106~164) ↔ `DeckHud/Energy`(y69~111) **5px 겹침** (둘 다 중앙 상단) +- `DeckHud/AllDeckButton`(모든덱보기, x376~564·y106~164)이 버린덱(x524~656·y-85~101)과 5px 간격으로 답답 +- 막/골드가 화면 모서리(±820, 480) — MSW 시스템 크롬(좌상 채팅, 우상 메뉴)과 시각 충돌 +- 플레이어 HP/방어가 좌하단 텍스트 2줄(패널감 없음) +- 타겟 표시가 의도 텍스트의 `[타겟]` 프리픽스뿐, 몬스터 슬롯 이름/HP 가독성 낮음 +- 메뉴/캐릭터선택 화면 뒤로 전투 HUD가 비치는 흐름 버그(가시성 호출 산발) + +## 2. 목표 + +STS2 스타일 배치로 전투 화면을 재구성해 겹침 0·시각 위계 확립. 기능 변경 없음(레이아웃·시각·표시 로직만). + +## 3. 설계 + +### 3.1 하단 HUD 재배치 (DeckHud, parent 1280×330) +| 요소 | 현재 | 변경 | +|---|---|---| +| 에너지 | 중앙 (0,90) 텍스트 | **좌측 오브 패널** (-560,40) 96×96 어두운 원형 패널 + "3/3" 대형(36) + "에너지" 소라벨 | +| 턴 종료 | 중앙 (0,135) 170×58 | **우측 대형 버튼** (560,40) 200×64, fontSize 28 | +| 뽑을덱 | (-590,8) | 유지, 라벨 위치 정리 | +| 버린덱 | (590,8) | 유지 | +| 모든덱보기 | (470,135) | **상단 바로 이동** (§3.2) | +- 에너지 오브(-560±48=-608~-512)와 뽑을덱(-590±66=-656~-524)은 y로 분리: 뽑을덱 y8±93=-85~101, 오브 y40±48=-8~88 → x 겹침 구간에서 y도 겹침 → **오브를 (-560, 130)으로** 배치(뽑을덱 위). 같은 식으로 턴종료 (560, 130)(버린덱 위). 카드(CardHand y180 중심, 카드 h250 → y55~305)와 x 비겹침(카드 x -500~500, 오브/버튼 x>±512). + +### 3.2 상단 HUD 바 (CombatHud 신규 `TopBar`) +- 반투명 패널 1200×52, (0, 486). 자식: `Floor`(좌, x -540), `Gold`(좌, x -380), `Relics`(중앙, 폭 560), `AllDeckButton`(우, x 520, 150×40). +- 기존 CombatHud의 Floor(±820,480)·Gold·Relics(0,430) 엔티티를 TopBar 자식으로 대체(기존 경로 제거, 컨트롤러 SetText 경로 갱신). +- AllDeckButton은 DeckHud에서 TopBar로 이동(바인딩 경로 갱신). + +### 3.3 플레이어 패널 (CombatHud `PlayerPanel`, 좌하) +- 패널 300×96, (-760, -480) [화면 좌하단, DeckHud 영역 밖]. 자식: 이름라벨("플레이어"), HP바(HpBarBg/HpBarFill, 폭 220 — `SetHpBar` 재사용, 폭 파라미터화), HP 텍스트("71/80"), 방어 뱃지(56×40 청색 패널+숫자, 방어 0이면 숨김). +- 기존 PlayerHp/PlayerBlock 텍스트 엔티티 제거, RenderCombat 갱신. +- ⚠️ SetHpBar가 현재 HP_BAR_W=120 고정 → `SetHpBar(path, hp, maxHp, width)`로 폭 인자 추가(몬스터 120/140, 플레이어 220). + +### 3.4 몬스터 슬롯 가독성 + 타겟 프레임 +- `MonsterSlot{i}`에 `TargetFrame` 자식 추가: 슬롯보다 약간 큰 **단일 반투명 골드 패널**(156×108, displayOrder 최하 — 슬롯 내용 뒤 배경 하이라이트). RenderCombat에서 `i==TargetIndex`인 슬롯만 enable. +- 의도 텍스트에서 `[타겟] ` 프리픽스 제거. +- 이름 fontSize 20→22, Hp 18→20, HP바 폭 120→140(HpBarBg/Fill·SetHpBar 호출 일치), Intent 색상: kind=Attack→(1,0.45,0.35), Defend→(0.5,0.75,1). + +### 3.5 HUD 가시성 상태 통일 (`ShowState`) +- 컨트롤러에 `ShowState(state)` 단일 메서드: state별 HUD on/off 표. + +| state | 켜짐 | +|---|---| +| `menu` | MainMenu | +| `charselect` | CharacterSelectHud | +| `map` | MapHud만 (층/골드는 MapHud 진입 전 RenderRun으로 갱신된 TopBar가 꺼져도 무방 — 맵 화면 자체 표시는 현행 유지) | +| `combat` | CombatHud, DeckHud, CardHand | +| `reward` | RewardHud (+CombatHud 유지) | +| `shop` / `rest` | ShopHud / RestHud | +- `OnBeginPlay` 시작 시 전 HUD off → `ShowState("menu")`. 기존 산발적 `SetEntityEnabled` 호출을 ShowState 호출로 치환(ShowMainMenu/StartNewGame/ShowMap/PickNode/StartCombat/OfferReward/PickReward/ShowShop/ShowRest/LeaveNode/CheckCombatEnd). +- 흐름 버그(메뉴 뒤 카드 비침)는 이걸로 해소. + +### 3.6 시스템 UI +- 조이스틱/공격·점프 버튼: 기존 숨김 유지(upsertUi). +- 채팅/우상단 메뉴 숨김은 구현 단계에서 MSW API(`_UIService`/WorldConfig) 확인, 불가하면 본 레이아웃(모서리 회피)으로 충분 — 실패해도 P1 완료 조건에 미포함. + +## 4. 변경 파일 +| 파일 | 변경 | +|---|---| +| `tools/deck/gen-slaydeck.mjs` | upsertUi 좌표/엔티티 재구성(TopBar·PlayerPanel·TargetFrame·오브·버튼 이동), SlayDeckController(ShowState·RenderCombat·SetHpBar(width)·바인딩 경로) | +| 생성물 | `ui/DefaultGroup.ui`·`SlayDeckController.codeblock` 재생성. `common.gamelogic` 불변 예상 | + +## 5. 범위 제외 (후속 페이즈) +카드 아트/스킬 아이콘·의도 아이콘(P2), 드래그 타겟·공격 모션·개별 턴·부채꼴 손패(P3), 맵(P4), 시스템(P5). + +## 6. 검증 +- 생성기 2회 실행 동일(결정적), JSON·중복 id 없음, sim 14/14(불변). +- **좌표 겹침 정적 검사**: 하단 HUD 요소 AABB 페어와이즈 겹침 0 (검증 스크립트로 확인). +- 메이커 플레이테스트: 메뉴→캐릭터선택→맵→전투(타겟 프레임 이동·에너지/턴종료 위치)→보상→상점→휴식 전 화면 스크린샷, 겹침·비침 0 확인. + +## 7. 리스크 +- SetHpBar 시그니처 변경 → 호출 3곳(몬스터·플레이어) 일치 필요. +- 기존 경로 제거(Floor/Gold/Relics/PlayerHp/PlayerBlock/AllDeckButton) 시 컨트롤러 SetText/바인딩 경로 누락 주의(grep로 구경로 0 확인). +- 사용자 PR(deck inspector·character select)이 추가한 UI와의 상호작용 — DeckAll/DeckInspect sortingOrder 오버라이드(2000/1900) 유지. diff --git a/tools/deck/gen-slaydeck.mjs b/tools/deck/gen-slaydeck.mjs index ef8e430..ae0e23a 100644 --- a/tools/deck/gen-slaydeck.mjs +++ b/tools/deck/gen-slaydeck.mjs @@ -112,7 +112,7 @@ const SKILL = { r: 0.46, g: 0.68, b: 0.52, a: 1 }; const MAX_MONSTERS = 4; const HEAD_OFFSET_Y = 1.4; // 몬스터 월드 원점 위로 띄울 높이(머리 위) — world→screen 변환 전 가산 -const HP_BAR_W = 120; +const HP_BAR_W = 140; const CARD_W = 180; const CARD_H = 250; const CARD_SPACING = 200; @@ -525,39 +525,49 @@ function upsertUi() { componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent', displayOrder: 2, components: [ - transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 170, y: 58 }, pos: { x: 0, y: 135 }, align: ALIGN_CENTER }), + transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 200, y: 64 }, pos: { x: 560, y: 160 }, align: ALIGN_CENTER }), sprite({ color: DARK, type: 1, raycast: true }), button(), - text({ value: '턴 종료', fontSize: 25, bold: true, color: GOLD, alignment: 0 }), + text({ value: '턴 종료', fontSize: 28, bold: true, color: GOLD, alignment: 0 }), ], })); add(entity({ id: guid('hud', hud.length), - path: '/ui/DefaultGroup/DeckHud/Energy', + path: '/ui/DefaultGroup/DeckHud/EnergyOrb', + modelId: 'uisprite', + entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 3, + components: [ + transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 96, y: 96 }, pos: { x: -560, y: 160 }, align: ALIGN_CENTER }), + sprite({ color: { r: 0.12, g: 0.2, b: 0.34, a: 0.95 }, type: 1 }), + ], + })); + add(entity({ + id: guid('hud', hud.length), + path: '/ui/DefaultGroup/DeckHud/EnergyOrb/Value', modelId: 'uitext', entryId: 'UIText', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 3, + displayOrder: 0, components: [ - transform({ parentW: 1280, parentH: 330, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 42 }, pos: { x: 0, y: 90 }, align: ALIGN_CENTER }), + transform({ parentW: 96, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 92, y: 48 }, pos: { x: 0, y: 6 } }), sprite({ color: TRANSPARENT }), - text({ value: '에너지 3/3', fontSize: 24, bold: true, color: { r: 0.6, g: 0.9, b: 1, a: 1 }, alignment: 0 }), + text({ value: '3/3', fontSize: 34, bold: true, color: { r: 0.65, g: 0.92, b: 1, a: 1 }, alignment: 4 }), ], })); - 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, + path: '/ui/DefaultGroup/DeckHud/EnergyOrb/Label', + modelId: 'uitext', + entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 1, 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 }), + transform({ parentW: 96, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 92, y: 24 }, pos: { x: 0, y: -28 } }), + sprite({ color: TRANSPARENT }), + text({ value: '에너지', fontSize: 14, bold: true, color: { r: 0.55, g: 0.7, b: 0.85, a: 1 }, alignment: 4 }), ], })); @@ -838,30 +848,41 @@ function upsertUi() { }); slot.jsonString.enable = false; combat.push(slot); + const targetFrame = entity({ + id: guid('cmb', 220 + i), path: `${base}/TargetFrame`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 0, + components: [ + transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W + 16, y: SLOT_H + 12 }, pos: { x: 0, y: 0 } }), + sprite({ color: { r: 0.95, g: 0.78, b: 0.25, a: 0.28 }, type: 1 }), + ], + }); + targetFrame.jsonString.enable = false; + combat.push(targetFrame); combat.push(entity({ id: guid('cmb', 60 + i), path: `${base}/Name`, modelId: 'uitext', entryId: 'UIText', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 0, + displayOrder: 1, components: [ transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W, y: 30 }, pos: { x: 0, y: 34 } }), sprite({ color: TRANSPARENT }), - text({ value: '', fontSize: 20, bold: true, color: GOLD, alignment: 4 }), + text({ value: '', fontSize: 22, bold: true, color: GOLD, alignment: 4 }), ], })); combat.push(entity({ id: guid('cmb', 80 + i), path: `${base}/Hp`, modelId: 'uitext', entryId: 'UIText', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 1, + displayOrder: 2, components: [ transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W, y: 26 }, pos: { x: 0, y: 6 } }), sprite({ color: TRANSPARENT }), - text({ value: '', fontSize: 18, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), + text({ value: '', fontSize: 20, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), ], })); combat.push(entity({ id: guid('cmb', 100 + i), path: `${base}/HpBarBg`, modelId: 'uisprite', entryId: 'UISprite', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', - displayOrder: 2, + displayOrder: 3, components: [ transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: HP_BAR_W, y: 14 }, pos: { x: 0, y: -14 } }), sprite({ color: { r: 0.18, g: 0.05, b: 0.06, a: 1 }, type: 1 }), @@ -870,7 +891,7 @@ function upsertUi() { combat.push(entity({ id: guid('cmb', 120 + i), path: `${base}/HpBarFill`, modelId: 'uisprite', entryId: 'UISprite', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', - displayOrder: 3, + displayOrder: 4, components: [ transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0, y: 0.5 }, size: { x: HP_BAR_W, y: 14 }, pos: { x: -HP_BAR_W / 2, y: -14 } }), sprite({ color: { r: 0.86, g: 0.35, b: 0.32, a: 1 }, type: 1 }), @@ -879,7 +900,7 @@ function upsertUi() { combat.push(entity({ id: guid('cmb', 140 + i), path: `${base}/Intent`, modelId: 'uitext', entryId: 'UIText', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', - displayOrder: 4, + displayOrder: 5, components: [ transform({ parentW: SLOT_W, parentH: SLOT_H, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: SLOT_W + 40, y: 24 }, pos: { x: 0, y: -36 } }), sprite({ color: TRANSPARENT }), @@ -887,71 +908,120 @@ function upsertUi() { ], })); } - let cmbN = 2; + const PP = '/ui/DefaultGroup/CombatHud/PlayerPanel'; combat.push(entity({ - id: guid('cmb', cmbN++), - path: '/ui/DefaultGroup/CombatHud/PlayerBg', - modelId: 'uisprite', - entryId: 'UISprite', + id: guid('cmb', 210), path: PP, modelId: 'uisprite', entryId: 'UISprite', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', displayOrder: 5, components: [ - transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 300, y: 110 }, pos: { x: -760, y: -260 }, align: ALIGN_CENTER }), + transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 300, y: 96 }, pos: { x: -760, y: -494 }, align: ALIGN_CENTER }), sprite({ color: PANEL_BG, type: 1 }), ], })); - const playerTexts = [ - ['PlayerHp', { x: -760, y: -238 }, { x: 280, y: 44 }, 'HP 80/80', 26, true, { r: 1, g: 1, b: 1, a: 1 }], - ['PlayerBlock', { x: -760, y: -284 }, { x: 280, y: 38 }, '방어 0', 22, false, { r: 0.6, g: 0.8, b: 1, a: 1 }], - ]; - for (const [suffix, pos, size, value, fontSize, bold, color] of playerTexts) { - 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: 6 + playerTexts.findIndex(([s]) => s === suffix), - components: [ - transform({ parentW: 1920, parentH: 1080, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size, pos }), - sprite({ color: TRANSPARENT }), - text({ value, fontSize, bold, color }), - ], - })); - } - 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', + id: guid('cmb', 211), path: `${PP}/Name`, modelId: 'uitext', entryId: 'UIText', componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 0, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 280, y: 28 }, pos: { x: 0, y: 28 } }), + sprite({ color: TRANSPARENT }), + text({ value: '플레이어', fontSize: 18, bold: true, color: GOLD, alignment: 4 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 212), path: `${PP}/HpBarBg`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 1, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 16 }, pos: { x: 16, y: -6 } }), + sprite({ color: { r: 0.18, g: 0.05, b: 0.06, a: 1 }, type: 1 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 213), path: `${PP}/HpBarFill`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 2, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0, y: 0.5 }, size: { x: 220, y: 14 }, pos: { x: -94, y: -6 } }), + sprite({ color: { r: 0.3, g: 0.78, b: 0.36, a: 1 }, type: 1 }), + ], + })); + combat.push(entity({ + id: guid('cmb', 214), path: `${PP}/HpText`, modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 3, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 220, y: 24 }, pos: { x: 16, y: -30 } }), + sprite({ color: TRANSPARENT }), + text({ value: '80/80', fontSize: 16, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), + ], + })); + const blockBadge = entity({ + id: guid('cmb', 215), path: `${PP}/BlockBadge`, modelId: 'uisprite', entryId: 'UISprite', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent', + displayOrder: 4, + components: [ + transform({ parentW: 300, parentH: 96, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 44, y: 40 }, pos: { x: -122, y: -12 } }), + sprite({ color: { r: 0.32, g: 0.5, b: 0.85, a: 1 }, type: 1 }), + ], + }); + blockBadge.jsonString.enable = false; + combat.push(blockBadge); + combat.push(entity({ + id: guid('cmb', 216), path: `${PP}/BlockBadge/Value`, modelId: 'uitext', entryId: 'UIText', + componentNames: 'MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent', + displayOrder: 0, + components: [ + transform({ parentW: 44, parentH: 40, anchor: { x: 0.5, y: 0.5 }, pivot: { x: 0.5, y: 0.5 }, size: { x: 44, y: 36 }, pos: { x: 0, y: 0 } }), + sprite({ color: TRANSPARENT }), + text({ value: '0', fontSize: 18, bold: true, color: { r: 1, g: 1, b: 1, a: 1 }, alignment: 4 }), + ], + })); + combat.push(entity({ + 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({ - id: guid('cmb', cmbN++), + id: guid('cmb', 2), path: '/ui/DefaultGroup/CombatHud/Result', modelId: 'uitext', entryId: 'UIText', @@ -1660,11 +1730,25 @@ self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", false) self:SetEntityEnabled("/ui/DefaultGroup/RewardHud", false) self:SetEntityEnabled("/ui/DefaultGroup/MapHud", false) self:SetEntityEnabled("/ui/DefaultGroup/ShopHud", false) -self:SetEntityEnabled("/ui/DefaultGroup/RestHud", false)`), +self:SetEntityEnabled("/ui/DefaultGroup/RestHud", false) +self:SetEntityEnabled("/ui/DefaultGroup/DeckInspectHud", false) +self:SetEntityEnabled("/ui/DefaultGroup/DeckAllHud", false)`), + method('ShowState', `self:HideGameHud() +self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", state == "menu") +self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", state == "charselect") +if state == "map" then + self:SetEntityEnabled("/ui/DefaultGroup/MapHud", true) +elseif state == "combat" then + self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", true) + self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", true) + self:SetEntityEnabled("/ui/DefaultGroup/CardHand", true) +elseif state == "shop" then + self:SetEntityEnabled("/ui/DefaultGroup/ShopHud", true) +elseif state == "rest" then + self:SetEntityEnabled("/ui/DefaultGroup/RestHud", true) +end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'state' }]), method('ShowMainMenu', `self.SelectedClass = "" -self:HideGameHud() -self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", true) -self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", false) +self:ShowState("menu") self:SetText("/ui/DefaultGroup/MainMenu/Title", "메이플 덱 어드벤처") self:SetText("/ui/DefaultGroup/MainMenu/Subtitle", "캐릭터를 고르고 덱을 만들어 모험을 시작하세요") self:SetText("/ui/DefaultGroup/MainMenu/NewGameButton", "새 게임") @@ -1694,9 +1778,7 @@ if start ~= nil and start.ButtonComponent ~= nil then self.StartGameHandler = start:ConnectEvent(ButtonClickEvent, function() self:StartNewGame() end) end`), method('ShowCharacterSelect', `self.SelectedClass = "" -self:HideGameHud() -self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", false) -self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", true) +self:ShowState("charselect") self:RenderCharacterSelect()`), method('SelectClass', `self.SelectedClass = className self:RenderCharacterSelect()`, [ @@ -1719,8 +1801,6 @@ end`), self:SetText("/ui/DefaultGroup/CharacterSelectHud/Status", "현재는 전사만 선택할 수 있습니다") return end -self:SetEntityEnabled("/ui/DefaultGroup/MainMenu", false) -self:SetEntityEnabled("/ui/DefaultGroup/CharacterSelectHud", false) self:StartRun()`), method('SetEntityEnabled', `local e = _EntityService:GetEntityByPath(path) if e ~= nil then @@ -1747,10 +1827,8 @@ self.CurrentEnemyId = "" self:BindButtons() self:AddRelic("${RELICS.startingRelic}") self:ShowMap()`), - method('StartCombat', `self:SetEntityEnabled("/ui/DefaultGroup/MapHud", false) -self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", true) -self:SetEntityEnabled("/ui/DefaultGroup/CardHand", true) -self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", true) + method('StartCombat', `self:ShowState("combat") +self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/Result", false) self.MaxEnergy = 3 self.Turn = 0 self.PlayerBlock = 0 @@ -1862,7 +1940,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) @@ -1970,7 +2048,7 @@ self.DiscardPile = {} self:Shuffle(self.DrawPile)`), method('RenderPiles', `self:SetText("/ui/DefaultGroup/DeckHud/DrawPile/Count", tostring(#self.DrawPile)) self:SetText("/ui/DefaultGroup/DeckHud/DiscardPile/Count", tostring(#self.DiscardPile)) -self:SetText("/ui/DefaultGroup/DeckHud/Energy", "에너지 " .. string.format("%d", self.Energy) .. "/" .. string.format("%d", self.MaxEnergy)) +self:SetText("/ui/DefaultGroup/DeckHud/EnergyOrb/Value", string.format("%d", self.Energy) .. "/" .. string.format("%d", self.MaxEnergy)) local inspect = _EntityService:GetEntityByPath("/ui/DefaultGroup/DeckInspectHud") if inspect ~= nil and inspect.Enable == true and self.DeckInspectKind ~= "" then self:OpenDeckInspect(self.DeckInspectKind) @@ -2325,15 +2403,25 @@ end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], N if intent.kind == "Attack" then t = "공격 " .. tostring(intent.value) elseif intent.kind == "Defend" then t = "방어 " .. tostring(intent.value) end end - if i == self.TargetIndex then t = "[타겟] " .. t end self:SetText(base .. "/Intent", t) - self:SetHpBar(base .. "/HpBarFill", m.hp, m.maxHp) + self:SetEntityEnabled(base .. "/TargetFrame", i == self.TargetIndex) + local intentEntity = _EntityService:GetEntityByPath(base .. "/Intent") + if intentEntity ~= nil and intentEntity.TextComponent ~= nil and intent ~= nil then + if intent.kind == "Attack" then + intentEntity.TextComponent.FontColor = Color(1, 0.45, 0.35, 1) + else + intentEntity.TextComponent.FontColor = Color(0.5, 0.75, 1, 1) + end + end + self:SetHpBar(base .. "/HpBarFill", m.hp, m.maxHp, ${HP_BAR_W}) else self:SetEntityEnabled(base, false) end end -self:SetText("/ui/DefaultGroup/CombatHud/PlayerHp", "HP " .. string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp)) -self:SetText("/ui/DefaultGroup/CombatHud/PlayerBlock", "방어 " .. string.format("%d", self.PlayerBlock)) +self:SetText("/ui/DefaultGroup/CombatHud/PlayerPanel/HpText", string.format("%d", self.PlayerHp) .. "/" .. string.format("%d", self.PlayerMaxHp)) +self:SetHpBar("/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill", self.PlayerHp, self.PlayerMaxHp, 220) +self:SetEntityEnabled("/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge", self.PlayerBlock > 0) +self:SetText("/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge/Value", string.format("%d", self.PlayerBlock)) self:RenderRun()`), method('SetHpBar', `local e = _EntityService:GetEntityByPath(path) if e == nil or e.UITransformComponent == nil then @@ -2342,11 +2430,12 @@ end local ratio = 0 if maxHp > 0 then ratio = hp / maxHp end if ratio < 0 then ratio = 0 end -local w = ${HP_BAR_W} * ratio +local w = width * ratio e.UITransformComponent.RectSize = Vector2(w, 14)`, [ { Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'path' }, { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hp' }, { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'maxHp' }, + { Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'width' }, ]), method('PositionMonsterSlot', `local m = self.Monsters[slot] if m == nil or m.entity == nil or not isvalid(m.entity) then @@ -2367,9 +2456,11 @@ 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('OfferReward', `local pool = {} + 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', `self:SetEntityEnabled("/ui/DefaultGroup/CardHand", false) +self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", false) +local pool = {} for id, _ in pairs(self.Cards) do table.insert(pool, id) end @@ -2458,15 +2549,9 @@ end if names == "" then names = "없음" end -self:SetText("/ui/DefaultGroup/CombatHud/Relics", "유물: " .. names)`), - method('ShowMap', `self:SetEntityEnabled("/ui/DefaultGroup/DeckHud", false) -self:SetEntityEnabled("/ui/DefaultGroup/CardHand", false) -self:SetEntityEnabled("/ui/DefaultGroup/CombatHud", false) -self:RenderMap() -local hud = _EntityService:GetEntityByPath("/ui/DefaultGroup/MapHud") -if hud ~= nil then - hud.Enable = true -end`), +self:SetText("/ui/DefaultGroup/CombatHud/TopBar/Relics", "유물: " .. names)`), + method('ShowMap', `self:ShowState("map") +self:RenderMap()`), method('IsReachable', `local list if self.CurrentNodeId == "" then list = self.MapStart @@ -2531,10 +2616,7 @@ end self.ShopRelic = self.RelicPool[math.random(1, #self.RelicPool)] self.ShopRelicBought = false self:RenderShop() -local hud = _EntityService:GetEntityByPath("/ui/DefaultGroup/ShopHud") -if hud ~= nil then - hud.Enable = true -end`), +self:ShowState("shop")`), method('RenderShop', `self:SetText("/ui/DefaultGroup/ShopHud/Gold", "골드 " .. string.format("%d", self.Gold)) for i = 1, 3 do local cid = self.ShopChoices[i] @@ -2602,10 +2684,7 @@ end local healed = self.PlayerHp - old self:SetText("/ui/DefaultGroup/RestHud/Info", "HP " .. string.format("%d", old) .. " → " .. string.format("%d", self.PlayerHp) .. " (+" .. string.format("%d", healed) .. ")") self:RenderCombat() -local hud = _EntityService:GetEntityByPath("/ui/DefaultGroup/RestHud") -if hud ~= nil then - hud.Enable = true -end`), +self:ShowState("rest")`), method('LeaveNode', `local s = _EntityService:GetEntityByPath("/ui/DefaultGroup/ShopHud") if s ~= nil then s.Enable = false diff --git a/ui/DefaultGroup.ui b/ui/DefaultGroup.ui index 238f70e..d106ccd 100644 --- a/ui/DefaultGroup.ui +++ b/ui/DefaultGroup.ui @@ -6272,20 +6272,20 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 85, - "y": 164 + "x": 660, + "y": 192 }, "OffsetMin": { - "x": -85, - "y": 106 + "x": 460, + "y": 128 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 170, - "y": 58 + "x": 200, + "y": 64 }, "UIMode": 1, "UIScale": { @@ -6295,12 +6295,12 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": 0, - "y": 135 + "x": 560, + "y": 160 }, "Position": { - "x": 0, - "y": 135, + "x": 560, + "y": 160, "z": 0 }, "QuaternionRotation": { @@ -6439,8 +6439,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 25, - "MaxSize": 25, + "FontSize": 28, + "MaxSize": 28, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -6472,11 +6472,11 @@ }, { "id": "0d000008-0000-4000-8000-00000d000008", - "path": "/ui/DefaultGroup/DeckHud/Energy", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", "jsonString": { - "name": "Energy", - "path": "/ui/DefaultGroup/DeckHud/Energy", + "name": "EnergyOrb", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb", "nameEditable": true, "enable": true, "visible": true, @@ -6484,6 +6484,147 @@ "displayOrder": 3, "pathConstraints": "////", "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": -512, + "y": 208 + }, + "OffsetMin": { + "x": -608, + "y": 112 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 96, + "y": 96 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": -560, + "y": 160 + }, + "Position": { + "x": -560, + "y": 160, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.12, + "g": 0.2, + "b": 0.34, + "a": 0.95 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0d000009-0000-4000-8000-00000d000009", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb/Value", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "Value", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb/Value", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, "origin": { "type": "Model", "entry_id": "UIText", @@ -6507,20 +6648,20 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 110, - "y": 111 + "x": 46, + "y": 30 }, "OffsetMin": { - "x": -110, - "y": 69 + "x": -46, + "y": -18 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 220, - "y": 42 + "x": 92, + "y": 48 }, "UIMode": 1, "UIScale": { @@ -6531,11 +6672,11 @@ "UIVersion": 2, "anchoredPosition": { "x": 0, - "y": 90 + "y": 6 }, "Position": { "x": 0, - "y": 90, + "y": 6, "z": 0 }, "QuaternionRotation": { @@ -6609,7 +6750,7 @@ }, { "@type": "MOD.Core.TextComponent", - "Alignment": 0, + "Alignment": 4, "Bold": true, "DropShadow": false, "DropShadowAngle": 30, @@ -6622,13 +6763,13 @@ "DropShadowDistance": 32, "Font": 0, "FontColor": { - "r": 0.6, - "g": 0.9, + "r": 0.65, + "g": 0.92, "b": 1, "a": 1 }, - "FontSize": 24, - "MaxSize": 24, + "FontSize": 34, + "MaxSize": 34, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -6650,7 +6791,7 @@ "bottom": 0 }, "SizeFit": false, - "Text": "에너지 3/3", + "Text": "3/3", "UseOutLine": true, "Enable": true } @@ -6659,27 +6800,27 @@ } }, { - "id": "0d000009-0000-4000-8000-00000d000009", - "path": "/ui/DefaultGroup/DeckHud/AllDeckButton", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent", + "id": "0d00000a-0000-4000-8000-00000d00000a", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb/Label", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { - "name": "AllDeckButton", - "path": "/ui/DefaultGroup/DeckHud/AllDeckButton", + "name": "Label", + "path": "/ui/DefaultGroup/DeckHud/EnergyOrb/Label", "nameEditable": true, "enable": true, "visible": true, "localize": true, - "displayOrder": 4, - "pathConstraints": "////", + "displayOrder": 1, + "pathConstraints": "/////", "revision": 1, "origin": { "type": "Model", - "entry_id": "UIButton", + "entry_id": "UIText", "sub_entity_id": null, "root_entity_id": null, "replaced_model_id": null }, - "modelId": "uibutton", + "modelId": "uitext", "@components": [ { "@type": "MOD.Core.UITransformComponent", @@ -6695,20 +6836,20 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 564, - "y": 164 + "x": 46, + "y": -16 }, "OffsetMin": { - "x": 376, - "y": 106 + "x": -46, + "y": -40 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 188, - "y": 58 + "x": 92, + "y": 24 }, "UIMode": 1, "UIScale": { @@ -6718,12 +6859,12 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": 470, - "y": 135 + "x": 0, + "y": -28 }, "Position": { - "x": 470, - "y": 135, + "x": 0, + "y": -28, "z": 0 }, "QuaternionRotation": { @@ -6759,10 +6900,10 @@ "PreserveSprite": 0, "StartFrameIndex": 0, "Color": { - "r": 0.08, - "g": 0.09, - "b": 0.11, - "a": 0.92 + "r": 0, + "g": 0, + "b": 0, + "a": 0 }, "DropShadow": false, "DropShadowAngle": 30, @@ -6791,60 +6932,13 @@ "a": 1 }, "OutlineWidth": 3, - "RaycastTarget": true, + "RaycastTarget": false, "Type": 1, "Enable": true }, - { - "@type": "MOD.Core.ButtonComponent", - "Colors": { - "NormalColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "HighlightedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "PressedColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 1 - }, - "SelectedColor": { - "r": 0.9607843, - "g": 0.9607843, - "b": 0.9607843, - "a": 1 - }, - "DisabledColor": { - "r": 0.784313738, - "g": 0.784313738, - "b": 0.784313738, - "a": 0.5019608 - }, - "ColorMultiplier": 1, - "FadeDuration": 0.1 - }, - "ImageRUIDs": { - "HighlightedSprite": null, - "PressedSprite": null, - "SelectedSprite": null, - "DisabledSprite": null - }, - "KeyCode": 0, - "OverrideSorting": false, - "Transition": 1, - "Enable": true - }, { "@type": "MOD.Core.TextComponent", - "Alignment": 0, + "Alignment": 4, "Bold": true, "DropShadow": false, "DropShadowAngle": 30, @@ -6857,13 +6951,13 @@ "DropShadowDistance": 32, "Font": 0, "FontColor": { - "r": 0.94, - "g": 0.74, - "b": 0.26, + "r": 0.55, + "g": 0.7, + "b": 0.85, "a": 1 }, - "FontSize": 23, - "MaxSize": 23, + "FontSize": 14, + "MaxSize": 14, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -6885,7 +6979,7 @@ "bottom": 0 }, "SizeFit": false, - "Text": "모든덱보기", + "Text": "에너지", "UseOutLine": true, "Enable": true } @@ -7222,6 +7316,147 @@ "@version": 1 } }, + { + "id": "0cb000dd-0000-4000-8000-00000cb000dd", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot1/TargetFrame", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "TargetFrame", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot1/TargetFrame", + "nameEditable": true, + "enable": false, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 78, + "y": 54 + }, + "OffsetMin": { + "x": -78, + "y": -54 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 156, + "y": 108 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 0 + }, + "Position": { + "x": 0, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.95, + "g": 0.78, + "b": 0.25, + "a": 0.28 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, { "id": "0cb0003d-0000-4000-8000-00000cb0003d", "path": "/ui/DefaultGroup/CombatHud/MonsterSlot1/Name", @@ -7233,7 +7468,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 0, + "displayOrder": 1, "pathConstraints": "/////", "revision": 1, "origin": { @@ -7379,8 +7614,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 20, - "MaxSize": 20, + "FontSize": 22, + "MaxSize": 22, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -7421,7 +7656,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 1, + "displayOrder": 2, "pathConstraints": "/////", "revision": 1, "origin": { @@ -7567,8 +7802,8 @@ "b": 1, "a": 1 }, - "FontSize": 18, - "MaxSize": 18, + "FontSize": 20, + "MaxSize": 20, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -7609,7 +7844,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 2, + "displayOrder": 3, "pathConstraints": "/////", "revision": 1, "origin": { @@ -7635,11 +7870,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -7647,7 +7882,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -7750,7 +7985,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 3, + "displayOrder": 4, "pathConstraints": "/////", "revision": 1, "origin": { @@ -7776,11 +8011,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -7788,7 +8023,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -7799,11 +8034,11 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": -60, + "x": -70, "y": -14 }, "Position": { - "x": -60, + "x": -70, "y": -14, "z": 0 }, @@ -7891,7 +8126,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 4, + "displayOrder": 5, "pathConstraints": "/////", "revision": 1, "origin": { @@ -8256,6 +8491,147 @@ "@version": 1 } }, + { + "id": "0cb000de-0000-4000-8000-00000cb000de", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot2/TargetFrame", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "TargetFrame", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot2/TargetFrame", + "nameEditable": true, + "enable": false, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 78, + "y": 54 + }, + "OffsetMin": { + "x": -78, + "y": -54 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 156, + "y": 108 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 0 + }, + "Position": { + "x": 0, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.95, + "g": 0.78, + "b": 0.25, + "a": 0.28 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, { "id": "0cb0003e-0000-4000-8000-00000cb0003e", "path": "/ui/DefaultGroup/CombatHud/MonsterSlot2/Name", @@ -8267,7 +8643,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 0, + "displayOrder": 1, "pathConstraints": "/////", "revision": 1, "origin": { @@ -8413,8 +8789,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 20, - "MaxSize": 20, + "FontSize": 22, + "MaxSize": 22, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -8455,7 +8831,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 1, + "displayOrder": 2, "pathConstraints": "/////", "revision": 1, "origin": { @@ -8601,8 +8977,8 @@ "b": 1, "a": 1 }, - "FontSize": 18, - "MaxSize": 18, + "FontSize": 20, + "MaxSize": 20, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -8643,7 +9019,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 2, + "displayOrder": 3, "pathConstraints": "/////", "revision": 1, "origin": { @@ -8669,11 +9045,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -8681,7 +9057,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -8784,7 +9160,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 3, + "displayOrder": 4, "pathConstraints": "/////", "revision": 1, "origin": { @@ -8810,11 +9186,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -8822,7 +9198,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -8833,11 +9209,11 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": -60, + "x": -70, "y": -14 }, "Position": { - "x": -60, + "x": -70, "y": -14, "z": 0 }, @@ -8925,7 +9301,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 4, + "displayOrder": 5, "pathConstraints": "/////", "revision": 1, "origin": { @@ -9290,6 +9666,147 @@ "@version": 1 } }, + { + "id": "0cb000df-0000-4000-8000-00000cb000df", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot3/TargetFrame", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "TargetFrame", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot3/TargetFrame", + "nameEditable": true, + "enable": false, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 78, + "y": 54 + }, + "OffsetMin": { + "x": -78, + "y": -54 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 156, + "y": 108 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 0 + }, + "Position": { + "x": 0, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.95, + "g": 0.78, + "b": 0.25, + "a": 0.28 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, { "id": "0cb0003f-0000-4000-8000-00000cb0003f", "path": "/ui/DefaultGroup/CombatHud/MonsterSlot3/Name", @@ -9301,7 +9818,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 0, + "displayOrder": 1, "pathConstraints": "/////", "revision": 1, "origin": { @@ -9447,8 +9964,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 20, - "MaxSize": 20, + "FontSize": 22, + "MaxSize": 22, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -9489,7 +10006,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 1, + "displayOrder": 2, "pathConstraints": "/////", "revision": 1, "origin": { @@ -9635,8 +10152,8 @@ "b": 1, "a": 1 }, - "FontSize": 18, - "MaxSize": 18, + "FontSize": 20, + "MaxSize": 20, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -9677,7 +10194,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 2, + "displayOrder": 3, "pathConstraints": "/////", "revision": 1, "origin": { @@ -9703,11 +10220,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -9715,7 +10232,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -9818,7 +10335,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 3, + "displayOrder": 4, "pathConstraints": "/////", "revision": 1, "origin": { @@ -9844,11 +10361,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -9856,7 +10373,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -9867,11 +10384,11 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": -60, + "x": -70, "y": -14 }, "Position": { - "x": -60, + "x": -70, "y": -14, "z": 0 }, @@ -9959,7 +10476,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 4, + "displayOrder": 5, "pathConstraints": "/////", "revision": 1, "origin": { @@ -10324,6 +10841,147 @@ "@version": 1 } }, + { + "id": "0cb000e0-0000-4000-8000-00000cb000e0", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot4/TargetFrame", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "TargetFrame", + "path": "/ui/DefaultGroup/CombatHud/MonsterSlot4/TargetFrame", + "nameEditable": true, + "enable": false, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 78, + "y": 54 + }, + "OffsetMin": { + "x": -78, + "y": -54 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 156, + "y": 108 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 0 + }, + "Position": { + "x": 0, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.95, + "g": 0.78, + "b": 0.25, + "a": 0.28 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, { "id": "0cb00040-0000-4000-8000-00000cb00040", "path": "/ui/DefaultGroup/CombatHud/MonsterSlot4/Name", @@ -10335,7 +10993,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 0, + "displayOrder": 1, "pathConstraints": "/////", "revision": 1, "origin": { @@ -10481,8 +11139,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 20, - "MaxSize": 20, + "FontSize": 22, + "MaxSize": 22, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -10523,7 +11181,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 1, + "displayOrder": 2, "pathConstraints": "/////", "revision": 1, "origin": { @@ -10669,8 +11327,8 @@ "b": 1, "a": 1 }, - "FontSize": 18, - "MaxSize": 18, + "FontSize": 20, + "MaxSize": 20, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -10711,7 +11369,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 2, + "displayOrder": 3, "pathConstraints": "/////", "revision": 1, "origin": { @@ -10737,11 +11395,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -10749,7 +11407,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -10852,7 +11510,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 3, + "displayOrder": 4, "pathConstraints": "/////", "revision": 1, "origin": { @@ -10878,11 +11536,11 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 60, + "x": 70, "y": -7 }, "OffsetMin": { - "x": -60, + "x": -70, "y": -21 }, "Pivot": { @@ -10890,7 +11548,7 @@ "y": 0.5 }, "RectSize": { - "x": 120, + "x": 140, "y": 14 }, "UIMode": 1, @@ -10901,11 +11559,11 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": -60, + "x": -70, "y": -14 }, "Position": { - "x": -60, + "x": -70, "y": -14, "z": 0 }, @@ -10993,7 +11651,7 @@ "enable": true, "visible": true, "localize": true, - "displayOrder": 4, + "displayOrder": 5, "pathConstraints": "/////", "revision": 1, "origin": { @@ -11171,12 +11829,12 @@ } }, { - "id": "0cb00002-0000-4000-8000-00000cb00002", - "path": "/ui/DefaultGroup/CombatHud/PlayerBg", + "id": "0cb000d2-0000-4000-8000-00000cb000d2", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", "jsonString": { - "name": "PlayerBg", - "path": "/ui/DefaultGroup/CombatHud/PlayerBg", + "name": "PlayerPanel", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel", "nameEditable": true, "enable": true, "visible": true, @@ -11208,11 +11866,11 @@ "MobileOnly": false, "OffsetMax": { "x": -610, - "y": -205 + "y": -446 }, "OffsetMin": { "x": -910, - "y": -315 + "y": -542 }, "Pivot": { "x": 0.5, @@ -11220,7 +11878,7 @@ }, "RectSize": { "x": 300, - "y": 110 + "y": 96 }, "UIMode": 1, "UIScale": { @@ -11231,11 +11889,11 @@ "UIVersion": 2, "anchoredPosition": { "x": -760, - "y": -260 + "y": -494 }, "Position": { "x": -760, - "y": -260, + "y": -494, "z": 0 }, "QuaternionRotation": { @@ -11312,18 +11970,18 @@ } }, { - "id": "0cb00003-0000-4000-8000-00000cb00003", - "path": "/ui/DefaultGroup/CombatHud/PlayerHp", + "id": "0cb000d3-0000-4000-8000-00000cb000d3", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/Name", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { - "name": "PlayerHp", - "path": "/ui/DefaultGroup/CombatHud/PlayerHp", + "name": "Name", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/Name", "nameEditable": true, "enable": true, "visible": true, "localize": true, - "displayOrder": 6, - "pathConstraints": "////", + "displayOrder": 0, + "pathConstraints": "/////", "revision": 1, "origin": { "type": "Model", @@ -11348,12 +12006,12 @@ }, "MobileOnly": false, "OffsetMax": { - "x": -620, - "y": -216 + "x": 140, + "y": 42 }, "OffsetMin": { - "x": -900, - "y": -260 + "x": -140, + "y": 14 }, "Pivot": { "x": 0.5, @@ -11361,7 +12019,7 @@ }, "RectSize": { "x": 280, - "y": 44 + "y": 28 }, "UIMode": 1, "UIScale": { @@ -11371,388 +12029,12 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": -760, - "y": -238 + "x": 0, + "y": 28 }, "Position": { - "x": -760, - "y": -238, - "z": 0 - }, - "QuaternionRotation": { "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": true, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 1, - "g": 1, - "b": 1, - "a": 1 - }, - "FontSize": 26, - "MaxSize": 26, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "HP 80/80", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0cb00004-0000-4000-8000-00000cb00004", - "path": "/ui/DefaultGroup/CombatHud/PlayerBlock", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "PlayerBlock", - "path": "/ui/DefaultGroup/CombatHud/PlayerBlock", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 7, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": -620, - "y": -265 - }, - "OffsetMin": { - "x": -900, - "y": -303 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 280, - "y": 38 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": -760, - "y": -284 - }, - "Position": { - "x": -760, - "y": -284, - "z": 0 - }, - "QuaternionRotation": { - "x": 0, - "y": 0, - "z": 0, - "w": 1 - }, - "Scale": { - "x": 1, - "y": 1, - "z": 1 - }, - "Enable": true - }, - { - "@type": "MOD.Core.SpriteGUIRendererComponent", - "AnimClipPlayType": 0, - "EndFrameIndex": 2147483647, - "ImageRUID": { - "DataId": "" - }, - "LocalPosition": { - "x": 0, - "y": 0 - }, - "LocalScale": { - "x": 1, - "y": 1 - }, - "OverrideSorting": false, - "PlayRate": 1, - "PreserveSprite": 0, - "StartFrameIndex": 0, - "Color": { - "r": 0, - "g": 0, - "b": 0, - "a": 0 - }, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "FillAmount": 1, - "FillCenter": true, - "FillClockWise": true, - "FillMethod": 0, - "FillOrigin": 0, - "FlipX": false, - "FlipY": false, - "FrameColumn": 1, - "FrameRate": 0, - "FrameRow": 1, - "Outline": false, - "OutlineColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 1 - }, - "OutlineWidth": 3, - "RaycastTarget": false, - "Type": 1, - "Enable": true - }, - { - "@type": "MOD.Core.TextComponent", - "Alignment": 4, - "Bold": false, - "DropShadow": false, - "DropShadowAngle": 30, - "DropShadowColor": { - "r": 0, - "g": 0, - "b": 0, - "a": 0.72 - }, - "DropShadowDistance": 32, - "Font": 0, - "FontColor": { - "r": 0.6, - "g": 0.8, - "b": 1, - "a": 1 - }, - "FontSize": 22, - "MaxSize": 22, - "MinSize": 8, - "OutlineColor": { - "r": 0.08, - "g": 0.08, - "b": 0.08, - "a": 1 - }, - "OutlineDistance": { - "x": 1, - "y": -1 - }, - "OutlineWidth": 1, - "Overflow": 0, - "OverrideSorting": false, - "Padding": { - "left": 0, - "right": 0, - "top": 0, - "bottom": 0 - }, - "SizeFit": false, - "Text": "방어 0", - "UseOutLine": true, - "Enable": true - } - ], - "@version": 1 - } - }, - { - "id": "0cb00005-0000-4000-8000-00000cb00005", - "path": "/ui/DefaultGroup/CombatHud/Floor", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", - "jsonString": { - "name": "Floor", - "path": "/ui/DefaultGroup/CombatHud/Floor", - "nameEditable": true, - "enable": true, - "visible": true, - "localize": true, - "displayOrder": 9, - "pathConstraints": "////", - "revision": 1, - "origin": { - "type": "Model", - "entry_id": "UIText", - "sub_entity_id": null, - "root_entity_id": null, - "replaced_model_id": null - }, - "modelId": "uitext", - "@components": [ - { - "@type": "MOD.Core.UITransformComponent", - "ActivePlatform": 255, - "AlignmentOption": 0, - "AnchorsMax": { - "x": 0.5, - "y": 0.5 - }, - "AnchorsMin": { - "x": 0.5, - "y": 0.5 - }, - "MobileOnly": false, - "OffsetMax": { - "x": -700, - "y": 502 - }, - "OffsetMin": { - "x": -940, - "y": 458 - }, - "Pivot": { - "x": 0.5, - "y": 0.5 - }, - "RectSize": { - "x": 240, - "y": 44 - }, - "UIMode": 1, - "UIScale": { - "x": 1, - "y": 1, - "z": 1 - }, - "UIVersion": 2, - "anchoredPosition": { - "x": -820, - "y": 480 - }, - "Position": { - "x": -820, - "y": 480, + "y": 28, "z": 0 }, "QuaternionRotation": { @@ -11844,8 +12126,8 @@ "b": 0.26, "a": 1 }, - "FontSize": 26, - "MaxSize": 26, + "FontSize": 18, + "MaxSize": 18, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -11867,7 +12149,7 @@ "bottom": 0 }, "SizeFit": false, - "Text": "층 1/3", + "Text": "플레이어", "UseOutLine": true, "Enable": true } @@ -11876,18 +12158,300 @@ } }, { - "id": "0cb00006-0000-4000-8000-00000cb00006", - "path": "/ui/DefaultGroup/CombatHud/Gold", - "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "id": "0cb000d4-0000-4000-8000-00000cb000d4", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarBg", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", "jsonString": { - "name": "Gold", - "path": "/ui/DefaultGroup/CombatHud/Gold", + "name": "HpBarBg", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarBg", "nameEditable": true, "enable": true, "visible": true, "localize": true, - "displayOrder": 9, - "pathConstraints": "////", + "displayOrder": 1, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 126, + "y": 2 + }, + "OffsetMin": { + "x": -94, + "y": -14 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 220, + "y": 16 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 16, + "y": -6 + }, + "Position": { + "x": 16, + "y": -6, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.18, + "g": 0.05, + "b": 0.06, + "a": 1 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000d5-0000-4000-8000-00000cb000d5", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "HpBarFill", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpBarFill", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 2, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 126, + "y": 1 + }, + "OffsetMin": { + "x": -94, + "y": -13 + }, + "Pivot": { + "x": 0, + "y": 0.5 + }, + "RectSize": { + "x": 220, + "y": 14 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": -94, + "y": -6 + }, + "Position": { + "x": -94, + "y": -6, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.3, + "g": 0.78, + "b": 0.36, + "a": 1 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000d6-0000-4000-8000-00000cb000d6", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpText", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "HpText", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/HpText", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 3, + "pathConstraints": "/////", "revision": 1, "origin": { "type": "Model", @@ -11912,20 +12476,20 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 940, - "y": 502 + "x": 126, + "y": -18 }, "OffsetMin": { - "x": 700, - "y": 458 + "x": -94, + "y": -42 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 240, - "y": 44 + "x": 220, + "y": 24 }, "UIMode": 1, "UIScale": { @@ -11935,12 +12499,858 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": 820, - "y": 480 + "x": 16, + "y": -30 }, "Position": { - "x": 820, - "y": 480, + "x": 16, + "y": -30, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0, + "g": 0, + "b": 0, + "a": 0 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + }, + { + "@type": "MOD.Core.TextComponent", + "Alignment": 4, + "Bold": true, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "Font": 0, + "FontColor": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + }, + "FontSize": 16, + "MaxSize": 16, + "MinSize": 8, + "OutlineColor": { + "r": 0.08, + "g": 0.08, + "b": 0.08, + "a": 1 + }, + "OutlineDistance": { + "x": 1, + "y": -1 + }, + "OutlineWidth": 1, + "Overflow": 0, + "OverrideSorting": false, + "Padding": { + "left": 0, + "right": 0, + "top": 0, + "bottom": 0 + }, + "SizeFit": false, + "Text": "80/80", + "UseOutLine": true, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000d7-0000-4000-8000-00000cb000d7", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "BlockBadge", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge", + "nameEditable": true, + "enable": false, + "visible": true, + "localize": true, + "displayOrder": 4, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": -100, + "y": 8 + }, + "OffsetMin": { + "x": -144, + "y": -32 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 44, + "y": 40 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": -122, + "y": -12 + }, + "Position": { + "x": -122, + "y": -12, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.32, + "g": 0.5, + "b": 0.85, + "a": 1 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000d8-0000-4000-8000-00000cb000d8", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge/Value", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "Value", + "path": "/ui/DefaultGroup/CombatHud/PlayerPanel/BlockBadge/Value", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "//////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UIText", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uitext", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 22, + "y": 18 + }, + "OffsetMin": { + "x": -22, + "y": -18 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 44, + "y": 36 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 0 + }, + "Position": { + "x": 0, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0, + "g": 0, + "b": 0, + "a": 0 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + }, + { + "@type": "MOD.Core.TextComponent", + "Alignment": 4, + "Bold": true, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "Font": 0, + "FontColor": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + }, + "FontSize": 18, + "MaxSize": 18, + "MinSize": 8, + "OutlineColor": { + "r": 0.08, + "g": 0.08, + "b": 0.08, + "a": 1 + }, + "OutlineDistance": { + "x": 1, + "y": -1 + }, + "OutlineWidth": 1, + "Overflow": 0, + "OverrideSorting": false, + "Padding": { + "left": 0, + "right": 0, + "top": 0, + "bottom": 0 + }, + "SizeFit": false, + "Text": "0", + "UseOutLine": true, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000c8-0000-4000-8000-00000cb000c8", + "path": "/ui/DefaultGroup/CombatHud/TopBar", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent", + "jsonString": { + "name": "TopBar", + "path": "/ui/DefaultGroup/CombatHud/TopBar", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 9, + "pathConstraints": "////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UISprite", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uisprite", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 600, + "y": 512 + }, + "OffsetMin": { + "x": -600, + "y": 460 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 1200, + "y": 52 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 0, + "y": 486 + }, + "Position": { + "x": 0, + "y": 486, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.06, + "g": 0.07, + "b": 0.1, + "a": 0.82 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000c9-0000-4000-8000-00000cb000c9", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Floor", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "Floor", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Floor", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 0, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UIText", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uitext", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": -440, + "y": 20 + }, + "OffsetMin": { + "x": -600, + "y": -20 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 160, + "y": 40 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": -520, + "y": 0 + }, + "Position": { + "x": -520, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0, + "g": 0, + "b": 0, + "a": 0 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": false, + "Type": 1, + "Enable": true + }, + { + "@type": "MOD.Core.TextComponent", + "Alignment": 4, + "Bold": true, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "Font": 0, + "FontColor": { + "r": 0.94, + "g": 0.74, + "b": 0.26, + "a": 1 + }, + "FontSize": 22, + "MaxSize": 22, + "MinSize": 8, + "OutlineColor": { + "r": 0.08, + "g": 0.08, + "b": 0.08, + "a": 1 + }, + "OutlineDistance": { + "x": 1, + "y": -1 + }, + "OutlineWidth": 1, + "Overflow": 0, + "OverrideSorting": false, + "Padding": { + "left": 0, + "right": 0, + "top": 0, + "bottom": 0 + }, + "SizeFit": false, + "Text": "막 1/3", + "UseOutLine": true, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb000ca-0000-4000-8000-00000cb000ca", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Gold", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "Gold", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Gold", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 1, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UIText", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uitext", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": -280, + "y": 20 + }, + "OffsetMin": { + "x": -440, + "y": -20 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 160, + "y": 40 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": -360, + "y": 0 + }, + "Position": { + "x": -360, + "y": 0, "z": 0 }, "QuaternionRotation": { @@ -12032,8 +13442,8 @@ "b": 0.4, "a": 1 }, - "FontSize": 26, - "MaxSize": 26, + "FontSize": 22, + "MaxSize": 22, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -12064,18 +13474,18 @@ } }, { - "id": "0cb00007-0000-4000-8000-00000cb00007", - "path": "/ui/DefaultGroup/CombatHud/Relics", + "id": "0cb000cb-0000-4000-8000-00000cb000cb", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Relics", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": { "name": "Relics", - "path": "/ui/DefaultGroup/CombatHud/Relics", + "path": "/ui/DefaultGroup/CombatHud/TopBar/Relics", "nameEditable": true, "enable": true, "visible": true, "localize": true, - "displayOrder": 9, - "pathConstraints": "////", + "displayOrder": 2, + "pathConstraints": "/////", "revision": 1, "origin": { "type": "Model", @@ -12100,19 +13510,19 @@ }, "MobileOnly": false, "OffsetMax": { - "x": 500, - "y": 450 + "x": 340, + "y": 20 }, "OffsetMin": { - "x": -500, - "y": 410 + "x": -220, + "y": -20 }, "Pivot": { "x": 0.5, "y": 0.5 }, "RectSize": { - "x": 1000, + "x": 560, "y": 40 }, "UIMode": 1, @@ -12123,12 +13533,12 @@ }, "UIVersion": 2, "anchoredPosition": { - "x": 0, - "y": 430 + "x": 60, + "y": 0 }, "Position": { - "x": 0, - "y": 430, + "x": 60, + "y": 0, "z": 0 }, "QuaternionRotation": { @@ -12220,8 +13630,8 @@ "b": 0.95, "a": 1 }, - "FontSize": 22, - "MaxSize": 22, + "FontSize": 18, + "MaxSize": 18, "MinSize": 8, "OutlineColor": { "r": 0.08, @@ -12252,7 +13662,242 @@ } }, { - "id": "0cb00008-0000-4000-8000-00000cb00008", + "id": "0cb000cd-0000-4000-8000-00000cb000cd", + "path": "/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton", + "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.ButtonComponent,MOD.Core.TextComponent", + "jsonString": { + "name": "AllDeckButton", + "path": "/ui/DefaultGroup/CombatHud/TopBar/AllDeckButton", + "nameEditable": true, + "enable": true, + "visible": true, + "localize": true, + "displayOrder": 3, + "pathConstraints": "/////", + "revision": 1, + "origin": { + "type": "Model", + "entry_id": "UIButton", + "sub_entity_id": null, + "root_entity_id": null, + "replaced_model_id": null + }, + "modelId": "uibutton", + "@components": [ + { + "@type": "MOD.Core.UITransformComponent", + "ActivePlatform": 255, + "AlignmentOption": 0, + "AnchorsMax": { + "x": 0.5, + "y": 0.5 + }, + "AnchorsMin": { + "x": 0.5, + "y": 0.5 + }, + "MobileOnly": false, + "OffsetMax": { + "x": 585, + "y": 20 + }, + "OffsetMin": { + "x": 435, + "y": -20 + }, + "Pivot": { + "x": 0.5, + "y": 0.5 + }, + "RectSize": { + "x": 150, + "y": 40 + }, + "UIMode": 1, + "UIScale": { + "x": 1, + "y": 1, + "z": 1 + }, + "UIVersion": 2, + "anchoredPosition": { + "x": 510, + "y": 0 + }, + "Position": { + "x": 510, + "y": 0, + "z": 0 + }, + "QuaternionRotation": { + "x": 0, + "y": 0, + "z": 0, + "w": 1 + }, + "Scale": { + "x": 1, + "y": 1, + "z": 1 + }, + "Enable": true + }, + { + "@type": "MOD.Core.SpriteGUIRendererComponent", + "AnimClipPlayType": 0, + "EndFrameIndex": 2147483647, + "ImageRUID": { + "DataId": "" + }, + "LocalPosition": { + "x": 0, + "y": 0 + }, + "LocalScale": { + "x": 1, + "y": 1 + }, + "OverrideSorting": false, + "PlayRate": 1, + "PreserveSprite": 0, + "StartFrameIndex": 0, + "Color": { + "r": 0.08, + "g": 0.09, + "b": 0.11, + "a": 0.92 + }, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "FillAmount": 1, + "FillCenter": true, + "FillClockWise": true, + "FillMethod": 0, + "FillOrigin": 0, + "FlipX": false, + "FlipY": false, + "FrameColumn": 1, + "FrameRate": 0, + "FrameRow": 1, + "Outline": false, + "OutlineColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 1 + }, + "OutlineWidth": 3, + "RaycastTarget": true, + "Type": 1, + "Enable": true + }, + { + "@type": "MOD.Core.ButtonComponent", + "Colors": { + "NormalColor": { + "r": 1, + "g": 1, + "b": 1, + "a": 1 + }, + "HighlightedColor": { + "r": 0.9607843, + "g": 0.9607843, + "b": 0.9607843, + "a": 1 + }, + "PressedColor": { + "r": 0.784313738, + "g": 0.784313738, + "b": 0.784313738, + "a": 1 + }, + "SelectedColor": { + "r": 0.9607843, + "g": 0.9607843, + "b": 0.9607843, + "a": 1 + }, + "DisabledColor": { + "r": 0.784313738, + "g": 0.784313738, + "b": 0.784313738, + "a": 0.5019608 + }, + "ColorMultiplier": 1, + "FadeDuration": 0.1 + }, + "ImageRUIDs": { + "HighlightedSprite": null, + "PressedSprite": null, + "SelectedSprite": null, + "DisabledSprite": null + }, + "KeyCode": 0, + "OverrideSorting": false, + "Transition": 1, + "Enable": true + }, + { + "@type": "MOD.Core.TextComponent", + "Alignment": 0, + "Bold": true, + "DropShadow": false, + "DropShadowAngle": 30, + "DropShadowColor": { + "r": 0, + "g": 0, + "b": 0, + "a": 0.72 + }, + "DropShadowDistance": 32, + "Font": 0, + "FontColor": { + "r": 0.94, + "g": 0.74, + "b": 0.26, + "a": 1 + }, + "FontSize": 18, + "MaxSize": 18, + "MinSize": 8, + "OutlineColor": { + "r": 0.08, + "g": 0.08, + "b": 0.08, + "a": 1 + }, + "OutlineDistance": { + "x": 1, + "y": -1 + }, + "OutlineWidth": 1, + "Overflow": 0, + "OverrideSorting": false, + "Padding": { + "left": 0, + "right": 0, + "top": 0, + "bottom": 0 + }, + "SizeFit": false, + "Text": "모든덱보기", + "UseOutLine": true, + "Enable": true + } + ], + "@version": 1 + } + }, + { + "id": "0cb00002-0000-4000-8000-00000cb00002", "path": "/ui/DefaultGroup/CombatHud/Result", "componentNames": "MOD.Core.UITransformComponent,MOD.Core.SpriteGUIRendererComponent,MOD.Core.TextComponent", "jsonString": {