diff --git a/game/modules/tome/data/talents/gifts/summon-advanced.lua b/game/modules/tome/data/talents/gifts/summon-advanced.lua index 8a1b6b31d5cff72c34e77d0f62d0b9ebff202928..7e8af391834d410c3c1f4151a704c440c9dfd582 100644 --- a/game/modules/tome/data/talents/gifts/summon-advanced.lua +++ b/game/modules/tome/data/talents/gifts/summon-advanced.lua @@ -125,16 +125,17 @@ newTalent{ return ([[For %d turn(s), you have 100%% chance that your summons appear as a wild version. Each turn the chance disminishes. Wild creatures have one more talent/power than the base versions: - - Ritch Flamespitter: sends a blast of flames around it, knocking foes away - - Hydra: Can disengage from melee range - - Rimebark: Becomes more resistant to magic damage + - Ritch Flamespitter: Can fly in the air, spitting its Flamespit past creatures in the path of its target + - Hydra: Can concentrate its breath into spits when allies would be caught in a breath, instead spitting a bolt + - Rimebark: Can better control its icestorm, no longer damaging or freezing allies caught within - Fire Drake: Can emit a powerful roar to silence its foes - - War Hound: Can rage, inreasing its critical chance and armour penetration - - Jelly: Can swallow foes that are low on life, regenerating your equilibrium + - War Hound: Can rage, inreasing its critical chance and gaining armour penetration + - Jelly: Can split into an additional jelly upon taking a large hit (jellies formed by splitting do not count against your summon cap) - Minotaur: Can rush toward its target - - Stone Golem: Melee blows can deal a small area of effect damage + - Stone Golem: Can deal a small area of effect damage with melee blows - Turtle: Can force all foes in a radius into melee range - Spider: Can project an insidious poison at its foes, reducing their healing - This talent requires Master Summoner to be active to be used.]]):format(t.duration(self,t)) + This talent requires Master Summoner to be active to be used. + Effects scale with levels in summon talents.]]):format(t.duration(self,t)) end, } diff --git a/game/modules/tome/data/talents/gifts/summon-distance.lua b/game/modules/tome/data/talents/gifts/summon-distance.lua index 3631f4ad0039b908d84a34b3eaaf8b6eb739a686..1accfb3c1902f1a6b2748fb7431d907777bc2e34 100644 --- a/game/modules/tome/data/talents/gifts/summon-distance.lua +++ b/game/modules/tome/data/talents/gifts/summon-distance.lua @@ -41,6 +41,32 @@ newTalent{ short_name = "RITCH_FLAMESPITTER_BOLT", end, } +newTalent{ short_name = "WILD_RITCH_FLAMESPITTER_BOLT", + name = "Flamespit", + type = {"wild-gift/other",1}, + points = 5, + equilibrium = 2, + message = "@Source@ spits flames!", + range = 10, + reflectable = true, + requires_target = true, + direct_hit = true, + tactical = { ATTACK = { FIRE = 2 } }, + action = function(self, t) + local tg = {type="hit", range=self:getTalentRange(t), talent=t} + local x, y = self:getTarget(tg) + if not x or not y then return nil end + self:project(tg, x, y, DamageType.FIRE, self:mindCrit(self:combatTalentMindDamage(t, 8, 120)), {type="flame"}) + game:playSoundNear(self, "talents/fire") + return true + end, + info = function(self, t) + return ([[Spits a bolt of fire, doing %0.2f fire damage. + The damage will increase with your Mindpower.]]):format(damDesc(self, DamageType.FIRE, self:combatTalentMindDamage(t, 8, 120))) + end, +} + +--No longer on summons but is still used by ants newTalent{ name = "Flame Fury", image = "talents/blastwave.png", type = {"wild-gift/other",1}, @@ -93,6 +119,8 @@ newTalent{ self:project(tg, x, y, DamageType.ACID, self:mindCrit(self:combatTalentStatDamage(t, "wil", 30, 430))) game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_acid", {radius=tg.radius, tx=x-self.x, ty=y-self.y}) game:playSoundNear(self, "talents/breath") + + self:startTalentCooldown(self.T_ACID_SPIT_HYDRA, 8) return true end, info = function(self, t) @@ -101,6 +129,36 @@ newTalent{ end, } +newTalent{ + name = "Acid Spit", short_name = "ACID_SPIT_HYDRA", + type = {"wild-gift/other",1}, + require = gifts_req1, + points = 5, + equilibrium = 10, + cooldown = 8, + message = "@Source@ spits acid!", + tactical = { ATTACK = { ACID = 2 } }, + range = 5, + requires_target = true, + target = function(self, t) + return {type="bolt", range=self:getTalentRange(t), 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.ACID, self:mindCrit(self:combatTalentStatDamage(t, "wil", 30, 430)), {type="acid"}) + game:playSoundNear(self, "talents/breath") + + self:startTalentCooldown(self.T_ACID_BREATH, 8) + return true + end, + info = function(self, t) + return ([[Spit acid on a foe, doing %0.2f damage. + The damage will increase with your Willpower.]]):format(damDesc(self, DamageType.ACID, self:combatTalentStatDamage(t, "wil", 30, 430))) + end, +} + newTalent{ name = "Lightning Breath", short_name = "LIGHTNING_BREATH_HYDRA", image = "talents/lightning_breath.png", type = {"wild-gift/other",1}, @@ -126,6 +184,8 @@ newTalent{ else game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_lightning", {radius=tg.radius, tx=x-self.x, ty=y-self.y}) end game:playSoundNear(self, "talents/lightning") + + self:startTalentCooldown(self.T_LIGHTNING_SPIT_HYDRA, 8) return true end, info = function(self, t) @@ -138,6 +198,41 @@ newTalent{ end, } +newTalent{ + name = "Lightning Spit", short_name = "LIGHTNING_SPIT_HYDRA", image = "talents/lightning_breath.png", + type = {"wild-gift/other",1}, + require = gifts_req1, + points = 5, + equilibrium = 10, + cooldown = 8, + message = "@Source@ spits lightning!", + tactical = { ATTACK = { LIGHTNING = 2 } }, + range = 5, + requires_target = true, + target = function(self, t) + return {type="bolt", range=self:getTalentRange(t), 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 + local dam = self:combatTalentStatDamage(t, "wil", 30, 500) + self:project(tg, x, y, DamageType.LIGHTNING, self:mindCrit(rng.avg(dam / 3, dam, 3)), {type="lightning_explosion"}) + game:playSoundNear(self, "talents/lightning") + + self:startTalentCooldown(self.T_LIGHTNING_BREATH_HYDRA, 8) + return true + end, + info = function(self, t) + return ([[Spit lightning on your foe, doing %d to %d damage. + The damage will increase with your Willpower.]]): + format( + damDesc(self, DamageType.LIGHTNING, (self:combatTalentStatDamage(t, "wil", 30, 500)) / 3), + damDesc(self, DamageType.LIGHTNING, self:combatTalentStatDamage(t, "wil", 30, 500)) + ) + end, +} + newTalent{ name = "Poison Breath", type = {"wild-gift/other",1}, @@ -160,6 +255,8 @@ newTalent{ self:project(tg, x, y, DamageType.POISON, {dam=self:mindCrit(self:combatTalentStatDamage(t, "wil", 30, 460)), apply_power=self:combatMindpower()}) 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") + + self:startTalentCooldown(self.T_POISON_SPIT_HYDRA, 8) return true end, info = function(self, t) @@ -168,6 +265,36 @@ newTalent{ end, } +newTalent{ + name = "Poison Spit", short_name = "POISON_SPIT_HYDRA", + type = {"wild-gift/other",1}, + require = gifts_req1, + points = 5, + equilibrium = 10, + cooldown = 8, + message = "@Source@ spits poison!", + tactical = { ATTACK = { NATURE = 1, poison = 1 } }, + range = 5, + requires_target = true, + target = function(self, t) + return {type="bolt", range=self:getTalentRange(t), 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.POISON, {dam=self:mindCrit(self:combatTalentStatDamage(t, "wil", 30, 460)), apply_power=self:combatMindpower(), {type="slime"}}) + game:playSoundNear(self, "talents/breath") + + self:startTalentCooldown(self.T_POISON_BREATH, 8) + return true + end, + info = function(self, t) + return ([[Spit poison on your foes, doing %d damage over a few turns. + The damage will increase with your Willpower.]]):format(damDesc(self, DamageType.NATURE, self:combatTalentStatDamage(t, "wil", 30, 460))) + end, +} + newTalent{ name = "Winter's Fury", type = {"wild-gift/other",1}, @@ -210,6 +337,49 @@ newTalent{ end, } +newTalent{ + name = "Winter's Fury", short_name="WILD_WINTER_S_FURY", + type = {"wild-gift/other",1}, + require = gifts_req4, + points = 5, + equilibrium = 10, + cooldown = 4, + tactical = { ATTACKAREA = { COLD = 2 }, DISABLE = { stun = 1 } }, + range = 0, + radius = 3, + target = function(self, t) + return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false} + end, + getDamage = function(self, t) return self:combatTalentStatDamage(t, "wil", 30, 120) end, + getDuration = function(self, t) return 4 end, + action = function(self, t) + -- Add a lasting map effect + game.level.map:addEffect(self, + self.x, self.y, t.getDuration(self, t), + DamageType.ICE, t.getDamage(self,t), + 3, + 5, nil, + {type="icestorm", only_one=true}, + function(e) + e.x = e.src.x + e.y = e.src.y + return true + end, + false, + false --param for friendlyfire + ) + game:playSoundNear(self, "talents/ice") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) + return ([[A furious yet well controlled ice storm rages around the user doing %0.2f cold damage in a radius of 3 to hostile targets each turn for %d turns. + It has 25%% chance to freeze damaged targets. + The damage and duration will increase with your Willpower.]]):format(damDesc(self, DamageType.COLD, damage), duration) + end, +} + newTalent{ name = "Ritch Flamespitter", type = {"wild-gift/summon-distance", 1}, @@ -240,8 +410,7 @@ newTalent{ on_arrival = function(self, t, m) local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t, x=m.x, y=m.y} local duration = self:callTalent(self.T_GRAND_ARRIVAL, "effectDuration") - local reduction = self:callTalent(self.T_GRAND_ARRIVAL, "resReduction") - self:project(tg, m.x, m.y, DamageType.TEMP_EFFECT, {foes=true, eff=self.EFF_LOWER_FIRE_RESIST, dur=duration, p={power=reduction}}) + self:project(tg, m.x, m.y, DamageType.TEMP_EFFECT, {foes=true, eff=self.EFF_LOWER_FIRE_RESIST, dur=duration, p={power=self:combatTalentMindDamage(t, 15, 70)}}) game.level.map:particleEmitter(m.x, m.y, tg.radius, "ball_fire", {radius=tg.radius}) end, incStats = function(self, t, fake) @@ -301,7 +470,7 @@ newTalent{ } if self:attr("wild_summon") and rng.percent(self:attr("wild_summon")) then m.name = m.name.." (wild summon)" - m[#m+1] = resolvers.talents{ [self.T_FLAME_FURY]=self:getTalentLevelRaw(t) } + m[#m] = resolvers.talents{ [self.T_WILD_RITCH_FLAMESPITTER_BOLT]=self:getTalentLevelRaw(t) } end setupSummon(self, m, x, y) game:playSoundNear(self, "talents/spell_generic") @@ -345,10 +514,9 @@ newTalent{ end, on_arrival = function(self, t, m) local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t, x=m.x, y=m.y} - local poisonDmg = self:callTalent(self.T_GRAND_ARRIVAL, "poisonDamage") game.level.map:addEffect(self, m.x, m.y, self:callTalent(self.T_GRAND_ARRIVAL,"effectDuration"), - DamageType.POISON, {dam=poisonDmg, apply_power=self:combatMindpower()}, + DamageType.POISON, {dam=self:combatTalentMindDamage(t, 10, 60), apply_power=self:combatMindpower()}, self:getTalentRadius(t), 5, nil, MapEffect.new{color_br=255, color_bg=255, color_bb=255, effect_shader="shader_images/poison_effect.png"}, @@ -413,7 +581,9 @@ newTalent{ } if self:attr("wild_summon") and rng.percent(self:attr("wild_summon")) then m.name = m.name.." (wild summon)" - m[#m+1] = resolvers.talents{ [self.T_DISENGAGE]=self:getTalentLevelRaw(t) } + m[#m+1] = resolvers.talents{ [self.T_LIGHTNING_SPIT_HYDRA]=self:getTalentLevelRaw(t) } + m[#m+1] = resolvers.talents{ [self.T_ACID_SPIT_HYDRA]=self:getTalentLevelRaw(t) } + m[#m+1] = resolvers.talents{ [self.T_POISON_SPIT_HYDRA]=self:getTalentLevelRaw(t) } end setupSummon(self, m, x, y) game:playSoundNear(self, "talents/spell_generic") @@ -458,8 +628,7 @@ newTalent{ on_arrival = function(self, t, m) local tg = {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t, x=m.x, y=m.y} local duration = self:callTalent(self.T_GRAND_ARRIVAL,"effectDuration") - local reduction = self:callTalent(self.T_GRAND_ARRIVAL,"resReduction") - self:project(tg, m.x, m.y, DamageType.TEMP_EFFECT, {foes=true, eff=self.EFF_LOWER_COLD_RESIST, dur=duration, p={power=reduction}}, {type="flame"}) + self:project(tg, m.x, m.y, DamageType.TEMP_EFFECT, {foes=true, eff=self.EFF_LOWER_COLD_RESIST, dur=duration, p={power=self:combatTalentMindDamage(t, 15, 70)}}, {type="flame"}) end, summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t) + self:getTalentLevel(self.T_RESILIENCE), 5, 0, 10, 5)) end, incStats = function(self, t,fake) @@ -520,7 +689,7 @@ newTalent{ } if self:attr("wild_summon") and rng.percent(self:attr("wild_summon")) then m.name = m.name.." (wild summon)" - m[#m+1] = resolvers.talents{ [self.T_RESOLVE]=self:getTalentLevelRaw(t) } + m[#m] = resolvers.talents{ [self.T_WILD_WINTER_S_FURY]=self:getTalentLevelRaw(t) } end setupSummon(self, m, x, y) game:playSoundNear(self, "talents/spell_generic") diff --git a/game/modules/tome/data/talents/gifts/summon-melee.lua b/game/modules/tome/data/talents/gifts/summon-melee.lua index 2d19dafa441deaf290f3fcb06ae1bf1152431c2f..521997d37a5ec4e29222893e30dddcbf0cb068f8 100644 --- a/game/modules/tome/data/talents/gifts/summon-melee.lua +++ b/game/modules/tome/data/talents/gifts/summon-melee.lua @@ -17,6 +17,61 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +newTalent{ + name = "Jelly Spread", short_name = "JELLY_PBAOE", + type = {"wild-gift/other",1}, + points = 5, + equilibrium = 10, + message = "@source@ oozes over the ground!!", + cooldown = 15, + tactical = { ATTACKAREA = { SLIME = 4} }, + range = 0, + radius = 1, + target = function(self, t) + return {type="ball", range=0, radius=1, selffire=false} + end, + getDamage = function(self, t) return self:combatTalentStatDamage(t, "con", 40, 140) end, + getDuration = function(self, t) return 4 end, + action = function(self, t) + -- Add a lasting map effect + game.level.map:addEffect(self, + self.x, self.y, t.getDuration(self, t), + DamageType.NATURE, t.getDamage(self, t), + 1, + 5, nil, + MapEffect.new{color_br=25, color_bg=140, color_bb=40, effect_shader="shader_images/retch_effect.png"}, + function(e, update_shape_only) + if not update_shape_only then e.radius = e.radius end + return true + end, + false, + false + ) + game:playSoundNear(self, "talents/slime") + return true + end, + info = function(self, t) + local damage = t.getDamage(self, t) + local duration = t.getDuration(self, t) + return ([[Ooze over the floor, spreading caustic jelly in a radius of 1 lasting %d turns and dealing %d nature damage per turn to hostile creatures caught within.]]):format(duration, damDesc(self, DamageType.NATURE, damage)) + end, +} + +newTalent{ + name = "Mitotic Split", short_name = "JELLY_MITOTIC_SPLIT", + type = {"wild-gift/other",1}, + mode = "passive", + points = 5, + getDamage = function(self,t) return self:combatTalentLimit(t, 5, 20, 8) end, + getChance = function(self,t) return self:combatTalentLimit(t, 85, 50, 75) end, + passives = function(self, t, p) + self:talentTemporaryValue(p, "clone_on_hit", {min_dam_pct=t.getDamage(self,t), chance=t.getChance(self,t)}) + end, + info = function(self, t) + return ([[%d%% chance to split upon taking a single hit dealing at least %d%% of your maximum life.]]):format(t.getChance(self, t), t.getDamage(self, t)) + end, +} + newTalent{ name = "War Hound", type = {"wild-gift/summon-melee", 1}, @@ -192,8 +247,9 @@ newTalent{ combat_armor = 1, combat_def = 1, never_move = 1, + resolvers.talents{ [Talents.T_JELLY_PBAOE]=self:getTalentLevelRaw(t) }, - combat = { dam=8, atk=15, apr=5, damtype=DamageType.ACID, dammod={str=0.7} }, + combat = { dam=8, atk=15, apr=5, damtype=DamageType.NATURE, dammod={str=0.7} }, wild_gift_detonate = t.id, @@ -212,7 +268,7 @@ newTalent{ } if self:attr("wild_summon") and rng.percent(self:attr("wild_summon")) then m.name = m.name.." (wild summon)" - m[#m+1] = resolvers.talents{ [self.T_SWALLOW]=self:getTalentLevelRaw(t) } + m[#m+1] = resolvers.talents{ [self.T_JELLY_MITOTIC_SPLIT]=self:getTalentLevelRaw(t) } end setupSummon(self, m, x, y) game:playSoundNear(self, "talents/spell_generic")