Skip to content
Snippets Groups Projects
Commit 7e864857 authored by SageAcrin's avatar SageAcrin
Browse files

Short version: Massive buff to Wyrmics.

Without removing or adding any talents, including added passive effects to each tree starting talent and a huge variety of buffs to utility talents.

Long version:

Full changelist;

-Cold Drake

Ice Claw: Always applies Ice damage instead of Cold. Changed from 1 range to a (1, 3) scaling radius cone. Damage is raised from (1.525, 2.025 to 1.6, 2.3). Now grants +4 to all three saves on talent level.
Icy Skin: Armor and Cold damage retribution changed from (Wil, 10, 700)/10 and (Wil, 6, 600)/10 to talentMindDamage(5, 25) and talentMindDamage(10, 30) respectively-values are overall lower. Added a (combatTalentLimit 1, 0.02, 0.10)% boost to max life while active. Sustain cost lowered to 10 from 30.
Ice Wall: Cooldown changed from flat 30 to (combatTalentLimit 5, 30, 10). Walls deal (3, 15) TalentMindDamage in Ice to enemies within (TalentScale 1, 2), meaning at cap it is a fairly solid DoT as well as a wall. (Does not self or ally damage)
Ice Breath: Damage boosted from (30, 430) to (30, 500). Uses new damage type ICE_SLOW, which slows enemies by 20% in addition to the normal Ice effects.

-Fire Drake

Swapped positions of Wing Buffet and Bellowing Roar.

Wing Buffet: Cooldown reduced to 8(from 10), Equi cost reduced to 5(from 7). Deals (1.1, 1.6) WeaponTalentDamage(instead of 0.8*Physical Power damage). Range lowered from (5, 9) to (3, 6). Passively raises physical power and accuracy by 4.
Bellowing Roar: Equilibrium cost raised from 3 to 8. Confusion strength lowered from 40+(6*TL) to 20+(6*TL); Ends up the same at TL5 though, due to the cap. Damage slightly lowered(from 40, 400 to 30, 380).
Devouring Flame: No longer harms the caster. Cooldown reduced to 20(was 35), Equi reduced to 6(was 10). Deals (15, 60) Mindpower(was formerly TalentStatDamage Wil(15, 120)), overall marginally better I believe. Radius changed from (2) to (2, 5 combatTalentScale, 5 at cap 2 at min). Now uses the new FIRE_DRAIN damage type(same as Fire but heals the user 10% of the damage it deals). Duration raised from (3, 7) to (5, 9).
Fire Breath: Now deals (30, 650), was (30, 550). Now uses the new FIRE_STUN damage type, which has a 25% chance of attempting to apply a 5 damage per turn/three turn Fireshock, and otherwise functions as FIREBURN damage type.

-Higher Draconic

Prismatic Slash: Now adds a ((2, 10, 0.5 TalentScale) /100, 12%~ at 6.5 or so) passive attack/mind speed bonus, old save bonus removed. Weapon hit damage raised from (1.2, 2.0) to (1.6, 2.3), burst damage remains the same. Now uses new FIRE_STUN and ICE_SLOW for the fire/ice bursts. Equi cost lowered to 10(from 20), Cooldown lowered to 12(from 16).
Venomous Breath: Changed from Insidious Poison to Crippling Poison. Effect of the poison is (50, 10, 20 TalentScale) chance to make enemies fail complex actions. Damage raised from (60, 650) to (60. 750). Now passively raises nature damage by 4% and nature resistance by 3%.
Wyrmic Guile: Now lowers the cooldown of (Fire, Cold, Lightning, Corrosive, Venomous, and Sand Breath) by math.min(8, 1, 6 TalentScale), in addition to previous effects. (In practice, this halves the breath CDs when capped.)
Chromatic Fury: Unchanged.

Sand Drake:

Swallow: Cooldown changed from (10) to (TalentLimit 4, 10, 7), so 10->7 with leveling. Damage raised from (1, 1.5) to (1.6, 2.5)-heavy raise is due to its off element Nature damage. Now passively raises Physical and Mental Critical rates by (2, 10 TalentScale).
Quake: Damage changed from (0.8*Physical Power) to (1.3, 2.1) TalentWeaponDamage. Cooldown lowered from 30 to 20. Knockback changed to 3.
Burrow: Duration drastically lowered(from 8, 20 to 3, 7). Now grants MindTalentDamage(15, 30) APR and (15, 30)/2 physical resistance penetration while active. Equilibrium cost lowered to 15 from 50, Cooldown changed to (10, 40, 15) from 30. Can be used instantly at TL5.
Sand Breath: Duration of blindness lowered from (3, 7) to (3, 4). Damage raised from (30, 400) to (30, 480).

Storm Drake:

Lightning Speed: Cooldown changed from 26 to 25(Odd number was the only reason for the tweak). Duration changed from (1.1, 2.6) to (1.1, 3.1). Now grants a passive (0.7, 0.08, 0.40) Movement speed bonus(45%~ at 6.5).
Static Field: Radius changed from (1) to (TalentScale 1, 6). Now deals (20, 160) Mindpower lightning damage in addition to the current life drain. Damage penalty on Elite Bosses changed from (current life drain/3) to (current life drain/2.5), a small boost against the final bosses but still lower than every other enemy in the game.
Tornado: No longer can self-damage. Projectile speed raised from 2 to 4. Now hits radius (2, 4) instead of Radius 1, and the target is now stunned for (3, 6 TalentScale) turns instead of 4 flatrate.
Lightning Breath: Damage raised from (30, 500) to (30, 670). Daze rate changed from flat 25% to (Mindpower 10, 30)+20%, generally 25 to 50% based on levels and Mindpower.

Venom Drake:

Acidic Spray: Now grants 4 Mindpower per level, passively.
Corrosive Mist: Equilibrium cost lowered to 10, Cooldown to 15. Damage raised slightly from 10, 70 to 15, 70.
Dissolve: Unchanged.
Corrosive Breath: Damage raised from (30, 420) to (30, 520). Disarm chance changed from flat 25% to (Mindpower 10, 30)+20%, 25-50% range in general.

(Note: May have missed one or two tweaks, sorry in advance if I did!)
parent 6ac65e3c
No related branches found
No related tags found
No related merge requests found
......@@ -1033,6 +1033,29 @@ newDamageType{
return init_dam
end,
}
-- Fire damage + DOT + 25% chance of Fireflash
newDamageType{
name = "stunning fire", type = "FIRE_STUN", text_color = "#LIGHT_RED#",
projector = function(src, x, y, type, dam)
local chance = 25
local dur = 3
local perc = 50
if _G.type(dam) == "table" then dam, dur, perc = dam.dam, dam.dur, (dam.initial or perc) end
local init_dam = dam * perc / 100
if init_dam > 0 then DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, init_dam) end
local target = game.level.map(x, y, Map.ACTOR)
if target then
dam = dam - init_dam
target:setEffect(target.EFF_BURNING, dur, {src=src, power=dam / dur, no_ct_effect=true})
if rng.percent(chance) then
DamageType:get(DamageType.FLAMESHOCK).projector(src, x, y, DamageType.FLAMESHOCK, {dur=3, dam=15, apply_power=src:combatMindpower()})
end
end
return init_dam
end,
}
newDamageType{
name = "fire burn", type = "GOLEM_FIREBURN",
projector = function(src, x, y, type, dam)
......@@ -1045,6 +1068,21 @@ newDamageType{
end,
}
-- Drain Life... with fire!
newDamageType{
name = "devouring flames", type = "FIRE_DRAIN", text_color = "#LIGHT_RED#",
projector = function(src, x, y, type, dam)
if _G.type(dam) == "number" then dam = {dam=dam, healfactor=0.1} end
local target = game.level.map(x, y, Map.ACTOR) -- Get the target first to make sure we heal even on kill
local realdam = DamageType:get(DamageType.FIRE).projector(src, x, y, DamageType.FIRE, dam.dam)
if target and realdam > 0 then
src:heal(realdam * dam.healfactor, target)
src:logCombat(target, "#Source# drains life from #Target#!")
end
return realdam
end,
}
-- Darkness + Fire
newDamageType{
name = "shadowflame", type = "SHADOWFLAME",
......@@ -1140,6 +1178,24 @@ newDamageType{
end,
}
-- Cold damage + freeze chance + 20% slow
newDamageType{
name = "slowing ice", type = "ICE_SLOW", text_color = "#1133F3#",
projector = function(src, x, y, type, dam)
local chance = 25
local target = game.level.map(x, y, Map.ACTOR)
if _G.type(dam) == "table" then chance, dam = dam.chance, dam.dam end
local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam)
if target then
target:setEffect(target.EFF_SLOW, 3, {power=0.2, no_ct_effect=true})
if rng.percent(chance) then
DamageType:get(DamageType.FREEZE).projector(src, x, y, DamageType.FREEZE, {dur=2, hp=70+dam*1.5})
end
end
return realdam
end,
}
-- Cold damage + freeze chance, increased if wet
newDamageType{
name = "ice storm", type = "ICE_STORM", text_color = "#1133F3#",
......
......@@ -27,24 +27,45 @@ newTalent{
random_ego = "attack",
equilibrium = 3,
cooldown = 7,
range = 1,
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 3)) end,
direct_hit = true,
requires_target = true,
tactical = { ATTACK = { COLD = 2 } },
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
damagemult = function(self, t) return self:combatTalentScale(t, 1.525, 2.025) end,
on_learn = function(self, t)
self.combat_physresist = self.combat_physresist + 4
self.combat_spellresist = self.combat_spellresist + 4
self.combat_mentalresist = self.combat_mentalresist + 4
self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1
end,
on_unlearn = function(self, t)
self.combat_physresist = self.combat_physresist - 4
self.combat_spellresist = self.combat_spellresist - 4
self.combat_mentalresist = self.combat_mentalresist - 4
self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1
end,
damagemult = function(self, t) return self:combatTalentScale(t, 1.6, 2.3) end,
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t)}
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
self:attackTarget(target, (self:getTalentLevel(t) >= 4) and DamageType.ICE or DamageType.COLD, t.damagemult(self, t), true)
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, tg, self)
local target = game.level.map(px, py, Map.ACTOR)
if target and target ~= self then
local hit = self:attackTarget(target, DamageType.ICE, self:combatTalentWeaponDamage(t, 1.6, 2.3), true)
end
end)
game:playSoundNear(self, "talents/breath")
return true
end,
info = function(self, t)
return ([[You call upon the mighty claw of a cold drake, doing %d%% weapon damage as cold damage.
At level 4, the attack becomes pure ice, giving a chance to freeze the target.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(100 * t.damagemult(self, t))
return ([[You call upon the mighty claw of a cold drake and rake a wave of freezing cold in front of you, doing %d%% weapon damage as Ice damage in a cone of %d. Ice damage gives a chance of freezing the target.
Every level in Ice Claw additionally raises your Physical, Mental and Spell Saves by 4.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(100 * t.damagemult(self, t), self:getTalentRadius(t))
end,
}
......@@ -55,28 +76,33 @@ newTalent{
mode = "sustained",
points = 5,
cooldown = 10,
sustain_equilibrium = 30,
sustain_equilibrium = 10,
range = 10,
tactical = { ATTACK = { COLD = 1 }, DEFEND = 2 },
on_learn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
getDamage = function(self, t) return self:combatTalentStatDamage(t, "wil", 10, 700) / 10 end,
getArmor = function(self, t) return self:combatTalentStatDamage(t, "wil", 6, 600) / 10 end,
getArmor = function(self, t) return self:combatTalentMindDamage(t, 5, 25) end,
getLifePct = function(self, t) return self:combatTalentLimit(t, 1, 0.02, 0.10) end, -- Limit < 100% bonus
getDamageOnMeleeHit = function(self, t) return 10 + self:combatTalentMindDamage(t, 10, 30) end,
activate = function(self, t)
return {
onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.COLD]=t.getDamage(self, t)}),
onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.COLD]=t.getDamageOnMeleeHit(self, t)}),
life = self:addTemporaryValue("max_life", t.getLifePct(self, t)*self.max_life),
armor = self:addTemporaryValue("combat_armor", t.getArmor(self, t)),
}
end,
deactivate = function(self, t, p)
self:removeTemporaryValue("on_melee_hit", p.onhit)
self:removeTemporaryValue("max_life", p.life)
self:removeTemporaryValue("combat_armor", p.armor)
self:removeTemporaryValue("on_melee_hit", p.onhit)
return true
end,
info = function(self, t)
return ([[Your skin forms icy scales, damaging anyone that hits you for %0.2f cold damage and increasing your Armour by %d.
local life = t.getLifePct(self, t)
return ([[Your skin forms icy scales and your flesh toughens, increasing your Maximum Life by %d%% and your Armour by %d.
You also deal %0.2f cold damage to any enemies that physically strike you.
Each point in cold drake talents also increases your cold resistance by 1%%.
The damage and Armor will scale with your Willpower.]]):format(damDesc(self, DamageType.COLD, t.getDamage(self, t)), t.getArmor(self, t))
The life increase will scale with your Talent Level, and your Armour and retaliation cold damage will scale with Mindpower.]]):format(life * 100, t.getArmor(self, t), damDesc(self, DamageType.COLD, t.getDamageOnMeleeHit(self, t)))
end,
}
......@@ -87,7 +113,7 @@ newTalent{
points = 5,
random_ego = "defensive",
equilibrium = 10,
cooldown = 30,
cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 5, 30, 10)) end,
range = 10,
tactical = { DISABLE = 2 },
requires_target = true,
......@@ -95,6 +121,8 @@ newTalent{
on_unlearn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1 end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
getLength = function(self, t) return 1 + math.floor(self:combatTalentScale(t, 3, 7)/2)*2 end,
getIceDamage = function(self, t) return self:combatTalentMindDamage(t, 3, 15) end,
getIceRadius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 2)) end,
action = function(self, t)
local halflength = math.floor(t.getLength(self,t)/2)
local block = function(_, lx, ly)
......@@ -103,6 +131,8 @@ newTalent{
local tg = {type="wall", range=self:getTalentRange(t), halflength=halflength, talent=t, halfmax_spots=halflength+1, block_radius=block}
local x, y = self:getTarget(tg)
if not x or not y then return nil end
local ice_damage = self:mindCrit(t.getIceDamage(self, t))
local ice_radius = t.getIceRadius(self, t)
local _ _, _, _, x, y = self:canProject(tg, x, y)
if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return nil end
......@@ -123,9 +153,15 @@ newTalent{
block_move = true,
block_sight = false,
temporary = 4 + self:getTalentLevel(t),
x =px, y = py,
x = px, y = py,
canAct = false,
dam = ice_damage,
radius = ice_radius,
act = function(self)
local tg = {type="ball", range=0, radius=ice_radius, friendlyfire=false, talent=t, x=self.x, y=self.y}
self.summoner.__project_source = self
self.summoner:project(tg, self.x, self.y, engine.DamageType.ICE, self.dam)
self.summoner.__project_source = nil
self:useEnergy()
self.temporary = self.temporary - 1
if self.temporary <= 0 then
......@@ -151,8 +187,11 @@ newTalent{
return true
end,
info = function(self, t)
return ([[Summons an icy wall of %d length for %d turns. Ice walls are transparent.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t))
local icerad = t.getIceRadius(self, t)
local icedam = t.getIceDamage(self, t)
return ([[Summons an icy wall of %d length for %d turns. Ice walls are transparent, but block projectiles and enemies.
Ice walls also emit freezing cold, dealing %0.2f damage for each ice wall within radius %d of an enemy, and with each wall giving a 25%% chance to freeze an enemy. This cold cannot hurt the talent user or their allies.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(3 + math.floor(self:getTalentLevel(t) / 2) * 2, t.getDuration(self, t), damDesc(self, DamageType.COLD, icedam), icerad)
end,
}
......@@ -179,7 +218,7 @@ newTalent{
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.ICE, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 430)))
self:project(tg, x, y, DamageType.ICE_SLOW, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 500)))
game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_cold", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
game:playSoundNear(self, "talents/breath")
......@@ -190,9 +229,9 @@ newTalent{
return true
end,
info = function(self, t)
return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage, and has a 25%% to be frozen for a few turns (higher rank enemies will be frozen for a shorter time).
return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage, will be slowed 20%% for three turns, and has a 25%% to be frozen for a few turns (higher rank enemies will be frozen for a shorter time).
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.COLD, self:combatTalentStatDamage(t, "str", 30, 430)))
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.COLD, self:combatTalentStatDamage(t, "str", 30, 500)))
end,
}
......@@ -17,79 +17,95 @@
-- Nicolas Casalini "DarkGod"
-- darkgod@te4.org
newTalent{
name = "Bellowing Roar",
name = "Wing Buffet",
type = {"wild-gift/fire-drake", 1},
require = gifts_req1,
points = 5,
random_ego = "attack",
message = "@Source@ roars!",
equilibrium = 3,
cooldown = 20,
equilibrium = 5,
cooldown = 8,
range = 0,
on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
on_learn = function(self, t)
self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1
self.combat_atk = self.combat_atk + 4
self.combat_dam = self.combat_dam + 4
end,
on_unlearn = function(self, t)
self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1
self.combat_atk = self.combat_atk - 4
self.combat_dam = self.combat_dam - 4
end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.6) end,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
direct_hit = true,
tactical = { DEFEND = { knockback = 2 }, ESCAPE = { knockback = 2 } },
requires_target = true,
target = function(self, t)
return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t}
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
tactical = { DEFEND = 1, DISABLE = { confusion = 3 } },
action = function(self, t)
local tg = self:getTalentTarget(t)
self:project(tg, self.x, self.y, DamageType.PHYSICAL, self:mindCrit(self:combatTalentStatDamage(t, "str", 40, 400)))
self:project(tg, self.x, self.y, DamageType.CONFUSION, {
dur=3,
dam=40 + 6 * self:getTalentLevel(t),
power_check=function() return self:combatPhysicalpower() end,
resist_check=self.combatPhysicalResist,
})
game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "shout", {additive=true, life=10, size=3, distorion_factor=0.5, radius=self:getTalentRadius(t), nb_circles=8, rm=0.8, rM=1, gm=0, gM=0, bm=0.1, bM=0.2, am=0.4, aM=0.6})
local x, y = self:getTarget(tg)
if not x or not y then return nil end
self:project(tg, x, y, function(px, py, tg, self)
local target = game.level.map(px, py, Map.ACTOR)
if target and target ~= self then
local hit = self:attackTarget(target, DamageType.PHYSKNOCKBACK, self:combatTalentWeaponDamage(t, 1.1, 1.6), true)
end
end)
game:playSoundNear(self, "talents/breath")
if core.shader.active(4) then
local bx, by = self:attachementSpot("back", true)
self:addParticles(Particles.new("shader_wings", 1, {life=18, x=bx, y=by, fade=-0.006, deploy_speed=14}))
end
return true
end,
info = function(self, t)
local radius = self:getTalentRadius(t)
return ([[You let out a powerful roar that sends your foes into utter confusion for 3 turns in a radius of %d.
The sound wave is so strong, your foes also take %0.2f physical damage.
The damage improves with your Strength.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(radius, self:combatTalentStatDamage(t, "str", 40, 400))
local damage = t.getDamage(self, t)
return ([[You summon a powerful gust of wind, knocking back your foes within a radius of %d up to 3 tiles away and damaging them for %d%% weapon damage.
Every level in Wing Buffet additionally raises your Physical Power and Accuracy by 4, passively.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t),damage*100)
end,
}
newTalent{
name = "Wing Buffet",
name = "Bellowing Roar",
type = {"wild-gift/fire-drake", 2},
require = gifts_req2,
points = 5,
random_ego = "attack",
equilibrium = 7,
cooldown = 10,
message = "@Source@ roars!",
equilibrium = 8,
cooldown = 20,
range = 0,
on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
direct_hit = true,
tactical = { DEFEND = { knockback = 2 }, ESCAPE = { knockback = 2 } },
requires_target = true,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t}
end,
tactical = { DEFEND = 1, DISABLE = { confusion = 3 } },
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.PHYSKNOCKBACK, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 15, 90)), dist=4})
game:playSoundNear(self, "talents/breath")
if core.shader.active(4) then
local bx, by = self:attachementSpot("back", true)
self:addParticles(Particles.new("shader_wings", 1, {life=18, x=bx, y=by, fade=-0.006, deploy_speed=14}))
end
self:project(tg, self.x, self.y, DamageType.PHYSICAL, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 380)))
self:project(tg, self.x, self.y, DamageType.CONFUSION, {
dur=3,
dam=20 + 6 * self:getTalentLevel(t),
power_check=function() return self:combatPhysicalpower() end,
resist_check=self.combatPhysicalResist,
})
game.level.map:particleEmitter(self.x, self.y, self:getTalentRadius(t), "shout", {additive=true, life=10, size=3, distorion_factor=0.5, radius=self:getTalentRadius(t), nb_circles=8, rm=0.8, rM=1, gm=0, gM=0, bm=0.1, bM=0.2, am=0.4, aM=0.6})
return true
end,
info = function(self, t)
return ([[You summon a powerful gust of wind, knocking back your foes within a radius of %d up to 4 tiles away and damaging them for %d.
The damage will increase with your Strength.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), self:combatTalentStatDamage(t, "str", 15, 90))
local radius = self:getTalentRadius(t)
return ([[You let out a powerful roar that sends your foes into utter confusion for 3 turns in a radius of %d.
The sound wave is so strong, your foes also take %0.2f physical damage.
The damage improves with your Strength.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(radius, self:combatTalentStatDamage(t, "str", 30, 380))
end,
}
......@@ -99,26 +115,26 @@ newTalent{
require = gifts_req3,
points = 5,
random_ego = "attack",
equilibrium = 10,
cooldown = 35,
equilibrium = 6,
cooldown = 20,
tactical = { ATTACKAREA = { FIRE = 2 } },
range = 10,
radius = 2,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 5)) end,
direct_hit = true,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) - 1 end,
target = function(self, t)
return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false}
end,
getDamage = function(self, t)
return self:combatTalentStatDamage(t, "wil", 15, 120)
return self:combatTalentMindDamage(t, 15, 60)
end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
action = function(self, t)
local duration = t.getDuration(self, t)
local radius = self:getTalentRadius(t)
local dam = self:mindCrit(t.getDamage(self, t))
local damage = self:mindCrit(t.getDamage(self, t))
local tg = self:getTalentTarget(t)
local x, y = self:getTarget(tg)
if not x or not y then return nil end
......@@ -126,11 +142,11 @@ newTalent{
-- Add a lasting map effect
game.level.map:addEffect(self,
x, y, duration,
DamageType.FIRE, dam,
DamageType.FIRE_DRAIN, {dam=damage, healfactor=0.1},
radius,
5, nil,
{type="inferno"},
nil, true
nil, false
)
game:playSoundNear(self, "talents/devouringflame")
return true
......@@ -140,7 +156,8 @@ newTalent{
local radius = self:getTalentRadius(t)
local duration = t.getDuration(self, t)
return ([[Spit a cloud of flames, doing %0.2f fire damage in a radius of %d each turn for %d turns.
The damage will increase with your Willpower, and can critical.
The flames will ignore the caster, and will drain 10%% of the damage dealt as the flames consume enemies life force and transfer it to the user.
The damage will increase with your Mindpower, and can critical.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(damDesc(self, DamageType.FIRE, dam), radius, duration)
end,
}
......@@ -168,7 +185,7 @@ newTalent{
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.FIREBURN, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 550)), dur=3, initial=70})
self:project(tg, x, y, DamageType.FIRE_STUN, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 650)), dur=3, initial=70})
game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_fire", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
if core.shader.active(4) then
......@@ -179,8 +196,8 @@ newTalent{
return true
end,
info = function(self, t)
return ([[You breathe fire in a frontal cone of radius %d. Any target caught in the area will take %0.2f fire damage over 3 turns.
return ([[You breathe fire in a frontal cone of radius %d. Any target caught in the area will take %0.2f fire damage over 3 turns, and has a 25%% chance of being Flameshocked for 3 turns, stunning them.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.FIRE, self:combatTalentStatDamage(t, "str", 30, 550)))
Each point in fire drake talents also increases your fire resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.FIRE, self:combatTalentStatDamage(t, "str", 30, 650)))
end,
}
......@@ -23,23 +23,18 @@ newTalent{
require = gifts_req_high1,
points = 5,
random_ego = "attack",
equilibrium = 20,
cooldown = 16,
equilibrium = 10,
cooldown = 12,
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,
getWeaponDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.6, 2.3) end,
getBurstDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 230) end,
getPassiveSpeed = function(self, t) return (self:combatTalentScale(t, 2, 10, 0.5)/100) 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
passives = function(self, t, p)
self:talentTemporaryValue(p, "combat_physspeed", t.getPassiveSpeed(self, t))
self:talentTemporaryValue(p, "combat_mindspeed", t.getPassiveSpeed(self, t))
end,
action = function(self, t)
......@@ -59,13 +54,13 @@ newTalent{
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)))
local grids = self:project(tg, x, y, DamageType.ICE_SLOW, 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)))
local grids = self:project(tg, x, y, DamageType.FIRE_STUN, 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
......@@ -86,10 +81,11 @@ newTalent{
info = function(self, t)
local burstdamage = t.getBurstDamage(self, t)
local radius = self:getTalentRadius(t)
local speed = t.getPassiveSpeed(self, 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.
You strike your enemy for %d%% weapon damage in one of blinding sand, disarming acid, freezing and slowing ice, dazing lightning or stunning 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)
Levels in Prismatic Slash increase your Physical and Mental attack speeds by %d%%.]]):format(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius, 100*speed)
end,
}
......@@ -105,12 +101,17 @@ newTalent{
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,
getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 60, 750) end,
getEffect = function(self, t) return math.ceil(self:combatTalentLimit(t, 50, 10, 20)) end,
on_learn = function(self, t)
self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) + 3
self.inc_damage[DamageType.NATURE] = (self.inc_damage[DamageType.NATURE] or 0) + 4
end,
on_unlearn = function(self, t)
self.resists[DamageType.NATURE] = (self.resists[DamageType.NATURE] or 0) - 3
self.inc_damage[DamageType.NATURE] = (self.inc_damage[DamageType.NATURE] or 0) - 4
end,
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
......@@ -118,7 +119,14 @@ newTalent{
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)})
local dam = self:mindCrit(t.getDamage(self, t))
self:project(tg, x, y, function(px, py)
local target = game.level.map(px, py, Map.ACTOR)
if target and target:canBe("poison") then
target:setEffect(self.EFF_CRIPPLING_POISON, 6, {src=self, power=dam/6, fail=math.ceil(self:combatTalentLimit(t, 100, 10, 20))})
end
end)
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")
......@@ -130,10 +138,10 @@ newTalent{
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.
return ([[You breathe crippling 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 gives enemies a %d%% chance to fail actions more complicated than basic attacks and movement, 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)
Each point in Venomous Breath also increases your nature resistance by 3%%, and your nature damage by 4%%.]] ):format(self:getTalentRadius(t), damDesc(self, DamageType.NATURE, t.getDamage(self,t)/6), effect)
end,
}
......@@ -145,6 +153,7 @@ newTalent{
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%
CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 6)) end, -- Limit < 8
on_learn = function(self, t)
self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 2
end,
......@@ -152,14 +161,17 @@ newTalent{
self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2
end,
passives = function(self, t, p)
local cdr = t.CDreduce(self, t)
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))
self:talentTemporaryValue(p, "talent_cd_reduction",
{[Talents.T_VENOMOUS_BREATH]=cdr, [Talents.T_ICE_BREATH]=cdr, [Talents.T_FIRE_BREATH]=cdr, [Talents.T_LIGHTNING_BREATH]=cdr, [Talents.T_CORROSIVE_BREATH]=cdr, [Talents.T_SAND_BREATH]=cdr})
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))
Your Cunning is increased by %d, and your breath attack cooldowns are reduced by %d.
You gain %d%% knockback resistance, and your blindness and stun resistances are increased by %d%%.]]):format(2*self:getTalentLevelRaw(t), t.CDreduce(self, t), 100*t.resistKnockback(self, t), 100*t.resistBlindStun(self, t))
end,
}
......
......@@ -23,24 +23,29 @@ newTalent{
require = gifts_req1,
points = 5,
equilibrium = 4,
cooldown = 10,
cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 4, 10, 7)) end,
range = 1,
no_message = true,
tactical = { ATTACK = { NATURE = 0.5 }, EQUILIBRIUM = 0.5},
tactical = { ATTACK = { weapon = 1 }, EQUILIBRIUM = 0.5},
requires_target = true,
no_npc_use = true,
maxSwallow = function(self, t, target) return -- Limit < 50%
self:combatLimit(self:getTalentLevel(t)*(self.size_category or 3)/(target.size_category or 3), 50, 13, 1, 25, 5)
end,
getPassiveCrit = function(self, t) return self:combatTalentScale(t, 2, 10, 0.5) end,
on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
passives = function(self, t, p)
self:talentTemporaryValue(p, "combat_physcrit", t.getPassiveCrit(self, t))
self:talentTemporaryValue(p, "combat_mindcrit", t.getPassiveCrit(self, t))
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
self:logCombat(target, "#Source# tries to swallow #Target#!")
local hit = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 1, 1.5), true)
local hit = self:attackTarget(target, DamageType.NATURE, self:combatTalentWeaponDamage(t, 1.6, 2.5), true)
if not hit then return true end
if (target.life * 100 / target.max_life > t.maxSwallow(self, t, target)) and not target.dead then
......@@ -64,11 +69,12 @@ newTalent{
return true
end,
info = function(self, t)
return ([[Attack the target for %d%% nature weapon damage.
return ([[Attack the target for %d%% Nature weapon damage.
If the attack brings your target below %d%% life or kills it, you can try to swallow it, killing it automatically and regaining life and equilibrium depending on its level.
The chance to swallow depends on your talent level and the relative size of the target.
Levels in Swallow additionally raises your Physical and Mental critical rate by %d%%, passively.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):
format(100 * self:combatTalentWeaponDamage(t, 1, 1.5), t.maxSwallow(self, t, self))
format(100 * self:combatTalentWeaponDamage(t, 1.6, 2.5), t.maxSwallow(self, t, self), t.getPassiveCrit(self, t))
end,
}
......@@ -80,30 +86,32 @@ newTalent{
random_ego = "attack",
message = "@Source@ shakes the ground!",
equilibrium = 4,
cooldown = 30,
cooldown = 20,
tactical = { ATTACKAREA = { PHYSICAL = 2 }, DISABLE = { knockback = 2 } },
range = 10,
range = 1,
on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
no_npc_use = true,
getDamage = function(self, t)
return self:combatDamage() * 0.8
end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.3, 2.1) end,
action = function(self, t)
local tg = {type="ball", range=0, selffire=false, radius=self:getTalentRadius(t), talent=t, no_restrict=true}
self:project(tg, self.x, self.y, DamageType.PHYSKNOCKBACK, {dam=self:mindCrit(t.getDamage(self, t)), dist=4})
self:project(tg, self.x, self.y, function(px, py, tg, self)
local target = game.level.map(px, py, Map.ACTOR)
if target and target ~= self then
local hit = self:attackTarget(target, DamageType.PHYSKNOCKBACK, self:combatTalentWeaponDamage(t, 1.3, 2.1), true)
end
end)
self:doQuake(tg, self.x, self.y)
return true
end,
info = function(self, t)
local radius = self:getTalentRadius(t)
local dam = t.getDamage(self, t)
return ([[You slam your foot onto the ground, shaking the area around you in a radius of %d.
Creatures caught by the quake will be damaged for %d and knocked back up to 4 tiles away.
The terrain will also be moved around within the quake's radius.
The damage will increase with your Strength.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(radius, dam)
return ([[You slam the ground, shaking the area around you in a radius of %d.
Creatures caught by the quake will be damaged for %d%% weapon damage, and knocked back up to 3 tiles away.
The terrain will also be moved around within the radius, and the user will be shifted to a random square within the radius.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(radius, dam * 100)
end,
}
......@@ -112,20 +120,24 @@ newTalent{
type = {"wild-gift/sand-drake", 3},
require = gifts_req3,
points = 5,
equilibrium = 50,
cooldown = 30,
equilibrium = 15,
cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 40, 15)) end,
range = 10,
no_energy = function(self, t) if self:getTalentLevel(t) >= 5 then return true else return false end end,
tactical = { CLOSEIN = 0.5, ESCAPE = 0.5 },
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 8, 20, 0.5, 0, 2)) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7, 0.5, 0, 2)) end,
getPenetration = function(self, t) return 10 + self:combatTalentMindDamage(t, 15, 30) end,
on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
on_unlearn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) - 0.5 end,
action = function(self, t)
self:setEffect(self.EFF_BURROW, t.getDuration(self, t), {})
self:setEffect(self.EFF_BURROW, t.getDuration(self, t), {power=t.getPenetration(self, t)})
return true
end,
info = function(self, t)
return ([[Allows you to burrow into walls for %d turns.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(t.getDuration(self, t))
return ([[Allows you to burrow into earthen walls for %d turns.
Your powerful digging abilities also allow you to exploit and smash through enemy defensive weaknesses; You ignore %d of target armor and %d%% of enemy physical damage resistance while this is in effect.
At Talent Level 5, this talent can be used instantly, and the cooldown will reduce with levels.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(t.getDuration(self, t), t.getPenetration(self, t), t.getPenetration(self, t) / 2)
end,
}
......@@ -149,9 +161,9 @@ newTalent{
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
getDamage = function(self, t)
return self:combatTalentStatDamage(t, "str", 30, 400)
return self:combatTalentStatDamage(t, "str", 30, 480)
end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 4)) end,
action = function(self, t)
local tg = self:getTalentTarget(t)
local x, y = self:getTarget(tg)
......@@ -169,7 +181,7 @@ newTalent{
info = function(self, t)
local damage = t.getDamage(self, t)
local duration = t.getDuration(self, t)
return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and be blinded for %d turns.
return ([[You breathe sand in a frontal cone of radius %d. Any target caught in the area will take %0.2f physical damage, and will be blinded for %d turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
Each point in sand drake talents also increases your physical resistance by 0.5%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.PHYSICAL, damage), duration)
end,
......
......@@ -25,15 +25,19 @@ newTalent{
require = gifts_req1,
points = 5,
equilibrium = 10,
cooldown = 26,
cooldown = 25,
range = 10,
tactical = { CLOSEIN = 2, ESCAPE = 2 },
requires_target = true,
no_energy = true,
getPassiveSpeed = function(self, t) return self:combatTalentScale(t, 0.08, 0.4, 0.7) end,
getSpeed = function(self, t) return self:combatTalentScale(t, 470, 750, 0.75) end,
getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 1.1, 2.6)) end,
getDuration = function(self, t) return math.ceil(self:combatTalentScale(t, 1.1, 3.1)) end,
on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 1 end,
passives = function(self, t, p)
self:talentTemporaryValue(p, "movement_speed", t.getPassiveSpeed(self, t))
end,
on_pre_use = function(self, t) return not self:attr("never_move") end,
action = function(self, t)
self:setEffect(self.EFF_LIGHTNING_SPEED, self:mindCrit(t.getDuration(self, t)), {power=t.getSpeed(self, t)})
......@@ -44,7 +48,8 @@ newTalent{
Also provides 30%% physical damage resistance and 100%% lightning resistance.
Any actions other than moving will stop this effect.
Note: since you will be moving very fast, game turns will pass very slowly.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(t.getSpeed(self, t), t.getDuration(self, t))
Levels in Lightning Speed additionally raises your Movement Speed by %d%%, passively.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(t.getSpeed(self, t), t.getDuration(self, t), t.getPassiveSpeed(self, t)*100)
end,
}
......@@ -56,7 +61,7 @@ newTalent{
equilibrium = 20,
cooldown = 20,
range = 0,
radius = 1,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 6)) end,
tactical = { ATTACKAREA = { instakill = 5 } },
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
......@@ -67,8 +72,12 @@ newTalent{
getPercent = function(self, t)
return self:combatLimit(self:combatTalentMindDamage(t, 10, 45), 90, 0, 0, 31, 31) -- Limit to <90%
end,
getDamage = function(self, t)
return self:combatTalentMindDamage(t, 20, 160)
end,
action = function(self, t)
local tg = self:getTalentTarget(t)
local litdam = self:mindCrit(t.getDamage(self, t))
self:project(tg, self.x, self.y, function(px, py)
local target = game.level.map(px, py, Map.ACTOR)
if not target then return end
......@@ -80,7 +89,7 @@ newTalent{
game.logSeen(target, "%s is caught in the static field!", target.name:capitalize())
local perc = t.getPercent(self, t)
if target.rank >= 5 then perc = perc / 3
if target.rank >= 5 then perc = perc / 2.5
elseif target.rank >= 3.5 then perc = perc / 2
elseif target.rank >= 3 then perc = perc / 1.5
end
......@@ -88,6 +97,7 @@ newTalent{
local dam = target.life * perc / 100
if target.life - dam < 0 then dam = target.life end
target:takeHit(dam, self)
self:project({type="hit", talent=t},target.x,target.y,DamageType.LIGHTNING,litdam)
game:delayedLogDamage(self, target, dam, ("#PURPLE#%d STATIC#LAST#"):format(math.ceil(dam)))
end, nil, {type="lightning_explosion"})
......@@ -96,9 +106,11 @@ newTalent{
end,
info = function(self, t)
local percent = t.getPercent(self, t)
return ([[Generate an electrical field around you in a radius of 1. Any creature caught inside will lose up to %0.1f%% of its current life (effect decreased for higher creature ranks).
This effect cannot kill creatures. Life loss will increase with your Mindpower.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(percent)
local litdam = t.getDamage(self, t)
return ([[Generate an electrical field around you in a radius of %d. Any creature caught inside will lose up to %0.1f%% of its current life (%0.1f%% if the target is Elite or Rare, %0.1f%% if the target is a Unique or Boss, and %0.1f%% if they are an Elite Boss.). This life drain is irresistable, but can be saved against with physical save.
Additionally, it will deal %0.2f lightning damage afterwards, regardless of target rank.
Current life loss and lightning damage will increase with your Mindpower, and the lightning damage element can critically hit with mental critical chances.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(self:getTalentRadius(t), percent, percent/1.5, percent/2, percent/2.5, damDesc(self, DamageType.LIGHTNING, litdam))
end,
}
......@@ -109,14 +121,16 @@ newTalent{
points = 5,
equilibrium = 14,
cooldown = 15,
proj_speed = 2, -- This is purely indicative
proj_speed = 4, -- This is purely indicative
tactical = { ATTACK = { LIGHTNING = 2 }, DISABLE = { stun = 2 } },
range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
range = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) - 1 end,
getRadius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 4, 0.5, 0, 0, true)) end,
getStunDuration = function(self, t) return self:combatTalentScale(t, 3, 6, 0.5, 0, 0, true) end,
action = function(self, t)
local tg = {type="hit", range=self:getTalentRange(t), talent=t}
local tg = {type="hit", range=self:getTalentRange(t), selffire=false, talent=t}
local x, y = self:getTarget(tg)
if not x or not y then return nil end
local _ _, x, y = self:canProject(tg, x, y)
......@@ -125,11 +139,13 @@ newTalent{
local movedam = self:mindCrit(self:combatTalentMindDamage(t, 10, 110))
local dam = self:mindCrit(self:combatTalentMindDamage(t, 15, 190))
local rad = t.getRadius(self, t)
local dur = t.getStunDuration(self, t)
local proj = require("mod.class.Projectile"):makeHoming(
self,
{particle="bolt_lightning", trail="lightningtrail"},
{speed=2, name="Tornado", dam=dam, movedam=movedam},
{speed=4, name="Tornado", dam=dam, movedam=movedam},
target,
self:getTalentRange(t),
function(self, src)
......@@ -138,10 +154,10 @@ newTalent{
end,
function(self, src, target)
local DT = require("engine.DamageType")
src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam)
src:project({type="ball", radius=rad, selffire=false, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
src:project({type="ball", radius=rad, selffire=false, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam)
if target:canBe("stun") then
target:setEffect(target.EFF_STUNNED, 4, {apply_power=src:combatMindpower()})
target:setEffect(target.EFF_STUNNED, dur, {apply_power=src:combatMindpower()})
else
game.logSeen(target, "%s resists the tornado!", target.name:capitalize())
end
......@@ -164,15 +180,19 @@ newTalent{
return true
end,
info = function(self, t)
local rad = t.getRadius(self, t)
local duration = t.getStunDuration(self, t)
return ([[Summons a tornado that moves slowly toward its target, following it if it changes position.
Any foe caught in its path takes %0.2f lightning damage.
When it reaches its target, it explodes in a radius of 1 for %0.2f lightning damage and %0.2f physical damage. All affected creatures will be knocked back, and the targeted creature will be stunned for 4 turns.
When it reaches its target, it explodes in a radius of %d for %0.2f lightning damage and %0.2f physical damage. All affected creatures will be knocked back, and the targeted creature will be stunned for %d turns. The blast will ignore the talent user.
The tornado will last for %d turns, or until it reaches its target.
Damage will increase with your Mindpower.
Damage will increase with your Mindpower, and the stun chance is based on your Mindpower vs target Physical Save.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(
damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 10, 110)),
rad,
damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 15, 190)),
damDesc(self, DamageType.PHYSICAL, self:combatTalentMindDamage(t, 15, 190)),
duration,
self:getTalentRange(t)
)
end,
......@@ -198,14 +218,17 @@ newTalent{
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
getDamage = function(self, t)
return self:combatTalentStatDamage(t, "str", 30, 500)
return self:combatTalentStatDamage(t, "str", 30, 670)
end,
getDaze = function(self, t)
return 20+self:combatTalentMindDamage(t, 10, 30)
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:mindCrit(t.getDamage(self, t))
self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {power_check=self:combatMindpower(), dam=rng.avg(dam / 3, dam, 3)})
self:project(tg, x, y, DamageType.LIGHTNING_DAZE, {daze=t.getDaze(self, t), power_check=self:combatMindpower(), dam=rng.avg(dam / 3, dam, 3)})
if core.shader.active() then game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_lightning", {radius=tg.radius, tx=x-self.x, ty=y-self.y}, {type="lightning"})
else game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_lightning", {radius=tg.radius, tx=x-self.x, ty=y-self.y})
......@@ -221,12 +244,14 @@ newTalent{
end,
info = function(self, t)
local damage = t.getDamage(self, t)
return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage, and can be dazed for 3 turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
local daze = t.getDaze(self, t)
return ([[You breathe lightning in a frontal cone of radius %d. Any target caught in the area will take %0.2f to %0.2f lightning damage, and have a %d%% chance to be dazed for 3 turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate. The Daze chance is based on your Mindpower.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(
self:getTalentRadius(t),
damDesc(self, DamageType.LIGHTNING, damage / 3),
damDesc(self, DamageType.LIGHTNING, damage)
damDesc(self, DamageType.LIGHTNING, damage),
daze
)
end,
}
......@@ -28,8 +28,14 @@ newTalent{
cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 3, 6.9, 5.5)) end, -- Limit >=3
tactical = { ATTACK = { ACID = 2 } },
range = function(self, t) return math.floor(self:combatTalentScale(t, 5.5, 7.5)) end,
on_learn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1 end,
on_learn = function(self, t)
self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1
self.combat_mindpower = self.combat_mindpower + 4
end,
on_unlearn = function(self, t)
self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1
self.combat_mindpower = self.combat_mindpower - 4
end,
direct_hit = function(self, t) if self:getTalentLevel(t) >= 5 then return true else return false end end,
requires_target = true,
target = function(self, t)
......@@ -58,6 +64,7 @@ newTalent{
The target will take %0.2f Mindpower-based acid damage.
Enemies struck have a 25%% chance to be Disarmed for three turns, as their weapon is rendered useless by an acid coating.
At Talent Level 5, this becomes a piercing line of acid.
Every level in Acidic Spray additionally raises your Mindpower by 4, passively.
Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(damDesc(self, DamageType.ACID, damage))
end,
}
......@@ -68,15 +75,15 @@ newTalent{
require = gifts_req2,
points = 5,
random_ego = "attack",
equilibrium = 15,
cooldown = 25,
equilibrium = 10,
cooldown = 15,
tactical = { ATTACKAREA = { ACID = 2 } },
range = 0,
on_learn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) + 1 end,
on_unlearn = function(self, t) self.resists[DamageType.ACID] = (self.resists[DamageType.ACID] or 0) - 1 end,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
requires_target = true,
getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 70) end,
getDamage = function(self, t) return self:combatTalentMindDamage(t, 15, 70) end,
getDuration = function(self, t) return math.floor(self:combatScale(self:combatMindpower(0.04) + self:getTalentLevel(t)/2, 6, 0, 7.67, 5.67)) end,
getCorrodeDur = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.8)) end,
getAtk = function(self, t) return self:combatTalentMindDamage(t, 2, 20) end,
......@@ -175,11 +182,14 @@ newTalent{
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
getDisarm = function(self, t)
return 20+self:combatTalentMindDamage(t, 10, 30)
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_DISARM, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 420)))
self:project(tg, x, y, DamageType.ACID_DISARM, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 520)), chance=t.getDisarm(self, t),})
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")
......@@ -190,9 +200,10 @@ newTalent{
return true
end,
info = function(self, t)
local disarm = t.getDisarm(self, t)
return ([[You breathe acid in a frontal cone of radius %d. Any target caught in the area will take %0.2f acid damage.
Enemies caught in the acid have a 25%% chance of their weapons becoming useless for three turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.ACID, self:combatTalentStatDamage(t, "str", 30, 420)))
Enemies caught in the acid have a %d%% chance of their weapons becoming useless for three turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate. The Disarm chance is based on your Mindpower.
Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(self:getTalentRadius(t), damDesc(self, DamageType.ACID, self:combatTalentStatDamage(t, "str", 30, 520)), disarm)
end,
}
\ No newline at end of file
......@@ -1025,7 +1025,7 @@ newEffect{
newEffect{
name = "BURROW", image = "talents/burrow.png",
desc = "Burrow",
long_desc = function(self, eff) return "The target is able to burrow into walls." end,
long_desc = function(self, eff) return ("The target is able to burrow into walls, and additionally has %d more APR and %d%% more physical resistance penetration."):format(eff.power, eff.power / 2) end,
type = "physical",
subtype = { earth=true },
status = "beneficial",
......@@ -1033,6 +1033,8 @@ newEffect{
activate = function(self, eff)
eff.pass = self:addTemporaryValue("can_pass", {pass_wall=1})
eff.dig = self:addTemporaryValue("move_project", {[DamageType.DIG]=1})
self:effectTemporaryValue(eff, "combat_apr", eff.power)
self:effectTemporaryValue(eff, "resists_pen", {[DamageType.PHYSICAL]=eff.power / 2 })
end,
deactivate = function(self, eff)
self:removeTemporaryValue("can_pass", eff.pass)
......
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