PK Adata/UT #P#Pux dPK A data/birth/UT #P#Pux dPK A+ w data/birth/wilder.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal: -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org getBirthDescriptor("class", "Wilder").descriptor_choices.subclass["Stone Warden"] = "allow" newBirthDescriptor{ type = "subclass", name = "Stone Warden", desc = { "Stone Wardens are dwarves trained in both the eldritch arts and the worship of nature.", "While other races are stuck in their belief that arcane forces and natural forces are meant to oppose, dwarves have found a way to combine them in harmony.", "Stone Wardens are armoured fighters, dual wielding shields to channel many of their powers.", "#GOLD#Stat modifiers:", "#LIGHT_BLUE# * +2 Strength, +0 Dexterity, +0 Constitution", "#LIGHT_BLUE# * +4 Magic, +3 Willpower, +0 Cunning", }, special_check = function(birth) if birth.descriptors_by_type.race ~= "Dwarf" then return false end return true end, power_source = {nature=true, arcane=true}, not_on_random_boss = true, stats = { str=2, wil=3, mag=4, }, talents_types = { ["wild-gift/call"]={true, 0.2}, ["wild-gift/earthen-power"]={true, 0.3}, ["wild-gift/earthen-vines"]={true, 0.3}, ["wild-gift/dwarven-nature"]={true, 0.3}, ["spell/stone-alchemy"]={false, 0.3}, ["spell/eldritch-stone"]={false, 0.3}, ["spell/eldritch-shield"]={true, 0.3}, ["spell/deeprock"]={false, 0.3}, ["spell/earth"]={true, 0.2}, ["spell/stone"]={false, 0.2}, ["cunning/survival"]={true, 0}, ["technique/combat-training"]={true, 0}, }, talents = { [ActorTalents.T_STONE_VINES] = 1, [ActorTalents.T_STONESHIELD] = 1, [ActorTalents.T_ELDRITCH_BLOW] = 1, [ActorTalents.T_ARMOUR_TRAINING] = 3, [ActorTalents.T_WEAPON_COMBAT] = 1, }, copy = { max_life = 110, resolvers.equip{ id=true, {type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000}, {type="armor", subtype="shield", name="iron shield", autoreq=true, ego_chance=-1000, ego_chance=-1000}, {type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000} }, }, copy_add = { life_rating = 2, }, } PK A data/talents/UT #P#Pux dPK Adata/talents/spells/UT #P#Pux dPK A_data/talents/spells/spells.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/eldritch-shield", name = "eldritch shield", description = "Infuse arcane forces in your shield." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/eldritch-stone", name = "eldritch stone", description = "Summon stony spikes inbued with various powers." } newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="spell/deeprock", name = "deeprock", description = "Harness the power of the world to turn into a Deeprock Form." } damDesc = Talents.main_env.damDesc spells_req1 = Talents.main_env.spells_req1 spells_req2 = Talents.main_env.spells_req2 spells_req3 = Talents.main_env.spells_req3 spells_req4 = Talents.main_env.spells_req4 spells_req5 = Talents.main_env.spells_req5 spells_req_high1 = Talents.main_env.spells_req_high1 spells_req_high2 = Talents.main_env.spells_req_high2 spells_req_high3 = Talents.main_env.spells_req_high3 spells_req_high4 = Talents.main_env.spells_req_high4 spells_req_high5 = Talents.main_env.spells_req_high5 load("/data-stone-wardens/talents/spells/eldritch-shield.lua") load("/data-stone-wardens/talents/spells/eldritch-stone.lua") load("/data-stone-wardens/talents/spells/deeprock.lua") PK A data/talents/spells/deeprock.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Deeprock Form", type = {"spell/deeprock", 1}, require = spells_req_high1, points = 5, equilibrium = 15, mana = 60, cooldown = 30, tactical = { ATTACK = 5 }, range = 10, radius = function(self, t) return 5 end, requires_target = true, getTime = function(self, t) return math.ceil(5 + self:combatTalentSpellDamage(t, 10, 150) / 10) end, getDam = function(self, t) return 5 + (self:combatTalentSpellDamage(t, 10, 250) / 10) end, getPen = function(self, t) return 5 + self:getTalentLevel(t) * 1.6 end, getArmor = function(self, t) return 5 + self:getTalentLevel(t) * 2.3 end, action = function(self, t) self:setEffect(self.EFF_DEEPROCK_FORM, t.getTime(self, t), {dam=t.getDam(self, t), pen=t.getPen(self, t), armor=t.getArmor(self, t)}) game:playSoundNear(self, "talents/earth") return true end, info = function(self, t) return ([[You call upon the very core of the world, harnessing its power to transform your body. For %d turns you become a Deeprock Elemental, increasing physical damage by %d%%, physical damage penetration by %d%%, armour by %d and gaining two size categories. Effects increases with spellpower.]]) :format(t.getTime(self, t),t.getDam(self, t),t.getPen(self, t),t.getArmor(self, t)) end, } newTalent{ name = "Volcanic Rock", type = {"spell/deeprock", 2}, require = spells_req_high2, points = 5, mode = "passive", info = function(self, t) local tv = self:getTalentFromId(self.T_VOLCANO) return ([[When you turn into a Deeprock elemental you also gain the power to invoke volcanos: %s]]): format(self:getTalentFullDescription(tv, self:getTalentLevelRaw(t) * 2):toString()) end, } newTalent{ name = "Boulder Rock", type = {"spell/deeprock", 3}, require = spells_req_high3, points = 5, mode = "passive", info = function(self, t) local tv = self:getTalentFromId(self.T_THROW_BOULDER) return ([[When you turn into a Deeprock elemental you also gain the power to throw boulders. %s]]): format(self:getTalentFullDescription(tv, self:getTalentLevelRaw(t) * 2):toString()) end, } newTalent{ name = "Mountainhewn", type = {"spell/deeprock", 4}, require = spells_req_high4, points = 5, mode = "passive", info = function(self, t) return ([[Your deeprock form become indomitable, granting you %d%% resistace to cuts, poisons, diseases and stuns. At level 5 while Deeprock Form is active all damage check physical resistance instead of the incomming damage resistance.]]): format(20 + self:getTalentLevel(t) * 7) end, } PK AK5'data/talents/spells/eldritch-shield.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Eldritch Blow", type = {"spell/eldritch-shield", 1}, require = spells_req1, points = 5, equilibrium = 3, mana = 10, cooldown = 10, range = 1, tactical = { ATTACK = { ARCANE = 2 }, DISABLE = { stun = 2 } }, requires_target = true, on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldricth Blow without a shield!") end return false end return true end, action = function(self, t) local shield = self:hasShield() local tg = {type="hit", range=self:getTalentRange(t)} local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end -- First attack with both weapon & shield (since we have the Stoneshield talent) local hit = self:attackTarget(target, DamageType.ARCANE, self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), true) -- Try to stun ! if hit then if target:canBe("stun") then target:setEffect(target.EFF_STUNNED, 2 + math.floor(self:getTalentLevel(t) / 2), {apply_power=self:combatPhysicalpower(), apply_save="combatSpellResist"}) else game.logSeen(target, "%s resists the stun!", target.name:capitalize()) end end return true end, info = function(self, t) return ([[Channel eldritch forces in your attack, hitting the target with your weapon and shield doing %d%% arcane damage. If the any of the attacks hit, the target is stunned for %d turns. The stun is considered a magical attack and thus is resisted with spell save, not physical save. Damage increases with spellpower.]]) :format(100 * self:combatTalentWeaponDamage(t, 0.6, (100 + self:combatTalentSpellDamage(t, 50, 300)) / 100), 2 + math.floor(self:getTalentLevel(t) / 2)) end, } newTalent{ name = "Eldritch Infusion", type = {"spell/eldritch-shield", 2}, require = spells_req2, points = 5, mode = "sustained", sustain_equilibrium = 15, sustain_mana = 50, cooldown = 30, tactical = { ATTACK = 3, BUFF = 2 }, getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 40) end, activate = function(self, t) local dam = t.getDamage(self, t) return { proj = self:addTemporaryValue("melee_project", {[DamageType.ARCANE]=dam}), onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.ARCANE]=dam * 0.7}), } end, deactivate = function(self, t, p) self:removeTemporaryValue("melee_project", p.proj) self:removeTemporaryValue("on_melee_hit", p.onhit) return true end, info = function(self, t) local dam = t.getDamage(self, t) return ([[Imbues your shields with arcane power, dealing %0.2f arcane damage with each attacks and %0.2f arcane damage when hit. The damage will increase with Spellpower.]]): format(damDesc(self, DamageType.ARCANE, dam), damDesc(self, DamageType.ARCANE, dam * 0.7)) end, } newTalent{ name = "Eldritch Fury", type = {"spell/eldritch-shield", 3}, require = spells_req3, points = 5, equilibrium = 20, mana = 30, cooldown = 12, requires_target = true, tactical = { ATTACK = { NATURE = 3 }, DISABLE = { stun = 1 } }, range = 1, on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldricth Fury without a shield!") end return false end return true end, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t)} local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end -- First attack with both weapon & shield (since we have the Stoneshield talent) local hit1 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true) local hit2 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true) local hit3 = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 0.6, 1.6), true) -- Try to stun ! if hit1 or hit2 or hit3 then if target:canBe("stun") then target:setEffect(target.EFF_DAZED, 3 + math.floor(self:getTalentLevel(t)), {apply_power=self:combatPhysicalpower(), apply_save="combatSpellResist"}) else game.logSeen(target, "%s resists the dazing blows!", target.name:capitalize()) end end return true end, info = function(self, t) return ([[Channel eldritch forces to speed up your attacks, hitting the target three times with your shields doing %d%% nature damage. If any of the attacks hit, the target is dazed for %d turns. The daze is considered a magical attack and thus is resisted with spell save, not physical save.]]) :format(100 * self:combatTalentWeaponDamage(t, 0.6, 1.6), 3 + math.floor(self:getTalentLevel(t))) end, } newTalent{ name = "Eldritch Slam", type = {"spell/eldritch-shield", 4}, require = spells_req4, points = 5, equilibrium = 10, mana = 30, cooldown = 20, tactical = { ATTACKAREA = { PHYSICAL = 3 } }, requires_target = true, range = 1, radius = function(self, t) return 1 + self:getTalentLevelRaw(t) end, on_pre_use = function(self, t, silent) local shield = self:hasShield() if not shield then if not silent then game.logPlayer(self, "You cannot use Eldritch Slam without a shield!") end return false end return true end, action = function(self, t) local tg = {type="ball", radius=self:getTalentRadius(t)} self:project(tg, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target or target == self then return end self:attackTarget(target, DamageType.ARCANE, self:combatTalentWeaponDamage(t, 1.3, 2.6), true) end) game.level.map:particleEmitter(self.x, self.y, tg.radius, "shieldstorm", {radius=tg.radius}) game:playSoundNear(self, "talents/icestorm") return true end, info = function(self, t) return ([[Slam your shield on the ground, doing %d%% arcane damage in a radius of %d.]]) :format(100 * self:combatTalentWeaponDamage(t, 1.3, 2.6), self:getTalentRadius(t)) end, } PK AHH&data/talents/spells/eldritch-stone.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Stone Spikes", type = {"spell/eldritch-stone", 1}, require = spells_req1, points = 5, equilibrium = 8, mana = 20, cooldown = 12, tactical = { ATTACK = function(self, t, target) local v = { PHYSICAL = 2 } if self:knowTalent(self.T_POISONED_SPIKES) then v.NATURE = 1 end if self:knowTalent(self.T_ELDRITCH_SPIKES) then v.ARCANE = 1 end if self:knowTalent(self.T_IMPALING_SPIKES) then v.PHYSICAL = 3 end return v end, DISABLE = function(self, t, target) local v = {} if self:knowTalent(self.T_POISONED_SPIKES) then v.heal = 1 end if self:knowTalent(self.T_ELDRITCH_SPIKES) then v.silence = 1 end if self:knowTalent(self.T_IMPALING_SPIKES) then v.disarm = 1 end return next(v) and v or 0 end, }, range = 0, radius = function(self, t) return 5 end, requires_target = true, target = function(self, t) return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} end, getDamage = function(self, t) return self:combatTalentSpellDamage(t, 50, 250) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) if not x or not y then return nil end self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end if target:canBe("cut") then target:setEffect(target.EFF_CUT, 6, {apply_power=self:combatSpellpower(), src=self, power=t.getDamage(self, t) / 6}) end if self:knowTalent(self.T_POISONED_SPIKES) then local st = self:getTalentFromId(self.T_POISONED_SPIKES) if target:canBe("poison") then target:setEffect(target.EFF_INSIDIOUS_POISON, 6, {apply_power=self:combatSpellpower(), src=self, heal_factor=st.getHeal(self, st), power=st.getDamage(self, st) / 6}) end end if self:knowTalent(self.T_ELDRITCH_SPIKES) then local st = self:getTalentFromId(self.T_ELDRITCH_SPIKES) DamageType:get(DamageType.ARCANE).projector(self, px, py, DamageType.ARCANE, st.getDamage(self, st)) if rng.percent(st.getSilence(self, t)) and target:canBe("silence") then target:setEffect(target.EFF_SILENCED, 6, {apply_power=self:combatSpellpower()}) end end if self:knowTalent(self.T_IMPALING_SPIKES) then local st = self:getTalentFromId(self.T_IMPALING_SPIKES) DamageType:get(DamageType.PHYSICAL).projector(self, px, py, DamageType.PHYSICAL, st.getDamage(self, st)) if rng.percent(st.getDisarm(self, t)) and target:canBe("disarm") then target:setEffect(target.EFF_DISARMED, 6, {apply_power=self:combatSpellpower()}) end end end, nil, {type="stone_spikes"}) game:playSoundNear(self, "talents/earth") return true end, info = function(self, t) return ([[Stony spikes briefly sprout from the ground in a cone, cutting all creatures caught for %0.2f total physical damage over 6 turns. Damage increases with spellpower.]]) :format(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t))) end, } newTalent{ name = "Poisoned Spikes", type = {"spell/eldritch-stone", 2}, require = spells_req2, points = 5, mode = "passive", getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 200) end, getHeal = function(self, t) return 20 + self:combatTalentSpellDamage(t, 30, 50) end, info = function(self, t) local dam = t.getDamage(self, t) return ([[Coats your stone spikes with insidious poison, dealing %0.2f total nature damage over 6 turns and reducing all healing by %d%%. The damage and heal reduction will increase with Spellpower.]]): format(damDesc(self, DamageType.NATURE, t.getDamage(self, t)), t.getHeal(self, t)) end, } newTalent{ name = "Eldritch Spikes", type = {"spell/eldritch-stone", 3}, require = spells_req3, points = 5, mode = "passive", getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 180) end, getSilence = function(self, t) return 20 + self:combatTalentSpellDamage(t, 30, 50) end, info = function(self, t) local dam = t.getDamage(self, t) return ([[Imbues your stone spikes with arcane forces, dealing %0.2f arcane damage and giving %d%% chances to silence the targets for 6 turns. The damage and chance will increase with Spellpower.]]): format(damDesc(self, DamageType.ARCANE, t.getDamage(self, t)), t.getSilence(self, t)) end, } newTalent{ name = "Impaling Spikes", type = {"spell/eldritch-stone", 4}, require = spells_req4, points = 5, mode = "passive", getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 200) end, getDisarm = function(self, t) return 20 + self:combatTalentSpellDamage(t, 30, 50) end, info = function(self, t) return ([[Your stone spikes grow in length, instantly dealing %0.2f physical damage and giving %d%% chances to disarm the targets for 6 turns. The damage and chance will increase with Spellpower.]]): format(damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)), t.getDisarm(self, t)) end, } PK Adata/talents/gifts/UT #P#Pux dPK Afw:data/talents/gifts/gifts.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalentType{ allow_random=true, is_nature=true, type="wild-gift/earthen-power", name = "earthen power", description = "Dwarves have learned to imbue their shields with the power of stone itself." } newTalentType{ allow_random=true, is_nature=true, type="wild-gift/earthen-vines", name = "earthen vines", description = "Control the stone itself and bring it alive in the form of dreadful vines." } newTalentType{ allow_random=true, is_nature=true, type="wild-gift/dwarven-nature", name = "dwarven nature", description = "Learn to harness the inate power of your race." } damDesc = Talents.main_env.damDesc gifts_req1 = Talents.main_env.gifts_req1 gifts_req2 = Talents.main_env.gifts_req2 gifts_req3 = Talents.main_env.gifts_req3 gifts_req4 = Talents.main_env.gifts_req4 gifts_req5 = Talents.main_env.gifts_req5 load("/data-stone-wardens/talents/gifts/earthen-power.lua") load("/data-stone-wardens/talents/gifts/earthen-vines.lua") load("/data-stone-wardens/talents/gifts/dwarven-nature.lua") PK AV88%data/talents/gifts/dwarven-nature.luaUT P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Earthen Missiles", short_name = "DWARVEN_HALF_EARTHEN_MISSILES", type = {"spell/other",1}, points = 5, mana = 10, cooldown = 2, tactical = { ATTACK = { PHYSICAL = 1, cut = 1} }, range = 10, direct_hit = true, reflectable = true, proj_speed = 20, requires_target = true, getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200) end, action = function(self, t) local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}, friendlyfire=false, friendlyblock=false} local x, y = self:getTarget(tg) if not x or not y then return nil end local damage = t.getDamage(self, t) self:projectile(tg, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil) game:playSoundNear(self, "talents/earth") --missile #2 local tg2 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}, friendlyfire=false, friendlyblock=false} local x, y = self:getTarget(tg2) if x and y then self:projectile(tg2, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil) game:playSoundNear(self, "talents/earth") end --missile #3 (Talent Level 5 Bonus Missile) if self:getTalentLevel(t) >= 5 then local tg3 = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="stone_shards", trail="earthtrail"}, friendlyfire=false, friendlyblock=false} local x, y = self:getTarget(tg3) if x and y then self:projectile(tg3, x, y, DamageType.SPLIT_BLEED, self:spellCrit(damage), nil) game:playSoundNear(self, "talents/earth") end else end return true end, info = function(self, t) local count = 2 if self:getTalentLevel(t) >= 5 then count = count + 1 end local damage = t.getDamage(self, t) return ([[Conjures %d missile shaped rocks that you target individually at any target or targets in range. Each missile deals %0.2f physical damage, and an additional %0.2f bleeding damage every turn for 5 turns. At talent level 5, you can conjure one additional missile. The damage will increase with your Spellpower.]]):format(count,damDesc(self, DamageType.PHYSICAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/12)) end, } newTalent{ name = "Elemental Split", type = {"wild-gift/dwarven-nature", 1}, require = gifts_req1, points = 5, equilibrium = 20, cooldown = 30, getDuration = function(self, t) return math.ceil(5 + self:getTalentLevel(t)) end, on_pre_use = function(self, t) return not self:hasEffect(self.EFF_DEEPROCK_FORM) end, action = function(self, t) -- Find space local x, y = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true}) if x then local m = require("mod.class.NPC").new(self:clone{ shader = "shadow_simulacrum", shader_args = {time_factor=1000, base=0.5, color={0.6, 0.3, 0.6}}, no_drops = true, faction = self.faction, summoner = self, summoner_gain_exp=true, summon_time = t.getDuration(self, t), ai_target = {actor=nil}, ai = "summoned", ai_real = "tactical", name = "Crystaline Half ("..self.name..")", desc = [[A crystaline structure that has taken your exact form.]], }) m:removeAllMOs() m.make_escort = nil m.on_added_to_level = nil m.energy.value = 0 m.player = nil -- m.max_life = m.max_life * t.getHealth(self, t) -- m.life = util.bound(m.life, 0, m.max_life) m.forceLevelup = function() end m.die = nil m.on_die = nil m.on_acquire_target = nil m.seen_by = nil m.can_talk = nil m.puuid = nil m.on_takehit = nil m.exp_worth = 0 m.no_inventory_access = true m.clone_on_hit = nil local tids = table.keys(m.talents) for i, tid in ipairs(tids) do if tid ~= m.T_STONESIELD and tid ~= m.T_ARMOUR_TRAINING then m:unlearnTalent(tid, m:getTalentLevelRaw(tid)) end end m:learnTalent(m.T_DWARVEN_HALF_EARTHEN_MISSILES, true, self:getTalentLevelRaw(t)) m.remove_from_party_on_death = true if self:knowTalent(self.T_POWER_CORE) then m:learnTalent(m.T_RAIN_OF_SPIKES, true, math.floor(self:getTalentLevel(self.T_POWER_CORE))) end game.zone:addEntity(game.level, m, "actor", x, y) game.level.map:particleEmitter(x, y, 1, "shadow") if game.party:hasMember(self) then game.party:addMember(m, { control="no", type="dwarven nature crystaline half", title="Crystaline Half", orders = {target=true}, }) end end -- Find space local x, y = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true}) if x then local m = require("mod.class.NPC").new(self:clone{ shader = "shadow_simulacrum", shader_args = {time_factor=-8000, base=0.5, color={0.6, 0.4, 0.3}}, no_drops = true, faction = self.faction, summoner = self, summoner_gain_exp=true, summon_time = t.getDuration(self, t), ai_target = {actor=nil}, ai = "summoned", ai_real = "tactical", name = "Stone Half ("..self.name..")", desc = [[A stone structure that has taken your exact form.]], }) m:removeAllMOs() m.make_escort = nil m.on_added_to_level = nil m.energy.value = 0 m.player = nil -- m.max_life = m.max_life * t.getHealth(self, t) -- m.life = util.bound(m.life, 0, m.max_life) m.forceLevelup = function() end m.die = nil m.on_die = nil m.on_acquire_target = nil m.seen_by = nil m.can_talk = nil m.puuid = nil m.on_takehit = nil m.exp_worth = 0 m.no_inventory_access = true m.clone_on_hit = nil local tids = table.keys(m.talents) for i, tid in ipairs(tids) do if tid ~= m.T_STONESIELD and tid ~= m.T_ARMOUR_TRAINING then m:unlearnTalent(tid, m:getTalentLevelRaw(tid)) end end m.talent_cd_reduction={[m.T_TAUNT]=3}, m:learnTalent(m.T_TAUNT, true, self:getTalentLevelRaw(t)) m.remove_from_party_on_death = true if self:knowTalent(self.T_POWER_CORE) then m:learnTalent(m.T_STONE_LINK, true, math.floor(self:getTalentLevel(self.T_POWER_CORE))) end game.zone:addEntity(game.level, m, "actor", x, y) game.level.map:particleEmitter(x, y, 1, "shadow") if game.party:hasMember(self) then game.party:addMember(m, { control="no", type="dwarven nature stone half", title="Stone Half", orders = {target=true}, }) end end game:playSoundNear(self, "talents/spell_generic2") return true end, info = function(self, t) return ([[Reach inside your dwarven core and summon your stone and crystaline halves to fight alongside you for %d turns. Crystaline Half: will attack your foes with earthen missiles Stone Half: will taunt your foes to protect you This power can not be called upon while under the effect of Deeprock Form. ]]):format(t.getDuration(self, t)) end, } newTalent{ name = "Power Core", type = {"wild-gift/dwarven-nature", 2}, require = gifts_req2, points = 5, mode = "passive", info = function(self, t) return ([[Improves your halves with new powers: Crystaline Half: Rain of Spikes. A massive effect on a zone the makes all foes bleed. Stone Half: Stone Link. A protective shield over a radius that will redirect all damage inside it to the stone half. The level of those talents is %d.]]): format(self:getTalentLevel(t)) end, } newTalent{ name = "Dwarven Unity", type = {"wild-gift/dwarven-nature", 3}, require = gifts_req3, points = 5, equilibrium = 10, cooldown = 6, tactical = { ATTACK = 2, PROTECT = 2 }, radius = function(self, t) return 3 + math.floor(self:getTalentLevel(t)) end, on_pre_use = function(self, t) local cryst = game.party:findMember{type="dwarven nature crystaline half"} local stone = game.party:findMember{type="dwarven nature stone half"} if not cryst and not stone then return false end return true end, action = function(self, t) local cryst = game.party:findMember{type="dwarven nature crystaline half"} local stone = game.party:findMember{type="dwarven nature stone half"} if cryst then self:project({type="ball", radius=self:getTalentRadius(t), friendlyfire=false}, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end cryst:forceUseTalent(cryst.T_EARTHEN_MISSILES, {ignore_cd=true, ignore_energy=true, force_target=target, force_level=self:getTalentLevelRaw(t), ignore_ressources=true}) end) end if stone then game.level.map:remove(self.x, self.y, Map.ACTOR) game.level.map:remove(stone.x, stone.y, Map.ACTOR) game.level.map(self.x, self.y, Map.ACTOR, stone) game.level.map(stone.x, stone.y, Map.ACTOR, self) self.x, self.y, stone.x, stone.y = stone.x, stone.y, self.x, self.y game.level.map:particleEmitter(stone.x, stone.y, 1, "teleport") game.level.map:particleEmitter(self.x, self.y, 1, "teleport") self:project({type="ball", radius=self:getTalentRadius(t), friendlyfire=false}, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end target:setTarget(stone) end) end return true end, info = function(self, t) return ([[You call upon the immediate help of your halves. Your stone half will trade place with you and all creatures currently targetting you in a radius of %d will target it instead. Your crystaline half will instantly fire a volley of level %d earthen missiles at all foes near the stone half (or you if the stone half is dead) in radius %d.]]): format(self:getTalentRadius(t), self:getTalentLevelRaw(t), self:getTalentRadius(t)) end, } newTalent{ name = "Mergeback", type = {"wild-gift/dwarven-nature", 4}, require = gifts_req4, points = 5, equilibrium = 10, cooldown = 20, no_npc_use = true, radius = 3, getRemoveCount = function(self, t) return math.floor(4 + self:getTalentLevel(t)) end, getDamage = function(self, t) return self:combatTalentStatDamage(t, "wil", 60, 330) end, getHeal = function(self, t) return self:combatTalentStatDamage(t, "wil", 60, 330) end, on_pre_use = function(self, t) local cryst = game.party:findMember{type="dwarven nature crystaline half"} local stone = game.party:findMember{type="dwarven nature stone half"} if not cryst and not stone then return false end return true end, action = function(self, t) local cryst = game.party:findMember{type="dwarven nature crystaline half"} local stone = game.party:findMember{type="dwarven nature stone half"} local nb = (cryst and 1 or 0) + (stone and 1 or 0) if cryst then cryst:die() end if stone then stone:die() end local target = self local effs = {} for eff_id, p in pairs(target.tmp) do local e = target.tempeffect_def[eff_id] if (e.type == "magical" or e.type == "mental" or e.type == "physical") and e.status == "detrimental" then effs[#effs+1] = {"effect", eff_id} end end for i = 1, t.getRemoveCount(self, t) do if #effs == 0 then break end local eff = rng.tableRemove(effs) if eff[1] == "effect" then target:removeEffect(eff[2]) end end self:heal(self:mindCrit(t.getHeal(self, t) * nb)) self:project({type="ball", radius=self:getTalentRadius(t), friendlyfire=false}, self.x, self.y, DamageType.NATURE, self:mindCrit(t.getDamage(self, t)) * nb) game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "generic_ball", {radius=self:getTalentRadius(t), rm=0, rM=0, gm=200, gM=250, bm=100, bM=170, am=200, aM=255}) game:playSoundNear(self, "talents/stone") return true end, info = function(self, t) local nb = t.getRemoveCount(self, t) local dam = t.getDamage(self, t) local heal = t.getHeal(self, t) return ([[Merges your halves back into you, cleaning your body from %d magical, mental or physical effects. For each half also heals you for %d and releases a shockwave of nature of radius 3 dealing %0.2f nature damage.]]): format(nb, heal, damDesc(self, DamageType.NATURE, dam)) end, } ----------------------------------------------------------- -- Halves talents ----------------------------------------------------------- newTalent{ name = "Stone Link", type = {"wild-gift/other", 1}, points = 5, equilibrium = 10, cooldown = 10, tactical = { BUFF = 2, }, radius = function(self, t) return math.floor(2 + self:getTalentLevel(t) / 2) end, requires_target = false, action = function(self, t) self:setEffect(self.EFF_STONE_LINK_SOURCE, 5, {rad=self:getTalentRadius(t)}) game:playSoundNear(self, "talents/stone") return true end, info = function(self, t) local radius = self:getTalentRadius(t) return ([[Creates a shield of radius %d that redirects all damage done to friends inside it to you for 5 turns.]]):format(radius) end, } newTalent{ name = "Rain of Spikes", type = {"wild-gift/other", 1}, points = 5, equilibrium = 10, cooldown = 6, tactical = { ATTACKAREA = {PHYSICAL=2}, }, radius = function(self, t) return math.floor(2 + self:getTalentLevel(t)) end, getDamage = function(self, t) return self:combatTalentStatDamage(t, "wil", 60, 330) end, action = function(self, t) self:project({type="ball", radius=self:getTalentRadius(t), friendlyfire=false}, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end if target:canBe("cut") then target:setEffect(target.EFF_CUT, 6, {apply_power=self:combatMindpower(), power=self:mindCrit(t.getDamage(self, t))/6}) end end, nil, {type="stone_spikes"}) game:playSoundNear(self, "talents/stone") return true end, info = function(self, t) local radius = self:getTalentRadius(t) return ([[Fires spikes all around you, making all your foes bleed for %0.2f damage over 6 turns. Damage will increase with Willpower.]]):format(radius) end, } PK A坨p//$data/talents/gifts/earthen-power.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Stoneshield", type = {"wild-gift/earthen-power", 1}, mode = "passive", require = gifts_req1, points = 5, no_unlearn_last = true, on_learn = function(self, t) self:attr("show_shield_combat", 1) end, on_unlearn = function(self, t) self:attr("show_shield_combat", -1) end, getValues = function(self, t) return (5 + self:getTalentLevel(t) * 2) / 100, 5 + self:getTalentLevel(t), (5 + self:getTalentLevel(t) * 1.7) / 100, 4 + self:getTalentLevel(t) end, getDamage = function(self, t) return self:getTalentLevel(t) * 10 end, getPercentInc = function(self, t) return math.sqrt(self:getTalentLevel(t) / 5) / 2 end, info = function(self, t) local m, mm, e, em = t.getValues(self, t) local damage = t.getDamage(self, t) local inc = t.getPercentInc(self, t) return ([[Each time you get hit you regenerate %d%% of the damage dealt as mana (up to a maximun of %0.2f) and %d%% as equilibrium (up to %0.2f). This effect can only happen once per turn. Makes all your melee attack also do a shield bash and allows you to dual-wield shields. Increases Physical Power by %d and increases damage done with shields by %d%%.]]):format(100 * m, mm, 100 * e, em, damage, inc*100) end, } newTalent{ name = "Stone Fortress", type = {"wild-gift/earthen-power", 2}, require = gifts_req2, points = 5, mode = "passive", info = function(self, t) return ([[When you use your Resilience of the Dwarves racial power your skin becomes so thick that it even absorbs damage from non physical attacks. Non physical damages are reduced by %d%% of your total armour value (ignoring hardiness).]]): format(50 + self:getTalentLevel(t) * 10) end, } newTalent{ name = "Shards", type = {"wild-gift/earthen-power", 3}, require = gifts_req3, mode = "sustained", points = 5, sustain_equilibrium = 15, cooldown = 30, tactical = { BUFF = 2 }, activate = function(self, t) return {} end, deactivate = function(self, t, p) return true end, info = function(self, t) return ([[Sharp shards of stone grow on your shields, when you get attacked in melee the shards will automatically do %d%% shield attack damage as nature. This effect can only happen once per turn.]]): format(self:combatTalentWeaponDamage(t, 0.4, 1) * 100) end, } newTalent{ name = "Eldritch Stone", type = {"wild-gift/earthen-power", 4}, require = gifts_req4, points = 5, equilibrium = 10, cooldown = 20, tactical = { DEFEND = 2, EQUILIBRIUM=1, MANA=1 }, radius = function(self, t) return math.floor(2 + self:getTalentLevel(t) / 2) end, getPower = function(self, t) return 70 + self:combatTalentStatDamage(t, "wil", 5, 400) end, action = function(self, t) self:setEffect(self.EFF_ELDRITCH_STONE, 7, {power=t.getPower(self, t), radius=self:getTalentRadius(t)}) game:playSoundNear(self, "talents/stone") return true end, info = function(self, t) local power = t.getPower(self, t) local radius = self:getTalentRadius(t) return ([[Creates a shield of impenetrable stone around you, absorbing all damage taken up to %d for 7 turns. All damage absorbed will increase your equilibrium, when the effect ends your equilibrium resets to the minimum and transfers to mana while unleashing a radius %d arcane storm equal to the mana regenerated. The shield will increase with Willpower]]):format(power, radius) end, } PK AքB$data/talents/gifts/earthen-vines.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Stone Vines", type = {"wild-gift/earthen-vines", 1}, require = gifts_req1, points = 5, mode = "sustained", sustain_equilibrium = 15, cooldown = 10, no_energy = true, tactical = { ATTACK = { PHYSICAL = 2 }, BUFF = 2, DISABLE = { pin = 2 } }, radius = function(self, t) return 4 + math.ceil(self:getTalentLevel(t) / 2) end, getValues = function(self, t) return 4 + self:getTalentLevelRaw(t), self:combatTalentStatDamage(t, "wil", 3, 50) end, do_vines = function(self, t) local p = self:isTalentActive(t.id) local rad = self:getTalentRadius(t) local tgts = {} local grids = core.fov.circle_grids(self.x, self.y, rad, true) for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do local a = game.level.map(x, y, Map.ACTOR) if a and self:reactionToward(a) < 0 and not a:hasEffect(a.EFF_STONE_VINE) then tgts[#tgts+1] = a end end end if #tgts <= 0 then return end -- Randomly take targets local tg = {type="hit", range=self:getTalentRange(t), talent=t} local a, id = rng.table(tgts) local hit, chance = a:checkHit(self:combatTalentStatDamage(t, "wil", 5, 110), a:combatPhysicalResist(), 0, 95, 5) if a:canBe("pin") and hit then local turns, dam = t.getValues(self, t) a:setEffect(a.EFF_STONE_VINE, turns, {dam=dam, src=self, free=rad*2, free_chance=100-chance}) game:playSoundNear(self, "talents/stone") end end, activate = function(self, t) return { movid = self:addTemporaryValue("movement_speed", -0.5), particle = self:addParticles(Particles.new("stonevine_static", 1, {})), } end, deactivate = function(self, t, p) self:removeTemporaryValue("movement_speed", p.movid) self:removeParticles(p.particle) return true end, info = function(self, t) local rad = self:getTalentRadius(t) local turns, dam = t.getValues(self, t) return ([[Living stone vines extend from your feet, each turn the vines will randomly target a creature in a radius of %d. Affected creatures are pinned to the ground and take %0.2f physical damage for %d turns. Targets will be free from the vines if they are at least %d grids away from you. While earthen vines are active your movement speed is reduced by 50%%. Each turn a creature entangled by the vines will have a chance to break free. The damage will increase with Willpower stats.]]): format(rad, damDesc(self, DamageType.PHYSICAL, dam), turns, rad*2) end, } newTalent{ name = "Eldritch Vines", type = {"wild-gift/earthen-vines", 2}, require = gifts_req2, points = 5, mode = "passive", info = function(self, t) return ([[Each time a vine deal damage to a creature it will restore %0.2f equilibrium and %0.2f mana.]]) :format(self:getTalentLevel(t) / 4, self:getTalentLevel(t) / 3) end, } newTalent{ name = "Rockwalk", type = {"wild-gift/earthen-vines", 3}, require = gifts_req3, points = 5, equilibrium = 15, cooldown = 10, requires_target = true, range = 20, tactical = { HEAL = 2, CLOSEIN = 2 }, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t)} local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if not target:hasEffect(target.EFF_STONE_VINE) then return nil end self:attr("allow_on_heal", 1) self:heal(100 + self:combatTalentStatDamage(t, "wil", 40, 630)) self:attr("allow_on_heal", -1) local tx, ty = util.findFreeGrid(x, y, 2, true, {[Map.ACTOR]=true}) if tx and ty then local ox, oy = self.x, self.y self:move(tx, ty, true) if config.settings.tome.smooth_move > 0 then self:resetMoveAnim() self:setMoveAnim(ox, oy, 8, 5) end end return true end, info = function(self, t) return ([[Merge with a stone vine, travelling alongside it to reappear near an entangled creature. Merging with the stone is beneficial for you, healing %0.2f life. Healing will increase with Willpower.]]) :format(100 + self:combatTalentStatDamage(t, "wil", 40, 630)) end, } newTalent{ name = "Rockswallow", type = {"wild-gift/earthen-vines", 4}, require = gifts_req4, points = 5, equilibrium = 15, cooldown = 10, requires_target = true, range = 20, tactical = { ATTACK = { PHYSICAL = 2 }, CLOSEIN = 2 }, action = function(self, t) local tg = {type="hit", range=self:getTalentRange(t)} local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if not target:hasEffect(target.EFF_STONE_VINE) then return nil end DamageType:get(DamageType.PHYSICAL).projector(self, target.x, target.y, DamageType.PHYSICAL, 80 + self:combatTalentStatDamage(t, "wil", 40, 330)) if target.dead then return true end local tx, ty = util.findFreeGrid(self.x, self.y, 2, true, {[Map.ACTOR]=true}) if tx and ty then local ox, oy = target.x, target.y target:move(tx, ty, true) if config.settings.tome.smooth_move > 0 then target:resetMoveAnim() target:setMoveAnim(ox, oy, 8, 5) end end return true end, info = function(self, t) return ([[Merge your target with a stone vine, forcing it to travel alongside it to reappear near you. Merging with the stone is detrimental for the target, dealing %0.2f physical damage. Damage will increase with Willpower.]]) :format(80 + self:combatTalentStatDamage(t, "wil", 40, 330)) end, } PK )Az )''data/timed_effects.luaUT dP#Pux d-- ToME - Tales of Maj'Eyal: -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org local Stats = require "engine.interface.ActorStats" local Particles = require "engine.Particles" local Entity = require "engine.Entity" local Chat = require "engine.Chat" local Map = require "engine.Map" local Level = require "engine.Level" newEffect{ name = "STONE_VINE", desc = "Stone Vine", long_desc = function(self, eff) return ("A living stone vine holds the target on the ground and doing %0.2f physical damage per turn."):format(eff.dam) end, type = "physical", subtype = { earth=true, pin=true }, status = "detrimental", parameters = { dam=10 }, on_gain = function(self, err) return "#Target# is grabbed by a stone vine.", "+Stone Vine" end, on_lose = function(self, err) return "#Target# is free from the stone vine.", "-Stone Vine" end, activate = function(self, eff) eff.last_x = eff.src.x eff.last_y = eff.src.y eff.tmpid = self:addTemporaryValue("never_move", 1) eff.particle = self:addParticles(Particles.new("stonevine", 1, {tx=eff.src.x-self.x, ty=eff.src.y-self.y})) end, deactivate = function(self, eff) self:removeTemporaryValue("never_move", eff.tmpid) self:removeParticles(eff.particle) end, on_timeout = function(self, eff) local severed = false if core.fov.distance(self.x, self.y, eff.src.x, eff.src.y) >= eff.free or eff.src.dead or not game.level:hasEntity(eff.src) then severed = true end if rng.percent(eff.free_chance) then severed = true end self:removeParticles(eff.particle) eff.particle = self:addParticles(Particles.new("stonevine", 1, {tx=eff.src.x-self.x, ty=eff.src.y-self.y})) if severed then return true else DamageType:get(DamageType.PHYSICAL).projector(eff.src or self, self.x, self.y, DamageType.PHYSICAL, eff.dam) if eff.src:knowTalent(eff.src.T_ELDRITCH_VINES) then local l = eff.src:getTalentLevel(eff.src.T_ELDRITCH_VINES) eff.src:incEquilibrium(-l / 4) eff.src:incMana(l / 3) end end eff.last_x = eff.src.x eff.last_y = eff.src.y end, } newEffect{ name = "DWARVEN_RESILIENCE", image = "talents/dwarf_resilience.png", desc = "Dwarven Resilience", long_desc = function(self, eff) if eff.mid then return ("The target's skin turns to stone, granting %d armour, %d physical save and %d spell save. Also applies %d armour to all non-physical damage."):format(eff.armor, eff.physical, eff.spell, eff.mid_ac) else return ("The target's skin turns to stone, granting %d armour, %d physical save and %d spell save."):format(eff.armor, eff.physical, eff.spell) end end, type = "physical", subtype = { earth=true }, status = "beneficial", parameters = { armor=10, spell=10, physical=10 }, on_gain = function(self, err) return "#Target#'s skin turns to stone." end, on_lose = function(self, err) return "#Target#'s skin returns to normal." end, activate = function(self, eff) eff.aid = self:addTemporaryValue("combat_armor", eff.armor) eff.pid = self:addTemporaryValue("combat_physresist", eff.physical) eff.sid = self:addTemporaryValue("combat_spellresist", eff.spell) if self:knowTalent(self.T_STONE_FORTRESS) then local ac = self:combatArmor() * (50 + self:getTalentLevel(self.T_STONE_FORTRESS) * 10) / 100 eff.mid_ac = ac eff.mid = self:addTemporaryValue("flat_damage_armor", {all=ac, [DamageType.PHYSICAL]=-ac}) end end, deactivate = function(self, eff) self:removeTemporaryValue("combat_armor", eff.aid) self:removeTemporaryValue("combat_physresist", eff.pid) self:removeTemporaryValue("combat_spellresist", eff.sid) if eff.mid then self:removeTemporaryValue("flat_damage_armor", eff.mid) end end, } newEffect{ name = "ELDRITCH_STONE", image = "talents/eldritch_stone.png", desc = "Eldritch Stone Shield", long_desc = function(self, eff) return ("The target's is surrounded by a shield absorbing %d/%d damage."):format(eff.power, eff.max) end, type = "magical", subtype = { earth=true, shield=true }, status = "beneficial", parameters = { power=100, radius=3 }, on_gain = function(self, err) return "#Target#'s is surrounded by stone." end, on_lose = function(self, err) return "#Target#'s free from the stone." end, activate = function(self, eff) if self:attr("shield_factor") then eff.power = eff.power * (100 + self:attr("shield_factor")) / 100 end if self:attr("shield_dur") then eff.dur = eff.dur + self:attr("shield_dur") end eff.max = eff.power eff.particle = self:addParticles(Particles.new("eldritch_stone", 1)) end, deactivate = function(self, eff) self:removeParticles(eff.particle) local equi = self:getEquilibrium() - self:getMinEquilibrium() if equi > 0 then self:incMana(equi) self:incEquilibrium(-equi) self:project({type="ball", radius=eff.radius, selffire=false}, self.x, self.y, DamageType.ARCANE, math.min(equi, 100 * self:getTalentLevel(self.T_ELDRITCH_STONE))) game.level.map:particleEmitter(self.x, self.y, eff.radius, "eldricth_stone_explo", {radius=eff.radius}) end end, } newEffect{ name = "STONE_LINK_SOURCE", image = "talents/stone_link.png", desc = "Stone Link", long_desc = function(self, eff) return ("The target's protects all those around it in radius %d."):format(eff.rad) end, type = "physical", subtype = { earth=true, shield=true }, status = "beneficial", parameters = { rad=3 }, on_gain = function(self, err) return "#Target#'s is protecting its friends.", "+Stone Link" end, on_lose = function(self, err) return "#Target#'s is not protecting anymore.", "-Stone Link" end, activate = function(self, eff) if core.shader.active() then eff.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=eff.rad}, {type="shield", time_factor=4000, color={0.7, 0.4, 0.3}})) else eff.particle = self:addParticles(Particles.new("eldritch_stone", 1, {size_factor=eff.rad})) end end, deactivate = function(self, eff) self:removeParticles(eff.particle) end, on_timeout = function(self, eff) self:project({type="ball", radius=eff.rad, selffire=false}, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target or self:reactionToward(target) < 0 then return end target:setEffect(target.EFF_STONE_LINK, 2, {src=self}) end) end, } newEffect{ name = "STONE_LINK", image = "talents/stone_link.png", desc = "Stone Link", long_desc = function(self, eff) return ("The target's is protected by %s, redirecting all damage to it."):format(eff.src.name) end, type = "physical", subtype = { earth=true, shield=true }, status = "beneficial", parameters = { }, on_gain = function(self, err) return "#Target#'s is protected.", "+Stone Link" end, on_lose = function(self, err) return "#Target#'s is less protected.", "-Stone Link" end, activate = function(self, eff) end, deactivate = function(self, eff) end, } newEffect{ name = "DEEPROCK_FORM", image = "talents/deeprock_form.png", desc = "Deeprock Form", long_desc = function(self, eff) return ("The target has turned into a huge deeprock elemental."):format() end, type = "magical", subtype = { earth=true, elemental=true }, status = "beneficial", parameters = { }, on_gain = function(self, err) return "#Target#'s is imbued by the power of the stone.", "+Deeprock Form" end, on_lose = function(self, err) return "#Target#'s is abandonned by stone's power.", "-Deeprock Form" end, activate = function(self, eff) if self:knowTalent(self.T_VOLCANIC_ROCK) then self:learnTalent(self.T_VOLCANO, true, self:getTalentLevelRaw(self.T_VOLCANIC_ROCK) * 2) self:effectTemporaryValue(eff, "talent_cd_reduction", {[self.T_VOLCANO] = 15}) end if self:knowTalent(self.T_BOULDER_ROCK) then self:learnTalent(self.T_THROW_BOULDER, true, self:getTalentLevelRaw(self.T_BOULDER_ROCK) * 2) end if self:knowTalent(self.T_MOUNTAINHEWN) then if self:getTalentLevel(self.T_MOUNTAINHEWN) >= 5 then self:effectTemporaryValue(eff, "force_use_resist", DamageType.PHYSICAL) end self:effectTemporaryValue(eff, "cut_immune", 20 + self:getTalentLevel(self.T_MOUNTAINHEWN) * 7) self:effectTemporaryValue(eff, "poison_immune", 20 + self:getTalentLevel(self.T_MOUNTAINHEWN) * 7) self:effectTemporaryValue(eff, "disease_immune", 20 + self:getTalentLevel(self.T_MOUNTAINHEWN) * 7) self:effectTemporaryValue(eff, "stun_immune", 20 + self:getTalentLevel(self.T_MOUNTAINHEWN) * 7) end self:effectTemporaryValue(eff, "inc_damage", {[DamageType.PHYSICAL] = eff.dam}) self:effectTemporaryValue(eff, "resists_pen", {[DamageType.PHYSICAL] = eff.pen}) self:effectTemporaryValue(eff, "combat_armor", eff.armor) self:effectTemporaryValue(eff, "size_category", 2) self.replace_display = mod.class.Actor.new{ image = "invis.png", add_displays = {mod.class.Actor.new{ image = "npc/elemental_xorn_harkor_zun.png", display_y=-1, display_h=2, shader = "shadow_simulacrum", shader_args = { color = {0.6, 0.5, 0.2}, base = 0.95, time_factor = 1500 }, }}, } self:removeAllMOs() game.level.map:updateMap(self.x, self.y) end, deactivate = function(self, eff) if self:knowTalent(self.T_VOLCANIC_ROCK) then self:unlearnTalent(self.T_VOLCANO, self:getTalentLevelRaw(self.T_VOLCANIC_ROCK) * 2) end if self:knowTalent(self.T_BOULDER_ROCK) then self:unlearnTalent(self.T_THROW_BOULDER, self:getTalentLevelRaw(self.T_BOULDER_ROCK) * 2) end self.replace_display = nil self:removeAllMOs() game.level.map:updateMap(self.x, self.y) end, } PK Ahooks/UT #P#Pux dPK A@CChooks/load.luaUT #P#Pux d-- ToME - Tales of Maj'Eyal: -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org local class = require"engine.class" local SW = require("mod.class.StoneWardensDLC") class:bindHook("ToME:load", SW.hookLoad) class:bindHook("Actor:takeHit", SW.hookTakeHit) class:bindHook("Combat:attackTargetWith", SW.hookAttackTargetWith) class:bindHook("Actor:actBase:Effects", SW.hookActBaseEffects)PK hAinit.luaUT uP#Pux d-- ToME - Tales of Maj'Eyal: -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org long_name = "Stone Wardens DLC Class" short_name = "stone-wardens" for_module = "tome" version = {1,0,0} weight = 1 author = { "DarkGod", "darkgod@te4.org" } homepage = "http://te4.org/" description = [[Stone Wardens class for dwarves.]] overload = true superload = true hooks = true data = true dlc = 5 dlc_files = { classes = {"mod.class.StoneWardensDLC"}, } PK A overload/UT $P#Pux dPK Aoverload/data/UT $P$Pux dPK Aoverload/data/gfx/UT $P$Pux dPK Aoverload/data/gfx/particles/UT $P$Pux dPK A]t+overload/data/gfx/particles/shieldstorm.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org base_size = 32 local nb = 0 return { generator = function() local ad = rng.range(0, 360) local a = math.rad(ad) local dir = math.rad(ad + 90) local r = rng.avg(1, 40 * radius) local dirv = math.rad(5) return { trail = 1, life = 20, size = rng.range(12, 18), sizev = -0.1, sizea = 0, x = r * math.cos(a), xv = 0, xa = 0, y = r * math.sin(a), yv = 0, ya = 0, dir = dir, dirv = dirv, dira = 0, vel = 10, velv = 0, vela = 0, r = rng.range(200, 230)/255, rv = 0, ra = 0, g = rng.range(200, 230)/255, gv = 0, ga = 0, b = rng.range(200, 230)/255, bv = 0, ba = 0, a = rng.range(200, 255)/255, av = 0, aa = 0, } end, }, function(self) if nb < 6 then self.ps:emit(20) nb = nb + 1 end end, 200, "shockbolt/object/shield_voratun" PK AoD )overload/data/gfx/particles/stonevine.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -- Make the 2 main forks local tx = tx * engine.Map.tile_w local ty = ty * engine.Map.tile_h local basesize = math.sqrt((ty*ty)+(tx*tx)) local basedir = math.atan2(ty, tx) local nbp = 0 local points = {} local function make_beam(fork_i) local bc = rng.float(0.8, 1) local c = 1 local a = 1 or rng.float(0.3, 0.6) local size = fork_i == 1 and 8 or 2 local starta = basedir+math.pi/2 local starts = rng.range(-0, 0) points[#points+1] = {bc=bc, c=c, a=a, size=size, x=math.cos(starta) * starts, y=math.sin(starta) * starts, prev=-1} local nb = 3 for i = 0, nb - 1 do -- Split point in the segment local split = rng.range(0, basesize / nb) + i * (basesize / nb) local dev = rng.range(-6, 6) * (9 + fork_i) / 10 points[#points+1] = { bc=bc, c=c, a=a, movea=basedir+dev+math.pi/2, size=size + rng.range(-2, 2), x=math.cos(basedir) * split + math.cos(basedir+math.pi/2) * dev, y=math.sin(basedir) * split + math.sin(basedir+math.pi/2) * dev, prev=#points-1 } end points[#points+1] = {bc=bc, c=c, a=a, size=size, x=tx, y=ty, prev=#points-1} nbp = #points end for fork_i = 1, 10 do make_beam(fork_i) end local last_id = -1 -- Populate the lightning based on the forks return { engine=core.particles.ENGINE_LINES, blend_mode=core.particles.BLEND_ADDITIVE, generator = function(id) local p = table.remove(points, 1) local ret = { life = 6, trail=(p.prev == -1) and -1 or last_id, size = p.size, sizev = 0, sizea = 0, x = p.x, xv = 0, xa = 0, y = p.y, yv = 0, ya = 0, dir = p.movea, dirv = 0, dira = 0, vel = rng.float(-1, 1), velv = 0, vela = 0, r = 0xD7/255, rv = 0, ra = 0, g = 0x8E/255, gv = 0, ga = 0, b = 0x45/255, bv = 0, ba = 0, a = 0.1, av = 0, aa = 0.001, } last_id = id return ret end, }, function(self) if nbp > 0 then self.ps:emit(10) nbp = nbp - 10 else for fork_i = 1, 10 do make_beam(fork_i) end end end, nbp, "particles_images/beam" PK Aӈ4overload/data/gfx/particles/eldricth_stone_explo.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org base_size = 32 local nb = 0 return { generator = function() local ad = rng.range(0, 360) local a = math.rad(ad) local dir = math.rad(ad + 90) local r = rng.avg(1, 40 * radius) local dirv = math.rad(5) return { trail = 1, life = 50, size = rng.range(3, 6), sizev = -0.1, sizea = 0, x = r * math.cos(a), xv = 0, xa = 0, y = r * math.sin(a), yv = 0, ya = 0, dir = dir, dirv = dirv, dira = 0, vel = 5, velv = 0, vela = 0, r = rng.range(180, 220)/255, rv = 0, ra = 0, g = rng.range(0, 0)/255, gv = 0, ga = 0, b = rng.range(200, 255)/255, bv = 0, ba = 0, a = rng.range(80, 220)/255, av = 0, aa = 0, } end, }, function(self) if nb < 5 then self.ps:emit(30) nb = nb + 1 end end, 500, "weather/snowflake" PK AR4VV,overload/data/gfx/particles/stone_spikes.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org base_size = 64 local nb = 0 return { generator = function() local size = rng.range(15, 32) return { trail = 0, life = 6, size = size, sizev = 0, sizea = 0, x = rng.range(-64+size/2, 64-size/2), xv = 0, xa = 0, y = rng.range(-64+size/2, 64-size/2), yv = 0, ya = 0, dir = 0, dirv = dirv, dira = 0, vel = 0, velv = 0, vela = 0, r = 0.6, rv = 0, ra = 0, g = 0.4, gv = 0, ga = 0, b = 0.3, bv = 0, ba = 0, a = 0.5, av = 0.1, aa = 0.01, } end, }, function(self) if nb < 2 then self.ps:emit(4) nb = nb + 1 end end, 8, "shockbolt/trap/trap_ground_spikes_01" PK Ao,.overload/data/gfx/particles/eldritch_stone.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org base_size = 32 local r = 1 local g = 1 local b = 0 local a = 1 return { generator = function() return { trail = 0, life = 10, size = 36 * (size_factor or 1), sizev = 0, sizea = 0, x = 0, xv = 0, xa = 0, y = 0, yv = 0, ya = 0, dir = 0, dirv = dirv, dira = 0, vel = 0, velv = 0, vela = 0, r = r, rv = 0, ra = 0, g = g, gv = 0, ga = 0, b = b, bv = 0, ba = 0, a = a, av = -0.02, aa = 0.005, } end, }, function(self) self.ps:emit(1) end, 1, "shield_bubble" PK AgBB0overload/data/gfx/particles/stonevine_static.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org base_size = 32 return { generator = function() local ad = rng.range(0, 360) local a = math.rad(ad) local dir = math.rad(ad) local r = rng.range(8, 18) return { life = 10, size = 1, sizev = 0.3, sizea = -0.01, x = r * math.cos(a), xv = 0, xa = 0, y = r * math.sin(a), yv = 0, ya = 0, dir = 0, dirv = 0, dira = 0, vel = 0, velv = 0, vela = 0, r = 0xD7/255, rv = 0, ra = 0, g = 0x8E/255, gv = 0, ga = 0, b = 0x45/255, bv = 0, ba = 0, a = rng.range(100, 220)/255, av = 0.05, aa = 0, } end, }, function(self) self.ps:emit(2) end, 10 PK Aoverload/data/gfx/talents/UT $P$Pux dPK A@0*overload/data/gfx/talents/boulder_rock.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME 2DIDATh:ktՕqL WxW1* J*82*jAŊi]Sfe ǾlLULuHEKyb𸗄 !$@HrwBgܜ>;}{l_n"i >.zǏJMU`0m-Ӧ/)#S% Άw[ x"wLQ2cj%%X@8!\kE /00 0W~pTӤ=S&K8G ՞=$u˜1>Ĥ%HR" $ZH ҭSZv92hYјvٹL-sƧ+D R;ӒLxbMu=e3yHHHD+4.!HH7?:9efΐk[;u  bAPA}4ŧL;X1ŜHdNgQ"EL-_ ᙯf!z{B$ VMI DĂI d&bb\-2p]DYb g젨 $0?k(@()J $͹&D &2Z8= R$ ČZ}E.`̬ d:6ċfs3f3Y=>/9{5 D$jLӈ[CT O-{zA}<.%յT7s@L*hLF"eDdE2J- V~lkD(FTK_px V$RANhR>B!xXwZI[Ӎ~$&=2'0g뾪[Jt`ɳ3'4yY#7 1ʺep^^3v's/9zh_(>r ?U[‘8Srr#*d1IlZ#h Pr0hR*ew>i?|@%>X^u ˲@H5 緕|vR8 Ȳ$"4M8#anP5,:3KBgY0+H4t%l*l`l!+5J5:ИCҿw+Z4c`@U 0ml'T#'+"*iLSnJ`CXd Ӂ$H3gpve`w(X7yfAGJ<^k0tȲߌ$ز,6/Iާ } 7/`E&p W ȦSU+0=<ӘKGha6-NpL{{՝3b~h4WPr솖}~$6H#{[X;{{ߴYv߸lRsYyH+nolz@9ߓiN,#snCss,0 Cw&tg쎼ʫP ĬњsQ=3C'f M.WiJ'Ǫ̟9I{9b&Z:@6$zDv+ަI-"'fihiЉԟm'p!%Ǖ[j ~αoC @T[{Y f|H IusV4\Љ9P>odKޣi; {c/h㵍-fOV5!b$"d]9{ǟvtvDpudB( 1uHo#|V]wUMZ*tLWq SK6 GpfI$"@GcH$;+O]+pXU)M!6lF[j\2{ڤ7n)T;rؐtvDS+[e>qu;zΛ0Օ? #f%:tf?/}e?uH'+I{ ]ru-Μw{iR_iV]CBѯ .9Sؽ8eie;d-Unx0 gv =0tJEϜm1Լ}ǘjhp1&n&$ ) V\;mD6Ǫ.yNqy f]lӶbˣmD"ʟ/{k +f| ۹0aρ#74j䰍oRJi}>Oά.+Z_<Ԟ>..}[ggQ,6Lr0~y= hݖ >Y;guWQ}  jqͯ>D"5lzߚߊW,JIIQ\.4HY(#eL,*j{:UI 3.$",>҇6l8Bq[֭rR7~FNg-.-|˭ '`RФ@ =f+VЎ Ij<<%1@QqݦѦ Jz~J7 M`ˎ%?\12g]%lR@.`u}e.ڜCi{<硺FayɆsƟORb1m]v:~7kʂynykӗ~u!߷ssadJބW_bL|]Sϻ=Eyp$vۤ97T'oH4Zu'~TjB4MK2؍v Q;Z+4_ӵgܙX-)rcG%$cb^~S 1e*QuԼH47),*i9Mr|mBvJ+~U皚oλ+ч >ϪՅte2Z}xyZ.t`g7sxq]B("-Y@šݹ9w&m٥.瘅#{V:)VuYʡPcO=jFwB8W{%'⤿aV#,zt_>v3O@oiniC&3C*lTTYZ5oFj$Pk'߽&i3:"fW Dxkݻf%gvoJ3g/_n:::O^L 1Hu.iՋ2WȢz\QkjjX0JMaM'{sb4CB(ş/P]}s}0sOo{}~K옣P?-h_r{n./gt뜯mD( )KC`hyΝ {/XS |zE) P0 C_Z hmN)عk֖`0x$ C`H0_ҥ !o/lxIENDB`PK A_J  +overload/data/gfx/talents/dwarven_unity.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDs(< pHYs:tIME5 z=v IDATx{p?'3!ƆıL«Ȁc`B #atUl-e|ZAqj@)$UcM ) 4$w{wn"3$Y{gxpp:$oʌ38)Ly , lٷϦj?===>W5Ipi:כֿ`Z47Deee콹 _#aQr@(,vm>ߙ|$ 3ų/_bn&k akP8 xh0Wf eX`[m ,5?ޛĽFL۶M{-V`cYHwq .N@?2Iyyz*DzU]ƍoCs>vXߩ)BǙPN,rX%‹09 0L8 \tQmm'yT7nƍW^Gu#K*_Ƕm,q:B#X˺O'=^`5ѹ;͛q%1tv9I~oUaLYD`WWy H"/4 M08q"[t@ "Z$y3V@%;>8z^[|$ضMQQ-5@20ٽ***(((x{%;<;閰dq6MٴPUJybG $)HKK#==O> &Icc#\?w\6l8IS7YkJ8k,Z3O!#C1{0g"$)CE 2zpxme_ફƲuHPc e"Au(nn7;6`.WY^NPZbJ%uP*R=~@qGb:B%>0mNP"ꟌF&jkk1-}41 @@4 I҇2lI]]GA|c7 } L|p-x3 Ht_co3$h9QRR; \~,O<tT(@iT?20Pn~-,Z_T*H[R")/g0djBPOM%PN@K 9h8rٳǙ47IȝO{7T|GC/m 3B6Ux=}j 2FƄm.:Pp$|.@ieP?a.{>фoV)}d싥`6 UUU18IK\AӇqj)sQUYَ/}O(,ttU띖gϞAgqmq{{;5u~̋ềAssPMsh/**b[twwsgRWz"Ix_)x>5cB)C~)tttk]$JW~+I$"-X") ֯|w$_'9ԃVm6‘#GRZ=Js t۶Y2(_,w98o޽#15<1Gi =ktttpi8b 'jo-7qIENDB`PK A" 'overload/data/gfx/talents/mergeback.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDs(< pHYs:tIME4. kIDATx{pT?'H If1d&Ch(B*##L[-3RyBLQF@c̀ED&@}?Bl-fv{=~@rK7 F#Ft:8wv'mmm\x dffOnqK@ Nh… ,N'+477GfիS\NC尿%< @jj*/_ )C˳Нw7|]kd1-sOww_RS!32C͊@SPQaFIn6ɧ~AOOπ X09gNC@RMFÂìg1쮞{nEZZZn s,0444D* ٌ(֑رi,Xsn"LqqV}ل~y $!!M2H=n.}2~xJZ曃!*ֽt&7^m !FD+}ťKb-Y:;;#nye S-,F1@y/Vʱ¾}JXX^#up-Ƞ{0m "c >YQ; {آ? $III+5LN3- **?跞.#F{M:.6s]hQzlgmnC.C?HQm\f2 )))l0W6Zշ εy])CPp;V͖pu}e[^fV8484qhPkUϗZ- ~R]m. j,\8+$coNyۧ≕ kF6"p&L^{9TXA^^&:;%VN<9$U*B\.6cn۩tH*jn 3&nprF<(Jx222X~2K@24 (pٳg|{+i7x_4d77𥷣Fᵭp9ݸv]vΝ;f̘Ayh 2H>;ϯ͛ZhԩBF%"q9$'OJ- *S]u9Z̕+WWEEE;JܹۓL4+&-)..ر"9 %Þ=Mɕrrr( K^rƍG;ЩD hdɒrEg3}J]]n6TF"99Nᣏ¯QD)A^sŋ)++"3п:ta$췀|>+<ƼzAe!?>GpDu~2 !(*Zȑ#1byrR@`ʔ)1`dWU5sH/\ b $_Sj}Fԡ2 шN(? ϛD ---499Ƃm V _\S׼cYyxpv'pȑlLlz˧@z1~_(4zR< ClPSSÏVK}Ќs;wnTxp+D_as>A'X\4 UU_t:?>;3:۾/Bf"hZY`r^i#hYzã@(X,br!K%# mZGM5 P%%%a2hmm]>Y-φ hmV ^y~w]tt@M`]^`!z~PE<~s/u (mt%7kPJޣCx꩖!V+<ѨaC F?d2{ Tf;fMw?MPZ*y+.ĉq<`\?aw]_Ggʀ >}tvaʴ _hnK롮iooGѠVILL$#CYY#+(-|IZZZkWYG!Ǐ/u:]DZTrw;|swT0IENDB`PK Af+overload/data/gfx/talents/eldritch_fury.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME!AUIDAThZkTTW(!*|F+Q0WLLg53cg5+kZ1=h'1JTD)% Jx)ū8ԈΚsv#|;v$%%|i!s"""rY &@Q \tV fbb8Suirrxs~~u:~2Ol6/\gk~&@0@JMMِʪo햴BBBRRR) fQqĄ;kwޔpTUEQ?7~͵0v;3 ŋDtrG7nܸzb >JCCΝaYoŀ{ҽT⬭>322@ &fBCC׼Aشj߼O 6667.7K] A`L _b.u-vСD<44dڶmXr}}q4<<\UGhDoNbA*\`b#.kwL&SrrU^.' NII{nKKKKKKrsM/?0FwO8S&su1^~iddDd%K8$STʕ# _y P[V!ๆFM~"" ?Uq6dmS#0+ 0r`f)FZWWWo?$:::55t>H~x,̾Ç"fgg&SJGiBO3NVTT$ 7KAAApp˗{zz[& fgg WU2 )V9ULLLH JLL\bVÇ bbw65CD$_P[ˤ$ϊe>[߻w/Uuvfqf%LZ xCʣ@d_j&qDv횜'999¿8|@.;z)@tIKI0fȢLD'6Cz|qv< Cxx8if  MEaf#`A<%._td~TTUI1L^$Yؐ`o.е\g܁l޶ϡ=z X&Mc1HqfńgWJ EC~9tRAAS, ȯ!A%Z,-9dA8uꔑ|v w/AEeH5 &s0yyyڷ`S-[$T)Ĉyg4"f##2` ,] `dlKerRӸvdd䊜B^ښb M4; 5Q@d(sOOB? ޝ;ws}EhaaaN@8J1]}3 5L 0?Ct{+&Ha_w!I6Fz7I#GUUXɇgz1K0@/z14 b?Fٳgk]"pCCShh7vvKw1Ų."S(E5] ~۶m2@nbbbyP/_\ ;| b_e… WK)o2\UU`ǎr7o$RcR|[tijj\.W&9s۹GdMwƒRbuVi&7&&F;F+;]K\?#"**C^jb~ d2yp mn֙JS2uK=oݺŚg9krr w\=y0&#<<|s \B! Ko7LFGGJKK*|섿yɓv=3+D"$IHH¢F=4;AbҥK^HH˗Ru&;Mn0Z54-y3'!:^O)u&驖 !vo(w +)U̙V{W!v#Mv%Vy`` g2?!nn*;NWFrz7}g k5dzlٲEhhYmbGdX1)3̙33z>FFFMk׮u(++Z{׽JjmZIO ׬_#~-+'9vww߿(&@a(Ϊv 0i?VJzzzrssr6(߿sbenw@(=UU,X\ F ?p\ɟomm_'Mul?7ΕZ%~\A:i 6P蕚ys8qb滚B>aAӰ}}e ["X)NZ"O\Y09rTcc3͢*`XV_ (>V7{W? V|P0L XeRQzvLė_~96&ZL >  :wNU쬲q$`*X;5[ZFݍAزXYDeb(`{^VO}^ug|N@^{(]Q43k'UʤpW#GX+))-2W"BTA>c?%Q.\pA ())-^\y8YQQ4oܧPwIENDB`PK A.:f///overload/data/gfx/talents/eldritch_infusion.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME+IDAThZ{tWՕs͓$y< < D$V:ZLVgVgyTe֡ࣕ- "(Q$ف;~UL'a-%wrg|ZdIڼxh\>Kk=000<<|>2bvtt+V,A1lT6oެξ겫2xQhQ]RuݒK‶-bˋܶ"bkG"5?}e}H.HtB h.??zh__8YYYg_4M;:Xi}xxUk3T(h{}١/)[`C,#b?uGGGbb?]mE/$lIOO={vi 1UWpA#XA<0 _, LG|/vttob h[lMƩĞuuuUWWyGO6tGԌ"@O! KT-'jjjZ|yNd!Au Ihȶ׽0b=x:0gBDž80:v VTTTTT/..'\}Š"b<ZHh!G{~fl߾߂D166g|.dK.]?88x馦qԸ4>|\z歂Y4$ed,tƏ[oBuFf̟Duʤu`ѢEvW hkk{7˻ g l8y<:15C>S"S|YD_z3JKK 2IHzzRhβ'o=mKMMͬ wxv %J6 >P! !(S;::xm_|_xx0F#&| LXlR``@Ɵ &z\ktttl 0 Y144rϜ{.daIdd~3m',˪ʹJKu3bcc'8uw|&N8Q>uFrU&Lؽ{+;\\% ZmoYjr5yZ`YPPյ@^汆eee ":~S_ jE Wv̙]B :tǏ=^)^>Twqfm6tAEC5crB%3W>vX{WWVnn#/nG֭K1``wwwbbb`*ߐ~,m~];3&knn7ǰJ-NX=c y#/.aS}E9 b``mC Ho~iʢk/=WWwww;9񫦿6$D,e-Ʒ]Q ߹eiwСCIII#V-\ď ~iǫĦ^dta%ЀX$dN05BMxnXS\U %bQP!1*쪥 86@DDDњ10oUTQm Bh 4}Z4a`313iD,$22V]`(1/hǏ|r9r^z{{ Z64P`Z5a"4  TUEaIE4SX*7HE][Vww7=-i߂XDLhClHΊ 8Z?-bk–QfU@(1al7###xAg [v^]@gg'M***;k(Z8rl6:{UԦ* ~@K57(6m۶}キ2/ [xUOQQ%yyyFD9'b -%d/oٲe```ԩӦM;z4Ge^{ 3h`cАm{g2逗^zBʜQ3Bш˅eY={WZWWqǪGW_}W{1ck_Q'>׷xb Zl?- gΜې*hb$\` "x2fPS__`C}y!xכ#""Z H4I nZ 67ӦM[UrRmߜ={6##D6%W1N:lR흿b& M)*++T6>}zSAȋ3pp pî6>U]]-"K.]$K_x~ѣGYrշâ%nuuuRd! ,"9lK;;;^rr2zz,]ls 9)Nw–.vVuue7/-҂q<η}6~O{+TlAw{OssYLH !qcmmDTTŋ/_Ud(tT :sSN]zy}A0kf>ӧO/|Q;O< :!>-%A,lhj訨鉊>}57\W4uzʈ2}W={/_HoK($GuQYYXHͼ ƎМӡaIU&M曯ɟ#F&}:m#Uʖ_"3 $f^ұU'?y8666,,{~ q-H̻$۶m)SD頢F aSλ-}{( ΙB1!::Yq `V eߟ֟7F䤡]JE9݅meMK[ mϴ.YQ>g7Z[[/p Os1^VœHc=H*O+HS[[{N?VtnI4&D&̡E_[ioo G>O*/jV45ΰ\;;5<ԩSR*<<|U3̑(g끮iemn-ݹiϮޫJ~>Rk֬I!*8Y9RsJ7x_g\>0+"t|%~ ZtRX6#!uċ$HsaVBOy3:`F}}]ٌ6g~>n,*uԷoD -LB_Μ9SÄyQ̤|LC4n~m2}E/@svપb愑1 kh,_%baωZyyWk9t)M *LO5QRL" n MMM1gI/ؙ]jIENDB`PK A^2*overload/data/gfx/talents/stone_spikes.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDmmu pHYs:tIME +rIDATx{tU՝?{ #H##8bdShjN])8ZY DR^ K {o7::sϹݿ|77| ]edd0}zHPB.)- f_'8--ЖV)QV\s?'-~Ϲt_&&`V$ZPx xJhaycu> LPBH@ Z+xXk@H)(fzRa -7ƅqZChkCDJT L?]zB+2@J3uLU^{e".c)E?G$:Z!upY͊{ ?7!坛l 1]׭\*Jrx{d70t63f\wlٲ[omzj"333~Bhx?;641 V>m.@ApFf GلBk555(; (,,,de%ebMqȐveGyV|V8}4̾#R. m3wn~;Bp)PJ01X:s986e?KHfhk7 C uカ/BZ 0t#UR#<0)?۶E^|W Gq2.cB6?*7 <@ma\}( LSEC=͂)S+yǧ˶6q)~-~9L>7.йxE)/1joLNNf)mkԵgdyG  ].ONpDe%06ݡ pW~r|بOO/#mEлw}%<ζ3E+U>mǎ/D\B~bMiY`2xvU$/O -w٥T$[oixuFDe#mY'N8z3Ss3gv6V--Q{廮GJ{ye&@Ǐ~:V'z@(u6UUU$$$0l& SXE-_ySPx=O7{m ߩБ#ƈJO6MM0yr۵ڵp7cd PЊ4"}:=4Q6ʍHHniX~?󿁧oD!t8P 5iii9m5ފ$~@DMGDau $ D8հ@0meep&j&hA@ds{ah8k^lz۶36ݜGI1JF,c&臱c;A:|֊M&5Ls"D!5?L W;IPUchk.VyJ߻HyaS(544Pc+mT='Ns;懏Az۵ ^y)|qd-t1'n-HM+%~{R.UK Vëű={b >]եP6v'999Yao쒎*ϕF: _O4leL;xL{?bWc=^smVj@@,pkCMz#8RWWyhhPw򠥿Ng 3 #sKLKFdjMsHMH@b|f@2-n붝;]&p@iyhYI~cTwV|c̵R@ 봡 &f#kka=0>?j? +q""k }iꃽG(*8l +JKA ɑMo Rhl490{*lB!% Ca!}puЧJDKrMQ Y o,e3qͽ`æʘ^M ,=qf-? |[&'W3k?E8b]ldb RRRp<~Jj/CRRpgjX&V|i I))!^XKzxv~ظ+OsVJVmغumۜdI#̵`0Rڛȃ%75) hpARV/TeE[te;sp͂(jtݴ1ęrsʕHIIIm3)FJǼhpe,Ws(^90,Y2֩mwp!DUU3c$Au=ٵ B[.kX e 0 +CC55uxN0@p1Dupgbb%-:U͝RAG[]~B!6 LFo+&wT䡑9 QUUf"R% aAp{Ŧ# 47ۜ;]':Y^0d}^GB hk͕c=`DgrS^^ (8gEk#gf0y/ARCCO?yZ~?gD;Y@ ?6y}I03ifݱ?oY" fҤ:d{Z 7|y&bl2Ɇ 0M>K*++#@kL!XoÂ&R scP$Ov`ptT6΂n]xƄFTYp$^|Ա_ j_$ؙ-- fNܷ–-[t d\.6~okoh  Z[rF#Ch!6ݻp PE~'(I/~/پ_sTZIENDB`PK A ;;+overload/data/gfx/talents/volcanic_rock.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME ꘮IDAThZyxTE?T۝NBFv" :6OAy:yΌ>LJ88WFqAE!@Bd#t:$~o?nw'lJ1S~ST+,D2B! &OCWMruz 76ܧsPlv7 c6nU=:T95Z=Jv)١sDɨb8<|½vIU 9G$ eAg֥Hp:qSo"j1Z7~yc¼@@DQѝWien,pɡlp<{D+sI39XTRZcSB"!""CdH Hئ.6gD1$9[jT{U$7Ǜ=ڻp쬋̮!)azT8Xf"Anm&l=HĐIC諂`瓆F M Ѹ!#~2Ÿ>ALY:*Q'#I8#Ɖ^9xfҜ>|%AHlίKO홫eY"= Ο8XөhpH'Ooˡ'FDZ-J{o 'MɎd?q~|oYc!sA+c2'Gq"#⁲tٻ#D(IDD$u ?gbcbv+_֜0:M.N'+Ȉ@QVW?FqHDPN[aC %ZW7?OTԯJn`1r|}1"!#Bw?+?Hнb#JY H IЧ%D@F$$ I"HcR˿b"tA!&Y:Fk,=d݋ U\BҺ2^< 1tmnԷ9$IEƉ1ƹ_$Z#G`؄.Ikt @ ,Lɮh8YC* ( e- @V#M3=:gEqH3Nĉc @TÛ;]ųF0^⋒  xK,˚WMSuMjWTEuRm:zMd؜A Lt z[e~Ժh(\?G` |\'H i9LKpFQZH^j:ytdwjE~!JZ^c|*N`rs.=qphĘv7;(:9~U +7./0H; !:Ys]?DZb D9"c d{֋C`5|WfL~ۂg?`mwllO L\" 1a:@-K73%nDڠʦr97ʚ_x:cDE3a+l~qkq1d$E T n&(@DZ& t`I9cNX:XiR.7;J CeI[t㢲c+"Bt~x)cҀQF؜m.8z||`rd'y|^_oۍ~OAi˿g]YTszOpFE )FD}uZrk.W\cE~Ut߼+kTМO!,$"8^;PR{(/-gy|vB߿Hlvy_=-D bus1"&@JB,C*L2S)go<&Uq@tW?/;Fg;6[NgWcᡲW&"_~k8PR34YdU8}]sjrk y#8~FuM1k{OVJH^ZTYдeweo)"P̞2R;_Uz|  "=O!qc vy ~+] 7Yw8m!Iq1჌WW$}q5W  #5ۧ(@]OU@guV[׫wչ^E2\=EUϽ @dUŕ',VD,!.Z #L$LUO^{2iQ@$# 0~>3,ŧ BDo9u!gx6OV[}T[<%X[O۔o4F "!h(|ͭܜL-~ a!*y|y,rq hrrΌ\Eiq-HS0κn54c"ӔFPKS^m3PUhgMgN)7g,!.om@DH_n]޾! 8VcNH<,=Y;W;cxxX詵K. k>AĈ@ \e %3 ,?x*"~ Й2ޯ(jߏb A׭?>.}re&e髭o,{l{~$m8zXz㩷A;Bh/ _~M1) #x(8c ZKx}eBDsCCC/q`dQT`LM2n[7ZZ&>d?D+ DBZ>+PqF%c{_*haР+rGzեկq?L?Iv+,*5uJMNg\FתKʫ3SB*T5znhCVZrHڻb%w?y&ud}& W}(_Soxjiy˃н="BΙ,IpIŊ7?:RjB_}plT ;saggY-B,Yz<{@4w$eO<)lm;jeY(Cx`plm1ދZehcymg9؍U h=^6P  ټݴsnㇶKvvu<6h:mm(u)"1nڶu?|︜\n-q-K1qpGcy¶ys=jEr'K/.`)n.T_PGuG抢HM*1 ~k/Mmt⚫tmfSO{.CVZf65V1-Gm6UU==4 ~>Y|=*_->6qٚk;Z" %{hVS5Tu暊VsOGsFz2si-ݶ.kCyqAxNҢv2 /QqumӧEc'T6ksfkTY~A"UIENDB`PK Aoz/ -overload/data/gfx/talents/impaling_spikes.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDmmu pHYs:tIME #0f* qIDATx{pT? $@@LDH$Rt:贶S[kS;ZZ[jgUE !![\\ܹedZ DK imlz5k~B"BZI]][6Ԝ-$,4",(B޹`8ߣuW_]Ckk7 e?+`%i!nhmpagUJ))AZ(a#Hz`={hjj, 3w `gř-G1O)of-G)|3 BI B-ٳ''Xof͂ۃ;_0&O0 (80 s8텋0onL@uܺv`Ѣy+A)mA+RHe#mP6B)ƴZ{e#B+μZq\}͒[_/N>H^$Z2ړW5Va !%͍J>ycD"7<ڇ^͢a=v 6_ !CF$0Z$y}{S;u>G);78s&\Rou8p w\ؚǙS=C@֮ H$BEHf(fܸQ  ' ;DzisN~c;ecQXdQ8p-Pga}m3Z}0 Ak͎Caf:%| u<B0ٰۛa;"s^ P< 6e;pϊ i~A!BƏ e#>|H@(m.tq6m#=xBٌaoWcM%1 5"{1}~3>&2f֮JCxK`ݺٳO ߯Zپ64U$̙3xNDiZy?ޔ̝Kpq !exX@(Sw7=7>>??]nnzm.<7mHf\s p yuVwxCɓyFœSt2v׮]0.a*~G=Qsn \4W,9s _&&=^.˶@D-l/T"Ce󳅊0Om} KJDnVҔXR}祎."",6?_6l7>bvem^:@bvnHXz6[ҥ9QN%tny,'r+FG@k`m<~.䱸T }O bURJ߆HXAKP aK |,'|]kTn $}{~^B,`ҤD;f/?ӬFG]F9~9` r"try0agL|/|tL}O۱IÛeb^bps3,:1}/09(>lELCPUϖ-535K{7k=r H( Ó7aݠ/0^3I1uj v⮿}) mBdT-͛XPV.>UBxP[ C,Aݎ|(9uJ x.u/pXK]Eΐ^?]ݤ7.Qj'X?09;w^$ʬXP[y4X]۶qQ@ye`[ReNW8u,W[=s(o}t}: ϛ2\> >̤GT`= w@2-K'g袡44k)_eMGCC zDpTxCxΪKFB_:`ct(sS(*-<п{{)x IqG:vOgjko޸v3f@m9psW->W<tKܛ;qas1 X䍨K/81|e-k]ɓ͑x+`H],A`y\sD'G:U(`vq3#7{B8 !eh%fz[%"{9>l1ܱW &f$m|\oUUYPAg'l9Ǧg$9`]Ym&$,fMװ`͚^ܓi98ؖ<W?^50$,e뗧~rL,#}$ Ĭ"]uvJ4X)+M>W@xL{<iQzX&jHf_uN^Um{X]]Mvwwj! oKVE:G$<5;%+vuf-XRIfizD6IR4lJS f(zoE!Zt2J4h 2|V* -4 ַx<~-:>^浪WVD7lų~,tI{$i4#WavX(DiۓVev:jG6R]_ڪ|b )GDMZI{ ZcSisЗ7 g=%LyJ6u~XMdQYt V^ⶌҀźlϘ(kSsZss -VjM>q.w";d"z?:bIo_Qh匡brŢHAj5[ڀVuΝD Vʜ̌FyͿwPP-l;)Sψ FP:z'ST;wZqtߠ2OyuvD{!J=I?LTLxP`=:4bd>fT1!Q77 iT$Sr$L~b&"h+SVϝ;g6wvv ,wqڈt[^d88O=5<І6o h뷅ɔfvANrΒbZc6G.<'ߦ[o 2~0s>Rv[VxHO҃272lh\_:5P(?6+$h4~:6/by[H}}0Ot:\HX"b(k6zCU)^!y;^]Y:k0ae:^F&ifNj B('G|yyyd:Q.v-Z] d~ٗ~Ͼ8Q4ʇ˙uO0iK)$Z\M>,&jlEˉG" !UVwB:&_b6 't^o4dr\ P2V`&RѯW R\w!RsQk`9J<7IP[d! ˤW@Ѹ2i@^2/F%{ZXV+LO¡{1 @%KmEmް~Աu32X(\FO@X\ԷU%~Z)^vb rZ@ןL&O@2\a8Hxa.F$H+s(Ais$@Ṡ uБDR" 3vZ{3{l6w||3ikfܡT*-no^tx<~di@\Y[css;jkdxXP,n/_w'ץ1vStټOrnjZ/6W4%}笁-1·F: r=)n L2mHw7AZzx>]  VOzh?k zaB)zP1|M\Fj: l RҏaT븰nZ6ׯݽT%|}eF &9o$xE9vH0Jm?d.D^vT跎ءJL l;p{rds#\Z-XƻzwEa>Qbloo?>z64BwFoƷ\|>z]__7 ;-LFцb?KV mo?хC2L6MW>>}Bf90f9;0>oOhGkK,IENDB`PK A 1D D +overload/data/gfx/talents/eldritch_slam.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME g IDAThZipTU}ݝNg! mBP1ʄ% (S1%Gd)rt~Ѳt\P'E" T) ʦIX@,u$8Uݯ;_+ʠ N󗠢"22211bttt{ c`Ca8Rm}}}kkncTWNe4G6jL2 PPvy@7"J)Ȁ7hfuuuuww:fv:!DDDC###zd5*V0! 01  @.k3N JfCsXם@QY а +`0 ff p}*ff ȟ4>? !fsjjjHͣ#TpI-C]=>Z4lw2Ls\,Np;4Ѻv?tycY5),_)?Ph4Y p.BV@{̙3}}}~J&,"ToMgggH ADI{~d*7ep;vz^:??KَI_7\0٪s?Z^^+:tX SSS^_'ZcYE + _3 j9,FRRp/w?Gڬe---C] 8qڵ`'$OÏzޕAvFez^(r(Zi;esuY#(X뭶u/yqɌrHuhdʕ+H("";@Uܼpȴ|XFlv!ZJ/9*}*Lt:k bNKK FsI?/_{5GJMMѸ)y###1MMM!SC=d,3`̙nMkM=R[O`ݛe L-~O555vY9%z~Fd7|eZO*`4eSof8dn_MV#yjHg]]]SiiiYWEIWQ K6Yg%gXjjNQՊbOBt%%ɓ'}=2 @UU4j a+f,Νˮo?4Q;FU2O}/SI>Ƈɷ7lhhhFtY.^xSف >j zA^x%a[E@B+3lI҄v>{w576gϞ*|qIdD;vlv@53_mgXݰ=-^w=`5&f!w{P&Ke7|h/R7<̔楧KefL&gssW 9m4 3> lY\6_m T @SSS%S{vIll윬mڻ… !1ӧC/K7dv~SRDq>sB Ag,$2*|n\șLڲsB^G zCУGUOh4A|.7+w뗻S4JHO6<APҸ'N_oX,S5B,ʖ%ZOT#pT]Mb0PNjLDnDh\ȇg9P'c#Ab镩`/zXY=>jHIP0.vLGD0_&UwfuHp[⬸ {#x&m䳏|C6F ʳYiqBτqhS=bxbz"5/n uwd0g~L,щ̓N_ EEmc"~@?Tvt%< LyפuU^HO,/op;{ōacS-kS'$drCkJ7_<>{ v*L-Jm;::SN'oܞ!# zRCONopʭe&Rrrry!WIʂl/HbWTT1܀βx bZ?3 U?e?IENDB`PK Ai )overload/data/gfx/talents/rockswallow.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME9,uv +IDAThZkl~ڎ8َss$M!YB) j[+ՆJ۸Lc mҴkb 3!6C`ZhKYiKJ8 %iII'.$u/ܟe3hV_ 0`2{CXY0@ ˊl6MgR3͐R.Fϊ|j\I YD6?AfɰIYRL)P?8Q]D 7bɞ\M!Y`̙lu2['qT$@Dl-Lo2uPwn7_&lm)ckkRY$k_XM(+P_XRg@|$b"tN[X%K*lQ$X*D$U$8ujpqlQppH`AKRF rtKRA$sX,/v¡C!bFP QB0IU.<}&TI,4A`A,&X_ubAaj7X@nw& HbAj$H/.!%ii@;E Un,]HH=U%XE2 }J 3BBPEQQ| LAv_Z.$6>o@toVMˤ*?Uh?ۢ Uō,**"},RJk|٨X̷ @n,,V2ݥ?̂TqπHTx.f8exD"G2%A0!@X.Pf'>3Μi' DE2{Y?bbb",Lb1&"fjwHK'ze [s,)E\mHsv=CSuSe0G4=!UBn;}XU4JxqUa`jj*k`1ްI<:4;*!r__ c`2܎ƧI;;;? ={IDZp t_466ܗ!` Jr%iU|*;HӐ.#CRl*u|8=ح93!Uk-QJXgLŋeEnz<=3 R!sqqNs>M`REQ.(€庯zAthA` pd2vwwP1F JZy모1 dTd`w)޽^荣oJU8\.::4xGU3`.(ֲ#~w@"XIeVgM; {gffl[6mق?^u/H$n]s6ng744l2MO[wg?=y/W+}݋]{͚c=E?SXb9兵j &8ǮAL ^Ო`AD|eI䲬{_T}Ӻ%L϶=(m>]n:v_[z='\-fff~@Kţ+0/^Y?D-K%*dto ~>:@p\;˻\$zkQC>_- tl?~l쵶w(B,*%|˫B\qyp:Tv*Eʅ nl7sl}&Ih Pebb"/1(nG'FKR91> /S_ZZpL|YTTsZ#-pZ^^~-8}dHzzaIt>822\.׽~ٶEA!A$~{IDX,;kvm/x;xqޠ;==}g]7~g!e|||(%c\p;Ģ͎ݞɮtJ1а]do=s7b-! (EexhtteUttn3{HVzD8rѬJg*ۋomwgā⛚]#(Bƅt."ۯ~Q_[@S4]Cvê~YD6ڇ򐗡pw "@Q #68VʢUnr4$@t5wW@"L.#l6EQVUSHpZ}|Zuu攭2i-j5j;D/]Mi&lӫ6Ss  OpQlĔGy[7Qzɽ^M7Ʈ&?x Xf^iRqgCCCeCN>YQ vNgf/S]R X,W>`_&L"4}qSRB[ɕeT惯[N-5 uCP(n$Bը4n/ cܺk8 ;pS}|S'|?jсH$%`P^^(X 1Xf|ʐ_Ĺ2nUidj ip-^ ahCax,1H&D"HjZRF|>_cQ&l*dk2Yy"FS ~"S  ]ml>Q(CJ1FtM@gjGG'uvwB,%^TY,bc7pr5]I`?uNa"p4_<^@ "`òg~v噔0Ή6bb17- y…p8LD111cccE.Vpf èm022J,'2e .̠~ J 5gVUUI͛WRRl+8읋BA40 IFV#FGGUL@v3pZL<79&&F;:;]2"VWvRL `xm%oXo_{LRU{Ս+Y}#>BWVd f{$0{5cA umHojtw\i:}^ڹ2U4j@Hg:|9kX6ɔ?$,Ns<<&PWpLK9ĢL*/8+Wttt\~]Fݻ#@[_L툌 @zzzww d5苴rO>R+笮q߽\Bؿkl6jZ11Q6w;vL4Qzݞ\EC45Ǐ/5f>3V_^S B\.ٕ4@ZbɑiwZl"z()"Ϫ233@駕 9KR ɩZ $eddaBr wmZZyΊ M"%b:{Kιu3 c6Ǡrw'mO8!&I/<ϼKk\M4Ae>1?p^λvZ'N"IvҥK{{{fz#<}y @ ###iiiHUٴ)lNj[VsAttt[[5LdJJJ=zuQ`v6!={D:7~ 2PsD^^E\)@kkj@NNI|[u۷iaM3̔Bcwv "|ydãgovpނuϜ9cďkd$dn#y}d>` @Ùnt:bU*ޜ{zz6Bt=M Wloow8/kM*V")H$(,/Ժ{Gɕ 7]xY_WeiiO?iZWWWOOO~~n}&?yۂ _(.Ecc0|eϗLaO{{E=@࿪W"J/++ ï&eVidjjH-3dFuۧiFGGGƗ%Q-=VP[,^dW$_8K}byZ I3{gIf͎[`q@ 7!Ӓ/Sm LHZ: %o,xn'?d$|<85#zĥXRPrzq^X0H?%@:+W_?foooVV֏ *yzo3__D_YYwRVp:r4M+..yuM?l5P^^vwQo~ql7 @IIɮew?~jp !*++[ZZ5M+**zpL˿df?g:ȗ}9'&&ZjYG*]Ǐt [@ZŽD>|n,_17>"_󺓧ZwڕcMc{}SVyKK䕔~%`5k[UTT)ѿ)*@{{@z@MP(XTc#ARE0];oܸ;vqu4RJ#Hwwǽ7N A*ܿbff@8޻)թj6]1]"NG.,,賻ipd'Ndy566>DubkKB/td3]Y:+w [[[{.n 1x Ǐ.JGSXF P컿Ƶt:)1\. B=jIRo:o7C :VBO=R+MOI2?ǟ.]Z_M"^\p|d:~+Y}GGԓTbI@3 s/~>w﮽ }|ybb~ R#i`=u y B_R7~ǎP@ķ_<177w[jN;͙mۺ|c(x*~;r8ۏb\S_?7+fWؼ_t˥]?:%rym $0^^Lv& wSDOVb~D H.Gf&ۯ )BB૏ P8QSw8=I7D|jT0+pnkOLJL) _ܹ\6t СՄP٥i@gv#g2668"QH·K=~~+9:B¦ I|ݑĩZzTyiOO_?#~p$9,zɶ&8p8  S?bk3<|8ҹ NceR' ;NEY:]쟴2lZM@${hQbz{{Ϝ9SS$[777CC!D#M "(K_5 '\8`{\.::Z nƊ( ---:PL3@?IJW- C<iSSq|5un9te8JB \gYb. >j*"֭{ukN3l"UWZ[ P\rTJU*:3 H(_`)vB@eH$bF Q^j5@Z hl45lW"Z([mzK^:5ƍݕZr&;7@2)g5{B ժDLǾqSM@,[@] p"Bm`uv- f"h' M iRI -5| KW/UIe{=;;sM̅B!PPӂQ0]j=nE -k @La`t5@hJV*V]'JR(ҫeh{h4uֹRX:.c<1^'όH2 w@HGwa!*F) DC"T*)*P> 1DheN(]K%\CÒ)1m:˿]Gn7^/hf\JR @XbVj{{[oFQ7t 7ݶL[dB!!Ԯ'q2444-:qb2\9^fta`Q/VѺ 5a*D@*m辌 U+: V$aؓ((6FBg][|IVf6|3323ógXs{jB=PMnݛixxvnS$/cbsx<~E,,,0x 0l6 +LFCb^džrjcn*zP5KCfToADL;bF`Arvv&$@J|t:-"Li| ٳ5Vr'k'z"-PWWsP4`rۚ\$Les3W4kUb @M=z2H$9'%(ioo3$`['bv-#9V_be ewgL?ܺu~+QGq-c\tRpvbf4s6z$qE $D uhF/eGs'd^zUt5aYlkB3 Orll&d2blD> l OLhJ%ۊb(29P"ccEd,(c%r+(RMMRWS ڵ9SJ WBiTP195В\~3 ivROVnl0#~ӐP.MGcf- uEMb[WmF|[isY__ 48secTEl8Vq䲶A=z֒dJ.tmrOE_qk B +qpȈj9;;1"ֿ٧[n28uv w Ǵe9kc/H9sE"Ȗ-[|exҖt~ͱνoR՗m0[˚Yȋ mę… /}㢶o 4b׹v;(k;w{SCWi-yQ_ͧW8ijjڽuϸu  sXZds= 6nܸgO/ehv"I'̯p8H$6oS*#o~>rr8qv$[L &&&{8SW*/Z"5rrJbx`;ѩREq"BWԪ _z[xصDB&88P33Eb"-Bzs]]]Z +K ikáRDdt4$ni.}tɏ~䟟Սy%^DLdI+WpC׬ H%;7"D`BE!I!T$-QBE *<6W-?{i[@J a&IS"JG!E P x}R"- H iiiqfgq ?ʼny$,B(R xw, y:.?*fӘ0|&?+XMd׮u_:7MY  DDNKe&-8='#b G'''7o_]us3:Z@RR҆E B{פd KXuOf|_f7x@v^@ar}wr}m H- <󎔔^Ї3{+k2\@QQQɚXa?[UN˹i`0xbwsLqAzlzaR }Znttuu Wp'KJJV Sp=#Oեa`%P~dKKKQQ·Wҕܴ={'=t^EEI#G &j}3SԿ={&xlo:; 0cG'g/_ ǦG [oqeu3{Z=++RK;;p O]˫Y988yh̢gff=g.~}u\ѝMCCC.[>IK.R-\ m ,@S7$n^P`̉u z8O_?rlmK*⺻-cgeUƒnYlي{3I`E6MJlmmͽނ便H4X8فo5kܽ;>Ђ UB<j,lxxk߾ڤR 05^},j|Z..]Đ vep,4( ExO/ .\`|RY{Z 7 qЕ+WxI;v&ݐ O5Mii:@%(Yh tMMMYYY~EFY=G64׮]o`N!p`` vt Ae9< E]8 GRNw399lM} Sh)|E8@>Oedddƍ5VƾaWs/1xDdhWJdǎw~8YR:8}*;J<<)Va_ L>B!$U"m0Hτm۶)XnÂbWh K2\ndQ͕;¢~nnn 99U$zEwӧ+t1P_8(3*E%"?cMFƝ֛G#ܼjp]kŖ2E~clVh"=OF6}>_ so 7aȈ04"ĉIV>bT# ƱFI,Rm݇8;;{fff?P^pF4`9 #)4xhyuPs4ۀ4WMP_ӝ8v};4~rd!)--݊G<;6m*2 . k:hN)EZى7pA`PId}"HkU0M *--W\a*3l|^ԁS9l }|hCexSSSۜ/7ŵ=OAA}ʕ+"rwb{ڛrɺѧ#GFK[IЊ=fк0OMM/yPL2PQQOJAS: lS߷544~HZnyp8lYVqq{V.0rm kV?@$S5) z.#B͜7o'cɓ'G{J(4瓒?Sٴ\ į2m۶t]965cvܹe˖ݹsGgK1IEFŘ}[LfZ+~"a/)GV:g:::fffZ[[dgg{ma0]4E}D mv޽ɴhZ#\-J!ʹ؇o=y`zz@NN޽bvE2JEKD;$[SG%a7G ңEx>zǬTY FAeZN|;޺әKŖ{$E˜i=CCC< Q7A+]+ qZ_|НO~Qɛ%A :h:9RB HMME3|o3 xess|}ڵ[[r1Q[9I' /KJJ dB)/ &׺~CsΝkhh())ٵ&fsw1lP4UGDNi?8|ĉ_aXC|zիWT\\n:f zga(˷/_ #k豓}$$$WUUͅBP(488800066?w~uZIENDB`PK A'',overload/data/gfx/talents/rain_of_spikes.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDs(< pHYs:tIME6uYIDATxytU?H&BB""A pѰ)AA}>DesfCA|ˠ0$J&,@ $!N $GU/Ew%0.NUU/P7_yhMzzf!e //Ue޽0[L\oxl_&rssya [ĺׯ#** cǎafY`dP[[Y0Y$̲˲@% X>/=zrp8* $$N"8&dٍyrjQnۥq)|]cUT.SUx0No<Cd_,/l6_"?>In @.]شi4>x ÆއH-nz^6hL\\mmm!rhobC=lFCCÿFX"^co=.Scq(~Uc n¿=7DӦeaɣ!(Kn8qBExW}?79ў=de|-r;hh O`cm;ʌb9 |#tHvʸ:$FTW;TW;Pdta|+eezu( %%fq! ޾} 𓺰nvUwadkmo Vt-݊-qe! R:oO T q@$G;ӧi L.ú)+FnصA0+tWB3tu p=}ہP]VU9Hl%ICA0+eeK#D߯7")))ni]{\*.%[oSᇿ( s=zq:RfN4d0f] >йB׋1&pcw64eGd$s_$6~uag:@bgߎɤ4>anpϜ={NNNiq!{ˁH^z45与pEB-&&kۭi׮3Ut3ox辅P]] @||&¤徘@6c{}~ ?{b|MMMS#||<̛{i1EE=f.{,X>DV }r]U}c:W\#`ٓT|\Td/>/lCr=N0СCB !99Vrɓ')ˤqQ;K`uuEEQ氉ѹ] ۢaTW5JvJu8v\% :E-TXZe.ݱ8Nۙ2%[҂wQႥK+.dYQSSÑ>T3͌mT5 UVVC0 KY~ 5kp3iiid(Pyq;\z7;悧aXڵyǼv)GM?A&I̟?89R {-{tc+G~`+n? N'ĠA;WJ̻q!pc_^`Fk0Nً+x#t ~U-KII~#mlߑuy 츒 [}Њu[/6lUU))ʾ}Fhr]YqrӉ ]#3S3&'/,X|%عsr{BO,AȲ&Y01GgϞ爀F?9:z#cƌ ;n͸\H֊ʬYۨk>0(hĚ%9_Đ"eH 2㎾|f@Qx]GVVVXny9$A o`8Uɐ`1%"9@w~&Oa]>nscR>٨A,mV(H&mckD3o^AXy!y&?2{E"aKȲ1V[]mlq'qeCT࣏dɤN J]zk&+&ٙff qN] L&82'V$/:jjj"6&7@b oH|p0=tnfd!W?mX h0^Y%;J} Ob`:W$͉<|#W8rѱ`(::n&*F{ݷ=V4.++m;cE`ҰPjj*kVz:]*.nN?0 &wi/aꊎ. ?r+;>B}}=)ə\;H?=NSVO8u۾bh?M&_KN+P"8d<`׮L?Vm7ٷH Ŗ0 KEHe_θqאJ]Y>+LU gsrz*ܰ2G|oVWp v6~>} flڴo~<D|9:ZZZXim߾ ѯ()lass3+V1dHeee3g0mڧzG p ^MxM"0$K466^ruec |`gxA9T{Oy)ȷY )@_A ɂ_FኝNcǎt=pDXBm˖-"`^{ &Yl{Oqq BAw*|NioFxqAդ;v#K)ۭJjYuO, -h wv\8IxN.薐g-Ä ??sd2zt $5? |( x "U \B(R{;h è'2 KJ*T^VQz~;ïEx\ gT<9RUҳ°\Xqѥ29Ӭb85g雓س+͈1求=ө r?C9K& ƃ=E0pؓCzRmCf؞UQ"s|N qQ:;:PvVv 3Z\.b 50TL1Ĝ4ܗGO~kjmMa |$S&0Tf5R(6n JJ49{p(QIU=UyC1Ulݺ_g$@ll,iiil6v6vfc7'}*n'H\*ꧯ)^za۱ٺc+:l6@ȋ&AhҌ~ĉ??\Lf\?n{|s=Jkkk2(ZLAT+"VN13IENDB`PK A&::$overload/data/gfx/talents/shards.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME`Kp IDAThZkL\y~`.f`3a0c{:Mm)ۮUI**jZQWVRkmۨUI(uƎ/|Y`x`3`|蜣}}_E[-Jin~ ɥ%ܺJRvB2GGggg_ ݻ6\=Ugd7Iā};._ZZzR]f @JFp:SSS9RB}\K9v_jF RGw##dG^eu6Ԁ |!51 $yK;a@ccAp$%iO`ĮLxAl (INʵmt?삎\uD % Ex&Y^^B聫!|_à_%N._tv9KIPQD=h ut,\.t'ӐP궩wB?6z0!;oPF**`>_xكU Y\S0Bv GFɒ{I*I^p#Q$^o*hLf٭x l~䍁lLJ#U9:OusjMR!t"M##S[FM$}v_`{ LSie0!j R,ջR6ַj$ՌʢVhmO|^랞jg  -I-7 U5q7t GytMEm;˵m.C==2_Yn_ &壸Dnll27cď}Z)e.{~5A_ZM{؍wիl6[QQV&]H;@?B"JjR(_F@ M&ܪB#%4a^[xm6\JB|Au*]5=***orY.X5FWDktgm@```&-sTBRR}'&I"[/ +Vy$iGvli"I$xB /tvNJC?~7H\sK@@m#fD6 /\тUt^"$h*ZXXxl<@{{Urt C\?D"EEEG:{Xe$.]o|D.E)4g5]ȼJ)@Fa%h)Um Ϝ)u&g㪼ˀǓ9xERZyhڜ4jrc҅b_a; O؊|Ç'jj&~Yd-Ay5H)_ժ^@PpÒ"D)UUG_f?0:Jw:kHrWo^o2l[˝wNl>2Ae.n^~vw12=ͦl±3M3@ 0<XNnCyY+Bd"|v{]]4௢sssP@ͺ l?X|dˌn\ <-t ;4YuG j)2: oZKKKwL]K`tΏЕqzPVbNߣ+ڏڈg;N'@GO BxOD&SP($$-GRRi$]L9SCUE7A y-l&[$I77k״t~}T#dӆT \H4AM`Qϐ`tff&~4033#DNUBw,ѷ:QOHB`: $y;)ϗH$7kH&>=~xRʸ}D"SSSW^Ƙ0PG,o$gff4p=|.CU0Чc`05ʌMOe=gagKHv)7x񼹕Zw}ZMUYr\"?V\\Uɫr{3sMNjVEǟ9 =Z\\H d;11!!\TZ׷ O}&Lk>V-y[+=6FV6E)ߚLLd;~Li|ңRkR~ CCC&/*7][_۶UB~Bo._ȝLˉ+$D"Vݻf8%[?=y`~~~Lt=^tfseehMLej=krrr"l6 J~sbxI[aRLyIENDB`PK Aބ-overload/data/gfx/talents/elemental_split.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDNv pHYs:tIME08Vt |IDATx]Te9;;`QjdI"v"aT$]AxEdE^ t[ :<]svf?hԙgfq,yy?*",Y5k,-ԩ^ 444k6Em\qŮ쌦 ,] /bGXxq2e ETPW QH/vO`ڴi`ApEEQ(wf͚$_j]0SoGX1hM$xa"eˢhL@Օ[<_paT|9n v<98(Ƌ ]D`cHQo*,%@@t-AA"17h@ sPX](\ F P bqlD4?[8/.$  >|ȉ5L#j E}">}˲ؾ}>lLܢ6n[]9p\R}ձ%E.;ꩩj`|iqxG@}}|C.zա T{߫T*귷Q nf(&Ml~-[Vl8r!L֐k- :F.QH[O!LV6E!xaĉ2C3^$ʶm* ^ț/;x] {.|D"A<,Ŗ[mjBfs?re](%<@&s;wfdقsf~ׯر*7aOkTW-[`Y͂dI}͛1* 9s&OL*b b@,RS)* 65%B_oɮɐ^<ȫ>??|TK`̙ φG\httVx-gZ[;=0\TYL + Μ y3`vZY}ܖF wX0 z_Ӏ=L[*dWT|^|\J+ JR P5j "(B]&(dGCaHC>@299.2VXwMpLd2|nۿE-~IENDB`PK A{c(overload/data/gfx/talents/power_core.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDs(< pHYs:tIME6%cȿVlIDATx{\Ueǿ,%oʡфE %KF󖗦Ҝ~]F*ӴtJ)hii1]&7" r=wNA99~{\g)@7p̸q:ݡR@@@-M^^'֭ZE/^qw2߿ziShꈀ шp\~,JKK49~~IS$Cz*DӦ0~q>qѽo `h 1M0/ 5ϺX`zI)))MVPV-Zػl̄i)))!((3 eS0&=G g΀Ԭ)uTM ^`Z"|VӧOWX@^Y>8K^^ޯ`(M-k2 eSXXI0A.mxIZ 5}w>X4 3bDC!/9f$"zzװu_! @ݺu4  C|P` J4M>d''Q`ʺ K i'g0 UhԨj@.MX l~{7= A)o3J6DOJ AAg~[`u+DN]G'$DXD:,gX&ΝsΞHT :t+-P] ;;QShR{ѰaÛ ,,LR|Q ZɡB54U?q+W^\xqRՎ~Ȉ)m,[4< o/ԳP;0'D[)Lŕ+W.[ F)TJ8qrw=z=[PRR¸?aR liَePuim;Sl~{7.\`})lk!??Kq&H; y~5)5[up$%K@!_&xMSy١ybhܸq~ʔvj9U&m: ;u*D\!oRAWhge@+V/ cڴo﹞a0g<3/;{r~v)9vLxn98w=-?[*6UK/Z2~| wqm4M| ]?w[(1ɦ3I&LDTsoDѸ1m۶ʘ{Kc{h@JJ31..Rf&Y&3>F% ֳy* ;Luj8&PxpEъg~<KVViVISzZR)0MT+=.mUuE!sP2AdѢ}Z/ kָ 1Kۛn[*VRn+|$讑SH!x䑸*#6<SOD)PF8\믧L ]*J1} Mp/// %ma\7r8}4[8[o!ZL˖-9z(ѝSQϯnʏ;6ހ`J)]EV](nQZZJɤa.Gtt4%%%-3qWGkx w8\l\igИk9z 7<1b)[s|Ăa4 7̙S9+V@c7l^:=ך^qCTIqq1+;ZSBR*{!ܩ\Mrݻ=:Q\,*HD8/Э{5G>>>vοۋZ]X>*}\BBBHLa]Sg 4ٹ1ƪPá0`ZlIϞ~ij\0G:5n˿ {,xM:l{aڴ5%~o{,bC'#s%~;Mpy#W4ϻ,7j|v-8vLh{KivmÇӽF~HCrsaö:g>l1~Dԋt0=Muݰ%"U]SvDƕB%cwQb-RJU5!FM'$4UF"-8+^}8dž&Q& ㋚ ,gީ~7 nwI rHD"qL&rLM9,LĤi!-=*jڎVbWOLD ȯ0A Ti@33TTnYbzb"$j RO1eGuʢ@ ,D  S5=xQ4(@yEOUel*'^[Ml6 TWLH$FrGn`"@` ׿?+LN?Lukkwl`q$?~]^^nf#y_<٬B {i7\047 +kd[z$JV.8v73t5Ǖby Zoll4u Lbqni{9u跨B1nɘhdr0F(Λ %/wC!4הg^im R,Y=n @ 9u{{3d%%K q[%䓱3m\/1.Xl {|>1yqm .אZ ^׃FϸSYtH nrڡ!7TvPmrfVwy' "bt1!5ks۫#{RI466vÎ2}0|BI^oP'Y^*Ub~qqG K;{vNL9Э\(T*mG^쬰o&3  z'|6틉Ib@<҃X,0)cwfM.fNC V?)m o|2rN(CP-䙾{ б dk Ds(E:v5D<`0Mc cZpxu{ƀp|(`](429-J JTsmJ:(U*@6}*_v zB(Nt``lޥjQBTjĒ &z*xkF,䊟@׺L!"RTo8srዧZW&<\l:3$~FrJZpj̡ЪH" hϞQoG7VCjd2yL|y ecp^>3~G'?bLDwbyDWa`\ ΍e+b~rRx7 YLnDo5@.'``OMDfD؛J[&QDfea# p>v~i%N,k@}GG'Z/SKCNA\B?'/[pT*ƽģ]ǾBζ}=e^m<P +wwalr\X>p:L9#χ|]Ֆԥ}þb$5A^zf4ϲ,wP_񗹕68Z>83ApS|^V5fYUf; "~IENDB`PK Ainn*overload/data/gfx/talents/mountainhewn.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME :!RIDAThZ{X_{gf`@7a@4TP/ E Of|zdeYgif>X'2`xݧt-cxدZ+!pȩr39nu 6𘛨dGT[[wss[:͝1bGGQ bXUs?C :V.!oO@i0s1o"A 䂑@K@'Ǐʉ}}}D|j}W&9Ř1}{a!~$8 "ėMjZ~BRBSp0!CU,-AaHp`d}**z-(=xD"CdBqB{FQs]]voƳ h4 B.ev1+@x&Q 0Zir}9G(v r|VWc@ c$2a@ғQH\(rL}vK<ޜab~0тH WG#\08PHz8rN$t:]z522JD{>62&"gc5v]CM6lj(gax[TZZxԿW1BɃ!CBDFd?eT!*T7jgn 8Q{≄nDrHEF C^`lOI>#"2BRߔ$)$$dt$dQ-$_Y;D! y#!#5N'<RYr<<6fd驤c=0)"=0C(m7K|s&9z0ڋc˛ ?¯vdNᅸvX(b  Z13& l`tNSi!}uhԨ C$w52$%RY---铒I;IC|In!-;Z2"mcd2!;[WW'f36M$7URpNy܍#$c 9Cj;y~Ȉ!&D([mY/WCH7d O.;A$y*dĐ9e DHGf$I2 wWFRl6˪xeB 7:~c:"g @DO*SDž CREW^-++˻& @$7C6!:1a6aL 2#dr|jkk7aDDT$I(79/M9k~đķWӧ2W(s\jāvv!N-DIC @KKKI Bv.ٳ$h՗9ӊd-2O8Ҋ\ Q8 Vk׮=eq}||xO6.wk^zI(hrso"q ]ӞXcg'N>}0qQ^ŋeHb,ŲiӦz{y%IڰaC  tD;v)xw4eq y=zŭ~q:C裍UU̙3cuZd;ۋe/9J=4G:tLƐU`X*++]r*đG?/\8]Tm>9`pj3-|}}I߷o5KB$5;/޽QĨG'#]t1hta֭[y|pwwTTT5e>q!5{0**CɁ߿<9rdkժ Α/޽M5$>K|.bf+qWtVʕ+sŰ@ꫯyɓe*?~Dnnn $:xɑ^=|6#_cflB;Eō=e C![ìl6y.wͪJ~6q\ЭpsIIIW={\Hbb\F-\iaa!~fɽC9?kKWfkLQz^D$[:쑝;wNEmhhk'Jk9ryyy내#k,,77K9gNˆiӦ׍477ggg-8r{&ܹse CLϭ\b/9Я_Se}055s/^\u(Ν;~N}MMٳOFGs^S˖-{b8]tk…jƨ4C^!Ԗ-[~#c07nص{nݺyyO?#CEſ˥gg_\tg/+)2f(ڳgOJJ#75k֬Y'N0Qub#<}c=2qllER@.mݺɓ==JDɩ¼Im?]kx͛0/&1 G9y^75MxxaÒFi80gddd/yh4&LHMM7&^b(*YZZZ\\\QQa2f3cLVk4Nחz` 68|-[233_ut@Pʔ)'Nuow8r~ VV5M pu<(*+mel`(z=Ks=C0FX9< HP2> 붞'ӻ>3֭Bmρm&ֵ Ã!8I`.E}EO[['Ye\MM'Ԥ4= enhk; h` lW I%̺(?$Ro%0 TF"4}: 8WOoT\ Kfz! /K޽aln97Ikkaӧ<#c BqwPũRbKcIjj§^'OBظO]r`^!x=ʅ;: h+1FBbKIC%;Z3inn>CƒU`ۧ0oȀ -*]@ZB_:TR@^0%[_*ktCT|Pk$P`\a-XRǒ)#%-/Iy9֯v3Ial5UYRBP "$uu{j@Ӳh;8"(+S];,ZJeTF_PWjl* %999=@R_8A0_젲19$##p81B`K4i(ݜPVVvz lU")\7{$Jɓ'=b,dUWIp@ Եe>nisb,4++U/[QQjD [11&N:v/;"݉BrdIP1FYYQl>hCIx:-lsT7MnYLm`(/FϭefMPI-* c'Z^s>n./^O jcO#>R-$BB=Pc#JKKS'BˠRP}a򣭯pfq>͞rϴirCYBEm &=̭'zc}ٶKy]RyY zGILщ(v:޺U999\rIo&^,%nC1w߅pՕ|ѝ XcD%a Taؙm=77%e;1. fw-`ryyyB!Ip匿Hl^dw2|… J+Astor>VUgY["QzeTmX AD nEȓ{{X~G׻@#!,+8 RaGqW*W [HƏ̜Ǡ>lĉֶT#s˲uoaN-ͤ£yg/psyi[OReH0!͉I $3&pBv:H8f˖&n8PJGygT<֯eǎL-f(H'a暓>ҺCy~J'XF'/dbQɂYSF"˖b߾}TTTPQ\8cCu=33S5HH_t-j^r/|* f̘ұ ?|HE0 ͊+zmΧ"pF;l%my[N7Nn:lml}ڨ.Q Ekhhh8=1yr1ߙ }[E^?$LlkYz c`{nxNg{FO6"̈lnG.;׬f&| lz 6dA ΖQv~C(KDCi.|6FR,X0!-y`ƫsw t(mxSw-/qtnEnoK\FODRWr%O.z8W^_Ą1vvc`hǯ(Vn=555#BƏuszCF 76_~0wu8)\!yΥ (EEEb&޽{سg)s||7PUIENDB`PK A -overload/data/gfx/talents/poisoned_spikes.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDmmu pHYs:tIME ,2J AIDATxpՙ?oB"HA DZt覝:+ݺSqtmw]"l]QHu$4T)a$n$3=3{}|<?weqfa4xkp{ހ \ . xj |s=n|?ɇpP?(cz-}5kAaǀ 6}6,`%=E6td(&CMc {0-ܡ=`%%k2Iuj׀ Ka`~dddl-` sݛ;ץps_|,/Gy㾊1"9 jr ?wkk1<1Njq A!4bw6Bkg^#~0gExΰm[#2i2)KHR8{6!C2-t1bExM纰=J?g^z|$8 R^7(/ox<0& J'Ub:|sG+FAD:#G_Ȱaxpp#!HvVq!#^~ :.@yBpv"B)̙| =L\pT^ {~i }sO!m (bG Å *˶?_hxxO zt,L:@I~jzca:B_ff: 87< ۶9O}+.h1!0vJFPxA@bXwHH:Ȯ] b&K`P Ðy{s.B8x9rLٳ ? ?|\ a??~G̞=g8pQæMG#&=y:ʂA J85ŧbشpPk…} rzXa>@kͪ&P 11|m3'N 4eˮg\V 1>SbvNx=Css{ŽP=(pXzX=w߿_%vM$VfiIt^ZTbp 1B|` ϋep]J{=Lt߭Avg[b=%%|i}},"n 5bRo(/U_1EڀW_ Rg3#@n_ɓMŜ9y,[" (u.AK%n@r%N4>?w{aCBpZZ2y\EbG7ո#7'E(Y|j6ƘH0` 03#VNQ7x +86Bn@)D)DTCkkkx/_~3ٜƈq.]5#0M*[64 x$8N?;-޵T(<Ӛ;wnJ Neq+o0-+䮚ʚ+mS{Y9kܗnN Ǐ7ѻ1tMBV.Sͤm zR8gUQXv!veirBRiӦpiga2yQWlۯ9pBݺk2cZvƌ0Ee34-XYCYn/ɞe|rƜsP׃| [G, :233#w_!F8mۑ#pD(rTUUQx}5rss sgha7Y͉rSLs55/D4:änW\7>䲍d8bCuuur ohAR$U`$;\]srڎKk'̴|/.Xdv\ nSSå1f͚Ç9版ѣG 7ߡ`dl`}\Dعsg\>tbY+HU_|v_<|_j)ND)ŲYHkݫBkڴi~kF)\oB%% }(T^N6@fG=0 ,qqaI y:uj"V]cNk]{͉ {WƲB 8qU FsuB*:  :F[~uF$ԁؽ{wRbl'X]@6|Xp_ zHo|'n2[oesfp 7nQk7^n,hldݺukWIENDB`PK A55)overload/data/gfx/talents/stone_vines.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIME64=IDAThZklWv%EJDԃÒ,ٲŎc[Jd[4I-&Eݴ?(v[b]tbMiMwԱ8~ʼneY)JD4%>Dwf8`/r43sϜwsAK^{  fbd0꼀/\2~]X?]tmHb0D'""6ԦMScT&hh@D*4ڧQM*V52NNַJbO2/I9@6Y)W.V"a,Za_$X3'uLPWDVL_E3E%% ,t (մNx}[H(J"Ngr6/U3%Y@D#e@ZEv~ieo͝Ɉ>,T _ S_ Xkc3Ȉõ*d $ZZ@IbT>i6?i)38FWgý1A`-m 0$3@d`` tB^sCLf}cXv,+ho XY'UJL$B`~xnCX;t Cn̸\.YQ>7W$MlC|n0F{{s{;he]J9$n~g{[r7a]-_̕$_?ρNd2GT"2gU-r\i@QFZٿnNbpl+++2tL@$6mrr`уǽ!B97G h4J[PPP DS~3BW!l=G|,--} zVOSĖL`&` @>>h4E b*eq %:`*)YvrrA7<߱kz~D, W % )B0$pw-pV\\V+D> H}`柾t.姼Vuf3+oVC?<;Z`Mڮk~JR?M,n"+++vwTYIݥe`rxB677??RYh,!w욙d2RFpeK[?*;tҩ"0d8HYbt:f٬fl6Y^.d (˫`0{4OoޑRn]b,A#֒13YUeD\͌";< Ւk̂`bI BL?>\L>[g55V,Rna~tiD >-!h HE aDX!=  8Yqߍ6`=ΜaIlV ^2q3WՙN%VC2 ;Kd?b1d2RPp5V EVWVVҗSi59,K72?:cZJ*(U ,H搞 OY#H>466t%^7*j9WNdp8/V4<^QAGqB/ڟ+@9OomTߔ:ٙK$+ck.)))yUs R2Jbd2ie8Q uu _ D_WONRCwn,Ӊ&2jӃhqM @6pZˬԺ[~Vufj9~s.| WTI.//[^4錰FڊƑ)3 Љ62k%a)PD;w6/C@{Ѓfdr&?\Yt{aw/\\WFoZvj0+ۄ. *}up*QX9""BMfƛL<t_w^s2)q($;dKh+c{-s*䀓PxL,|Vu#趝|3?J\zDO4`lӑr45reMMcۢPA(okmrO!-؞$Is:T 4Ӝ^4ӜN$w1KIq\9{,eY)%3OϜvc:z5b;sh4Nwao}xm.f7Tf j%XU{Oֳgܠ.xyʎ&Gds?)n$ p<~|D,-K6݂Ry;NP0o@P ,s=M?ߎ]ͦnIc;;^WtEfOxzLDԇOގ7e\(01y. l冇;T]Gș^ZZ2CВQ(45&Z wFHD6051an/uTOd^Q&+p"d2x|[ݮϲy BW-sQr{GX@Px3 S^Avx G+=qsۡQk;w2/y*@Ə/ }#M=pnZLqn*{\g&{Mnzi"[|yD޿i/R \5N) Rc80Z0z~*FˁpF?zn@6/V]8":4e&$w @:fu/ht|q>eV PֽϣU@g/E"е#.=Udfب6-;JSN\k3^ %=G@p>W*g0؟ .-- M~1r@)GTvuj`7H)<苞[1WWWLK[_3fxUi+;O盢96|1;pyϾ ԍNX33zzTZS5K=J+Z :R:?) h=mQqhpy`͘pO@hC53OxGx!y\e2OgFTju[{}x㋋TJ*%{@x涠DX\\+°k<#Hp 51;fx:-JLy,[vT+L/7dSX,u'c3oRE]X]]X,#oo߽4_IENDB`PK A (overload/data/gfx/talents/stone_link.pngUT $P$Pux dPNG  IHDR@@iqsRGBbKGDs(< pHYs:tIME2'~ wIDATx}xLW?3H&IHRH2 x"C"KŖV+ʮZUZU4Ull_RAY/EI)LD /$%I$׽#/}ZmbhfA^[#L*%44T%iij\@If_F 6KlBhTRRRd ~&JU5 V7:.]4:G-wzIGXʐpޓ z`qΞ5F~~~/[XVvmF*BNʙT*JJJꊢΤRBBBwHuu!\;S [E Aс25żFDQё:[+t&MLZ-&؜QN0se&*ح [ݻ`ƷmۖM3/58B{ARrf,?[5'%!' ,]&M7yg(..СCW<9<駡DGG7<́ r  ž WϿdN:@ٹS`>\ABBk wUjx tܺufYJȑC9qb4yybENu$ҭ[7 8u Vܹs2#F eݧϫ(LkA]c)q`ggLj1AN!kL&IvڱeK͕|kmP?}L\)K Bdd$}årkKb &>Oo2xZe`UDf-_+}#2yd|I`K/%[ذAhТE mW%ԛnω}AUmڴ)a=UغL6moG>ҵ@*khll-7'#"jXɶ?\FѰdƛDt$Z5`gΜ`!2fŒٷo5W^\n]P8"/߿Ϛ5).n89c<. N3CXWKZZC /#߃wށu#5ر+Vʟ{ ĉݻfo*E+>^]]]mUTbjj~A 'jڪ%Ե^O :99& bJ Kt4b=zE| jZk?,W-hI `~A|l|f T*===n/GGG1>^ڼkjʝ:uYPUڊ '6*nJռmYkΝ; ի (h/}VhEWbG -:{eujs*cŌ6h4fh݊:\9:uu ﲂ$H]O>deeqeIp/qB~HKK\zuX7cƙg ֮o}_1IZQzw44= 6ۓ'{s?HAAAǂ_kz(J+AULPՒ(p|N~P ɓ1)7'sY@߾}-籴Efl)u7Vt:͋dde_c}oooRo_@ &&x;Zx)x[2Lz|^R1~P/Gdi&ͦRD"q |DT^^P&#Ac*@Z`vV\gg|(jjjjiLM7E,Rtwb2p@yh/e;` /3X,w?qMy`fF@K@:uNwpeƻ8ӀF`~S&:CF5g 2nȟx;FqǾC===?oz^K^TN]t!ܠ(OVH-G5][K'ۏӭhM06!m.7pmfaLx{B03O5"?W^ydz<af!XIK o=QD_0yB{!aaH/KIv>N38`="LB[CK.gc=`鲰$,y@mvvgEAy=d1K@<g륤2%y2V^y.M(_y}~Nl0́(@2844tҥt:}uGp8Ǜxj{]m4%'u%r h^0>>oBhd29~eeemmmB]Qܺ8S281tܹq e+t"jÍ۷og5,轋ho^;r쩧Zcs'c8~oxx8Jn͛7wa2qJ2ɱ@ =̓m ~MBt#+#񥧷_/Gogg`]t:=;GP(TWWt=C`&ހjŨ^nrJZ|%"Ssx|{-q`?:k?8L&vE޾fM9s0o@.#PqtwիWRm`<̵ q?rO=pbO0[)Wp &l6k;9jnn|2\xQՏlDtR/"=x}ty̶*u?'~V]]8t)Y"d]F ^)1ELo l;'bxy]]]$x",NMMM(JIVZQVa``I]Ea!R/_̈CQ 82ng5ׅD6nƈ3uw0H\crK{{-ng3ݪمA1WDXJKK'&&ܼ m E0 ?;~M ȟW_}7_ϚI;23`!^XX,d><- != ]~ |{?cOk*-0`%+hrtzfX T FR{-?<?.K&!0gdb׮vALd4'mH^裏nk xY'Oݑ`(ky!X`&\V$ t^}Nǟ={U_t^iM/ E7s RtS:::\C"G N8{um޼eƵ(W 0;;KE54FF2###CCCCCCccctz3;"QIII4FH4{'"l3G"l6;==dp8\^^аe˖_|qZvy|`WW/]J\`˧?NwNXn݆ W ᕢ37bM l.cf)--bX,b/CeEWW AjCE9F]i $vLˁd!N.+c(H 'Q[fPZi ?H)asJ1&C'zzw1]+ieD #?8pb+,Vw6S:x1$+R;#?VU@Qcc /%TVVرmǎED l! ^D.>Ñ/>H$R[[tw666644TVVhKBx(rR3 RkW^M&.\eߊsK͡P(B!grŶ IENDB`PK A-k>>,overload/data/gfx/talents/eldritch_stone.pngUT $P$Pux dPNG  IHDR@@% sRGB pHYs  tIMEt?IDAThZ[sTWvݭ֥[tA\$k@PFC2L|!eG8'I<3LMf(qa(Κ|P孵dii鎐 T aFPD"\<8??1AU vzeyCmHB@(/zh p!H*NjkV0Vv{@@H(6RWh- Qoݴ..ڵ+Rɓ[ED B D(E1cXXV(݉g4>2hK=%j˖-?=]қP3M\ZU D)TPNMlȷ/6޹LgkUU?Mm`-X&gIh$;@@)sѣ6ॗ0!Z>x́٠ݢ9::_NY0u/H]d+,((؀$_(5dԘa޼%Wk(:t2HLLLĆ3T&x̒? P[[}_èӮ.󙕕 5J}.-4_a$CYH a_ kظ^wDG92Ue1mZFT7o677OAыT^t+]'/ B]Wb=T"S~ȡ|4:yaj|<9LJT: շnO999׽{6f4޺x1geĖ^c+WFFFQD"WL6 c(XSe=T־݊X~'j M'Pe(Ammm;+ ^Y=_*k׼\Ű|xxmaI]FY#֤={YC FT}͛^6iUFOQOӁp~u!)e *KaC&:/_8[XSGUիkaZUUm:.hz= fQ{-MT&:%eϠf&X,y!~{nav`]ů>BOOO]#;YԊE{:8+m($Ȗs;Y''Xlѫ?(&r /^VK7>˷h ZCLzzzzz _4ZjG #&)l枸겦;_L& 3/JOBשƝ&Jt;l̤#'>('RhE xJ3УGtCغd.fKwnФmuuU2u}54?Œ{oSxئJ8sgjJyOݑĽSO$b7,޷nM]ƍRhl–$6)}OWSSދ3)^V:sϴ1Қ4b_<~f2D& Z"/`:}7[wtsnO?Aa F1u=|[+䏆`wS:D@oML+OR/]"bސ8/U+.;?sg,Ipi=Г s'c1 ɲ>am"0YaQ+*h p|!ehC",ҡ[ )];] =2۱v{uy?e&IxIkb@#I )A%bk@rGXL0ݐiϭJo(v➕JoЛaj1^';oEtnI;/2-/ܕus$T=m9] tB Eu=} ۷o6̶r}US+J'<F*YA:Ц8O|/_N$eee צ˜ċ8w`l^W}@ lqJ( " Ej}"R 1sދFxq G d<]]fQ]]Ԕ[jWSƬT7psU_ ݻ[y/(xnl____Bʖ,W5ѐBM*?2::ֺݻkCǓ*CCCCCC_|֭[kjjm(Tho,d3|E7ZE|ʓ0Eb>R_~_akMOOwvvYQQQ}}}6vյѧᰞpO'kIENDB`PK A overload/mod/UT #P#Pux dPK Aoverload/mod/class/UT #P#Pux dPK A+overload/mod/class/StoneWardensDLC.lua.stubUT #P#Pux dPK A superload/UT $P$Pux dPK Asuperload/mod/UT $P$Pux dPK Asuperload/mod/class/UT $P$Pux dPK AJ,,superload/mod/class/Actor.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org local _M = loadPrevious(...) local base_getObjectOffslot = _M.getObjectOffslot function _M:getObjectOffslot(o) if o.type == "armor" and o.subtype == "shield" and self:knowTalent(self.T_STONESHIELD) then return "MAINHAND" end return base_getObjectOffslot(self, o) end return _M PK AKr*superload/mod/class/Game.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org local _M = loadPrevious(...) local base_countBirthUnlocks = _M.countBirthUnlocks function _M:countBirthUnlocks() local nb, max = base_countBirthUnlocks(self) if profile.mod.allow_build.wilder_stone_warden then nb = nb + 1 end return nb, max + 1 end return _M PK Asuperload/mod/class/interface/UT $P$Pux dPK AUN  (superload/mod/class/interface/Combat.luaUT $P$Pux d-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini -- -- This program is free software: you can redistribute it and/or modify -- it under the terms of the GNU General Public License as published by -- the Free Software Foundation, either version 3 of the License, or -- (at your option) any later version. -- -- This program is distributed in the hope that it will be useful, -- but WITHOUT ANY WARRANTY; without even the implied warranty of -- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -- GNU General Public License for more details. -- -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org local _M = loadPrevious(...) local base_getObjectCombat = _M.getObjectCombat function _M:getObjectCombat(o, kind) if kind == "mainhand" and o.type == "armor" and o.subtype == "shield" and self:knowTalent(self.T_STONESHIELD) then return o.special_combat end if kind == "offhand" and o.type == "armor" and o.subtype == "shield" and self:knowTalent(self.T_STONESHIELD) then return o.special_combat end return base_getObjectCombat(self, o, kind) end _M.weapon_talents.shield = "T_STONESHIELD" return _M PK AAdata/UT#Pux dPK A A?data/birth/UT#Pux dPK A+ w data/birth/wilder.luaUT#Pux dPK A A data/talents/UT#Pux dPK AA data/talents/spells/UT#Pux dPK A_X data/talents/spells/spells.luaUT#Pux dPK A data/talents/spells/deeprock.luaUT#Pux dPK AK5'!data/talents/spells/eldritch-shield.luaUT#Pux dPK AHH&S=data/talents/spells/eldritch-stone.luaUT#Pux dPK AASdata/talents/gifts/UT#Pux dPK Afw:HTdata/talents/gifts/gifts.luaUT#Pux dPK AV88%[data/talents/gifts/dwarven-nature.luaUTPux dPK A坨p//$data/talents/gifts/earthen-power.luaUT#Pux dPK AքB$data/talents/gifts/earthen-vines.luaUT#Pux dPK )Az )''data/timed_effects.luaUTdPux dPK AA hooks/UT#Pux dPK A@CCKhooks/load.luaUT#Pux dPK hAinit.luaUTuPux dPK A Aoverload/UT$Pux dPK AAoverload/data/UT$Pux dPK AA"overload/data/gfx/UT$Pux dPK AAnoverload/data/gfx/particles/UT$Pux dPK A]t+overload/data/gfx/particles/shieldstorm.luaUT$Pux dPK AoD )?overload/data/gfx/particles/stonevine.luaUT$Pux dPK Aӈ4:overload/data/gfx/particles/eldricth_stone_explo.luaUT$Pux dPK AR4VV,overload/data/gfx/particles/stone_spikes.luaUT$Pux dPK Ao,.c overload/data/gfx/particles/eldritch_stone.luaUT$Pux dPK AgBB0overload/data/gfx/particles/stonevine_static.luaUT$Pux dPK AAkoverload/data/gfx/talents/UT$Pux dPK A@0*overload/data/gfx/talents/boulder_rock.pngUT$Pux dPK A_J  +8(overload/data/gfx/talents/dwarven_unity.pngUT$Pux dPK A" '3overload/data/gfx/talents/mergeback.pngUT$Pux dPK Af+>overload/data/gfx/talents/eldritch_fury.pngUT$Pux dPK A.:f///Noverload/data/gfx/talents/eldritch_infusion.pngUT$Pux dPK A^2*$doverload/data/gfx/talents/stone_spikes.pngUT$Pux dPK A ;;+ztoverload/data/gfx/talents/volcanic_rock.pngUT$Pux dPK Aoz/ -overload/data/gfx/talents/impaling_spikes.pngUT$Pux dPK A0``,roverload/data/gfx/talents/eldritch_vines.pngUT$Pux dPK A 1D D +8overload/data/gfx/talents/eldritch_slam.pngUT$Pux dPK Ai )overload/data/gfx/talents/rockswallow.pngUT$Pux dPK AѮ+ݼoverload/data/gfx/talents/eldritch_blow.pngUT$Pux dPK ATmMM)overload/data/gfx/talents/stoneshield.pngUT$Pux dPK AC˟)),overload/data/gfx/talents/stone_fortress.pngUT$Pux dPK A'',/overload/data/gfx/talents/rain_of_spikes.pngUT$Pux dPK A&::$overload/data/gfx/talents/shards.pngUT$Pux dPK Aބ-Toverload/data/gfx/talents/elemental_split.pngUT$Pux dPK A{c(overload/data/gfx/talents/power_core.pngUT$Pux dPK ALǏ&*overload/data/gfx/talents/rockwalk.pngUT$Pux dPK Ainn*1overload/data/gfx/talents/mountainhewn.pngUT$Pux dPK Ar= = -Coverload/data/gfx/talents/eldritch_spikes.pngUT$Pux dPK A -jQoverload/data/gfx/talents/poisoned_spikes.pngUT$Pux dPK A55)_overload/data/gfx/talents/stone_vines.pngUT$Pux dPK A (*poverload/data/gfx/talents/stone_link.pngUT$Pux dPK A+~overload/data/gfx/talents/deeprock_form.pngUT$Pux dPK A-k>>,overload/data/gfx/talents/eldritch_stone.pngUT$Pux dPK A Aoverload/mod/UT#Pux dPK AAoverload/mod/class/UT#Pux dPK A+.overload/mod/class/StoneWardensDLC.lua.stubUT#Pux dPK A Asuperload/UT$Pux dPK AAמsuperload/mod/UT$Pux dPK AAsuperload/mod/class/UT$Pux dPK AJ,,msuperload/mod/class/Actor.luaUT$Pux dPK AKr*superload/mod/class/Game.luaUT$Pux dPK AAasuperload/mod/class/interface/UT$Pux dPK AUN  (superload/mod/class/interface/Combat.luaUT$Pux dPKAA'