313 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			313 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local imbuingWindow
 | 
						|
local bankGold = 0
 | 
						|
local inventoryGold = 0
 | 
						|
local itemImbuements = {}
 | 
						|
local emptyImbue
 | 
						|
local groupsCombo
 | 
						|
local imbueLevelsCombo
 | 
						|
local protectionBtn
 | 
						|
local clearImbue
 | 
						|
local selectedImbue
 | 
						|
local imbueItems = {}
 | 
						|
local protection = false
 | 
						|
local clearConfirmWindow
 | 
						|
local imbueConfirmWindow
 | 
						|
 | 
						|
function init()
 | 
						|
  connect(g_game, {
 | 
						|
    onGameEnd = hide,
 | 
						|
    onResourceBalance = onResourceBalance,
 | 
						|
    onImbuementWindow = onImbuementWindow,
 | 
						|
    onCloseImbuementWindow = onCloseImbuementWindow
 | 
						|
  })
 | 
						|
 | 
						|
  imbuingWindow = g_ui.displayUI('imbuing')
 | 
						|
  emptyImbue = imbuingWindow.emptyImbue
 | 
						|
  groupsCombo = emptyImbue.groups
 | 
						|
  imbueLevelsCombo = emptyImbue.imbuement
 | 
						|
  protectionBtn = emptyImbue.protection
 | 
						|
  clearImbue = imbuingWindow.clearImbue
 | 
						|
  imbuingWindow:hide()
 | 
						|
 | 
						|
  groupsCombo.onOptionChange = function(widget)
 | 
						|
    imbueLevelsCombo:clear()
 | 
						|
    if itemImbuements ~= nil then
 | 
						|
      local selectedGroup = groupsCombo:getCurrentOption().text
 | 
						|
      for _,imbuement in ipairs(itemImbuements) do
 | 
						|
        if imbuement["group"] == selectedGroup then
 | 
						|
          emptyImbue.imbuement:addOption(imbuement["name"])          
 | 
						|
        end
 | 
						|
      end
 | 
						|
      imbueLevelsCombo.onOptionChange(imbueLevelsCombo) -- update options
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  imbueLevelsCombo.onOptionChange = function(widget)
 | 
						|
    setProtection(false)
 | 
						|
    local selectedGroup = groupsCombo:getCurrentOption().text
 | 
						|
    for _,imbuement in ipairs(itemImbuements) do
 | 
						|
      if imbuement["group"] == selectedGroup then
 | 
						|
        if #imbuement["sources"] == widget.currentIndex then
 | 
						|
          selectedImbue = imbuement
 | 
						|
          for i,source in ipairs(imbuement["sources"]) do
 | 
						|
            for _,item in ipairs(imbueItems) do
 | 
						|
              if item:getId() == source["item"]:getId() then
 | 
						|
                if item:getCount() >= source["item"]:getCount() then
 | 
						|
                  emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_green")
 | 
						|
                  emptyImbue.imbue:setEnabled(true)
 | 
						|
                  emptyImbue.requiredItems:getChildByIndex(i).count:setColor("white")
 | 
						|
                end
 | 
						|
                if item:getCount() < source["item"]:getCount() then
 | 
						|
                  emptyImbue.imbue:setEnabled(false)
 | 
						|
                  emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
 | 
						|
                  emptyImbue.requiredItems:getChildByIndex(i).count:setColor("red")
 | 
						|
                end
 | 
						|
                emptyImbue.requiredItems:getChildByIndex(i).count:setText(item:getCount() .. "/" .. source["item"]:getCount())
 | 
						|
              end
 | 
						|
            end
 | 
						|
            emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(source["item"]:getId())
 | 
						|
            emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip("The imbuement requires " .. source["description"] .. ".")
 | 
						|
          end
 | 
						|
          for i = 3, widget.currentIndex + 1, -1 do
 | 
						|
            emptyImbue.requiredItems:getChildByIndex(i).count:setText("")
 | 
						|
            emptyImbue.requiredItems:getChildByIndex(i).item:setItemId(0)
 | 
						|
            emptyImbue.requiredItems:getChildByIndex(i).item:setTooltip("")
 | 
						|
          end
 | 
						|
          emptyImbue.protectionCost:setText(imbuement["protectionCost"])
 | 
						|
          emptyImbue.cost:setText(imbuement["cost"])
 | 
						|
          if not protection and (bankGold + inventoryGold) < imbuement["cost"] then
 | 
						|
            emptyImbue.imbue:setEnabled(false)
 | 
						|
            emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
 | 
						|
            emptyImbue.cost:setColor("red")
 | 
						|
          end
 | 
						|
          if not protection and (bankGold + inventoryGold) >= imbuement["cost"] then
 | 
						|
            emptyImbue.cost:setColor("white")
 | 
						|
          end
 | 
						|
          if protection and (bankGold + inventoryGold) < (imbuement["cost"] + imbuement["protectionCost"]) then
 | 
						|
            emptyImbue.imbue:setEnabled(false)
 | 
						|
            emptyImbue.imbue:setImageSource("/images/game/imbuing/imbue_empty")
 | 
						|
            emptyImbue.cost:setColor("red")
 | 
						|
          end
 | 
						|
          if protection and (bankGold + inventoryGold) >= (imbuement["cost"] + imbuement["protectionCost"]) then
 | 
						|
            emptyImbue.cost:setColor("white")
 | 
						|
          end
 | 
						|
          emptyImbue.successRate:setText(imbuement["successRate"] .. "%")
 | 
						|
          if selectedImbue["successRate"] > 50 then
 | 
						|
            emptyImbue.successRate:setColor("white")
 | 
						|
          else
 | 
						|
            emptyImbue.successRate:setColor("red")
 | 
						|
          end
 | 
						|
          emptyImbue.description:setText(imbuement["description"])
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  protectionBtn.onClick = function()
 | 
						|
    setProtection(not protection)
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function setProtection(value)
 | 
						|
  protection = value
 | 
						|
  if protection then
 | 
						|
    emptyImbue.cost:setText(selectedImbue["cost"] + selectedImbue["protectionCost"])
 | 
						|
    emptyImbue.successRate:setText("100%")
 | 
						|
    emptyImbue.successRate:setColor("green")
 | 
						|
    protectionBtn:setImageClip(torect("66 0 66 66"))
 | 
						|
  else
 | 
						|
    if selectedImbue then
 | 
						|
      emptyImbue.cost:setText(selectedImbue["cost"])
 | 
						|
      emptyImbue.successRate:setText(selectedImbue["successRate"] .. "%")
 | 
						|
      if selectedImbue["successRate"] > 50 then
 | 
						|
        emptyImbue.successRate:setColor("white")
 | 
						|
      else
 | 
						|
        emptyImbue.successRate:setColor("red")
 | 
						|
      end
 | 
						|
    end
 | 
						|
    protectionBtn:setImageClip(torect("0 0 66 66"))
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function terminate()
 | 
						|
  disconnect(g_game, {
 | 
						|
    onGameEnd = hide,
 | 
						|
    onResourceBalance = onResourceBalance,
 | 
						|
    onImbuementWindow = onImbuementWindow,
 | 
						|
    onCloseImbuementWindow = onCloseImbuementWindow
 | 
						|
  })
 | 
						|
  
 | 
						|
  imbuingWindow:destroy()
 | 
						|
end
 | 
						|
 | 
						|
function resetSlots()
 | 
						|
  emptyImbue:setVisible(false)
 | 
						|
  clearImbue:setVisible(false)
 | 
						|
  for i=1,3 do
 | 
						|
    imbuingWindow.itemInfo.slots:getChildByIndex(i):setText("Slot " .. i)
 | 
						|
    imbuingWindow.itemInfo.slots:getChildByIndex(i):setEnabled(false)
 | 
						|
    imbuingWindow.itemInfo.slots:getChildByIndex(i):setTooltip("Items can have up to three imbuements slots. This slot is not available for this item.")
 | 
						|
    imbuingWindow.itemInfo.slots:getChildByIndex(i).onClick = nil
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function selectSlot(widget, slotId, activeSlot)
 | 
						|
  if activeSlot then
 | 
						|
    emptyImbue:setVisible(false)
 | 
						|
    widget:setText(activeSlot[1]["name"])
 | 
						|
    clearImbue.title:setText('Clear Imbuement "' .. activeSlot[1]["name"] .. '"')
 | 
						|
    clearImbue.groups:clear()
 | 
						|
    clearImbue.groups:addOption(activeSlot[1]["group"])
 | 
						|
    clearImbue.imbuement:clear()
 | 
						|
    clearImbue.imbuement:addOption(activeSlot[1]["name"])
 | 
						|
    clearImbue.description:setText(activeSlot[1]["description"])
 | 
						|
 | 
						|
    hours = string.format("%02.f", math.floor(activeSlot[2]/3600))
 | 
						|
    mins = string.format("%02.f", math.floor(activeSlot[2]/60 - (hours*60)))
 | 
						|
    clearImbue.time.timeRemaining:setText(hours..":"..mins.."h")
 | 
						|
 | 
						|
    clearImbue.cost:setText(activeSlot[3])
 | 
						|
    if (bankGold + inventoryGold) < activeSlot[3] then
 | 
						|
      emptyImbue.clear:setEnabled(false)
 | 
						|
      emptyImbue.clear:setImageSource("/images/game/imbuing/imbue_empty")
 | 
						|
      emptyImbue.cost:setColor("red")
 | 
						|
    end
 | 
						|
 | 
						|
    local yesCallback = function()
 | 
						|
      g_game.clearImbuement(slotId)
 | 
						|
      widget:setText("Slot " .. (slotId + 1))
 | 
						|
      if clearConfirmWindow then
 | 
						|
        clearConfirmWindow:destroy()
 | 
						|
        clearConfirmWindow=nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
    local noCallback = function()
 | 
						|
      imbuingWindow:show()
 | 
						|
      if clearConfirmWindow then
 | 
						|
        clearConfirmWindow:destroy()
 | 
						|
        clearConfirmWindow=nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    clearImbue.clear.onClick = function()
 | 
						|
      imbuingWindow:hide()
 | 
						|
      clearConfirmWindow = displayGeneralBox(tr('Confirm Clearing'), tr('Do you wish to spend ' .. activeSlot[3] .. ' gold coins to clear the imbuement "' .. activeSlot[1]["name"] .. '" from your item?'), {
 | 
						|
        { text=tr('Yes'), callback=yesCallback },
 | 
						|
        { text=tr('No'), callback=noCallback },
 | 
						|
        anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
 | 
						|
    end
 | 
						|
 | 
						|
    clearImbue:setVisible(true)
 | 
						|
  else
 | 
						|
    emptyImbue:setVisible(true)
 | 
						|
    clearImbue:setVisible(false)
 | 
						|
 | 
						|
    local yesCallback = function()
 | 
						|
      g_game.applyImbuement(slotId, selectedImbue["id"], protection)
 | 
						|
      if clearConfirmWindow then
 | 
						|
        clearConfirmWindow:destroy()
 | 
						|
        clearConfirmWindow=nil
 | 
						|
      end
 | 
						|
      widget:setText(selectedImbue["name"])
 | 
						|
      imbuingWindow:show()
 | 
						|
    end
 | 
						|
    local noCallback = function()
 | 
						|
      imbuingWindow:show()
 | 
						|
      if clearConfirmWindow then
 | 
						|
        clearConfirmWindow:destroy()
 | 
						|
        clearConfirmWindow=nil
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    emptyImbue.imbue.onClick = function()
 | 
						|
      imbuingWindow:hide()
 | 
						|
      local cost = selectedImbue["cost"]
 | 
						|
      local successRate = selectedImbue["successRate"]
 | 
						|
      if protection then
 | 
						|
        cost = cost + selectedImbue["protectionCost"]
 | 
						|
        successRate = "100"
 | 
						|
      end
 | 
						|
      clearConfirmWindow = displayGeneralBox(tr('Confirm Imbuing Attempt'), 'You are about to imbue your item with "' .. selectedImbue["name"] .. '".\nYour chance to succeed is ' .. successRate .. '%. It will consume the required astral sources and '.. cost ..' gold coins.\nDo you wish to proceed?', {
 | 
						|
        { text=tr('Yes'), callback=yesCallback },
 | 
						|
        { text=tr('No'), callback=noCallback },
 | 
						|
        anchor=AnchorHorizontalCenter}, yesCallback, noCallback)
 | 
						|
    end
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onImbuementWindow(itemId, slots, activeSlots, imbuements, needItems)
 | 
						|
  if not itemId then
 | 
						|
    return
 | 
						|
  end
 | 
						|
  resetSlots()
 | 
						|
  imbueItems = table.copy(needItems)
 | 
						|
  imbuingWindow.itemInfo.item:setItemId(itemId)
 | 
						|
 | 
						|
  for i=1, slots do
 | 
						|
    local slot = imbuingWindow.itemInfo.slots:getChildByIndex(i)
 | 
						|
    slot.onClick = function(widget)
 | 
						|
      selectSlot(widget, i - 1)
 | 
						|
    end
 | 
						|
    slot:setTooltip("Use this slot to imbue your item. Depending on the item you can have up to three different imbuements.")
 | 
						|
    slot:setEnabled(true)
 | 
						|
 | 
						|
    if slot:getId() == "slot0" then
 | 
						|
      selectSlot(slot, i - 1)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  for i, slot in pairs(activeSlots) do
 | 
						|
    local activeSlotBtn = imbuingWindow.itemInfo.slots:getChildById("slot" .. i)
 | 
						|
    activeSlotBtn.onClick = function(widget)
 | 
						|
      selectSlot(widget, i, slot)
 | 
						|
    end
 | 
						|
    if activeSlotBtn:getId() == "slot0" then
 | 
						|
      selectSlot(activeSlotBtn, i, slot)
 | 
						|
    end
 | 
						|
  end
 | 
						|
 | 
						|
  if imbuements ~= nil then
 | 
						|
    groupsCombo:clear()
 | 
						|
    imbueLevelsCombo:clear()
 | 
						|
    itemImbuements = table.copy(imbuements)
 | 
						|
    for _,imbuement in ipairs(itemImbuements) do
 | 
						|
      if not groupsCombo:isOption(imbuement["group"]) then
 | 
						|
        groupsCombo:addOption(imbuement["group"])
 | 
						|
      end
 | 
						|
    end
 | 
						|
  end
 | 
						|
  show()
 | 
						|
end
 | 
						|
 | 
						|
function onResourceBalance(type, balance)
 | 
						|
  if type == 0 then
 | 
						|
    bankGold = balance
 | 
						|
  elseif type == 1 then
 | 
						|
    inventoryGold = balance
 | 
						|
  end
 | 
						|
  if type == 0 or type == 1 then
 | 
						|
    imbuingWindow.balance:setText(tr("Balance") .. ":\n" .. (bankGold + inventoryGold))
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
function onCloseImbuementWindow()
 | 
						|
  resetSlots()
 | 
						|
end
 | 
						|
 | 
						|
function hide()
 | 
						|
  g_game.closeImbuingWindow()
 | 
						|
  imbuingWindow:hide()
 | 
						|
end
 | 
						|
 | 
						|
function show()
 | 
						|
  imbuingWindow:show()
 | 
						|
  imbuingWindow:raise()
 | 
						|
  imbuingWindow:focus()
 | 
						|
end
 | 
						|
 | 
						|
function toggle()
 | 
						|
  if imbuingWindow:isVisible() then
 | 
						|
    return hide()
 | 
						|
  end
 | 
						|
  show()
 | 
						|
end |