Skip to content
Snippets Groups Projects
Commit d958e0c9 authored by Tawny Harte's avatar Tawny Harte
Browse files

Special talents for Wilder Summons and Necro Minions

parent d50ea2e1
No related branches found
No related tags found
No related merge requests found
......@@ -119,7 +119,7 @@ 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,
......@@ -149,7 +149,7 @@ newTalent{
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,
......@@ -184,7 +184,7 @@ 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,
......@@ -219,7 +219,7 @@ newTalent{
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,
......@@ -255,7 +255,7 @@ 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,
......@@ -285,7 +285,7 @@ newTalent{
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,
......@@ -415,7 +415,7 @@ newTalent{
end,
incStats = function(self, t, fake)
local mp = self:combatMindpower()
return{
return{
wil=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75),
cun=15 + (fake and mp or self:mindCrit(mp)) * 1.7 * self:combatTalentScale(t, 0.2, 1, 0.75),
con=10
......@@ -472,14 +472,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m] = resolvers.talents{ [self.T_WILD_RITCH_FLAMESPITTER_BOLT]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -540,7 +541,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
wil=15 + (fake and mp or self:mindCrit(mp)) * 1.6 * self:combatTalentScale(t, 0.2, 1, 0.75),
str = 18,
con=10 + self:combatTalentScale(t, 2, 10, 0.75)
......@@ -599,14 +600,15 @@ newTalent{
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
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -657,7 +659,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
wil=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75),
cun=15 + (fake and mp or self:mindCrit(mp)) * 1.6 * self:combatTalentScale(t, 0.2, 1, 0.75),
con=10
......@@ -715,14 +717,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_WINTER_S_GRASP]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -787,7 +790,7 @@ newTalent{
inc_stats = { -- No crit chance for escorts
str=15 + self:combatMindpower(2) * self:combatTalentScale(t, 1/6, 5/6, 0.75),
wil=38,
con=20 + self:combatMindpower(1.5) * self:combatTalentScale(t, 1/6, 5/6, 0.75),
con=20 + self:combatMindpower(1.5) * self:combatTalentScale(t, 1/6, 5/6, 0.75),
},
level_range = {self.level, self.level}, exp_worth = 0,
......@@ -805,8 +808,9 @@ newTalent{
summon_time = m.summon_time,
ai_target = {actor=m.ai_target.actor}
}
m.is_nature_summon = true
setupSummon(self, mh, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
......@@ -817,7 +821,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 2, 0, 7, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
str=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75),
wil = 38,
con=20 + (fake and mp or self:mindCrit(mp)) * 1.5 * self:combatTalentScale(t, 0.2, 1, 0.75)
......@@ -876,8 +880,9 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_AURA_OF_SILENCE]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
......
......@@ -71,7 +71,7 @@ newTalent{
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},
......@@ -110,10 +110,10 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
str=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
dex=15 + (fake and mp or self:mindCrit(mp)) * 1 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
con=15
con=15
}
end,
action = function(self, t)
......@@ -160,14 +160,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_TOTAL_THUGGERY]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -218,7 +219,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t, fake)
local mp = self:combatMindpower()
return{
return{
con=10 + (fake and mp or self:mindCrit(mp)) * 1.6 * self:combatTalentScale(t, 0.2, 1, 0.75),
str=10 + self:combatTalentScale(t, 2, 10, 0.75)
}
......@@ -280,14 +281,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_JELLY_MITOTIC_SPLIT]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -337,7 +339,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 2, 0, 7, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
str=25 + (fake and mp or self:mindCrit(mp)) * 2.1 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
dex=10 + (fake and mp or self:mindCrit(mp)) * 1.8 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
con=10 + self:combatTalentScale(t, 2, 10, 0.75)
......@@ -394,14 +396,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_RUSH]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -455,7 +458,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
str=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
dex=15 + (fake and mp or self:mindCrit(mp)) * 1.9 * self:combatTalentScale(t, 0.2, 1, 0.75) + self:combatTalentScale(t, 2, 10, 0.75),
con=10 + self:combatTalentScale(t, 2, 10, 0.75)
......@@ -514,14 +517,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_DISARM]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......
......@@ -120,7 +120,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
con=15 + (fake and mp or self:mindCrit(mp)) * 2.1 * self:combatTalentScale(t, 0.2, 1, 0.75),
wil = 18,
dex=10 + self:combatTalentScale(t, 2, 10, 0.75)
......@@ -191,14 +191,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.talents{ [self.T_BATTLE_CALL]=self:getTalentLevelRaw(t) }
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -247,7 +248,7 @@ newTalent{
summonTime = function(self, t) return math.floor(self:combatScale(self:getTalentLevel(t), 5, 0, 10, 5)) + self:callTalent(self.T_RESILIENCE, "incDur") end,
incStats = function(self, t,fake)
local mp = self:combatMindpower()
return{
return{
dex=15 + (fake and mp or self:mindCrit(mp)) * 2 * self:combatTalentScale(t, 0.2, 1, 0.75),
wil = 18,
str=10 + self:combatTalentScale(t, 2, 10, 0.75),
......@@ -304,14 +305,15 @@ newTalent{
m.name = m.name.." (wild summon)"
m[#m+1] = resolvers.inscription("INFUSION:_INSIDIOUS_POISON", {cooldown=12, range=6, heal_factor=60, power=self:getTalentLevel(t) * 60})
end
m.is_nature_summon = true
setupSummon(self, m, x, y)
if self:knowTalent(self.T_RESILIENCE) then
local incLife = self:callTalent(self.T_RESILIENCE, "incLife") + 1
m.max_life = m.max_life * incLife
m.life = m.max_life
end
game:playSoundNear(self, "talents/spell_generic")
return true
end,
......@@ -370,7 +372,7 @@ newTalent{
action = function(self, t)
local tg = self:getTalentTarget(t)
local x, y, target = self:getTargetLimited(tg)
if not target or target == self then return nil
if not target or target == self then return nil
else
target:setEffect(target.EFF_SUMMON_CONTROL, t.getDur(self, t), {range=t.getRad(self,t), src=self})
......@@ -382,4 +384,4 @@ newTalent{
info = function(self, t)
return ([[Mark a creature with pheromones, signalling to all of your summons within %d tiles of it to shift aggression towards the marked creature for %d turns.]]):format(t.getRad(self,t), t.getDur(self,t))
end,
}
\ No newline at end of file
}
......@@ -162,7 +162,7 @@ uberTalent{
uberTalent{
name = "Blighted Summoning",
mode = "passive",
require = { special={desc="Have summoned at least 100 creatures affected by this talent. More permanent summons may count for more than 1.", fct=function(self)
require = { special={desc="Have summoned at least 100 creatures. More permanent summons may count as more than 1.", fct=function(self)
return self:attr("summoned_times") and self:attr("summoned_times") >= 100
end} },
cant_steal = true,
......@@ -170,17 +170,8 @@ uberTalent{
on_learn = function(self, t)
if game.party and game.party:hasMember(self) and game.party.members then
for act, def in pairs(game.party.members) do
if act ~= self and act.summoner == self and not act.is_blighted_summon then
act:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
act:addTemporaryValue("all_damage_convert_percent", 50)
if not act:knowTalent(act.T_BONE_SHIELD) then
act:learnTalent(act.T_BONE_SHIELD, true, 3, {no_unlearn=true})
act:forceUseTalent(act.T_BONE_SHIELD, {ignore_energy=true})
end
if not act:knowTalent(act.T_VIRULENT_DISEASE) then
act:learnTalent(act.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
end
act.is_blighted_summon = true
if act ~= self and act.summoner == self then
self:callTalent(self.T_BLIGHTED_SUMMONING, "doBlightedSummon", act)
end
end
end
......@@ -188,20 +179,84 @@ uberTalent{
-- Called by addedToLevel to Actor.lua
doBlightedSummon = function(self, t, who)
if who.is_blighted_summon or not self:knowTalent(self.T_BLIGHTED_SUMMONING) then return false end
who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
who:addTemporaryValue("all_damage_convert_percent", 50)
if not who:knowTalent(who.T_BONE_SHIELD) then
who:learnTalent(who.T_BONE_SHIELD, true, 3, {no_unlearn=true})
who:forceUseTalent(who.T_BONE_SHIELD, {ignore_energy=true})
who:learnTalent(who.T_BONE_SHIELD, true, 3, {no_unlearn=true})
who:forceUseTalent(who.T_BONE_SHIELD, {ignore_energy=true})
end
if not who:knowTalent(who.T_VIRULENT_DISEASE) then
if who.necrotic_minion then
if who.subtype == "giant" then
who:learnTalent(who.T_BONE_SPIKE, true, 3, {no_unlearn=true})
who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
elseif who.subtype == "vampire" or who.subtype == "lich" then
who:learnTalent(who.T_BLOOD_GRASP, true, 3, {no_unlearn=true})
who:learnTalent(who.T_BLOOD_BOIL, true, 3, {no_unlearn=true})
elseif who.subtype == "ghost" or who.subtype == "wight" then
who:learnTalent(who.T_BLOOD_FURY, true, 3, {no_unlearn=true})
who:learnTalent(who.T_CURSE_OF_DEATH, true, 3, {no_unlearn=true})
elseif who.subtype == "ghoul" then
who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
elseif who.name == "skeleton archer" or who.name == "skeleton master archer" then
who:learnTalent(who.T_BONE_SPIKE, true, 3, {no_unlearn=true})
elseif who.name == "skeleton mage" then
who:learnTalent(who.T_BONE_SPEAR, true, 3, {no_unlearn=true})
elseif who.name == "degenerated skeleton warrior" or who.name == "skeleton warrior" or who.name == "armoured skeleton warrior" then
who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
else
who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
who:addTemporaryValue("all_damage_convert_percent", 50)
who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
end
elseif who.is_nature_summon then
if who.name == "war hound" then
who:learnTalent(who.T_GNAW, true, 3, {no_unlearn=true})
elseif who.subtype == "jelly" then
who:learnTalent(who.T_CURSE_OF_DEFENSELESSNESS, true, 3, {no_unlearn=true})
elseif who.name == "minotaur" then
who:learnTalent(who.T_RUIN, true, 3, {no_unlearn=true}) who:forceUseTalent(who.T_RUIN, {ignore_energy=true})
elseif who.name == "stone golem" then
who:learnTalent(who.T_ACID_BLOOD, true, 3, {no_unlearn=true})
elseif who.subtype == "ritch" then
who:learnTalent(who.T_LIFE_TAP, true, 3, {no_unlearn=true})
elseif who.type == "hydra" then
who:learnTalent(who.T_BLOOD_SPRAY, true, 3, {no_unlearn=true})
elseif who.name == "rimebark" then
who:learnTalent(who.T_POISON_STORM, true, 3, {no_unlearn=true})
elseif who.name == "fire drake" then
who:learnTalent(who.T_FLAME_OF_URH_ROK, true, 3, {no_unlearn=true})
else
who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
who:addTemporaryValue("all_damage_convert_percent", 50)
who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
end
else
who:addTemporaryValue("all_damage_convert", DamageType.BLIGHT)
who:addTemporaryValue("all_damage_convert_percent", 50)
who:learnTalent(who.T_VIRULENT_DISEASE, true, 3, {no_unlearn=true})
end
who:incVim(who:getMaxVim())
who.is_blighted_summon = true
end,
info = function(self, t)
return ([[You infuse blighted energies into all of your summons, granting them Bone Shield and Virulent Disease at talent level 3 and causing 50%% of their damage to be converted to Blight.
Your summons gain a bonus to spellpower equal to your magic.
return ([[You infuse blighted energies into all of your summons, granting them Bone Shield (level 3) and a bonus to Spellpower equal to your Magic.
Your Wilder Summons and Necrotic Minions will gain special corrupted talents (level 3), other summons will gain 50% Blight damage conversion and Virulent Disease (level 3).
#GREEN#Wilder Summons:#LAST#
War Hound: Gnaw
Jelly: Curse of Defencelessness
Minotaur: Ruin
Golem: Acid Blood
Ritch: Life Tap
Hydra: Blood Spray
Rimebark: Poison Storm
Fire Drake: Flame of Urh’Rok
Turtle: Elemental Discord
Spider: Blood Grasp
#GREY#Necrotic Minions:#LAST#
Skeleton Mages: Bone Spear
Skeleton Archers: Bone Spike
Skeleton Warriors: Ruin
Bone Giants: Bone Spike and Ruin
Ghouls: Virulent Disease
Vampires / Liches: Blood Grasp and Blood Boil
Ghosts / Wights: Blood Fury and Curse of Death
]]):format()
end,
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment