-- ToME - Tales of Maj'Eyal -- Copyright (C) 2009, 2010, 2011, 2012, 2013 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 <http://www.gnu.org/licenses/>. -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org newTalent{ name = "Prismatic Slash", type = {"wild-gift/higher-draconic", 1}, require = gifts_req_high1, points = 5, random_ego = "attack", equilibrium = 20, cooldown = 16, range = 1, tactical = { ATTACK = { PHYSICAL = 1, COLD = 1, FIRE = 1, LIGHTNING = 1, ACID = 1 } }, requires_target = true, getWeaponDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 2.0) end, getBurstDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 230) end, radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end, on_learn = function(self, t) self.combat_physresist = self.combat_physresist + 1 self.combat_spellresist = self.combat_spellresist + 1 self.combat_mentalresist = self.combat_mentalresist + 1 end, on_unlearn = function(self, t) self.combat_physresist = self.combat_physresist - 1 self.combat_spellresist = self.combat_spellresist - 1 self.combat_mentalresist = self.combat_mentalresist - 1 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 local elem = rng.table{"phys", "cold", "fire", "lightning", "acid",} if elem == "phys" then self:attackTarget(target, DamageType.PHYSICAL, t.getWeaponDamage(self, t), true) local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t} local grids = self:project(tg, x, y, DamageType.SAND, {dur=3, dam=self:mindCrit(t.getBurstDamage(self, t))}) game.level.map:particleEmitter(x, y, tg.radius, "ball_matter", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80}) game:playSoundNear(self, "talents/flame") elseif elem == "cold" then self:attackTarget(target, DamageType.ICE, t.getWeaponDamage(self, t), true) local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t} local grids = self:project(tg, x, y, DamageType.ICE, self:mindCrit(t.getBurstDamage(self, t))) game.level.map:particleEmitter(x, y, tg.radius, "ball_ice", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80}) game:playSoundNear(self, "talents/flame") elseif elem == "fire" then self:attackTarget(target, DamageType.FIREBURN, t.getWeaponDamage(self, t), true) local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t} local grids = self:project(tg, x, y, DamageType.FIREBURN, self:mindCrit(t.getBurstDamage(self, t))) game.level.map:particleEmitter(x, y, tg.radius, "ball_fire", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80}) game:playSoundNear(self, "talents/flame") elseif elem == "lightning" then self:attackTarget(target, DamageType.LIGHTNING_DAZE, t.getWeaponDamage(self, t), true) local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t} local grids = self:project(tg, x, y, DamageType.LIGHTNING_DAZE, self:mindCrit(t.getBurstDamage(self, t))) game.level.map:particleEmitter(x, y, tg.radius, "ball_lightning", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80}) game:playSoundNear(self, "talents/flame") elseif elem == "acid" then self:attackTarget(target, DamageType.ACID_DISARM, t.getWeaponDamage(self, t), true) local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t} local grids = self:project(tg, x, y, DamageType.ACID_DISARM, self:mindCrit(t.getBurstDamage(self, t))) game.level.map:particleEmitter(x, y, tg.radius, "ball_acid", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80}) game:playSoundNear(self, "talents/flame") end return true end, info = function(self, t) local burstdamage = t.getBurstDamage(self, t) local radius = self:getTalentRadius(t) return ([[Unleash raw, chaotic elemental damage upon your enemy. You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing ice, stunning lightning or burning flames, with equal odds. Additionally, you will cause a burst that deals %0.2f of that damage to enemies in radius %d, regardless of if you hit with the blow. Each point in Prismatic Slash increase your Physical, Spell and Mind Saves by 1.]]):format(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius) end, } newTalent{ name = "Venomous Breath", type = {"wild-gift/higher-draconic", 2}, require = gifts_req_high2, points = 5, random_ego = "attack", equilibrium = 12, cooldown = 12, message = "@Source@ breathes venom!", tactical = { ATTACKAREA = { poison = 2 } }, range = 0, radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end, direct_hit = true, requires_target = true, getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 60, 650) end, getEffect = function(self, t) return self:combatTalentLimit(t, 100, 18, 50) end, -- Limit < 100% on_learn = function(self, t) self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) + 2 end, on_unlearn = function(self, t) self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) - 2 end, target = function(self, t) return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t} 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, DamageType.INSIDIOUS_POISON, {dam=self:mindCrit(t.getDamage(self,t)), dur=6, heal_factor=t.getEffect(self,t)}) game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_slime", {radius=tg.radius, tx=x-self.x, ty=y-self.y}) game:playSoundNear(self, "talents/breath") if core.shader.active(4) then self:addParticles(Particles.new("shader_wings", 1, {img="poisonwings", life=18, fade=-0.006, deploy_speed=14})) end return true end, info = function(self, t) local effect = t.getEffect(self, t) return ([[You breathe insidious poison in a frontal cone of radius %d. Any target caught in the area will take %0.2f nature damage each turn for 6 turns. The poison also reduces the healing of enemies poisoned by %d%% while it is in effect. The damage will increase with your Strength, and the critical chance is based on your Mental crit rate. Each point in Venomous Breath also increases your nature resistance by 2%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect) end, } newTalent{ name = "Wyrmic Guile", type = {"wild-gift/higher-draconic", 3}, require = gifts_req_high3, points = 5, mode = "passive", resistKnockback = function(self, t) return self:combatTalentLimit(t, 1, .17, .5) end, -- Limit < 100% resistBlindStun = function(self, t) return self:combatTalentLimit(t, 1, .07, .25) end, -- Limit < 100% on_learn = function(self, t) self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 2 end, on_unlearn = function(self, t) self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2 end, passives = function(self, t, p) self:talentTemporaryValue(p, "knockback_immune", t.resistKnockback(self, t)) self:talentTemporaryValue(p, "stun_immune", t.resistBlindStun(self, t)) self:talentTemporaryValue(p, "blind_immune", t.resistBlindStun(self, t)) end, info = function(self, t) return ([[You have the mental prowess of a Wyrm. Your Cunning is increased by %d. You gain %d%% knockback resistance, and your blindness and stun resistances are increased by %d%%.]]):format(2*self:getTalentLevelRaw(t), 100*t.resistKnockback(self, t), 100*t.resistBlindStun(self, t)) end, } newTalent{ name = "Chromatic Fury", type = {"wild-gift/higher-draconic", 4}, require = gifts_req_high4, points = 5, mode = "passive", resistPen = function(tl) if tl <=0 then return 0 end return math.floor(mod.class.interface.Combat.combatTalentLimit({}, tl, 100, 4, 20)) end, -- Limit < 100% on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 0.5 self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 0.5 self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 0.5 self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 0.5 local rpchange = t.resistPen(self:getTalentLevelRaw(t)) - t.resistPen(self:getTalentLevelRaw(t)-1) self.resists_pen[DamageType.PHYSICAL] = (self.resists_pen[DamageType.PHYSICAL] or 0) + rpchange self.resists_pen[DamageType.COLD] = (self.resists_pen[DamageType.COLD] or 0) + rpchange self.resists_pen[DamageType.FIRE] = (self.resists_pen[DamageType.FIRE] or 0) + rpchange self.resists_pen[DamageType.LIGHTNING] = (self.resists_pen[DamageType.LIGHTNING] or 0) + rpchange self.resists_pen[DamageType.ACID] = (self.resists_pen[DamageType.ACID] or 0) + rpchange self.inc_damage[DamageType.PHYSICAL] = (self.inc_damage[DamageType.PHYSICAL] or 0) + 2 self.inc_damage[DamageType.COLD] = (self.inc_damage[DamageType.COLD] or 0) + 2 self.inc_damage[DamageType.FIRE] = (self.inc_damage[DamageType.FIRE] or 0) + 2 self.inc_damage[DamageType.LIGHTNING] = (self.inc_damage[DamageType.LIGHTNING] or 0) + 2 self.inc_damage[DamageType.ACID] = (self.inc_damage[DamageType.ACID] or 0) + 2 end, on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 0.5 self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 0.5 self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 0.5 self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 0.5 local rpchange = t.resistPen(self:getTalentLevelRaw(t)) - t.resistPen(self:getTalentLevelRaw(t)+1) self.resists_pen[DamageType.PHYSICAL] = (self.resists_pen[DamageType.PHYSICAL] or 0) + rpchange self.resists_pen[DamageType.COLD] = (self.resists_pen[DamageType.COLD] or 0) + rpchange self.resists_pen[DamageType.FIRE] = (self.resists_pen[DamageType.FIRE] or 0) + rpchange self.resists_pen[DamageType.LIGHTNING] = (self.resists_pen[DamageType.LIGHTNING] or 0) + rpchange self.resists_pen[DamageType.ACID] = (self.resists_pen[DamageType.ACID] or 0) + rpchange self.inc_damage[DamageType.PHYSICAL] = (self.inc_damage[DamageType.PHYSICAL] or 0) - 2 self.inc_damage[DamageType.COLD] = (self.inc_damage[DamageType.COLD] or 0) - 2 self.inc_damage[DamageType.FIRE] = (self.inc_damage[DamageType.FIRE] or 0) - 2 self.inc_damage[DamageType.LIGHTNING] = (self.inc_damage[DamageType.LIGHTNING] or 0) - 2 self.inc_damage[DamageType.ACID] = (self.inc_damage[DamageType.ACID] or 0) - 2 end, info = function(self, t) return ([[You have gained the full power of the multihued dragon, and your mastery over the elements is complete. Increases physical, fire, cold, lightning and acid damage by %d%%, and your resistance penetration in those elements by %d%%. Each point in Chromatic Fury also increases your resistances to physical, fire, cold, lightning and acid by 0.5%%.]]) :format(2*self:getTalentLevelRaw(t), t.resistPen(self:getTalentLevelRaw(t))) end, }