From b4642f9038cc411078ffe60577ac047812d9d6b9 Mon Sep 17 00:00:00 2001 From: Samuel Date: Mon, 8 Oct 2012 06:51:25 +0200 Subject: [PATCH] Custom spell support & tweaks - Description available - Easy setup for custom spells - Sample custom spells --- modules/game_spelllist/icons/sample.png | Bin 0 -> 22549 bytes modules/game_spelllist/spelllist.lua | 276 +++++++++++++++--------- modules/game_spelllist/spelllist.otui | 19 +- modules/gamelib/spells.lua | 260 +++++++++++----------- 4 files changed, 323 insertions(+), 232 deletions(-) create mode 100644 modules/game_spelllist/icons/sample.png diff --git a/modules/game_spelllist/icons/sample.png b/modules/game_spelllist/icons/sample.png new file mode 100644 index 0000000000000000000000000000000000000000..14aa3b05df49cf4449d019dc271c08fb40d08536 GIT binary patch literal 22549 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 CxbUF> literal 0 HcmV?d00001 diff --git a/modules/game_spelllist/spelllist.lua b/modules/game_spelllist/spelllist.lua index 3296dd04..d387e0a7 100644 --- a/modules/game_spelllist/spelllist.lua +++ b/modules/game_spelllist/spelllist.lua @@ -1,34 +1,53 @@ -spelllistWindow = nil -spelllistButton = nil -spellList = nil -nameValueLabel = nil -formulaValueLabel = nil -vocationValueLabel = nil -groupValueLabel = nil -typeValueLabel = nil -cooldownValueLabel = nil -levelValueLabel = nil -manaValueLabel = nil -premiumValueLabel = nil - -vocationBoxAny = nil -vocationBoxSorcerer = nil -vocationBoxDruid = nil -vocationBoxPaladin = nil -vocationBoxKnight = nil - -groupBoxAny = nil -groupBoxAttack = nil -groupBoxHealing = nil -groupBoxSupport = nil - -premiumBoxAny = nil -premiumBoxNo = nil -premiumBoxYes = nil - -vocationRadioGroup = nil -groupRadioGroup = nil -premiumRadioGroup = nil +SpelllistSettings = { + ['Default'] = { + iconFile = 'icons.png', + iconSize = {width = 32, height = 32}, + spellListWidth = 210, + spellWindowWidth = 550, + spellOrder = {'Animate Dead', 'Annihilation', 'Avalanche', 'Berserk', 'Blood Rage', 'Brutal Strike', 'Cancel Invisibility', 'Challenge', 'Chameleon', 'Charge', 'Conjure Arrow', 'Conjure Bolt', 'Conjure Explosive Arrow', 'Conjure Piercing Bolt', 'Conjure Poisoned Arrow', 'Conjure Power Bolt', 'Conjure Sniper Arrow', 'Convince Creature', 'Creature Illusion', 'Cure Bleeding', 'Cure Burning', 'Cure Curse', 'Cure Electrification', 'Cure Poison', 'Cure Poison Rune', 'Curser', 'Death Strike', 'Desintegrate', 'Destroy Field', 'Divine Caldera', 'Divine Healing', 'Divine Missile', 'Electrify', 'Enchant Party', 'Enchant Spear', 'Enchant Staff', 'Energy Beam', 'Energy Field', 'Energy Strike', 'Energy Wall', 'Energy Wave', 'Energybomb', 'Envenom', 'Eternal Winter', 'Ethereal Spear', 'Explosion', 'Fierce Berserk', 'Find Person', 'Fire Field', 'Fire Wall', 'Fire Wave', 'Fireball', 'Firebomb', 'Flame Strike', 'Food', 'Front Sweep', 'Great Energy Beam', 'Great Fireball', 'Great Light', 'Groundshaker', 'Haste', 'Heal Friend', 'Heal Party', 'Heavy Magic Missile', 'Hells Core', 'Holy Flash', 'Holy Missile', 'Ice Strike', 'Ice Wave', 'Icicle', 'Ignite', 'Inflict Wound', 'Intense Healing', 'Intense Healing Rune', 'Intense Recovery', 'Intense Wound Cleansing', 'Invisibility', 'Levitate', 'Light', 'Light Healing', 'Light Magic Missile', 'Lightning', 'Magic Rope', 'Magic Shield', 'Magic Wall', 'Mass Healing', 'Paralyze', 'Physical Strike', 'Poison Bomb', 'Poison Field', 'Poison Wall', 'Protect Party', 'Protector', 'Rage of the Skies', 'Recovery', 'Salvation', 'Sharpshooter', 'Soulfire', 'Stalagmite', 'Stone Shower', 'Strong Energy Strike', 'Strong Ethereal Spear', 'Strong Flame Strike', 'Strong Haste', 'Strong Ice Strike', 'Strong Ice Wave', 'Strong Terra Strike', 'Sudden Death', 'Summon Creature', 'Swift Foot', 'Terra Strike', 'Terra Wave', 'Thunderstorm', 'Train Party', 'Ultimate Energy Strike', 'Ultimate Flame Strike', 'Ultimate Healing', 'Ultimate Healing Rune', 'Ultimate Ice Strike', 'Ultimate Light', 'Ultimate Terra Strike', 'Whirlwind Throw', 'Wild Growth', 'Wound Cleansing', 'Wrath of Nature'} + }, + + ['Sample'] = { + iconFile = 'sample.png', + iconSize = {width = 64, height = 64}, + spellOrder = {'Critical Strike', 'Firefly', 'Fire Breath', 'Moonglaives', 'Wind Walk'} + } +} + +local SpelllistProfile = 'Default' + +spelllistWindow = nil +spelllistButton = nil +spellList = nil +nameValueLabel = nil +formulaValueLabel = nil +vocationValueLabel = nil +groupValueLabel = nil +typeValueLabel = nil +cooldownValueLabel = nil +levelValueLabel = nil +manaValueLabel = nil +premiumValueLabel = nil +descriptionValueLabel = nil + +vocationBoxAny = nil +vocationBoxSorcerer = nil +vocationBoxDruid = nil +vocationBoxPaladin = nil +vocationBoxKnight = nil + +groupBoxAny = nil +groupBoxAttack = nil +groupBoxHealing = nil +groupBoxSupport = nil + +premiumBoxAny = nil +premiumBoxNo = nil +premiumBoxYes = nil + +vocationRadioGroup = nil +groupRadioGroup = nil +premiumRadioGroup = nil -- consts FILTER_PREMIUM_ANY = 0 @@ -56,13 +75,23 @@ local filters = { groupId = FILTER_GROUP_ANY } -local spellDisplayOrder = {'Animate Dead', 'Annihilation', 'Avalanche', 'Berserk', 'Blood Rage', 'Brutal Strike', 'Cancel Invisibility', 'Challenge', 'Chameleon', 'Charge', 'Conjure Arrow', 'Conjure Bolt', 'Conjure Explosive Arrow', 'Conjure Piercing Bolt', 'Conjure Poisoned Arrow', 'Conjure Power Bolt', 'Conjure Sniper Arrow', 'Convince Creature', 'Creature Illusion', 'Cure Bleeding', 'Cure Burning', 'Cure Curse', 'Cure Electrification', 'Cure Poison', 'Cure Poison Rune', 'Curser', 'Death Strike', 'Desintegrate', 'Destroy Field', 'Divine Caldera', 'Divine Healing', 'Divine Missile', 'Electrify', 'Enchant Party', 'Enchant Spear', 'Enchant Staff', 'Energy Beam', 'Energy Field', 'Energy Strike', 'Energy Wall', 'Energy Wave', 'Energybomb', 'Envenom', 'Eternal Winter', 'Ethereal Spear', 'Explosion', 'Fierce Berserk', 'Find Person', 'Fire Field', 'Fire Wall', 'Fire Wave', 'Fireball', 'Firebomb', 'Flame Strike', 'Food', 'Front Sweep', 'Great Energy Beam', 'Great Fireball', 'Great Light', 'Groundshaker', 'Haste', 'Heal Friend', 'Heal Party', 'Heavy Magic Missile', 'Hells Core', 'Holy Flash', 'Holy Missile', 'Ice Strike', 'Ice Wave', 'Icicle', 'Ignite', 'Inflict Wound', 'Intense Healing', 'Intense Healing Rune', 'Intense Recovery', 'Intense Wound Cleansing', 'Invisibility', 'Levitate', 'Light', 'Light Healing', 'Light Magic Missile', 'Lightning', 'Magic Rope', 'Magic Shield', 'Magic Wall', 'Mass Healing', 'Paralyze', 'Physical Strike', 'Poison Bomb', 'Poison Field', 'Poison Wall', 'Protect Party', 'Protector', 'Rage of the Skies', 'Recovery', 'Salvation', 'Sharpshooter', 'Soulfire', 'Stalagmite', 'Stone Shower', 'Strong Energy Strike', 'Strong Ethereal Spear', 'Strong Flame Strike', 'Strong Haste', 'Strong Ice Strike', 'Strong Ice Wave', 'Strong Terra Strike', 'Sudden Death', 'Summon Creature', 'Swift Foot', 'Terra Strike', 'Terra Wave', 'Thunderstorm', 'Train Party', 'Ultimate Energy Strike', 'Ultimate Flame Strike', 'Ultimate Healing', 'Ultimate Healing Rune', 'Ultimate Ice Strike', 'Ultimate Light', 'Ultimate Terra Strike', 'Whirlwind Throw', 'Wild Growth', 'Wound Cleansing', 'Wrath of Nature'} +function setSpelllistProfile(name) + if SpelllistProfile == name then return end + + if SpelllistSettings[name] and SpellInfo[name] then + local oldProfile = SpelllistProfile + SpelllistProfile = name + changeSpelllistProfile(oldProfile) + else + perror('Spelllist profile \'' .. name .. '\' could not be set.') + end +end function getIconImageClip(id) - return (((id-1)%12)*32) .. ' ' .. ((math.ceil(id/12)-1)*32) .. ' 32 32' + return (((id-1)%12)*SpelllistSettings[SpelllistProfile].iconSize.width) .. ' ' .. ((math.ceil(id/12)-1)*SpelllistSettings[SpelllistProfile].iconSize.height) .. ' ' .. SpelllistSettings[SpelllistProfile].iconSize.width .. ' ' .. SpelllistSettings[SpelllistProfile].iconSize.height end -function setupOptions() +function setOptions() if g_game.getClientVersion() >= 950 then -- Vocation is only send in newer clients spelllistWindow:getChildById('buttonFilterVocation'):setVisible(true) else @@ -71,7 +100,7 @@ function setupOptions() end function init() - connect(g_game, { onGameStart = setupOptions, + connect(g_game, { onGameStart = setOptions, onGameEnd = resetWindow }) spelllistWindow = g_ui.displayUI('spelllist.otui', modules.game_interface.getRightPanel()) @@ -89,6 +118,7 @@ function init() levelValueLabel = spelllistWindow:getChildById('labelLevelValue') manaValueLabel = spelllistWindow:getChildById('labelManaValue') premiumValueLabel = spelllistWindow:getChildById('labelPremiumValue') + descriptionValueLabel = spelllistWindow:getChildById('labelDescriptionValue') vocationBoxAny = spelllistWindow:getChildById('vocationBoxAny') vocationBoxSorcerer = spelllistWindow:getChildById('vocationBoxSorcerer') @@ -135,34 +165,14 @@ function init() g_keyboard.bindKeyPress('Down', function() spellList:focusNextChild(KeyboardFocusReason) end, spelllistWindow) g_keyboard.bindKeyPress('Up', function() spellList:focusPreviousChild(KeyboardFocusReason) end, spelllistWindow) - - for i = 1, #spellDisplayOrder do - local spell = spellDisplayOrder[i] - local info = SpellInfo[spell] - local tmpLabel = g_ui.createWidget('SpellListLabel', spellList) - tmpLabel:setId(spell) - tmpLabel:setText(spell .. '\n\'' .. info.words .. '\'') - tmpLabel:setPhantom(false) - if not(SpellIcons[info.icon]) then - perror('Spell icon \'' .. info.icon .. '\' not found.') - else - tmpLabel:setImageClip(getIconImageClip(SpellIcons[info.icon][1])) - end - - tmpLabel.onClick = updateSpellInformation - end - - connect(spellList, { onChildFocusChange = function(self, focusedChild) - if focusedChild == nil then return end - updateSpellInformation(focusedChild) - end }) - - setupOptions() + initialiseSpelllist() + setOptions() + resizeWindow() end function terminate() - disconnect(g_game, { onGameStart = setupOptions, + disconnect(g_game, { onGameStart = setOptions, onGameEnd = resetWindow }) disconnect(spellList, { onChildFocusChange = function(self, focusedChild) @@ -171,51 +181,103 @@ function terminate() end }) spelllistButton:destroy() - spelllistButton = nil + spelllistButton = nil spelllistWindow:destroy() - spelllistWindow = nil + spelllistWindow = nil vocationRadioGroup:destroy() - vocationRadioGroup = nil + vocationRadioGroup = nil groupRadioGroup:destroy() - groupRadioGroup = nil + groupRadioGroup = nil premiumRadioGroup:destroy() - premiumRadioGroup = nil + premiumRadioGroup = nil - spellList = nil - nameValueLabel = nil - formulaValueLabel = nil - vocationValueLabel = nil - groupValueLabel = nil - typeValueLabel = nil - cooldownValueLabel = nil - levelValueLabel = nil - manaValueLabel = nil - premiumValueLabel = nil - - vocationBoxAny = nil - vocationBoxSorcerer = nil - vocationBoxDruid = nil - vocationBoxPaladin = nil - vocationBoxKnight = nil - - groupBoxAny = nil - groupBoxAttack = nil - groupBoxHealing = nil - groupBoxSupport = nil - - premiumBoxAny = nil - premiumBoxNo = nil - premiumBoxYes = nil + spellList = nil + nameValueLabel = nil + formulaValueLabel = nil + vocationValueLabel = nil + groupValueLabel = nil + typeValueLabel = nil + cooldownValueLabel = nil + levelValueLabel = nil + manaValueLabel = nil + premiumValueLabel = nil + descriptionValueLabel = nil + + vocationBoxAny = nil + vocationBoxSorcerer = nil + vocationBoxDruid = nil + vocationBoxPaladin = nil + vocationBoxKnight = nil + + groupBoxAny = nil + groupBoxAttack = nil + groupBoxHealing = nil + groupBoxSupport = nil + + premiumBoxAny = nil + premiumBoxNo = nil + premiumBoxYes = nil +end + +function initialiseSpelllist() + for i = 1, #SpelllistSettings[SpelllistProfile].spellOrder do + local spell = SpelllistSettings[SpelllistProfile].spellOrder[i] + local info = SpellInfo[SpelllistProfile][spell] + + local tmpLabel = g_ui.createWidget('SpellListLabel', spellList) + tmpLabel:setId(spell) + tmpLabel:setText(spell .. '\n\'' .. info.words .. '\'') + tmpLabel:setPhantom(false) + + local iconId = tonumber(info.icon) + if not iconId and SpellIcons[info.icon] then + iconId = SpellIcons[info.icon][1] + end + + if not(iconId) then + perror('Spell icon \'' .. info.icon .. '\' not found.') + end + + tmpLabel:setHeight(SpelllistSettings[SpelllistProfile].iconSize.height + 4) + tmpLabel:setTextOffset(topoint((SpelllistSettings[SpelllistProfile].iconSize.width + 10) .. ' ' .. (SpelllistSettings[SpelllistProfile].iconSize.height - 32)/2 + 3)) + tmpLabel:setImageSource('/game_spelllist/icons/' .. SpelllistSettings[SpelllistProfile].iconFile) + tmpLabel:setImageClip(getIconImageClip(iconId)) + tmpLabel:setImageSize(tosize(SpelllistSettings[SpelllistProfile].iconSize.width .. ' ' .. SpelllistSettings[SpelllistProfile].iconSize.height)) + tmpLabel.onClick = updateSpellInformation + end + + connect(spellList, { onChildFocusChange = function(self, focusedChild) + if focusedChild == nil then return end + updateSpellInformation(focusedChild) + end }) +end + +function changeSpelllistProfile(oldProfile) + -- Delete old labels + for i = 1, #SpelllistSettings[oldProfile].spellOrder do + local spell = SpelllistSettings[oldProfile].spellOrder[i] + local tmpLabel = spellList:getChildById(spell) + + tmpLabel:destroy() + end + + -- Create new spelllist and ajust window + initialiseSpelllist() + setOptions() + resizeWindow() + resetWindow() end function updateSpelllist() - for i = 1, #spellDisplayOrder do - local spell = spellDisplayOrder[i] - local info = SpellInfo[spell] + for i = 1, #SpelllistSettings[SpelllistProfile].spellOrder do + local spell = SpelllistSettings[SpelllistProfile].spellOrder[i] + local info = SpellInfo[SpelllistProfile][spell] local tmpLabel = spellList:getChildById(spell) local localPlayer = g_game.getLocalPlayer() + + if not info.level then print(spell) end if (not(filters.level) or info.level <= localPlayer:getLevel()) and (not(filters.vocation) or table.find(info.vocations, localPlayer:getVocation())) and (filters.vocationId == FILTER_VOCATION_ANY or table.find(info.vocations, filters.vocationId) or table.find(info.vocations, filters.vocationId+4)) and (filters.groupId == FILTER_GROUP_ANY or info.group[filters.groupId]) and (filters.premium == FILTER_PREMIUM_ANY or (info.premium and filters.premium == FILTER_PREMIUM_YES) or (not(info.premium) and filters.premium == FILTER_PREMIUM_NO)) then tmpLabel:setVisible(true) else @@ -227,18 +289,19 @@ end function updateSpellInformation(widget) local spell = widget:getId() - local name = '' - local formula = '' - local vocation = '' - local group = '' - local type = '' - local cooldown = '' - local level = '' - local mana = '' - local premium = '' + local name = '' + local formula = '' + local vocation = '' + local group = '' + local type = '' + local cooldown = '' + local level = '' + local mana = '' + local premium = '' + local description = '' - if SpellInfo[spell] then - local info = SpellInfo[spell] + if SpellInfo[SpelllistProfile][spell] then + local info = SpellInfo[SpelllistProfile][spell] name = spell formula = info.words @@ -262,6 +325,7 @@ function updateSpellInformation(widget) level = info.level mana = info.mana .. ' / ' .. info.soul premium = (info.premium and 'yes' or 'no') + description = info.description or '-' end nameValueLabel:setText(name) @@ -273,6 +337,7 @@ function updateSpellInformation(widget) levelValueLabel:setText(level) manaValueLabel:setText(mana) premiumValueLabel:setText(premium) + descriptionValueLabel:setText(description) end function toggle() @@ -333,6 +398,11 @@ function toggleFilter(widget, selectedWidget) updateSpelllist() end +function resizeWindow() + spelllistWindow:setWidth(SpelllistSettings['Default'].spellWindowWidth + SpelllistSettings[SpelllistProfile].iconSize.width - 32) + spellList:setWidth(SpelllistSettings['Default'].spellListWidth + SpelllistSettings[SpelllistProfile].iconSize.width - 32) +end + function resetWindow() spelllistWindow:hide() spelllistButton:setOn(false) diff --git a/modules/game_spelllist/spelllist.otui b/modules/game_spelllist/spelllist.otui index c8456802..d8abc18e 100644 --- a/modules/game_spelllist/spelllist.otui +++ b/modules/game_spelllist/spelllist.otui @@ -29,7 +29,7 @@ SpellInfoValueLabel < Label MainWindow id: spelllistWindow !text: tr('Spell List') - size: 500 400 + size: 550 400 @onEscape: toggle() TextList @@ -142,6 +142,12 @@ MainWindow anchors.top: labelMana.bottom text: Premium: + SpellInfoLabel + id: labelDescription + anchors.left: spellList.right + anchors.top: labelPremium.bottom + text: Description: + SpellInfoValueLabel id: labelNameValue anchors.left: labelName.right @@ -187,6 +193,11 @@ MainWindow anchors.left: labelPremium.right anchors.top: labelManaValue.bottom + SpellInfoValueLabel + id: labelDescriptionValue + anchors.left: labelDescription.right + anchors.top: labelPremiumValue.bottom + Label id: labelVocationFilter anchors.top: labelPremium.bottom @@ -194,7 +205,7 @@ MainWindow width: 70 font: verdana-11px-monochrome text: Vocation - margin-top: 25 + margin-top: 30 margin-left: 20 CheckBox @@ -245,7 +256,7 @@ MainWindow width: 70 font: verdana-11px-monochrome text: Group - margin-top: 25 + margin-top: 30 margin-left: 20 CheckBox @@ -288,7 +299,7 @@ MainWindow width: 70 font: verdana-11px-monochrome text: Premium - margin-top: 25 + margin-top: 30 margin-left: 20 CheckBox diff --git a/modules/gamelib/spells.lua b/modules/gamelib/spells.lua index c7e4d21a..2418c284 100644 --- a/modules/gamelib/spells.lua +++ b/modules/gamelib/spells.lua @@ -1,130 +1,140 @@ -- ['Spell Name'] = {words = '', exhaustion = spellCooldown, premium = true/false, type = 'Instant'/'Conjure', icon = iconName, mana = manaCost, level = levelRequirement, soul = soulCost, group = {[groupId] = groupCooldown}, vocation = {vocationIds}} SpellInfo = { - ['Death Strike'] = {words = 'exori mort', exhaustion = 2000, premium = true, type = 'Instant', icon = 'deathstrike', mana = 20, level = 16, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Flame Strike'] = {words = 'exori flam', exhaustion = 2000, premium = true, type = 'Instant', icon = 'flamestrike', mana = 20, level = 14, soul = 0, group = {[1] = 2000}, vocations = {1, 2, 5, 6}}, - ['Strong Flame Strike'] = {words = 'exori gran flam', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongflamestrike', mana = 60, level = 70, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, - ['Ultimate Flame Strike'] = {words = 'exori max flam', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateflamestrike', mana = 100, level = 90, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, - ['Energy Strike'] = {words = 'exori vis', exhaustion = 2000, premium = true, type = 'Instant', icon = 'energystrike', mana = 20, level = 12, soul = 0, group = {[1] = 2000}, vocations = {1, 2, 5, 6}}, - ['Strong Energy Strike'] = {words = 'exori gran vis', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongenergystrike', mana = 60, level = 80, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, - ['Ultimate Energy Strike'] = {words = 'exori max vis', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateenergystrike', mana = 100, level = 100,soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, - ['Whirlwind Throw'] = {words = 'exori hur', exhaustion = 6000, premium = true, type = 'Instant', icon = 'whirlwindthrow', mana = 40, level = 28, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Fire Wave'] = {words = 'exevo flam hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'firewave', mana = 25, level = 18, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Ethereal Spear'] = {words = 'exori con', exhaustion = 2000, premium = true, type = 'Instant', icon = 'eterealspear', mana = 25, level = 23, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, - ['Strong Ethereal Spear'] = {words = 'exori gran con', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongetherealspear', mana = 55, level = 90, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, - ['Energy Beam'] = {words = 'exevo vis lux', exhaustion = 4000, premium = false, type = 'Instant', icon = 'energybeam', mana = 40, level = 23, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Great Energy Beam'] = {words = 'exevo gran vis lux', exhaustion = 6000, premium = false, type = 'Instant', icon = 'greatenergybeam', mana = 110, level = 29, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Groundshaker'] = {words = 'exori mas', exhaustion = 8000, premium = true, type = 'Instant', icon = 'groundshaker', mana = 160, level = 33, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Berserk'] = {words = 'exori', exhaustion = 4000, premium = true, type = 'Instant', icon = 'berserk', mana = 115, level = 35, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Annihilation'] = {words = 'exori gran ico', exhaustion = 30000, premium = true, type = 'Instant', icon = 'annihilation', mana = 300, level = 110,soul = 0, group = {[1] = 4000}, vocations = {4, 8}}, - ['Brutal Strike'] = {words = 'exori ico', exhaustion = 6000, premium = true, type = 'Instant', icon = 'brutalstrike', mana = 30, level = 16, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Front Sweep'] = {words = 'exori min', exhaustion = 6000, premium = true, type = 'Instant', icon = 'frontsweep', mana = 200, level = 70, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Inflict Wound'] = {words = 'utori kor', exhaustion = 30000, premium = true, type = 'Instant', icon = 'inflictwound', mana = 30, level = 40, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Ignite'] = {words = 'utori flam', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ignite', mana = 30, level = 26, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Lightning'] = {words = 'exori amp vis', exhaustion = 8000, premium = true, type = 'Instant', icon = 'lightning', mana = 60, level = 55, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, - ['Curser'] = {words = 'utori mort', exhaustion = 50000, premium = true, type = 'Instant', icon = 'curse', mana = 30, level = 75, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Electrify'] = {words = 'utori vis', exhaustion = 30000, premium = true, type = 'Instant', icon = 'electrify', mana = 30, level = 34, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Energy Wave'] = {words = 'exevo vis hur', exhaustion = 8000, premium = false, type = 'Instant', icon = 'energywave', mana = 170, level = 38, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, - ['Rage of the Skies'] = {words = 'exevo gran mas vis', exhaustion = 40000, premium = true, type = 'Instant', icon = 'rageoftheskies', mana = 600, level = 55, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, - ['Fierce Berserk'] = {words = 'exori gran', exhaustion = 6000, premium = true, type = 'Instant', icon = 'fierceberserk', mana = 340, level = 90, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, - ['Hells Core'] = {words = 'exevo gran mas flam', exhaustion = 40000, premium = true, type = 'Instant', icon = 'hellscore', mana = 1100, level = 60, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, - ['Holy Flash'] = {words = 'utori san', exhaustion = 40000, premium = true, type = 'Instant', icon = 'holyflash', mana = 30, level = 70, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, - ['Divine Missile'] = {words = 'exori san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'divinemissile', mana = 20, level = 40, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, - ['Divine Caldera'] = {words = 'exevo mas san', exhaustion = 4000, premium = true, type = 'Instant', icon = 'divinecaldera', mana = 160, level = 50, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, - ['Physical Strike'] = {words = 'exori moe ico', exhaustion = 2000, premium = true, type = 'Instant', icon = 'physicalstrike', mana = 20, level = 16, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, - ['Eternal Winter'] = {words = 'exevo gran mas frigo',exhaustion = 40000, premium = true, type = 'Instant', icon = 'eternalwinter', mana = 1050, level = 60, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, - ['Ice Strike'] = {words = 'exori frigo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'icestrike', mana = 20, level = 15, soul = 0, group = {[1] = 2000}, vocations = {1, 5, 2, 6}}, - ['Strong Ice Strike'] = {words = 'exori gran frigo', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongicestrike', mana = 60, level = 80, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {2, 6}}, - ['Ultimate Ice Strike'] = {words = 'exori max frigo', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateicestrike', mana = 100, level = 100,soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, - ['Ice Wave'] = {words = 'exevo frigo hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'icewave', mana = 25, level = 18, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, - ['Strong Ice Wave'] = {words = 'exevo gran frigo hur',exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongicewave', mana = 170, level = 40, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, - ['Envenom'] = {words = 'utori pox', exhaustion = 40000, premium = true, type = 'Instant', icon = 'envenom', mana = 30, level = 50, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, - ['Terra Strike'] = {words = 'exori tera', exhaustion = 2000, premium = true, type = 'Instant', icon = 'terrastrike', mana = 20, level = 13, soul = 0, group = {[1] = 2000}, vocations = {1, 5, 2, 6}}, - ['Strong Terra Strike'] = {words = 'exori gran tera', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongterrastrike', mana = 60, level = 70, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {2, 6}}, - ['Ultimate Terra Strike'] = {words = 'exori max tera', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateterrastrike', mana = 100, level = 90, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, - ['Terra Wave'] = {words = 'exevo tera hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'terrawave', mana = 210, level = 38, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, - ['Wrath of Nature'] = {words = 'exevo gran mas tera', exhaustion = 40000, premium = true, type = 'Instant', icon = 'wrathofnature', mana = 700, level = 55, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, - ['Light Healing'] = {words = 'exura', exhaustion = 1000, premium = false, type = 'Instant', icon = 'lighthealing', mana = 20, level = 9, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 5, 6, 7}}, - ['Wound Cleansing'] = {words = 'exura ico', exhaustion = 1000, premium = false, type = 'Instant', icon = 'woundcleansing', mana = 40, level = 10, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, - ['Intense Wound Cleansing'] = {words = 'exura gran ico', exhaustion = 600000,premium = true, type = 'Instant', icon = 'intensewoundcleansing', mana = 200, level = 80, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, - ['Cure Bleeding'] = {words = 'exana kor', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curebleeding', mana = 30, level = 30, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, - ['Cure Electrification'] = {words = 'exana vis', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curseelectrification', mana = 30, level = 22, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, - ['Cure Poison'] = {words = 'exana pox', exhaustion = 6000, premium = false, type = 'Instant', icon = 'curepoison', mana = 30, level = 10, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Cure Burning'] = {words = 'exana flam', exhaustion = 6000, premium = true, type = 'Instant', icon = 'cureburning', mana = 30, level = 30, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, - ['Cure Curse'] = {words = 'exana mort', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curecurse', mana = 40, level = 80, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, - ['Recovery'] = {words = 'utura', exhaustion = 60000, premium = true, type = 'Instant', icon = 'recovery', mana = 75, level = 50, soul = 0, group = {[2] = 1000}, vocations = {4, 8, 3, 7}}, - ['Intense Recovery'] = {words = 'utura gran', exhaustion = 60000, premium = true, type = 'Instant', icon = 'intenserecovery', mana = 165, level = 100,soul = 0, group = {[2] = 1000}, vocations = {4, 8, 3, 7}}, - ['Salvation'] = {words = 'exura gran san', exhaustion = 1000, premium = true, type = 'Instant', icon = 'salvation', mana = 210, level = 60, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, - ['Intense Healing'] = {words = 'exura gran', exhaustion = 1000, premium = false, type = 'Instant', icon = 'intensehealing', mana = 70, level = 20, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 5, 6, 7}}, - ['Heal Friend'] = {words = 'exura sio', exhaustion = 1000, premium = true, type = 'Instant', icon = 'healfriend', mana = 140, level = 18, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, - ['Ultimate Healing'] = {words = 'exura vita', exhaustion = 1000, premium = false, type = 'Instant', icon = 'ultimatehealing', mana = 160, level = 30, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 5, 6}}, - ['Mass Healing'] = {words = 'exura gran mas res', exhaustion = 2000, premium = true, type = 'Instant', icon = 'masshealing', mana = 150, level = 36, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, - ['Divine Healing'] = {words = 'exura san', exhaustion = 1000, premium = false, type = 'Instant', icon = 'divinehealing', mana = 160, level = 35, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, - ['Light'] = {words = 'utevo lux', exhaustion = 2000, premium = false, type = 'Instant', icon = 'light', mana = 20, level = 8, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Find Person'] = {words = 'exiva', exhaustion = 2000, premium = false, type = 'Instant', icon = 'findperson', mana = 20, level = 8, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Magic Rope'] = {words = 'exani tera', exhaustion = 2000, premium = true, type = 'Instant', icon = 'magicrope', mana = 20, level = 9, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Levitate'] = {words = 'exani hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'levitate', mana = 50, level = 12, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Great Light'] = {words = 'utevo gran lux', exhaustion = 2000, premium = false, type = 'Instant', icon = 'greatlight', mana = 60, level = 13, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Magic Shield'] = {words = 'utamo vita', exhaustion = 2000, premium = false, type = 'Instant', icon = 'magicshield', mana = 50, level = 14, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Haste'] = {words = 'utani hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'haste', mana = 60, level = 14, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, - ['Charge'] = {words = 'utani tempo hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'charge', mana = 100, level = 25, soul = 0, group = {[3] = 2000}, vocations = {4, 8}}, - ['Swift Foot'] = {words = 'utamo tempo san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'swiftfoot', mana = 400, level = 55, soul = 0, group = {[1] = 10000, [3] = 2000}, vocations = {3, 7}}, - ['Challenge'] = {words = 'exeta res', exhaustion = 2000, premium = true, type = 'Instant', icon = 'challenge', mana = 30, level = 20, soul = 0, group = {[3] = 2000}, vocations = {8}}, - ['Strong Haste'] = {words = 'utani gran hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'stronghaste', mana = 100, level = 20, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Creature Illusion'] = {words = 'utevo res ina', exhaustion = 2000, premium = false, type = 'Instant', icon = 'creatureillusion', mana = 100, level = 23, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Ultimate Light'] = {words = 'utevo vis lux', exhaustion = 2000, premium = true, type = 'Instant', icon = 'ultimatelight', mana = 140, level = 26, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Cancel Invisibility'] = {words = 'exana ina', exhaustion = 2000, premium = true, type = 'Instant', icon = 'cancelinvisibility', mana = 200, level = 26, soul = 0, group = {[3] = 2000}, vocations = {3, 7}}, - ['Invisibility'] = {words = 'utana vid', exhaustion = 2000, premium = false, type = 'Instant', icon = 'invisible', mana = 440, level = 35, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Sharpshooter'] = {words = 'utito tempo san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'sharpshooter', mana = 450, level = 60, soul = 0, group = {[2] = 10000, [3] = 10000}, vocations = {3, 7}}, - ['Protector'] = {words = 'utamo tempo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'protector', mana = 200, level = 55, soul = 0, group = {[1] = 10000, [3] = 2000}, vocations = {4, 8}}, - ['Blood Rage'] = {words = 'utito tempo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'bloodrage', mana = 290, level = 60, soul = 0, group = {[3] = 2000}, vocations = {4, 8}}, - ['Train Party'] = {words = 'utito mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'trainparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {8}}, - ['Protect Party'] = {words = 'utamo mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'protectparty', mana = 'Var.', evel = 32, soul = 0, group = {[3] = 2000}, vocations = {7}}, - ['Heal Party'] = {words = 'utura mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'healparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {6}}, - ['Enchant Party'] = {words = 'utori mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'enchantparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {5}}, - ['Summon Creature'] = {words = 'utevo res', exhaustion = 2000, premium = false, type = 'Instant', icon = 'summoncreature', mana = 'Var.', level = 25, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Conjure Arrow'] = {words = 'exevo con', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'conjurearrow', mana = 100, level = 13, soul = 1, group = {[3] = 2000}, vocations = {3, 7}}, - ['Food'] = {words = 'exevo pan', exhaustion = 2000, premium = false, type = 'Instant', icon = 'food', mana = 120, level = 14, soul = 1, group = {[3] = 2000}, vocations = {2, 6}}, - ['Conjure Poisoned Arrow'] = {words = 'exevo con pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonedarrow', mana = 130, level = 16, soul = 2, group = {[3] = 2000}, vocations = {3, 7}}, - ['Conjure Bolt'] = {words = 'exevo con mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'conjurebolt', mana = 140, level = 17, soul = 2, group = {[3] = 2000}, vocations = {3, 7}}, - ['Conjure Sniper Arrow'] = {words = 'exevo con hur', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'sniperarrow', mana = 160, level = 24, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, - ['Conjure Explosive Arrow'] = {words = 'exevo con flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'explosivearrow', mana = 290, level = 25, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, - ['Conjure Piercing Bolt'] = {words = 'exevo con grav', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'piercingbolt', mana = 180, level = 33, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, - ['Enchant Staff'] = {words = 'exeta vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'enchantstaff', mana = 80, level = 41, soul = 0, group = {[3] = 2000}, vocations = {5}}, - ['Enchant Spear'] = {words = 'exeta con', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'enchantspear', mana = 350, level = 45, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, - ['Conjure Power Bolt'] = {words = 'exevo con vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'powerbolt', mana = 800, level = 59, soul = 3, group = {[3] = 2000}, vocations = {7}}, - ['Poison Field'] = {words = 'adevo grav pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonfield', mana = 200, level = 14, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Light Magic Missile'] = {words = 'adori min vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'lightmagicmissile', mana = 120, level = 15, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Fire Field'] = {words = 'adevo grav flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firefield', mana = 240, level = 15, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Fireball'] = {words = 'adori flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'fireball', mana = 460, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, - ['Energy Field'] = {words = 'adevo grav vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energyfield', mana = 320, level = 18, soul = 2, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Stalagmite'] = {words = 'adori tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'stalagmite', mana = 400, level = 24, soul = 2, group = {[3] = 2000}, vocations = {1, 5, 2, 6}}, - ['Great Fireball'] = {words = 'adori mas flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'greatfireball', mana = 530, level = 30, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, - ['Heavy Magic Missile'] = {words = 'adori vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'heavymagicmissile', mana = 350, level = 25, soul = 2, group = {[3] = 2000}, vocations = {1, 5, 2, 6}}, - ['Poison Bomb'] = {words = 'adevo mas pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonbomb', mana = 520, level = 25, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, - ['Firebomb'] = {words = 'adevo mas flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firebomb', mana = 600, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Soulfire'] = {words = 'adevo res flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'soulfire', mana = 600, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Poison Wall'] = {words = 'adevo mas grav pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonwall', mana = 640, level = 29, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Explosion'] = {words = 'adevo mas hur', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'explosion', mana = 570, level = 31, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Fire Wall'] = {words = 'adevo mas grav flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firewall', mana = 780, level = 33, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Energybomb'] = {words = 'adevo mas vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energybomb', mana = 880, level = 37, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, - ['Energy Wall'] = {words = 'adevo mas grav vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energywall', mana = 1000, level = 41, soul = 5, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Sudden Death'] = {words = 'adori gran mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'suddendeath', mana = 985, level = 45, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, - ['Cure Poison Rune'] = {words = 'adana pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'antidote', mana = 200, level = 15, soul = 1, group = {[3] = 2000}, vocations = {2, 6}}, - ['Intense Healing Rune'] = {words = 'adura gran', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'intensehealingrune', mana = 240, level = 15, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, - ['Ultimate Healing Rune'] = {words = 'adura vita', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'ultimatehealingrune', mana = 400, level = 24, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Convince Creature'] = {words = 'adeta sio', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'convincecreature', mana = 200, level = 16, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Animate Dead'] = {words = 'adana mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'animatedead', mana = 600, level = 27, soul = 5, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, - ['Chameleon'] = {words = 'adevo ina', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'chameleon', mana = 600, level = 27, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, - ['Destroy Field'] = {words = 'adito grav', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'destroyfield', mana = 120, level = 17, soul = 2, group = {[3] = 2000}, vocations = {1, 2, 3, 5, 6, 7}}, - ['Desintegrate'] = {words = 'adito tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'desintegrate', mana = 200, level = 21, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 3, 5, 6, 7}}, - ['Magic Wall'] = {words = 'adevo grav tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'magicwall', mana = 750, level = 32, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, - ['Wild Growth'] = {words = 'adevo grav vita', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'wildgrowth', mana = 600, level = 27, soul = 5, group = {[3] = 2000}, vocations = {2, 6}}, - ['Paralyze'] = {words = 'adana ani', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'paralyze', mana = 1400, level = 54, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Icicle'] = {words = 'adori frigo', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'icicle', mana = 460, level = 28, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Avalanche'] = {words = 'adori mas frigo', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'avalanche', mana = 530, level = 30, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Stone Shower'] = {words = 'adori mas tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'stoneshower', mana = 430, level = 28, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, - ['Thunderstorm'] = {words = 'adori mas vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'thunderstorm', mana = 430, level = 28, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, - ['Holy Missile'] = {words = 'adori san', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'holymissile', mana = 350, level = 27, soul = 3, group = {[3] = 2000}, vocations = {3, 7}} + ['Default'] = { + ['Death Strike'] = {words = 'exori mort', exhaustion = 2000, premium = true, type = 'Instant', icon = 'deathstrike', mana = 20, level = 16, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Flame Strike'] = {words = 'exori flam', exhaustion = 2000, premium = true, type = 'Instant', icon = 'flamestrike', mana = 20, level = 14, soul = 0, group = {[1] = 2000}, vocations = {1, 2, 5, 6}}, + ['Strong Flame Strike'] = {words = 'exori gran flam', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongflamestrike', mana = 60, level = 70, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, + ['Ultimate Flame Strike'] = {words = 'exori max flam', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateflamestrike', mana = 100, level = 90, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, + ['Energy Strike'] = {words = 'exori vis', exhaustion = 2000, premium = true, type = 'Instant', icon = 'energystrike', mana = 20, level = 12, soul = 0, group = {[1] = 2000}, vocations = {1, 2, 5, 6}}, + ['Strong Energy Strike'] = {words = 'exori gran vis', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongenergystrike', mana = 60, level = 80, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, + ['Ultimate Energy Strike'] = {words = 'exori max vis', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateenergystrike', mana = 100, level = 100,soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, + ['Whirlwind Throw'] = {words = 'exori hur', exhaustion = 6000, premium = true, type = 'Instant', icon = 'whirlwindthrow', mana = 40, level = 28, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Fire Wave'] = {words = 'exevo flam hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'firewave', mana = 25, level = 18, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Ethereal Spear'] = {words = 'exori con', exhaustion = 2000, premium = true, type = 'Instant', icon = 'eterealspear', mana = 25, level = 23, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Strong Ethereal Spear'] = {words = 'exori gran con', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongetherealspear', mana = 55, level = 90, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Energy Beam'] = {words = 'exevo vis lux', exhaustion = 4000, premium = false, type = 'Instant', icon = 'energybeam', mana = 40, level = 23, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Great Energy Beam'] = {words = 'exevo gran vis lux', exhaustion = 6000, premium = false, type = 'Instant', icon = 'greatenergybeam', mana = 110, level = 29, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Groundshaker'] = {words = 'exori mas', exhaustion = 8000, premium = true, type = 'Instant', icon = 'groundshaker', mana = 160, level = 33, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Berserk'] = {words = 'exori', exhaustion = 4000, premium = true, type = 'Instant', icon = 'berserk', mana = 115, level = 35, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Annihilation'] = {words = 'exori gran ico', exhaustion = 30000, premium = true, type = 'Instant', icon = 'annihilation', mana = 300, level = 110,soul = 0, group = {[1] = 4000}, vocations = {4, 8}}, + ['Brutal Strike'] = {words = 'exori ico', exhaustion = 6000, premium = true, type = 'Instant', icon = 'brutalstrike', mana = 30, level = 16, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Front Sweep'] = {words = 'exori min', exhaustion = 6000, premium = true, type = 'Instant', icon = 'frontsweep', mana = 200, level = 70, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Inflict Wound'] = {words = 'utori kor', exhaustion = 30000, premium = true, type = 'Instant', icon = 'inflictwound', mana = 30, level = 40, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Ignite'] = {words = 'utori flam', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ignite', mana = 30, level = 26, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Lightning'] = {words = 'exori amp vis', exhaustion = 8000, premium = true, type = 'Instant', icon = 'lightning', mana = 60, level = 55, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {1, 5}}, + ['Curser'] = {words = 'utori mort', exhaustion = 50000, premium = true, type = 'Instant', icon = 'curse', mana = 30, level = 75, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Electrify'] = {words = 'utori vis', exhaustion = 30000, premium = true, type = 'Instant', icon = 'electrify', mana = 30, level = 34, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Energy Wave'] = {words = 'exevo vis hur', exhaustion = 8000, premium = false, type = 'Instant', icon = 'energywave', mana = 170, level = 38, soul = 0, group = {[1] = 2000}, vocations = {1, 5}}, + ['Rage of the Skies'] = {words = 'exevo gran mas vis', exhaustion = 40000, premium = true, type = 'Instant', icon = 'rageoftheskies', mana = 600, level = 55, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, + ['Fierce Berserk'] = {words = 'exori gran', exhaustion = 6000, premium = true, type = 'Instant', icon = 'fierceberserk', mana = 340, level = 90, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Hells Core'] = {words = 'exevo gran mas flam', exhaustion = 40000, premium = true, type = 'Instant', icon = 'hellscore', mana = 1100, level = 60, soul = 0, group = {[1] = 4000}, vocations = {1, 5}}, + ['Holy Flash'] = {words = 'utori san', exhaustion = 40000, premium = true, type = 'Instant', icon = 'holyflash', mana = 30, level = 70, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Divine Missile'] = {words = 'exori san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'divinemissile', mana = 20, level = 40, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Divine Caldera'] = {words = 'exevo mas san', exhaustion = 4000, premium = true, type = 'Instant', icon = 'divinecaldera', mana = 160, level = 50, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Physical Strike'] = {words = 'exori moe ico', exhaustion = 2000, premium = true, type = 'Instant', icon = 'physicalstrike', mana = 20, level = 16, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, + ['Eternal Winter'] = {words = 'exevo gran mas frigo',exhaustion = 40000, premium = true, type = 'Instant', icon = 'eternalwinter', mana = 1050, level = 60, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, + ['Ice Strike'] = {words = 'exori frigo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'icestrike', mana = 20, level = 15, soul = 0, group = {[1] = 2000}, vocations = {1, 5, 2, 6}}, + ['Strong Ice Strike'] = {words = 'exori gran frigo', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongicestrike', mana = 60, level = 80, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {2, 6}}, + ['Ultimate Ice Strike'] = {words = 'exori max frigo', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateicestrike', mana = 100, level = 100,soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, + ['Ice Wave'] = {words = 'exevo frigo hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'icewave', mana = 25, level = 18, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, + ['Strong Ice Wave'] = {words = 'exevo gran frigo hur',exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongicewave', mana = 170, level = 40, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, + ['Envenom'] = {words = 'utori pox', exhaustion = 40000, premium = true, type = 'Instant', icon = 'envenom', mana = 30, level = 50, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, + ['Terra Strike'] = {words = 'exori tera', exhaustion = 2000, premium = true, type = 'Instant', icon = 'terrastrike', mana = 20, level = 13, soul = 0, group = {[1] = 2000}, vocations = {1, 5, 2, 6}}, + ['Strong Terra Strike'] = {words = 'exori gran tera', exhaustion = 8000, premium = true, type = 'Instant', icon = 'strongterrastrike', mana = 60, level = 70, soul = 0, group = {[1] = 2000, [4] = 8000}, vocations = {2, 6}}, + ['Ultimate Terra Strike'] = {words = 'exori max tera', exhaustion = 30000, premium = true, type = 'Instant', icon = 'ultimateterrastrike', mana = 100, level = 90, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, + ['Terra Wave'] = {words = 'exevo tera hur', exhaustion = 4000, premium = false, type = 'Instant', icon = 'terrawave', mana = 210, level = 38, soul = 0, group = {[1] = 2000}, vocations = {2, 6}}, + ['Wrath of Nature'] = {words = 'exevo gran mas tera', exhaustion = 40000, premium = true, type = 'Instant', icon = 'wrathofnature', mana = 700, level = 55, soul = 0, group = {[1] = 4000}, vocations = {2, 6}}, + ['Light Healing'] = {words = 'exura', exhaustion = 1000, premium = false, type = 'Instant', icon = 'lighthealing', mana = 20, level = 9, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 5, 6, 7}}, + ['Wound Cleansing'] = {words = 'exura ico', exhaustion = 1000, premium = false, type = 'Instant', icon = 'woundcleansing', mana = 40, level = 10, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, + ['Intense Wound Cleansing'] = {words = 'exura gran ico', exhaustion = 600000,premium = true, type = 'Instant', icon = 'intensewoundcleansing', mana = 200, level = 80, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, + ['Cure Bleeding'] = {words = 'exana kor', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curebleeding', mana = 30, level = 30, soul = 0, group = {[2] = 1000}, vocations = {4, 8}}, + ['Cure Electrification'] = {words = 'exana vis', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curseelectrification', mana = 30, level = 22, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, + ['Cure Poison'] = {words = 'exana pox', exhaustion = 6000, premium = false, type = 'Instant', icon = 'curepoison', mana = 30, level = 10, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Cure Burning'] = {words = 'exana flam', exhaustion = 6000, premium = true, type = 'Instant', icon = 'cureburning', mana = 30, level = 30, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, + ['Cure Curse'] = {words = 'exana mort', exhaustion = 6000, premium = true, type = 'Instant', icon = 'curecurse', mana = 40, level = 80, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, + ['Recovery'] = {words = 'utura', exhaustion = 60000, premium = true, type = 'Instant', icon = 'recovery', mana = 75, level = 50, soul = 0, group = {[2] = 1000}, vocations = {4, 8, 3, 7}}, + ['Intense Recovery'] = {words = 'utura gran', exhaustion = 60000, premium = true, type = 'Instant', icon = 'intenserecovery', mana = 165, level = 100,soul = 0, group = {[2] = 1000}, vocations = {4, 8, 3, 7}}, + ['Salvation'] = {words = 'exura gran san', exhaustion = 1000, premium = true, type = 'Instant', icon = 'salvation', mana = 210, level = 60, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, + ['Intense Healing'] = {words = 'exura gran', exhaustion = 1000, premium = false, type = 'Instant', icon = 'intensehealing', mana = 70, level = 20, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 3, 5, 6, 7}}, + ['Heal Friend'] = {words = 'exura sio', exhaustion = 1000, premium = true, type = 'Instant', icon = 'healfriend', mana = 140, level = 18, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, + ['Ultimate Healing'] = {words = 'exura vita', exhaustion = 1000, premium = false, type = 'Instant', icon = 'ultimatehealing', mana = 160, level = 30, soul = 0, group = {[2] = 1000}, vocations = {1, 2, 5, 6}}, + ['Mass Healing'] = {words = 'exura gran mas res', exhaustion = 2000, premium = true, type = 'Instant', icon = 'masshealing', mana = 150, level = 36, soul = 0, group = {[2] = 1000}, vocations = {2, 6}}, + ['Divine Healing'] = {words = 'exura san', exhaustion = 1000, premium = false, type = 'Instant', icon = 'divinehealing', mana = 160, level = 35, soul = 0, group = {[2] = 1000}, vocations = {3, 7}}, + ['Light'] = {words = 'utevo lux', exhaustion = 2000, premium = false, type = 'Instant', icon = 'light', mana = 20, level = 8, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Find Person'] = {words = 'exiva', exhaustion = 2000, premium = false, type = 'Instant', icon = 'findperson', mana = 20, level = 8, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Magic Rope'] = {words = 'exani tera', exhaustion = 2000, premium = true, type = 'Instant', icon = 'magicrope', mana = 20, level = 9, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Levitate'] = {words = 'exani hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'levitate', mana = 50, level = 12, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Great Light'] = {words = 'utevo gran lux', exhaustion = 2000, premium = false, type = 'Instant', icon = 'greatlight', mana = 60, level = 13, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Magic Shield'] = {words = 'utamo vita', exhaustion = 2000, premium = false, type = 'Instant', icon = 'magicshield', mana = 50, level = 14, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Haste'] = {words = 'utani hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'haste', mana = 60, level = 14, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 3, 4, 5, 6, 7, 8}}, + ['Charge'] = {words = 'utani tempo hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'charge', mana = 100, level = 25, soul = 0, group = {[3] = 2000}, vocations = {4, 8}}, + ['Swift Foot'] = {words = 'utamo tempo san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'swiftfoot', mana = 400, level = 55, soul = 0, group = {[1] = 10000, [3] = 2000}, vocations = {3, 7}}, + ['Challenge'] = {words = 'exeta res', exhaustion = 2000, premium = true, type = 'Instant', icon = 'challenge', mana = 30, level = 20, soul = 0, group = {[3] = 2000}, vocations = {8}}, + ['Strong Haste'] = {words = 'utani gran hur', exhaustion = 2000, premium = true, type = 'Instant', icon = 'stronghaste', mana = 100, level = 20, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Creature Illusion'] = {words = 'utevo res ina', exhaustion = 2000, premium = false, type = 'Instant', icon = 'creatureillusion', mana = 100, level = 23, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Ultimate Light'] = {words = 'utevo vis lux', exhaustion = 2000, premium = true, type = 'Instant', icon = 'ultimatelight', mana = 140, level = 26, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Cancel Invisibility'] = {words = 'exana ina', exhaustion = 2000, premium = true, type = 'Instant', icon = 'cancelinvisibility', mana = 200, level = 26, soul = 0, group = {[3] = 2000}, vocations = {3, 7}}, + ['Invisibility'] = {words = 'utana vid', exhaustion = 2000, premium = false, type = 'Instant', icon = 'invisible', mana = 440, level = 35, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Sharpshooter'] = {words = 'utito tempo san', exhaustion = 2000, premium = true, type = 'Instant', icon = 'sharpshooter', mana = 450, level = 60, soul = 0, group = {[2] = 10000, [3] = 10000}, vocations = {3, 7}}, + ['Protector'] = {words = 'utamo tempo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'protector', mana = 200, level = 55, soul = 0, group = {[1] = 10000, [3] = 2000}, vocations = {4, 8}}, + ['Blood Rage'] = {words = 'utito tempo', exhaustion = 2000, premium = true, type = 'Instant', icon = 'bloodrage', mana = 290, level = 60, soul = 0, group = {[3] = 2000}, vocations = {4, 8}}, + ['Train Party'] = {words = 'utito mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'trainparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {8}}, + ['Protect Party'] = {words = 'utamo mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'protectparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {7}}, + ['Heal Party'] = {words = 'utura mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'healparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {6}}, + ['Enchant Party'] = {words = 'utori mas sio', exhaustion = 2000, premium = true, type = 'Instant', icon = 'enchantparty', mana = 'Var.', level = 32, soul = 0, group = {[3] = 2000}, vocations = {5}}, + ['Summon Creature'] = {words = 'utevo res', exhaustion = 2000, premium = false, type = 'Instant', icon = 'summoncreature', mana = 'Var.', level = 25, soul = 0, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Conjure Arrow'] = {words = 'exevo con', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'conjurearrow', mana = 100, level = 13, soul = 1, group = {[3] = 2000}, vocations = {3, 7}}, + ['Food'] = {words = 'exevo pan', exhaustion = 2000, premium = false, type = 'Instant', icon = 'food', mana = 120, level = 14, soul = 1, group = {[3] = 2000}, vocations = {2, 6}}, + ['Conjure Poisoned Arrow'] = {words = 'exevo con pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonedarrow', mana = 130, level = 16, soul = 2, group = {[3] = 2000}, vocations = {3, 7}}, + ['Conjure Bolt'] = {words = 'exevo con mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'conjurebolt', mana = 140, level = 17, soul = 2, group = {[3] = 2000}, vocations = {3, 7}}, + ['Conjure Sniper Arrow'] = {words = 'exevo con hur', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'sniperarrow', mana = 160, level = 24, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, + ['Conjure Explosive Arrow'] = {words = 'exevo con flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'explosivearrow', mana = 290, level = 25, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, + ['Conjure Piercing Bolt'] = {words = 'exevo con grav', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'piercingbolt', mana = 180, level = 33, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, + ['Enchant Staff'] = {words = 'exeta vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'enchantstaff', mana = 80, level = 41, soul = 0, group = {[3] = 2000}, vocations = {5}}, + ['Enchant Spear'] = {words = 'exeta con', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'enchantspear', mana = 350, level = 45, soul = 3, group = {[3] = 2000}, vocations = {3, 7}}, + ['Conjure Power Bolt'] = {words = 'exevo con vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'powerbolt', mana = 800, level = 59, soul = 3, group = {[3] = 2000}, vocations = {7}}, + ['Poison Field'] = {words = 'adevo grav pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonfield', mana = 200, level = 14, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Light Magic Missile'] = {words = 'adori min vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'lightmagicmissile', mana = 120, level = 15, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Fire Field'] = {words = 'adevo grav flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firefield', mana = 240, level = 15, soul = 1, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Fireball'] = {words = 'adori flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'fireball', mana = 460, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, + ['Energy Field'] = {words = 'adevo grav vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energyfield', mana = 320, level = 18, soul = 2, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Stalagmite'] = {words = 'adori tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'stalagmite', mana = 400, level = 24, soul = 2, group = {[3] = 2000}, vocations = {1, 5, 2, 6}}, + ['Great Fireball'] = {words = 'adori mas flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'greatfireball', mana = 530, level = 30, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, + ['Heavy Magic Missile'] = {words = 'adori vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'heavymagicmissile', mana = 350, level = 25, soul = 2, group = {[3] = 2000}, vocations = {1, 5, 2, 6}}, + ['Poison Bomb'] = {words = 'adevo mas pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonbomb', mana = 520, level = 25, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, + ['Firebomb'] = {words = 'adevo mas flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firebomb', mana = 600, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Soulfire'] = {words = 'adevo res flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'soulfire', mana = 600, level = 27, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Poison Wall'] = {words = 'adevo mas grav pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'poisonwall', mana = 640, level = 29, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Explosion'] = {words = 'adevo mas hur', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'explosion', mana = 570, level = 31, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Fire Wall'] = {words = 'adevo mas grav flam', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'firewall', mana = 780, level = 33, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Energybomb'] = {words = 'adevo mas vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energybomb', mana = 880, level = 37, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, + ['Energy Wall'] = {words = 'adevo mas grav vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'energywall', mana = 1000, level = 41, soul = 5, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Sudden Death'] = {words = 'adori gran mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'suddendeath', mana = 985, level = 45, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, + ['Cure Poison Rune'] = {words = 'adana pox', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'antidote', mana = 200, level = 15, soul = 1, group = {[3] = 2000}, vocations = {2, 6}}, + ['Intense Healing Rune'] = {words = 'adura gran', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'intensehealingrune', mana = 240, level = 15, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, + ['Ultimate Healing Rune'] = {words = 'adura vita', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'ultimatehealingrune', mana = 400, level = 24, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Convince Creature'] = {words = 'adeta sio', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'convincecreature', mana = 200, level = 16, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Animate Dead'] = {words = 'adana mort', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'animatedead', mana = 600, level = 27, soul = 5, group = {[3] = 2000}, vocations = {1, 2, 5, 6}}, + ['Chameleon'] = {words = 'adevo ina', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'chameleon', mana = 600, level = 27, soul = 2, group = {[3] = 2000}, vocations = {2, 6}}, + ['Destroy Field'] = {words = 'adito grav', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'destroyfield', mana = 120, level = 17, soul = 2, group = {[3] = 2000}, vocations = {1, 2, 3, 5, 6, 7}}, + ['Desintegrate'] = {words = 'adito tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'desintegrate', mana = 200, level = 21, soul = 3, group = {[3] = 2000}, vocations = {1, 2, 3, 5, 6, 7}}, + ['Magic Wall'] = {words = 'adevo grav tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'magicwall', mana = 750, level = 32, soul = 5, group = {[3] = 2000}, vocations = {1, 5}}, + ['Wild Growth'] = {words = 'adevo grav vita', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'wildgrowth', mana = 600, level = 27, soul = 5, group = {[3] = 2000}, vocations = {2, 6}}, + ['Paralyze'] = {words = 'adana ani', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'paralyze', mana = 1400, level = 54, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Icicle'] = {words = 'adori frigo', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'icicle', mana = 460, level = 28, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Avalanche'] = {words = 'adori mas frigo', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'avalanche', mana = 530, level = 30, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Stone Shower'] = {words = 'adori mas tera', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'stoneshower', mana = 430, level = 28, soul = 3, group = {[3] = 2000}, vocations = {2, 6}}, + ['Thunderstorm'] = {words = 'adori mas vis', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'thunderstorm', mana = 430, level = 28, soul = 3, group = {[3] = 2000}, vocations = {1, 5}}, + ['Holy Missile'] = {words = 'adori san', exhaustion = 2000, premium = false, type = 'Conjure', icon = 'holymissile', mana = 350, level = 27, soul = 3, group = {[3] = 2000}, vocations = {3, 7}} + }, + + ['Sample'] = { + ['Wind Walk'] = {words = 'windwalk', description = 'Run at enormous speed.', exhaustion = 2000, premium = false, type = 'Instant', icon = 1, mana = 50, level = 10, soul = 0, group = {[3] = 2000}, vocations = {1, 2}}, + ['Fire Breath'] = {words = 'firebreath', description = 'A strong firewave.', exhaustion = 2000, premium = false, type = 'Instant', icon = 2, mana = 350, level = 27, soul = 0, group = {[1] = 2000}, vocations = {4, 8}}, + ['Moonglaives'] = {words = 'moonglaives', description = 'Throw moonglaives around you.', exhaustion = 2000, premium = false, type = 'Instant', icon = 3, mana = 90, level = 55, soul = 0, group = {[1] = 2000}, vocations = {3, 7}}, + ['Critical Strike'] = {words = 'criticalstrike', description = 'Land a critical strike.', exhaustion = 2000, premium = false, type = 'Instant', icon = 4, mana = 350, level = 27, soul = 0, group = {[1] = 2000}, vocations = {3, 4, 7, 8}}, + ['Firefly'] = {words = 'firefly', description = 'Summon a angry firefly', exhaustion = 2000, premium = false, type = 'Instant', icon = 5, mana = 350, level = 27, soul = 0, group = {[1] = 2000}, vocations = {1, 2, 5, 6}} + } } -- ['const_name'] = {client_id, TFS_id}