2020-03-31 21:34:09 +02:00

309 lines
8.9 KiB
Lua

-- sponsored by kivera-global.com
local preyWindow
local preyButton
local msgWindow
local bankGold = 0
local inventoryGold = 0
local rerollPrice = 0
local bonusRerolls = 0
local PREY_BONUS_DAMAGE_BOOST = 0
local PREY_BONUS_DAMAGE_REDUCTION = 1
local PREY_BONUS_XP_BONUS = 2
local PREY_BONUS_IMPROVED_LOOT = 3
local PREY_BONUS_NONE = 4
local PREY_ACTION_LISTREROLL = 0
local PREY_ACTION_BONUSREROLL = 1
local PREY_ACTION_MONSTERSELECTION = 2
local PREY_ACTION_REQUEST_ALL_MONSTERS = 3
local PREY_ACTION_CHANGE_FROM_ALL = 4
local PREY_ACTION_LOCK_PREY = 5
function bonusDescription(bonusType, bonusValue, bonusGrade)
if bonusType == PREY_BONUS_DAMAGE_BOOST then
return "Damage bonus (" .. bonusGrade .. "/10)"
elseif bonusType == PREY_BONUS_DAMAGE_REDUCTION then
return "Damage reduction bonus (" .. bonusGrade .. "/10)"
elseif bonusType == PREY_BONUS_XP_BONUS then
return "XP bonus (" .. bonusGrade .. "/10)"
elseif bonusType == PREY_BONUS_IMPROVED_LOOT then
return "Loot bonus (" .. bonusGrade .. "/10)"
elseif bonusType == PREY_BONUS_DAMAGE_BOOST then
return "-"
end
return "Uknown bonus"
end
function timeleftTranslation(timeleft, forPreyTimeleft) -- in seconds
if timeleft == 0 then
if forPreyTimeleft then
return tr("infinite bonus")
end
return tr("Available now")
end
local minutes = math.ceil(timeleft / 60)
local hours = math.floor(minutes / 60)
minutes = minutes - hours * 60
if hours > 0 then
if forPreyTimeleft then
return "" .. hours .. "h " .. minutes .. "m"
end
return tr("Available in") .. " " .. hours .. "h " .. minutes .. "m"
end
if forPreyTimeleft then
return "" .. minutes .. "m"
end
return tr("Available in") .. " " .. minutes .. "m"
end
function init()
connect(g_game, {
onGameStart = check,
onGameEnd = hide,
onResourceBalance = onResourceBalance,
onPreyFreeRolls = onPreyFreeRolls,
onPreyTimeLeft = onPreyTimeLeft,
onPreyPrice = onPreyPrice,
onPreyLocked = onPreyLocked,
onPreyInactive = onPreyInactive,
onPreyActive = onPreyActive,
onPreySelection = onPreySelection
})
preyWindow = g_ui.displayUI('prey')
preyWindow:hide()
if g_game.isOnline() then
check()
end
end
function terminate()
disconnect(g_game, {
onGameStart = check,
onGameEnd = hide,
onResourceBalance = onResourceBalance,
onPreyFreeRolls = onPreyFreeRolls,
onPreyTimeLeft = onPreyTimeLeft,
onPreyPrice = onPreyPrice,
onPreyLocked = onPreyLocked,
onPreyInactive = onPreyInactive,
onPreyActive = onPreyActive,
onPreySelection = onPreySelection
})
if preyButton then
preyButton:destroy()
end
preyWindow:destroy()
if msgWindow then
msgWindow:destroy()
msgWindow = nil
end
end
function check()
if g_game.getFeature(GamePrey) then
if not preyButton then
preyButton = modules.client_topmenu.addRightGameToggleButton('preyButton', tr('Preys'), '/images/topbuttons/prey', toggle)
end
elseif preyButton then
preyButton:destroy()
preyButton = nil
end
end
function hide()
preyWindow:hide()
if msgWindow then
msgWindow:destroy()
msgWindow = nil
end
end
function show()
if not g_game.getFeature(GamePrey) then
return hide()
end
preyWindow:show()
preyWindow:raise()
preyWindow:focus()
--g_game.preyRequest() -- update preys, it's for tibia 12
end
function toggle()
if preyWindow:isVisible() then
return hide()
end
show()
end
function onPreyFreeRolls(slot, timeleft)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
if prey.state ~= "active" and prey.state ~= "selection" then
return
end
prey.bottomLabel:setText(tr("Free list reroll") .. ": \n" .. timeleftTranslation(timeleft * 60))
end
function onPreyTimeLeft(slot, timeleft)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
if prey.state ~= "active" then
return
end
prey.description:setText(tr("Time left") .. ": " .. timeleftTranslation(timeleft, true))
end
function onPreyPrice(price)
rerollPrice = price
preyWindow.rerollPrice:setText(tr("Reroll price") .. ":\n" .. price)
end
function onPreyLocked(slot, unlockState, timeUntilFreeReroll)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
prey.state = "locked"
prey.title:setText(tr("Prey Locked"))
prey.list:hide()
prey.listScrollbar:hide()
prey.creature:hide()
prey.description:hide()
prey.bonuses:hide()
prey.button:hide()
prey.bottomLabel:show()
if unlockState == 0 then
prey.bottomLabel:setText(tr("You need to have premium account and buy this prey slot in the game store."))
elseif unlockState == 1 then
prey.bottomLabel:setText(tr("You need to buy this prey slot in the game store."))
else
prey.bottomLabel:setText(tr("You can't unlock it."))
prey.bottomButton:hide()
end
if (unlockState == 0 or unlockState == 1) and modules.game_shop then
prey.bottomButton:setText("Open game store")
prey.bottomButton.onClick = function() hide() modules.game_shop.show() end
prey.bottomButton:show()
end
end
function onPreyInactive(slot, timeUntilFreeReroll)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
prey.state = "inactive"
prey.title:setText(tr("Prey Inactive"))
prey.list:hide()
prey.listScrollbar:hide()
prey.creature:hide()
prey.description:hide()
prey.bonuses:hide()
prey.button:hide()
prey.bottomLabel:hide()
prey.bottomLabel:setText(tr("Free list reroll")..": \n" .. timeleftTranslation(timeUntilFreeReroll * 60))
prey.bottomLabel:show()
if timeUntilFreeReroll > 0 then
prey.bottomButton:setText(tr("Buy list reroll"))
else
prey.bottomButton:setText(tr("Free list reroll"))
end
prey.bottomButton:show()
prey.bottomButton.onClick = function()
g_game.preyAction(slot, PREY_ACTION_LISTREROLL, 0)
end
end
function onPreyActive(slot, currentHolderName, currentHolderOutfit, bonusType, bonusValue, bonusGrade, timeLeft, timeUntilFreeReroll)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
prey.state = "active"
prey.title:setText(currentHolderName)
prey.list:hide()
prey.listScrollbar:hide()
prey.creature:show()
prey.creature:setOutfit(currentHolderOutfit)
prey.description:setText(tr("Time left") .. ": " .. timeleftTranslation(timeLeft, true))
prey.description:show()
prey.bonuses:setText(bonusDescription(bonusType, bonusValue, bonusGrade))
prey.bonuses:show()
prey.button:setText(tr("Bonus reroll"))
prey.button:show()
prey.bottomLabel:setText(tr("Free list reroll")..": \n" .. timeleftTranslation(timeUntilFreeReroll * 60))
prey.bottomLabel:show()
if timeUntilFreeReroll > 0 then
prey.bottomButton:setText(tr("Buy list reroll"))
else
prey.bottomButton:setText(tr("Free list reroll"))
end
prey.bottomButton:show()
prey.button.onClick = function()
if bonusRerolls == 0 then
return showMessage(tr("Error"), tr("You don't have any bonus rerolls.\nYou can buy them in ingame store."))
end
g_game.preyAction(slot, PREY_ACTION_BONUSREROLL, 0)
end
prey.bottomButton.onClick = function()
g_game.preyAction(slot, PREY_ACTION_LISTREROLL, 0)
end
end
function onPreySelection(slot, bonusType, bonusValue, bonusGrade, names, outfits, timeUntilFreeReroll)
local prey = preyWindow["slot" .. (slot + 1)]
if not prey then return end
prey.state = "selection"
prey.title:setText(tr("Select monster"))
prey.list:show()
prey.listScrollbar:show()
prey.creature:hide()
prey.description:hide()
prey.bonuses:hide()
prey.button:setText(tr("Select"))
prey.button:show()
prey.bottomLabel:setText("Free list reroll: \n" .. timeleftTranslation(timeUntilFreeReroll * 60))
prey.bottomLabel:show()
prey.bottomButton:hide()
prey.list:destroyChildren()
for i, name in ipairs(names) do
local label = g_ui.createWidget("PreySelectionLabel", prey.list)
label:setText(name)
label.creature:setOutfit(outfits[i])
end
prey.button.onClick = function()
local child = prey.list:getFocusedChild()
if not child then
return showMessage(tr("Error"), tr("Select monster to proceed."))
end
local index = prey.list:getChildIndex(child)
g_game.preyAction(slot, PREY_ACTION_MONSTERSELECTION, index - 1)
end
end
function onResourceBalance(type, balance)
if type == 0 then -- bank gold
bankGold = balance
elseif type == 1 then -- inventory gold
inventoryGold = balance
elseif type == 10 then -- bonus rerolls
bonusRerolls = balance
preyWindow.bonusRerolls:setText(tr("Available bonus rerolls") .. ":\n" .. balance)
end
if type == 0 or type == 1 then
preyWindow.balance:setText(tr("Balance") .. ":\n" .. (bankGold + inventoryGold))
end
end
function showMessage(title, message)
if msgWindow then
msgWindow:destroy()
end
msgWindow = displayInfoBox(title, message)
msgWindow:show()
msgWindow:raise()
msgWindow:focus()
end