Skip to content
Snippets Groups Projects
Commit 3911d72a authored by Chris Davidson's avatar Chris Davidson
Browse files

Revise Wyrmic

parent ace91e5d
No related branches found
No related tags found
No related merge requests found
......@@ -155,8 +155,7 @@ newBirthDescriptor{
max_life = 110,
resolvers.equipbirth{ id=true,
{type="weapon", subtype="battleaxe", name="iron battleaxe", autoreq=true, ego_chance=-1000},
{type="armor", subtype="light", name="rough leather armour", autoreq=true, ego_chance=-1000}
},
{type="armor", subtype="heavy", name="iron mail armour", autoreq=true, ego_chance=-1000, ego_chance=-1000} },
},
copy_add = {
life_rating = 2,
......
......@@ -26,7 +26,7 @@ newTalent{
points = 5,
random_ego = "attack",
equilibrium = 3,
cooldown = 7,
cooldown = 10,
range = 0,
radius = function(self, t) return 3 end,
direct_hit = true,
......@@ -41,7 +41,7 @@ newTalent{
self.combat_physresist = self.combat_physresist - 2
self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) - 1
end,
damagemult = function(self, t) return self:combatTalentWeaponDamage(t, 1.6, 2.3) end,
damagemult = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.7) end,
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), selffire=false, radius=self:getTalentRadius(t), talent=t}
end,
......@@ -49,10 +49,19 @@ 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, 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, t.damagemult(self, t), true)
-- We need to alter behavior slightly to accomodate shields since they aren't used in attackTarget
local shield, shield_combat = self:hasShield()
local weapon = self:hasMHWeapon()
if not shield then
self:attackTarget(target, DamageType.ICE, t.damagemult(self, t), true)
else
self:attackTargetWith(target, weapon, DamageType.ICE, t.damagemult(self, t))
self:attackTargetWith(target, shield_combat, DamageType.ICE, t.damagemult(self, t))
end
end
end)
game:playSoundNear(self, "talents/breath")
......@@ -61,7 +70,9 @@ newTalent{
info = function(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 radius %d. Ice damage gives a chance of freezing the target.
Every level in Ice Claw additionally raises your Physical Save by 2.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format(100 * t.damagemult(self, t), self:getTalentRadius(t))
Each point in cold drake talents also increases your cold resistance by 1%%.
This talent will attack with your shield as well if you have one equipped.]]):format(100 * t.damagemult(self, t), self:getTalentRadius(t))
end,
}
......@@ -206,7 +217,11 @@ newTalent{
message = "@Source@ breathes ice!",
tactical = { ATTACKAREA = { COLD = 2 }, DISABLE = { stun = 1 } },
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
radius = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
getDamage = function(self, t)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 30, 500) or 0
return self:combatTalentStatDamage(t, "str", 30, 500) + bonus
end,
direct_hit = true,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.COLD] = (self.resists[DamageType.COLD] or 0) + 1 end,
......@@ -218,7 +233,20 @@ 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_SLOW, self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 500)))
local damage = self:mindCrit(t.getDamage(self, t))
self:project(tg, x, y, function(tx, ty)
local target = game.level.map(tx, ty, Map.ACTOR)
if not target or target == self then return end
DamageType:get(DamageType.COLD).projector(self, tx, ty, DamageType.COLD, damage)
if target:canBe("stun") then
target:setEffect(target.EFF_FROZEN, 3, {hp=damage, apply_power = self:combatMindpower()})
else
game.logSeen(target, "%s resists the freeze!", target.name:capitalize())
end
end, t.getDamage(self, t), {type="freeze"})
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")
......@@ -229,8 +257,8 @@ 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, 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, 500)))
return ([[You breathe ice in a frontal cone of radius %d. Any target caught in the area will take %0.2f cold damage and be frozen for 3 turns.
The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Freeze apply power is based on your Mindpower.
Each point in cold drake talents also increases your cold resistance by 1%%.]]):format( self:getTalentRadius(t), damDesc(self, DamageType.COLD, t.getDamage(self, t)))
end,
}
......@@ -25,20 +25,20 @@ newTalent{
points = 5,
random_ego = "attack",
equilibrium = 5,
cooldown = 8,
cooldown = 10,
range = 0,
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
self.combat_atk = self.combat_atk + 2
self.combat_dam = self.combat_dam + 2
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
self.combat_atk = self.combat_atk - 2
self.combat_dam = self.combat_dam - 2
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,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 1.7) end,
radius = function(self, t) return 3 end,
direct_hit = true,
tactical = { DEFEND = { knockback = 2 }, ESCAPE = { knockback = 2 } },
requires_target = true,
......@@ -49,10 +49,20 @@ newTalent{
local tg = self:getTalentTarget(t)
local x, y = self:getTarget(tg)
if not x or not y then return nil end
local state = {}
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)
if target and target ~= self and not state[target] then
-- We need to alter behavior slightly to accomodate shields since they aren't used in attackTarget
state[target] = true
local shield, shield_combat = self:hasShield()
local weapon = self:hasMHWeapon()
if not shield then
self:attackTarget(target, DamageType.PHYSKNOCKBACK, t.getDamage(self, t), true)
else
self:attackTargetWith(target, weapon, DamageType.PHYSKNOCKBACK, t.getDamage(self, t))
self:attackTargetWith(target, shield_combat, DamageType.PHYSKNOCKBACK, t.getDamage(self, t))
end
end
end)
game:playSoundNear(self, "talents/breath")
......@@ -66,8 +76,10 @@ newTalent{
info = function(self, t)
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)
Every level in Wing Buffet additionally raises your Physical Power and Accuracy by 2, passively.
Each point in fire drake talents also increases your fire resistance by 1%%.
This talent will attack with your shield as well if you have one equipped.]]):format(self:getTalentRadius(t),damage*100)
end,
}
......@@ -174,9 +186,9 @@ newTalent{
equilibrium = 12,
cooldown = 12,
message = "@Source@ breathes fire!",
tactical = { ATTACKAREA = { FIRE = 2 }, DISABLE = {stun = 1}},
tactical = { ATTACKAREA = { FIRE = 2 }},
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
radius = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
direct_hit = true,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.FIRE] = (self.resists[DamageType.FIRE] or 0) + 1 end,
......@@ -184,11 +196,15 @@ newTalent{
target = function(self, t)
return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
getDamage = function(self, t)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 30, 850) or 0
return self:combatTalentStatDamage(t, "str", 30, 850) + bonus
end, -- Higher damage because no debuff and delayed
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.FIRE_STUN, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 650)), dur=3, initial=70})
self:project(tg, x, y, DamageType.FIREBURN, {dam=self:mindCrit(t.getDamage(self, t)), dur=3})
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
......@@ -199,8 +215,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, 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, 650)))
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.
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, t.getDamage(self, t)))
end,
}
......@@ -46,37 +46,49 @@ newTalent{
local elem = rng.table{"phys", "cold", "fire", "lightning", "acid",}
if elem == "phys" then
self:attackTarget(target, DamageType.PHYSICAL, t.getWeaponDamage(self, t), true)
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.SAND, {dur=3, dam=self:mindCrit(t.getBurstDamage(self, t))})
game.level.map:particleEmitter(x, y, tg.radius, "ball_matter", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
elseif elem == "cold" then
self:attackTarget(target, DamageType.ICE, t.getWeaponDamage(self, t), true)
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.ICE_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.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
self:attackTarget(target, DamageType.LIGHTNING_DAZE, t.getWeaponDamage(self, t), true)
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.LIGHTNING_DAZE, self:mindCrit(t.getBurstDamage(self, t)))
game.level.map:particleEmitter(x, y, tg.radius, "ball_lightning", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
elseif elem == "acid" then
self:attackTarget(target, DamageType.ACID_DISARM, t.getWeaponDamage(self, t), true)
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.ACID_DISARM, self:mindCrit(t.getBurstDamage(self, t)))
game.level.map:particleEmitter(x, y, tg.radius, "ball_acid", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
-- We need to alter behavior slightly to accomodate shields since they aren't used in attackTarget
local attack_mode = function(self, target, dt, dam)
local shield, shield_combat = self:hasShield()
local weapon = self:hasMHWeapon()
if not shield then
self:attackTarget(target, dt, dam, true)
else
self:attackTargetWith(target, weapon, dt, dam)
self:attackTargetWith(target, shield_combat, dt, dam)
end
end
if elem == "phys" then
attack_mode(self, target, DamageType.PHYSICAL, t.getWeaponDamage(self, t))
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.SAND, {dur=3, dam=self:mindCrit(t.getBurstDamage(self, t))})
game.level.map:particleEmitter(x, y, tg.radius, "ball_matter", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
elseif elem == "cold" then
attack_mode(self, target, DamageType.ICE, t.getWeaponDamage(self, t))
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=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
attack_mode(self, target, DamageType.FIREBURN, t.getWeaponDamage(self, t))
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=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
attack_mode(self, target, DamageType.LIGHTNING_DAZE, t.getWeaponDamage(self, t))
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.LIGHTNING_DAZE, self:mindCrit(t.getBurstDamage(self, t)))
game.level.map:particleEmitter(x, y, tg.radius, "ball_lightning", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
elseif elem == "acid" then
attack_mode(self, target, DamageType.ACID_DISARM, t.getWeaponDamage(self, t))
local tg = {type="ball", range=1, selffire=false, radius=self:getTalentRadius(t), talent=t}
local grids = self:project(tg, x, y, DamageType.ACID_DISARM, self:mindCrit(t.getBurstDamage(self, t)))
game.level.map:particleEmitter(x, y, tg.radius, "ball_acid", {radius=tg.radius, grids=grids, tx=x, ty=y, max_alpha=80})
game:playSoundNear(self, "talents/flame")
end
return true
end,
info = function(self, t)
......@@ -86,7 +98,9 @@ newTalent{
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 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.
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)
Levels in Prismatic Slash increase your Physical and Mental attack speeds by %d%%.
This talent will attack with your shield as well if you have one equipped.]]):format(100 * self:combatTalentWeaponDamage(t, 1.2, 2.0), burstdamage, radius, 100*speed)
end,
}
......@@ -101,9 +115,12 @@ newTalent{
message = "@Source@ breathes venom!",
tactical = { ATTACKAREA = { poison = 2 } },
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
radius = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
requires_target = true,
getDamage = function(self, t) return self:combatTalentStatDamage(t, "str", 60, 750) end,
getDamage = function(self, t)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 60, 750) or 0
return self:combatTalentStatDamage(t, "str", 60, 750) + bonus
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
......@@ -154,25 +171,18 @@ 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,
on_unlearn = function(self, t)
self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2
end,
getStat = function(self, t) return self:combatTalentScale(t, 1, 12) 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})
self:talentTemporaryValue(p, "inc_stats", {[self.STAT_STR] = t.getStat(self, t)})
self:talentTemporaryValue(p, "inc_stats", {[self.STAT_WIL] = t.getStat(self, t)})
end,
info = function(self, t)
return ([[You have the mental prowess of a Wyrm.
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))
return ([[You have mastered your draconic nature.
Your Strength and Willpower are increased by %d.
You gain %d%% knockback resistance, and your blindness and stun resistances are increased by %d%%.]]):format(t.getStat(self, t), 100*t.resistKnockback(self, t), 100*t.resistBlindStun(self, t))
end,
}
......@@ -182,36 +192,49 @@ newTalent{
require = gifts_req_high4,
points = 5,
mode = "passive",
getDamageIncrease = function(self, t) return self:combatTalentScale(t, 2.5, 10) end,
getDamageIncrease = function(self, t) return self:combatTalentScale(t, 2.5, 20) end,
getResists = function(self, t) return self:combatTalentScale(t, 0.6, 2.5) end,
getResistPen = function(self, t) return self:combatTalentLimit(t, 100, 5, 20) end, -- Limit < 100%
getResistPen = function(self, t) return self:combatTalentLimit(t, 50, 5, 30) end, -- Limit < 50%
passives = function(self, t, p)
local dam_inc = t.getDamageIncrease(self, t)
local resists = t.getResists(self, t)
local resists_pen = t.getResistPen(self, t)
self:talentTemporaryValue(p, "heightened_senses", t.getDamageIncrease(self, t))
self:talentTemporaryValue(p, "inc_damage", {[DamageType.PHYSICAL]=dam_inc,
self:talentTemporaryValue(p, "inc_damage", {
[DamageType.PHYSICAL]=dam_inc,
[DamageType.COLD]=dam_inc,
[DamageType.FIRE]=dam_inc,
[DamageType.LIGHTNING]=dam_inc,
[DamageType.ACID]=dam_inc
[DamageType.ACID]=dam_inc,
[DamageType.NATURE]=dam_inc,
[DamageType.BLIGHT]=dam_inc,
[DamageType.DARKNESS]=dam_inc,
})
self:talentTemporaryValue(p, "resists", {[DamageType.PHYSICAL]=resists,
self:talentTemporaryValue(p, "resists", {
[DamageType.PHYSICAL]=resists,
[DamageType.COLD]=resists,
[DamageType.FIRE]=resists,
[DamageType.LIGHTNING]=resists,
[DamageType.ACID]=resists
})
self:talentTemporaryValue(p, "resists_pen", {[DamageType.PHYSICAL]=resists_pen,
[DamageType.ACID]=resists,
[DamageType.NATURE]=resists,
[DamageType.BLIGHT]=resists,
[DamageType.DARKNESS]=resists,
})
self:talentTemporaryValue(p, "resists_pen", {
[DamageType.PHYSICAL]=resists_pen,
[DamageType.COLD]=resists_pen,
[DamageType.FIRE]=resists_pen,
[DamageType.LIGHTNING]=resists_pen,
[DamageType.ACID]=resists_pen
})
[DamageType.ACID]=resists_pen,
[DamageType.NATURE]=resists_pen,
[DamageType.BLIGHT]=resists_pen,
[DamageType.DARKNESS]=resists_pen,
})
end,
info = function(self, t)
return ([[You have gained the full power of the multihued dragon, and have become both resistant and attuned to physical, fire, cold, lightning and acid damage.
Your resistance to these elements is increased by %0.1f%% and all damage you deal with them is increased by %0.1f%% with %0.1f%% resistance penetration.]])
return ([[You have gained the full power of the various drakes throughout the world, and have become both resistant and attuned to physical, fire, cold, lightning, acid, nature, blight, and darkness damage.
Your resistance to these elements is increased by %0.1f%% and all damage you deal with them is increased by %0.1f%% with %0.1f%% resistance penetration.
Learning this talent will add a Willpower bonus to your breath talent damage with the same scaling as Strength, effectively doubling it when the stats are equal.]])
:format(t.getResists(self, t), t.getDamageIncrease(self, t), t.getResistPen(self, t))
end,
}
......@@ -154,7 +154,7 @@ newTalent{
message = "@Source@ breathes sand!",
tactical = { ATTACKAREA = {PHYSICAL = 2}, DISABLE = { blind = 2 } },
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
radius = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
direct_hit = true,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.PHYSICAL] = (self.resists[DamageType.PHYSICAL] or 0) + 0.5 end,
......@@ -163,9 +163,10 @@ 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, 480)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 10, 400) or 0
return self:combatTalentStatDamage(t, "str", 10, 400) + bonus
end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 4)) end,
getDuration = function(self, t) return 3 end,
action = function(self, t)
local tg = self:getTalentTarget(t)
local x, y = self:getTarget(tg)
......@@ -184,7 +185,7 @@ newTalent{
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 will be blinded for %d turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate.
The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Blind apply power is based on your Mindpower.
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,
}
......@@ -121,14 +121,15 @@ newTalent{
points = 5,
equilibrium = 14,
cooldown = 15,
proj_speed = 4, -- This is purely indicative
proj_speed = 1, -- This is purely indicative
tactical = { ATTACK = { LIGHTNING = 2 }, DISABLE = { stun = 2 } },
range = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
range = function(self, t) return 10 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,
getMoveDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 30) end,
getDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 150) 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), selffire=false, talent=t}
local x, y = self:getTarget(tg)
......@@ -137,30 +138,37 @@ newTalent{
local target = game.level.map(x, y, Map.ACTOR)
if not target then return nil end
local movedam = self:mindCrit(self:combatTalentMindDamage(t, 10, 110))
local dam = self:mindCrit(self:combatTalentMindDamage(t, 15, 190))
local movedam = self:mindCrit(t.getMoveDamage(self, t))
local dam = self:mindCrit(t.getDamage(self, t))
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=4, name="Tornado", dam=dam, movedam=movedam, rad=rad, dur=dur},
{speed=1, name="Tornado", dam=dam, movedam=movedam, rad=rad, dur=dur},
target,
self:getTalentRange(t),
function(self, src)
local DT = require("engine.DamageType")
DT:get(DT.LIGHTNING).projector(src, self.x, self.y, DT.LIGHTNING, self.def.movedam)
local Map = require("engine.Map")
local kb_func = function(px, py)
local target = game.level.map(px, py, Map.ACTOR)
if not target or target == self then return end
if target:canBe("knockback") then
target:knockback(src.x, src.y, 2)
game.logSeen(target, "%s is knocked back!", target.name:capitalize())
else
game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
end
end
src:project({type="ball", radius=2, selffire=false, x=self.x, y=self.y, friendlyfire=false}, self.x, self.y, DT.LIGHTNING, self.def.movedam)
src:project({type="ball", radius=2, selffire=false, x=self.x, y=self.y, friendlyfire=false}, self.x, self.y, kb_func)
end,
function(self, src, target)
local DT = require("engine.DamageType")
src:project({type="ball", radius=self.def.rad, selffire=false, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
src:project({type="ball", radius=self.def.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, self.def.dur, {apply_power=src:combatMindpower()})
else
game.logSeen(target, "%s resists the tornado!", target.name:capitalize())
end
-- Lightning ball gets a special treatment to make it look neat
local sradius = (1 + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
......@@ -175,24 +183,24 @@ newTalent{
game:playSoundNear(self, "talents/lightning")
end
)
proj.energy.value = 1500 -- Give it a boost so it moves before our next turn
proj.homing.count = 20 -- 20 turns max
game.zone:addEntity(game.level, proj, "projectile", self.x, self.y)
game:playSoundNear(self, "talents/lightning")
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 %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.
return ([[Summons a tornado that moves very slowly toward its target, following it if it changes position for up to 20 turns.
Each time it moves every foe within radius 2 takes %0.2f lightning damage and is knocked back 2 spaces.
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. 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, and the stun chance is based on your Mindpower vs target Physical Save.
Damage will increase with your Mindpower.
Each point in storm drake talents also increases your lightning resistance by 1%%.]]):format(
damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 10, 110)),
damDesc(self, DamageType.LIGHTNING, t.getMoveDamage(self, t)),
rad,
damDesc(self, DamageType.LIGHTNING, self:combatTalentMindDamage(t, 15, 190)),
damDesc(self, DamageType.PHYSICAL, self:combatTalentMindDamage(t, 15, 190)),
duration,
damDesc(self, DamageType.LIGHTNING, t.getDamage(self, t)),
damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)),
self:getTalentRange(t)
)
end,
......@@ -207,9 +215,9 @@ newTalent{
equilibrium = 12,
cooldown = 12,
message = "@Source@ breathes lightning!",
tactical = { ATTACKAREA = {LIGHTNING = 2}, DISABLE = { daze = 1 } },
tactical = { ATTACKAREA = {LIGHTNING = 2}, DISABLE = { stun = 1 } },
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
radius = function(self, t) return math.min(10, math.floor(self:combatTalentScale(t, 5, 9))) end,
direct_hit = true,
requires_target = true,
on_learn = function(self, t) self.resists[DamageType.LIGHTNING] = (self.resists[DamageType.LIGHTNING] or 0) + 1 end,
......@@ -218,23 +226,30 @@ 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, 670)
end,
getDaze = function(self, t)
return 20+self:combatTalentMindDamage(t, 10, 30)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 30, 670) or 0
return self:combatTalentStatDamage(t, "str", 30, 670) + bonus
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, {daze=t.getDaze(self, t), power_check=self:combatMindpower(), dam=rng.avg(dam / 3, dam, 3)})
local damage = self:mindCrit(t.getDamage(self, t))
self:project(tg, x, y, function(tx, ty)
local target = game.level.map(tx, ty, Map.ACTOR)
if not target or target == self then return end
DamageType:get(DamageType.LIGHTNING).projector(self, tx, ty, DamageType.LIGHTNING, damage)
if target:canBe("stun") then
target:setEffect(target.EFF_STUNNED, 3, {apply_power = self:combatMindpower()})
else
game.logSeen(target, "%s resists the stun!", target.name:capitalize())
end
end)
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})
end
if core.shader.active(4) then
local bx, by = self:attachementSpot("back", true)
self:addParticles(Particles.new("shader_wings", 1, {img="lightningwings", x=bx, y=by, life=18, fade=-0.006, deploy_speed=14}))
......@@ -244,14 +259,12 @@ newTalent{
end,
info = function(self, t)
local damage = t.getDamage(self, t)
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.
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 be stunned for 3 turns.
The damage will increase with your Strength, and the critical chance is based on your Mental crit rate, and the Stun apply power 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),
daze
damDesc(self, DamageType.LIGHTNING, damage)
)
end,
}
......@@ -146,21 +146,41 @@ newTalent{
target = function(self, t) return {type="hit", range=self:getTalentRange(t)} 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,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.1, 0.60) end,
action = function(self, t)
local tg = self:getTalentTarget(t)
local x, y, target = self:getTarget(tg)
if not target or not self:canProject(tg, x, y) then return nil end
-- We need to alter behavior slightly to accomodate shields since they aren't used in attackTarget
local shield, shield_combat = self:hasShield()
local weapon = self:hasMHWeapon()
if not shield then
self:attackTarget(target, (self:getTalentLevel(t) >= 2) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 4) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 6) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 8) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t), true)
else
self:attackTargetWith(target, weapon, (self:getTalentLevel(t) >= 2) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, shield_combat, (self:getTalentLevel(t) >= 2) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, weapon, (self:getTalentLevel(t) >= 4) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, shield_combat, (self:getTalentLevel(t) >= 4) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, weapon, (self:getTalentLevel(t) >= 6) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, shield_combat, (self:getTalentLevel(t) >= 6) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTarget(target, (self:getTalentLevel(t) >= 2) and DamageType.ACID_BLIND or DamageType.ACID, self:combatTalentWeaponDamage(t, 0.1, 0.60), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 4) and DamageType.ACID_BLIND or DamageType.ACID, self:combatTalentWeaponDamage(t, 0.1, 0.60), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 6) and DamageType.ACID_BLIND or DamageType.ACID, self:combatTalentWeaponDamage(t, 0.1, 0.60), true)
self:attackTarget(target, (self:getTalentLevel(t) >= 8) and DamageType.ACID_BLIND or DamageType.ACID, self:combatTalentWeaponDamage(t, 0.1, 0.60), true)
self:attackTargetWith(target, weapon, (self:getTalentLevel(t) >= 8) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
self:attackTargetWith(target, shield_combat, (self:getTalentLevel(t) >= 8) and DamageType.ACID_BLIND or DamageType.ACID, t.getDamage(self, t))
end
return true
end,
info = function(self, t)
return ([[You strike the enemy with a rain of fast, acidic blows. You strike four times for pure acid damage. Every blow does %d%% damage.
Every two talent levels, one of your strikes becomes blinding acid instead of normal acid, blinding the target 25%% of the time if it hits.
Each point in acid drake talents also increases your acid resistance by 1%%.]]):format(100 * self:combatTalentWeaponDamage(t, 0.1, 0.6))
Each point in acid drake talents also increases your acid resistance by 1%%.
This talent will attack with your shield as well if you have one equipped.]]):format(100 * self:combatTalentWeaponDamage(t, 0.1, 0.6))
end,
}
......@@ -183,14 +203,24 @@ 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)
getDamage = function(self, t)
local bonus = self:knowTalent(self.T_CHROMATIC_FURY) and self:combatTalentStatDamage(t, "wil", 30, 520) or 0
return self:combatTalentStatDamage(t, "str", 30, 520) + bonus
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, {dam=self:mindCrit(self:combatTalentStatDamage(t, "str", 30, 520)), chance=t.getDisarm(self, t),})
local damage = self:mindCrit(t.getDamage(self, t))
self:project(tg, x, y, function(tx, ty)
local target = game.level.map(tx, ty, Map.ACTOR)
if not target or target == self then return end
DamageType:get(DamageType.ACID).projector(self, tx, ty, DamageType.ACID, damage)
if target:canBe("disarm") then
target:setEffect(target.EFF_DISARMED, 3, {apply_power = self:combatMindpower()})
end
end)
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")
......@@ -201,10 +231,9 @@ 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 %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)
Enemies caught in the acid are disarmed for 3 turns.
The damage will increase with your Strength, the critical chance is based on your Mental crit rate, and the Disarm apply power 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, t.getDamage(self, t)))
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