From 2d2ddc3ea0801ddff5eab4cc621cc5f6811a3858 Mon Sep 17 00:00:00 2001 From: Alexander Sedov <alex0player@gmail.com> Date: Sat, 13 Dec 2014 07:31:49 +0300 Subject: [PATCH] Cleaned up Absorption (removed tons of duplicate code) and removed spiked code, as they no longer exist. --- game/modules/tome/data/damage_types.lua | 15 - .../tome/data/talents/psionic/absorption.lua | 319 ++++-------------- 2 files changed, 64 insertions(+), 270 deletions(-) diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index c725e81696..3f0c923c5b 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -215,31 +215,16 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) local t = target:getTalentFromId(target.T_KINETIC_SHIELD) dam = t.ks_on_damage(target, t, type, dam) end - -- Static reduce damage for psionic spiked kinetic shield - if target:attr("kinspike_shield") then - local t = target:getTalentFromId(target.T_KINETIC_SHIELD) - dam = t.kss_on_damage(target, t, type, dam) - end -- Static reduce damage for psionic thermal shield if target.isTalentActive and target:isTalentActive(target.T_THERMAL_SHIELD) then local t = target:getTalentFromId(target.T_THERMAL_SHIELD) dam = t.ts_on_damage(target, t, type, dam) end - -- Static reduce damage for psionic spiked thermal shield - if target:attr("thermspike_shield") then - local t = target:getTalentFromId(target.T_THERMAL_SHIELD) - dam = t.tss_on_damage(target, t, type, dam) - end -- Static reduce damage for psionic charged shield if target.isTalentActive and target:isTalentActive(target.T_CHARGED_SHIELD) then local t = target:getTalentFromId(target.T_CHARGED_SHIELD) dam = t.cs_on_damage(target, t, type, dam) end - -- Static reduce damage for psionic spiked charged shield - if target:attr("chargespike_shield") then - local t = target:getTalentFromId(target.T_CHARGED_SHIELD) - dam = t.css_on_damage(target, t, type, dam) - end if dam ~= lastdam then game:delayedLogDamage(src, target, 0, ("%s(%d to psi shield)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam-dam), false) end diff --git a/game/modules/tome/data/talents/psionic/absorption.lua b/game/modules/tome/data/talents/psionic/absorption.lua index 05a7c42549..dc75710438 100644 --- a/game/modules/tome/data/talents/psionic/absorption.lua +++ b/game/modules/tome/data/talents/psionic/absorption.lua @@ -82,6 +82,60 @@ local function shieldOverlay(self, t, p) return tostring(math.ceil(val)), fnt end +local function shieldOnDamage(self, t, elementTest, transcendId, dam) + if not elementTest then return dam end + local shield = self:isTalentActive(t.id) + if shield.game_turn + 10 <= game.turn then + shield.psi_gain = 0 + shield.game_turn = game.turn + end + local mast = shieldMastery(self, t) + local total_dam = dam + local absorbable_dam = getEfficiency(self, t) * total_dam + local strength = getShieldStrength(self, t) + if self:hasEffect(transcendId) then + absorbable = total_dam + strength = strength * 2 + end + local guaranteed_dam = total_dam - absorbable_dam + dam = absorbable_dam + + local psigain = 0 + if dam <= strength then + psigain = 1 + dam/mast + shieldAbsorb(self, t, shield, dam) + dam = 0 + else + psigain = 1 + strength/mast + dam = dam - strength + shieldAbsorb(self, t, shield, strength) + end + psigain = math.min(maxPsiAbsorb(self, t) - shield.psi_gain, psigain) + shield.psi_gain = shield.psi_gain + psigain + self:incPsi(psigain) + + game.log("Kinetic %d %d %d", dam, absorbable_dam, guaranteed_dam) + + return dam + guaranteed_dam +end + +local function adjustShieldGFX(self, t, v, p, r, g, b) + if not p then p = self:isTalentActive(t.id) end + if not p then return end + self:removeParticles(p.particle) + if v then + if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="shield5"}, + {type="runicshield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=7, bubbleColor={r, g, b, 0.6}, auraColor={r, g, b, 1}})) + else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=r, g=g, b=b, a=1})) + end + else + if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.1, img="shield5"}, + {type="shield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=3, color={r, g, b}})) + else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=r, g=g, b=b, a=0.5})) + end + end +end + newTalent{ name = "Kinetic Shield", type = {"psionic/absorption", 1}, @@ -105,59 +159,17 @@ newTalent{ end, --called when damage gets absorbed by kinetic shield ks_on_damage = function(self, t, damtype, dam) - local ks = self:isTalentActive(self.T_KINETIC_SHIELD) - if not ks then return dam end - if ks.game_turn + 10 <= game.turn then - ks.psi_gain = 0 - ks.game_turn = game.turn - end - local kinetic_shield = self.kinetic_shield - local mast = shieldMastery(self, t) - local total_dam = dam - local absorbable_dam = getEfficiency(self,t)* total_dam - if self:hasEffect(self.EFF_TRANSCENDENT_TELEKINESIS) then absorbable_dam = total_dam kinetic_shield = kinetic_shield * 2 end - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - if not kineticElement(self, t, damtype) then return total_dam end - - local psigain = 0 - if dam <= kinetic_shield then - psigain = 1 + dam/mast - shieldAbsorb(self, t, ks, dam) - dam = 0 - else - psigain = 1 + kinetic_shield/mast - dam = dam - kinetic_shield - shieldAbsorb(self, t, ks, kinetic_shield) - end - psigain = math.min(maxPsiAbsorb(self, t) - ks.psi_gain, psigain) - ks.psi_gain = ks.psi_gain + psigain - self:incPsi(psigain) - - return dam + guaranteed_dam + return shieldOnDamage(self, t, kineticElement(self, t, damtype), + self.EFF_TRANSCENDENT_TELEKINESIS, dam) end, adjust_shield_gfx = function(self, t, v, p) - if not p then p = self:isTalentActive(t.id) end - if not p then return end - - self:removeParticles(p.particle) - if v then - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="shield5"}, {type="runicshield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=7, bubbleColor={1, 0, 0.3, 0.6}, auraColor={1, 0, 0.3, 1}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=1, g=0, b=0.3, a=1})) - end - else - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.1, img="shield5"}, {type="shield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=3, color={1, 0, 0.3}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=1, g=0, b=0.3, a=0.5})) - end - end + return adjustShieldGFX(self, t, v, p, 1, 0, 0.3) end, iconOverlay = shieldOverlay, activate = function(self, t) game:playSoundNear(self, "talents/heal") - local s_str = getShieldStrength(self, t) local ret = { - am = self:addTemporaryValue("kinetic_shield", s_str), game_turn = game.turn, psi_gain = 0, last_absorbs = {last_turn=math.floor(game.turn / 10), values={}}, @@ -167,52 +179,11 @@ newTalent{ end, deactivate = function(self, t, p) self:removeParticles(p.particle) - self:removeTemporaryValue("kinetic_shield", p.am) if self:attr("save_cleanup") then return true end if self:getTalentLevel(t) >= 3 then shieldSpike(self, t, p) end return true end, - --called when damage gets absorbed by kinetic shield spike - kss_on_damage = function(self, t, damtype, dam) - local kss = self:hasEffect(self.EFF_KINSPIKE_SHIELD) - if not kss then return dam end - if kss.game_turn + 10 <= game.turn then - kss.psi_gain = 0 - kss.game_turn = game.turn - end - local mast = shieldMastery(self, t) - local total_dam = dam - local absorbable_dam = 1*total_dam - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - --- local psigain = 0 - if kineticElement(self, t, damtype) then - -- Absorb damage into the shield - if dam <= self.kinspike_shield_absorb then - self.kinspike_shield_absorb = self.kinspike_shield_absorb - dam --- psigain = 2 + 2*dam/mast - dam = 0 - else --- psigain = 2 + 2*self.kinspike_shield_absorb/mast - dam = dam - self.kinspike_shield_absorb - self.kinspike_shield_absorb = 0 - end - --- psigain = math.min(2*maxPsiAbsorb(self, t) - kss.psi_gain, psigain) --- kss.psi_gain = kss.psi_gain + psigain --- self:incPsi(psigain) - - if self.kinspike_shield_absorb <= 0 then - game.logPlayer(self, "Your spiked kinetic shield crumbles under the damage!") - self:removeEffect(self.EFF_KINSPIKE_SHIELD) - end - return dam + guaranteed_dam - else - return total_dam - end - end, info = function(self, t) local s_str = getShieldStrength(self, t) local absorb = 100*getEfficiency(self,t) @@ -249,52 +220,11 @@ newTalent{ --called when damage gets absorbed by thermal shield ts_on_damage = function(self, t, damtype, dam) - local ts = self:isTalentActive(self.T_THERMAL_SHIELD) - if not ts then return dam end - if ts.game_turn + 10 <= game.turn then - ts.psi_gain = 0 - ts.game_turn = game.turn - end - local mast = shieldMastery(self, t) - local thermal_shield = self.thermal_shield - local total_dam = dam - local absorbable_dam = getEfficiency(self,t)* total_dam - if self:hasEffect(self.EFF_TRANSCENDENT_PYROKINESIS) then absorbable_dam = total_dam thermal_shield = thermal_shield * 2 end - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - if not thermalElement(self, t, damtype) then return total_dam end - - local psigain = 0 - if dam <= thermal_shield then - psigain = 1 + dam/mast - shieldAbsorb(self, t, ts, dam) - dam = 0 - else - psigain = 1 + thermal_shield/mast - shieldAbsorb(self, t, ts, thermal_shield) - dam = dam - thermal_shield - end - - psigain = math.min(maxPsiAbsorb(self, t) - ts.psi_gain, psigain) - ts.psi_gain = ts.psi_gain + psigain - self:incPsi(psigain) - - return dam + guaranteed_dam + return shieldOnDamage(self, t, thermalElement(self, t, damtype), + self.EFF_TRANSCENDENT_PYROKINESIS, dam) end, adjust_shield_gfx = function(self, t, v, p) - if not p then p = self:isTalentActive(t.id) end - if not p then return end - - self:removeParticles(p.particle) - if v then - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="shield5"}, {type="runicshield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=7, bubbleColor={0.3, 1, 1, 0.6}, auraColor={0.3, 1, 1, 1}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=0.3, g=1, b=1, a=1})) - end - else - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.1, img="shield5"}, {type="shield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=3, color={0.3, 1, 1}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=0.3, g=1, b=1, a=0.5})) - end - end + return adjustShieldGFX(self, t, v, p, 0.3, 1, 1) end, iconOverlay = shieldOverlay, activate = function(self, t) @@ -302,7 +232,6 @@ newTalent{ local s_str = getShieldStrength(self, t) local ret = { - am = self:addTemporaryValue("thermal_shield", s_str), game_turn = game.turn, psi_gain = 0, last_absorbs = {last_turn=math.floor(game.turn / 10), values={}}, @@ -312,50 +241,11 @@ newTalent{ end, deactivate = function(self, t, p) self:removeParticles(p.particle) - self:removeTemporaryValue("thermal_shield", p.am) if self:attr("save_cleanup") then return true end if self:getTalentLevel(t) >= 3 then shieldSpike(self, t, p) end return true end, - --called when damage gets absorbed by thermal shield spike - tss_on_damage = function(self, t, damtype, dam) - local tss = self:hasEffect(self.EFF_THERMSPIKE_SHIELD) - if not tss then return dam end - if tss.game_turn + 10 <= game.turn then - tss.psi_gain = 0 - tss.game_turn = game.turn - end - local mast = shieldMastery(self, t) - local total_dam = dam - local absorbable_dam = 1* total_dam - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - --- local psigain = 0 - if thermalElement(self, t, damtype) then - -- Absorb damage into the shield - if dam <= self.thermspike_shield_absorb then - self.thermspike_shield_absorb = self.thermspike_shield_absorb - dam --- psigain = 2 + 2*dam/mast - dam = 0 - else --- psigain = 2 + 2*self.thermspike_shield_absorb/mast - dam = dam - self.thermspike_shield_absorb - self.thermspike_shield_absorb = 0 - end --- psigain = math.min(2*maxPsiAbsorb(self, t) - tss.psi_gain, psigain) --- tss.psi_gain = tss.psi_gain + psigain --- self:incPsi(psigain) - if self.thermspike_shield_absorb <= 0 then - game.logPlayer(self, "Your spiked thermal shield crumbles under the damage!") - self:removeEffect(self.EFF_THERMSPIKE_SHIELD) - end - return dam + guaranteed_dam - else - return total_dam - end - end, info = function(self, t) local s_str = getShieldStrength(self, t) local absorb = 100*getEfficiency(self,t) @@ -392,50 +282,11 @@ newTalent{ end, --called when damage gets absorbed by charged shield cs_on_damage = function(self, t, damtype, dam) - local cs = self:isTalentActive(self.T_CHARGED_SHIELD) - if not cs then return dam end - if cs.game_turn + 10 <= game.turn then - cs.psi_gain = 0 - cs.game_turn = game.turn - end - local mast = shieldMastery(self, t) - local charged_shield = self.charged_shield - local total_dam = dam - local absorbable_dam = getEfficiency(self,t)* total_dam - if self:hasEffect(self.EFF_TRANSCENDENT_ELECTROKINESIS) then absorbable_dam = total_dam charged_shield = charged_shield * 2 end - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - if not chargedElement(self, t, damtype) then return total_dam end - - local psigain = 0 - if dam <= charged_shield then - psigain = 1 + dam/mast - shieldAbsorb(self, t, cs, dam) - dam = 0 - else - psigain = 1 + charged_shield/mast - dam = dam - charged_shield - shieldAbsorb(self, t, cs, charged_shield) - end - psigain = math.min(maxPsiAbsorb(self, t) - cs.psi_gain, psigain) - cs.psi_gain = cs.psi_gain + psigain - self:incPsi(psigain) - return dam + guaranteed_dam + return shieldOnDamage(self, t, chargedElement(self, t, damtype), + self.EFF_TRANSCENDENT_ELECTROKINESIS, dam) end, adjust_shield_gfx = function(self, t, v, p) - if not p then p = self:isTalentActive(t.id) end - if not p then return end - - self:removeParticles(p.particle) - if v then - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="shield5"}, {type="runicshield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=7, bubbleColor={0.8, 1, 0.2, 0.6}, auraColor={0.8, 1, 0.2, 1}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=0.8, g=1, b=0.2, a=1})) - end - else - if core.shader.active(4) then p.particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.1, img="shield5"}, {type="shield", ellipsoidalFactor=1, time_factor=-10000, llpow=1, aadjust=3, color={0.8, 1, 0.2}})) - else p.particle = self:addParticles(Particles.new("generic_shield", 1, {r=0.8, g=1, b=0.2, a=0.5})) - end - end + return adjustShieldGFX(self, t, v, p, 0.8, 1, 0.2) end, iconOverlay = shieldOverlay, activate = function(self, t) @@ -443,7 +294,6 @@ newTalent{ local s_str = getShieldStrength(self, t) local ret = { - am = self:addTemporaryValue("charged_shield", s_str), game_turn = game.turn, psi_gain = 0, last_absorbs = {last_turn=math.floor(game.turn / 10), values={}}, @@ -453,52 +303,11 @@ newTalent{ end, deactivate = function(self, t, p) self:removeParticles(p.particle) - self:removeTemporaryValue("charged_shield", p.am) if self:attr("save_cleanup") then return true end if self:getTalentLevel(t) >= 3 then shieldSpike(self, t, p) end return true end, - --called when damage gets absorbed by charged shield spike - css_on_damage = function(self, t, damtype, dam) - local css = self:hasEffect(self.EFF_CHARGESPIKE_SHIELD) - if not css then return dam end - if css.game_turn + 10 <= game.turn then - css.psi_gain = 0 - css.game_turn = game.turn - end - local mast = shieldMastery(self, t) - local total_dam = dam - local absorbable_dam = 1* total_dam - local guaranteed_dam = total_dam - absorbable_dam - dam = absorbable_dam - --- local psigain = 0 - if chargedElement(self, t, damtype) then - -- Absorb damage into the shield - if dam <= self.chargespike_shield_absorb then - self.chargespike_shield_absorb = self.chargespike_shield_absorb - dam --- psigain = 2 + 2*dam/mast - dam = 0 - else --- psigain = 2 + 2*self.chargespike_shield_absorb/mast - dam = dam - self.chargespike_shield_absorb - self.chargespike_shield_absorb = 0 - end - --- psigain = math.min(2*maxPsiAbsorb(self, t) - css.psi_gain, psigain) --- css.psi_gain = css.psi_gain + psigain --- self:incPsi(psigain) - - if self.chargespike_shield_absorb <= 0 then - game.logPlayer(self, "Your spiked charged shield crumbles under the damage!") - self:removeEffect(self.EFF_CHARGESPIKE_SHIELD) - end - return dam + guaranteed_dam - else - return total_dam - end - end, info = function(self, t) local s_str = getShieldStrength(self, t) local absorb = 100*getEfficiency(self,t) @@ -557,7 +366,7 @@ newTalent{ end, info = function(self, t) return ([[Surround yourself with a forcefield, reducing all incoming damage by %d%%. - Such a shield is very expensive to maintain, and will drain 5%% of your maximum psi each turn, for each turn you have it maintained. eg. turn 2 it will drain 10%%.]]): + Such a shield is very expensive to maintain, and will drain 5%% of your maximum psi each turn and 5%% more for each turn you have it maintained. For example, on turn 2 it will drain 10%%.]]): format(t.getResist(self,t)) end, } -- GitLab