Skip to content
Snippets Groups Projects
Commit 28f16639 authored by Eric Wykoff's avatar Eric Wykoff
Browse files

manifold balance

fixes
parent f0e2f674
No related branches found
No related tags found
No related merge requests found
Showing
with 98 additions and 91 deletions
......@@ -20,7 +20,7 @@
-- EDGE TODO: Particles, Timed Effect Particles
local function bow_warden(self, target)
if self:knowTalent(self.T_FRAYED_THREADS) then self:callTalent(self.T_FRAYED_THREADS, "doBowWarden", target) end
if self:knowTalent(self.BLENDED_THREADS) then self:callTalent(self.T_BLENDED_THREADS, "doBowWarden", target) end
end
newTalent{
......@@ -74,26 +74,53 @@ newTalent{
}
newTalent{
name = "Weapon Folding", short_name = "WEAPON_FOLDING_BAD",
type = {"chronomancy/blade-threading", 2},
mode = "sustained",
require = chrono_req2,
sustain_paradox = 12,
cooldown = 10,
tactical = { BUFF = 2 },
name = "Blade Sheer",
type = {"chronomancy/blade-threading", 1},
require = chrono_req1,
points = 5,
getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end,
activate = function(self, t)
return {}
end,
deactivate = function(self, t, p)
cooldown = 6,
paradox = function (self, t) return getParadoxCost(self, t, 10) end,
tactical = { ATTACK = {weapon = 2}, DISABLE = 3 },
requires_target = true,
speed = "weapon",
range = 1,
is_melee = true,
target = function(self, t) return {type="hit", range=self:getTalentRange(t), talent=t} end,
getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
getWarp = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end,
action = function(self, t)
local swap = doWardenWeaponSwap(self, "blade")
local tg = self:getTalentTarget(t)
local x, y, target = self:getTarget(tg)
if not target or not self:canProject(tg, x, y) then
if swap then doWardenWeaponSwap(self, "bow") end
return nil
end
-- Hit?
local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true)
-- Project our warp
if hitted then
bow_warden(self, target)
self:project({type="hit"}, target.x, target.y, DamageType.WARP, self:spellCrit(t.getWarp(self, t)))
game.level.map:particleEmitter(target.x, target.y, 1, "generic_discharge", {rm=64, rM=64, gm=134, gM=134, bm=170, bM=170, am=35, aM=90})
end
return true
end,
info = function(self, t)
local damage = t.getDamage(self, t)
return ([[Folds a single dimension of your weapons (or ammo) upon itself, adding %0.2f temporal damage to your strikes and increasing your armour penetration by %d.
The armour penetration and damage will increase with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), damage/2)
end,
local damage = t.getDamage(self, t) * 100
local duration = t.getDuration(self, t)
local warp = t.getWarp(self, t)
return ([[Attack the target with your melee weapons for %d%%.
If the attack hits you'll warp the target, dealing %0.2f temporal and %0.2f physical damage, and may stun, blind, pin, or confuse them for %d turns.
The bonus damage improves with your Spellpower.]])
:format(damage, damDesc(self, DamageType.TEMPORAL, warp/2), damDesc(self, DamageType.PHYSICAL, warp/2), duration)
end
}
newTalent{
......
......@@ -20,7 +20,7 @@
-- EDGE TODO: Particles, Timed Effect Particles
local function blade_warden(self, target)
if self:knowTalent(self.T_FRAYED_THREADS) then self:callTalent(self.T_FRAYED_THREADS, "doBladeWarden", target) end
if self:knowTalent(self.T_BLENDED_THREADS) then self:callTalent(self.T_BLENDED_THREADS, "doBladeWarden", target) end
end
newTalent{
......
......@@ -170,7 +170,7 @@ newTalent{
no_npc_use = true, -- so rares don't learn useless talents
allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects
on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it
getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 10, 25))) end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 10, 25))) end,
on_pre_use = function(self, t, silent)
if checkTimeline(self) then
if not silent then
......
......@@ -813,7 +813,7 @@ newTalent{
requires_target = true,
direct_hit = true,
range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 3, 7)) end,
getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
getConfuseEfficency = function(self, t) return math.min(50, self:getTalentLevelRaw(t) * 10) end,
action = function(self, t)
local tg = {type="hit", range=self:getTalentRange(t)}
......
......@@ -255,7 +255,7 @@ newTalent{
tactical = { ESCAPE = 2 },
range = 0,
radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end,
getTeleport = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 8, 16)) end,
getTeleport = function(self, t) return math.floor(self:combatTalentScale(t, 8, 16)) end,
target = function(self, t)
return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
end,
......@@ -313,7 +313,7 @@ newTalent{
tactical = { DISABLE = 2 },
range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
requires_target = true,
getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end,
getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end,
getChance = function(self, t) return self:combatTalentLimit(t, 10, 20, 30) end,
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end,
target = function(self, t)
......
......@@ -142,7 +142,7 @@ newTalent{
range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
radius = function(self, t) return math.floor(self:combatTalentLimit(t, 1, 5, 2)) end, -- Limit to radius 1
requires_target = true,
getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end,
getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end,
no_npc_use = true,
action = function(self, t)
-- Target the entrance location
......
......@@ -85,7 +85,7 @@ newTalent{
target = function(self, t)
return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t}
end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.ceil(self:combatTalentScale(self:getTalentLevel(t), 2.3, 4.3))) end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.ceil(self:combatTalentScale(t, 2.3, 4.3))) end,
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170, getParadoxSpellpower(self, t)) end,
getDamageType = function(self, t)
local damage_type = DamageType.TEMPORAL
......
......@@ -19,6 +19,15 @@
-- some helpers
local function clear_folds(self)
for eff_id, p in pairs(self.tmp) do
local e = self.tempeffect_def[eff_id]
if e.subtype.weapon_manifold == true then
self:removeEffect(eff_id)
end
end
end
newTalent{
name = "Fold Fate",
type = {"chronomancy/other", 1},
......@@ -27,30 +36,20 @@ newTalent{
tactical = { BUFF = 2, DEBUFF = 2 },
points = 5,
no_energy = true,
on_pre_use = function(self, t, silent)
for eff_id, p in pairs(self.tmp) do
local e = self.tempeffect_def[eff_id]
if true == e.subtype.weapon_manifold then
if not silent then
game.logPlayer(self, "You may only have one Weapon Manifold active at a time.")
end
return false
end
end
return true
end,
action = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local dam = t.getChance(self, t)
local chance = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
local dox = self:callTalent(self.T_WEAPON_MANIFOLD, "getParadoxRegen")
clear_folds(self)
self:setEffect(self.EFF_FOLD_FATE, duration, {dam = dam, src = self, paradox = dox})
self:setEffect(self.EFF_FOLD_FATE, duration, {chance = chance, src = self, paradox = dox})
return true
end,
info = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local dam = t.getChance(self, t)
local dam = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
local dox = self:callTalent(self.T_WEAPON_MANIFOLD, "getParadoxRegen")
return (
[[Fold a thread of fate into your weapons for %d turns, causing confusing dissonance when it strikes your targets as you damage their fates to repair the timeline.
......@@ -68,23 +67,12 @@ newTalent{
tactical = { BUFF = 2, DEBUFF = 2 },
points = 1,
no_energy = true,
on_pre_use = function(self, t, silent)
for eff_id, p in pairs(self.tmp) do
local e = self.tempeffect_def[eff_id]
if true == e.subtype.weapon_manifold then
if not silent then
game.logPlayer(self, "You may only have one Weapon Manifold active at a time.")
end
return false
end
end
return true
end,
action = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local damage = self:callTalent(self.T_WEAPON_FOLDING, "getDamage")
local chance = t.getChance(self, t)
local eff_dur = t.getEffDur(self, t)
local chance = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
clear_folds(self)
self:setEffect(self.EFF_FOLD_GRAVITY, duration, {dam = damage, src = self, chance = chance})
......@@ -93,11 +81,10 @@ newTalent{
info = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local damage = self:callTalent(self.T_WEAPON_FOLDING, "getDamage")
local chance = t.getChance(self, t)
local eff_dur = t.getEffDur(self, t)
local chance = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
return (
[[Fold a thread of gravity into your weapons for %d turns.
Your melee and archery attacks deal +%0.1f Physical damage, and each attack has a %d%% chance to Pin your target for %d turns.
Your melee and archery attacks deal +%0.1f Physical damage, and each attack has a %d%% chance to Pin your target for 4 turns.
The damage will improve with your Paradox, and the Pin will be applied with your Spellpower.]]
):format( duration, damDesc(self, DamageType.PHYSICAL, damage), chance, eff_dur )
end,
......@@ -111,24 +98,13 @@ newTalent{
tactical = { BUFF = 2, DEBUFF = 2 },
points = 1,
no_energy = true,
on_pre_use = function(self, t, silent)
for eff_id, p in pairs(self.tmp) do
local e = self.tempeffect_def[eff_id]
if true == e.subtype.weapon_manifold then
if not silent then
game.logPlayer(self, "You may only have one Weapon Manifold active at a time.")
end
return false
end
end
return true
end,
action = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local damage = self:callTalent(self.T_WEAPON_FOLDING, "getDamage")
local chance = t.getChance(self, t)
local eff_dur = t.getEffDur(self, t)
local chance = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
clear_folds(self)
self:setEffect(self.EFF_FOLD_VOID, duration, {dam = damage, src = self, chance = chance})
return true
......@@ -136,13 +112,12 @@ newTalent{
info = function(self, t)
local duration = self:callTalent(self.T_WEAPON_MANIFOLD, "getDuration")
local damage = self:callTalent(self.T_WEAPON_FOLDING, "getDamage")
local chance = t.getChance(self, t)
local eff_dur = t.getEffDur(self, t)
local chance = self:callTalent(self.T_WEAPON_MANIFOLD, "getChance")
return (
[[Fold a thread of the void into your weapons for %d turns.
Your melee and archery attacks deal +%0.1f Darkness damage, and each attack has a %d%% chance to Blind your target for %d turns.
Your melee and archery attacks deal +%0.1f Darkness damage, and each attack has a %d%% chance to Blind your target for 4 turns.
The damage will improve with your Paradox, and the Blindness will be applied with your Spellpower.]]
):format( duration, damDesc(self, DamageType.DARKNESS, damage), chance, eff_dur )
):format( duration, damDesc(self, DamageType.DARKNESS, damage), chance )
end,
}
......@@ -186,7 +161,6 @@ newTalent{
end,
}
newTalent{
name = "Weapon Manifold",
type = {"chronomancy/temporal-combat", 2},
......@@ -194,16 +168,22 @@ newTalent{
mode = "passive",
points = 5,
on_learn = function(self, t)
self:learnTalent(Talents.T_FOLD_FATE, true)
self:learnTalent(Talents.T_FOLD_GRAVITY, true)
self:learnTalent(Talents.T_FOLD_VOID, true)
local lev = self:getTalentLevelRaw(t)
if lev == 1 then
self:learnTalent(Talents.T_FOLD_FATE, true, nil, {no_unlearn=true})
self:learnTalent(Talents.T_FOLD_GRAVITY, true)
self:learnTalent(Talents.T_FOLD_VOID, true)
end
end,
on_unlearn = function(self, t)
self:unlearnTalent(Talents.T_FOLD_FATE)
self:unlearnTalent(Talents.T_FOLD_GRAVITY)
self:unlearnTalent(Talents.T_FOLD_VOID)
local lev = self:getTalentLevelRaw(t)
if lev == 0 then
self:unlearnTalent(Talents.T_FOLD_FATE)
self:unlearnTalent(Talents.T_FOLD_GRAVITY)
self:unlearnTalent(Talents.T_FOLD_VOID)
end
end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.ceil(self:combatTalentScale(self:getTalentLevel(t), 4, 8))) end,
getDuration = function(self, t) return getExtensionModifier(self, t, math.ceil(self:combatTalentScale(t, 4, 8))) end,
getParadoxRegen = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t))/12 end,
getChance = function(self, t) return self:combatTalentLimit(t, 40, 10, 30) end,
info = function(self, t)
......@@ -212,11 +192,12 @@ newTalent{
local dox = t.getParadoxRegen(self, t)
local chance = t.getChance(self, t)
return ([[For %d turns, enhance your melee and archery attacks with the power of fate, gravity or the void.
Fold Fate: Paradox tunes %0.1f towards baseline, and you have a %d%% chance to Confuse your target for 4 turns.
Fold Gravity: %0.2f Physical damage, and you have a %d%% chance to Pin your target for 4 turns.
Fold Void: %0.2f Darkness damage, and you have a %d%% chance to Blind your target for 4 turns.
Damage is based on Weapon Folding and Paradox tuning scales with your Spellpower.]]
Fold Fate: Paradox tunes %0.1f towards baseline, and you have a %d%% chance to Confuse your target for 4 turns on hit.
Fold Gravity: %0.2f Physical damage, and you have a %d%% chance to Pin your target for 4 turns on hit.
Fold Void: %0.2f Darkness damage, and you have a %d%% chance to Blind your target for 4 turns on hit.
Only one fold may be active at a time, damage is based on Weapon Folding, and Paradox tuning scales with your Spellpower.]]
):format( dur, dox, chance, damDesc(self, DamageType.PHYSICAL, damage), chance, damDesc(self, DamageType.DARKNESS, damage), chance )
end,
}
......
......@@ -26,7 +26,6 @@ newTalent{
mode = "passive",
points = 5,
getPercent = function(self, t) return self:combatTalentLimit(t, 40, 80, 100)/100 end,
getPercent = function(self, t) return paradoxTalentScale(self, t, 40, 80, 100)/100 end,
getRadius = function(self, t) return self:getTalentLevel(t) > 4 and 2 or 1 end,
callbackOnArcheryAttack = function(self, t, target, hitted, crit, weapon, ammo, damtype, mult, dam)
if not hitted then return end
......
......@@ -224,8 +224,8 @@ newTalent{
no_npc_use = true, -- so rares don't learn useless talents
allow_temporal_clones = true, -- let clones copy it anyway so they can benefit from the effects
on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end, -- but don't let them cast it
getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 5, 9)) end,
getPower = function(self, t) return paradoxTalentScale(self, t, 20, 50, 100) end,
getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
getPower = function(self, t) return self:combatTalentScale(t, 20, 50, 100) end,
target = function(self, t)
return {type="hit", range=self:getTalentRange(t), talent=t}
end,
......
......@@ -119,7 +119,7 @@ newTalent{
return {type="hit", range=self:getTalentRange(t), talent=t}
end,
getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 250, getParadoxSpellpower(self, t)) end,
getDuration = function(self, t) return getExtensionModifier(self, t, 2 + math.ceil(self:combatTalentScale(self:getTalentLevel(t), 0.3, 2.3))) end,
getDuration = function(self, t) return getExtensionModifier(self, t, 2 + math.ceil(self:combatTalentScale(t, 0.3, 2.3))) end,
action = function(self, t)
local tg = self:getTalentTarget(t)
local x, y = self:getTarget(tg)
......
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