import { method, RUN_LENGTH, GOLD_PER_WIN, CARD_PRICE, REST_HEAL, RELIC_PRICE, ACT_COUNT, ACT_MAPS, LOBBY_MAP, LOBBY_SPAWN } from '../lib/codeblock.mjs'; import { CARDS, ENEMIES, CLASSES, JOBS, SOUL_UNLOCKS, CARDFRAMES, RARITIES, MAP_ROWS, MAP_COLS, CHEST_CLOSED_RUID, CHEST_OPEN_RUID, NODEICONS, CHARS, CAM, RELICS, POTIONS, luaSoulShopTable, frameRuid, luaFramesTable, luaNodeIconsTable, luaRelicsTable, luaPotionsTable, luaIntentsArray, luaEnemiesTable, luaStr, luaJobsTable, luaCardsTable, luaDeckTable } from '../lib/data.mjs'; import { UI_FILE, COMMON_FILE, UI_ROOT, GENERATED_UI_SECTIONS, UI_APPEND_ORDER, DISABLED_STOCK_CONTROLS, TRANSPARENT, DARK, GOLD, ATTACK, DEFEND, SKILL, DAMAGE_DIGIT_RUIDS, DAMAGE_POP_MAX_DIGITS, DAMAGE_POP_DIGIT_W, DAMAGE_POP_DIGIT_H, DAMAGE_POP_DIGIT_SPACING, MAX_MONSTERS, HEAD_OFFSET_Y, HP_BAR_W, WHITE, CARD_NAME_TEXT, CARD_DESC_TEXT, cardFaceLayout, CARD_W, CARD_H, CARD_SPACING, CARD_XS, ALIGN_CENTER, ALIGN_BOTTOM_CENTER, guid, transform, sprite, button, text, scrollLayoutGroup, popupLayerFor, uiOrderFor, displayOrderFor, applySortingOverride, entity, uiPath, sectionRoot, isGeneratedUiEntity, appendUiSection } from '../lib/ui-helpers.mjs'; export const itemMethods = [ method('HasRelic', `if self.RunRelics == nil then return false end for i = 1, #self.RunRelics do if self.RunRelics[i] == id then return true end end return false`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'id' }], 0, 'boolean'), method('ApplyRelics', `if self.RunRelics == nil then return end for i = 1, #self.RunRelics do local r = self.Relics[self.RunRelics[i]] if r ~= nil and r.hook == hook then if r.effect == "block" then self.PlayerBlock = self.PlayerBlock + r.value elseif r.effect == "energy" then self.Energy = self.Energy + r.value elseif r.effect == "strength" then self.PlayerStr = self.PlayerStr + r.value elseif r.effect == "draw" then self:DrawCards(r.value) self:RenderHand(false) elseif r.effect == "heal" or r.effect == "healOnAttack" or r.effect == "healOnWin" then self.PlayerHp = self.PlayerHp + r.value if self.PlayerHp > self.PlayerMaxHp then self.PlayerHp = self.PlayerMaxHp end elseif r.effect == "healIfLow" then if self.PlayerHp * 2 <= self.PlayerMaxHp then self.PlayerHp = self.PlayerHp + r.value if self.PlayerHp > self.PlayerMaxHp then self.PlayerHp = self.PlayerMaxHp end end elseif r.effect == "gold" then self.Gold = self.Gold + r.value end end end`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'hook' }]), method('AddRelic', `if self.RunRelics == nil then self.RunRelics = {} end table.insert(self.RunRelics, id) local r = self.Relics[id] if r ~= nil and r.hook == "passive" then if r.effect == "potionSlots" then self.PotionSlots = r.value self:RenderPotions() elseif r.effect == "maxHp" then self.PlayerMaxHp = self.PlayerMaxHp + r.value self.PlayerHp = self.PlayerHp + r.value end end self:RenderRelics()`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'id' }]), method('PickNewRelic', `local pool = {} for i = 1, #self.RelicPool do if self:HasRelic(self.RelicPool[i]) == false then table.insert(pool, self.RelicPool[i]) end end if #pool == 0 then self.Gold = self.Gold + 25 self:Toast("유물을 모두 모았습니다! 메소 +25") return "" end return pool[math.random(1, #pool)]`, [], 0, 'string'), method('AddPotion', `if self.RunPotions == nil then self.RunPotions = {} end if #self.RunPotions >= self.PotionSlots then self:Toast("물약 슬롯이 가득 찼습니다") return false end table.insert(self.RunPotions, pid) self:RenderPotions() return true`, [{ Type: 'string', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'pid' }], 0, 'boolean'), method('MaybeDropPotion', `if math.random() > ${POTIONS.dropChance} then return end local keys = {} for pid, _ in pairs(self.Potions) do table.insert(keys, pid) end table.sort(keys) local pid = keys[math.random(1, #keys)] if self:AddPotion(pid) == true then local p = self.Potions[pid] self:Toast("물약 획득: " .. p.name) end`), method('RenderPotions', `for i = 1, 5 do local base = "/ui/RunUIGroup/CombatHud/TopBar/PotionSlot" .. tostring(i) local e = _EntityService:GetEntityByPath(base) if e ~= nil and e.SpriteGUIRendererComponent ~= nil then local pid = nil if self.RunPotions ~= nil then pid = self.RunPotions[i] end if pid ~= nil and self.Potions[pid] ~= nil then e.SpriteGUIRendererComponent.ImageRUID = self.Potions[pid].icon e.SpriteGUIRendererComponent.Color = Color(1, 1, 1, 1) elseif i > self.PotionSlots then e.SpriteGUIRendererComponent.ImageRUID = "" e.SpriteGUIRendererComponent.Color = Color(0.1, 0.1, 0.12, 0.85) else e.SpriteGUIRendererComponent.ImageRUID = "" e.SpriteGUIRendererComponent.Color = Color(0.22, 0.25, 0.3, 0.9) end end end`), method('OpenPotionMenu', `if self.RunPotions == nil or self.RunPotions[slot] == nil then return end self.PotionMenuSlot = slot local pid = self.RunPotions[slot] local p = self.Potions[pid] if p ~= nil then self:SetText("/ui/RunUIGroup/CombatHud/PotionMenu/Title", p.name .. " — " .. p.desc) end self:SetEntityEnabled("/ui/RunUIGroup/CombatHud/PotionMenu", true)`, [{ Type: 'number', DefaultValue: null, SyncDirection: 0, Attributes: [], Name: 'slot' }]), method('ClosePotionMenu', `self.PotionMenuSlot = 0 self:SetEntityEnabled("/ui/RunUIGroup/CombatHud/PotionMenu", false)`), method('UsePotion', `if self.PotionMenuSlot <= 0 then return end if self.CombatOver == true or self.TurnBusy == true or self.FxBusy == true then self:Toast("지금은 사용할 수 없습니다") return end local combat = _EntityService:GetEntityByPath("/ui/RunUIGroup/CombatHud") local hand = _EntityService:GetEntityByPath("/ui/RunUIGroup/CardHand") if combat == nil or combat.Enable ~= true or hand == nil or hand.Enable ~= true then self:Toast("전투 중에만 사용할 수 있습니다") return end local pid = self.RunPotions[self.PotionMenuSlot] if pid == nil then return end local p = self.Potions[pid] if p == nil then return end if p.effect == "heal" then self.PlayerHp = math.min(self.PlayerHp + p.value, self.PlayerMaxHp) elseif p.effect == "damage" then self:DealDamageToTarget(p.value, false) self:ShowDmgPop(self.TargetIndex, p.value) elseif p.effect == "strength" then self.PlayerStr = self.PlayerStr + p.value elseif p.effect == "block" then self.PlayerBlock = self.PlayerBlock + p.value elseif p.effect == "energy" then self.Energy = self.Energy + p.value elseif p.effect == "weak" then local tm = self.Monsters[self.TargetIndex] if tm ~= nil and tm.alive == true then tm.weak = tm.weak + p.value end end table.remove(self.RunPotions, self.PotionMenuSlot) self:Toast("물약 사용: " .. p.name) self:ClosePotionMenu() self:RenderPotions() self:RenderPiles() self:RenderCombat() self:CheckCombatEnd()`), method('TossPotion', `if self.PotionMenuSlot <= 0 then return end local pid = self.RunPotions[self.PotionMenuSlot] if pid ~= nil then local p = self.Potions[pid] table.remove(self.RunPotions, self.PotionMenuSlot) if p ~= nil then self:Toast("물약 버림: " .. p.name) end end self:ClosePotionMenu() self:RenderPotions()`), method('RenderRelics', `local count = 0 if self.RunRelics ~= nil then count = #self.RunRelics end for i = 1, 10 do local base = "/ui/RunUIGroup/CombatHud/TopBar/RelicSlot" .. tostring(i) local e = _EntityService:GetEntityByPath(base) if e ~= nil and e.SpriteGUIRendererComponent ~= nil then local rid = nil if self.RunRelics ~= nil then rid = self.RunRelics[i] end if rid ~= nil and self.Relics[rid] ~= nil and (i < 10 or count <= 10) then e.SpriteGUIRendererComponent.ImageRUID = self.Relics[rid].icon e.SpriteGUIRendererComponent.Color = Color(1, 1, 1, 1) else e.SpriteGUIRendererComponent.ImageRUID = "" e.SpriteGUIRendererComponent.Color = Color(0.15, 0.16, 0.2, 0.6) end end end local of = "" if count > 10 then of = "+" .. tostring(count - 9) end self:SetText("/ui/RunUIGroup/CombatHud/TopBar/RelicOverflow", of)`), ];