diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 51923c1f1f84aba3e6d85a0e2b817433014eb7cf..1b69545cd16ed1da6773447db9744c8f6f08b964 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -5049,6 +5049,16 @@ function _M:postUseTalent(ab, ret, silent) if ab.sustain_feedback then trigger = true; self:incMaxFeedback(-util.getval(ab.sustain_feedback, self, ab)) end + if ab.sustain_slots then + if not self.sustain_slots then self.sustain_slots = {} end + local slots = ab.sustain_slots + if 'string' == type(slots) then slots = {slots} end + for _, slot in pairs(slots) do + local t = self.sustain_slots[slot] + if t and self:isTalentActive(t) then self:forceUseTalent(t, {ignore_energy=true}) end + self.sustain_slots[slot] = ab.id + end + end for event, store in pairs(sustainCallbackCheck) do if ab[event] then self[store] = self[store] or {} @@ -5088,6 +5098,15 @@ function _M:postUseTalent(ab, ret, silent) end if ab.sustain_feedback then self:incMaxFeedback(util.getval(ab.sustain_feedback, self, ab)) + end + if ab.sustain_slots then + local slots = ab.sustain_slots + if 'string' == type(slots) then slots = {slots} end + for _, slot in pairs(slots) do + if self.sustain_slots[slot] == ab.id then + self.sustain_slots[slot] = nil + end + end end for event, store in pairs(sustainCallbackCheck) do if ab[event] then @@ -5200,6 +5219,25 @@ function _M:postUseTalent(ab, ret, silent) return true end +-- Return the talent currently taking up a given sustain slot. +function _M:getSustainSlot(slot) + if not self.sustain_slots then return end + return self.sustain_slots[slot] +end + +-- Get the sustain which a talent will replace. +function _M:getReplacedSustains(talent) + if 'string' == type(talent) then talent = self:getTalentFromId(talent) end + local slots = talent.sustain_slots or {} + if 'string' == type(slots) then slots = {slots} end + local ret = {} + for _, slot in pairs(slots) do + local t = self:getSustainSlot(slot) + if t ~= talent.id then table.insert(ret, t) end + end + return ret +end + --- Force a talent to activate without using energy or such function _M:forceUseTalent(t, def) if def.no_talent_fail then self:attr("no_talent_fail", 1) end @@ -5393,6 +5431,14 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery) end end + if t.mode == 'sustained' then + local replaces = self:getReplacedSustains(t) + if #replaces > 0 then + for k, v in pairs(replaces) do replaces[k] = self:getTalentFromId(v).name end + d:add({"color",0x6f,0xff,0x83}, "Will Deactivate: ", {"color",0xFF,0xFF,0xFF}, table.concat(replaces, ', '), true) + end + end + self:triggerHook{"Actor:getTalentFullDescription", str=d, t=t, addlevel=addlevel, config=config, fake_mastery=fake_mastery} d:add({"color",0x6f,0xff,0x83}, "Description: ", {"color",0xFF,0xFF,0xFF}) @@ -5436,12 +5482,12 @@ function _M:getTalentCooldown(t) if eff and not self:attr("talent_reuse") then cd = 1 + cd * eff.power end - + local p = self:isTalentActive(self.T_MATRIX) if p and p.talent == t.id then cd = math.floor(cd * (1 - self:callTalent(self.T_MATRIX, "getPower"))) end - + if t.is_spell then return math.ceil(cd * (1 - (self.spell_cooldown_reduction or 0))) elseif t.is_summon then @@ -5462,9 +5508,9 @@ function _M:startTalentCooldown(t, v) else if not t.cooldown then return end self.talents_cd[t.id] = self:getTalentCooldown(t) - + if t.id ~= self.T_REDUX and self:hasEffect(self.EFF_REDUX) then - local eff = self:hasEffect(self.EFF_REDUX) + local eff = self:hasEffect(self.EFF_REDUX) if t.type[1]:find("^chronomancy/") and self:getTalentCooldown(t) <= eff.max_cd and t.mode == "activated" and not t.fixed_cooldown then self.talents_cd[t.id] = 1 end diff --git a/game/modules/tome/data/talents/celestial/chants.lua b/game/modules/tome/data/talents/celestial/chants.lua index e8d0d4ac7ec4041f92e87551c8b86d4067b026e0..4210aeb0f412946bbec95827417c35d7e6c376dc 100644 --- a/game/modules/tome/data/talents/celestial/chants.lua +++ b/game/modules/tome/data/talents/celestial/chants.lua @@ -17,15 +17,6 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -local function cancelChants(self) - local chants = {self.T_CHANT_OF_FORTITUDE, self.T_CHANT_OF_FORTRESS, self.T_CHANT_OF_RESISTANCE, self.T_CHANT_OF_LIGHT} - for i, t in ipairs(chants) do - if self:isTalentActive(t) then - self:forceUseTalent(t, {ignore_energy=true}) - end - end -end - -- Synergizes with melee classes (escort), Weapon of Wrath, healing mod (avoid overheal > healing efficiency), and low spellpower newTalent{ name = "Chant of Fortitude", @@ -42,11 +33,11 @@ newTalent{ getResists = function(self, t) return self:combatTalentSpellDamage(t, 5, 70) end, getLifePct = function(self, t) return self:combatTalentLimit(t, 1, 0.05, 0.20) end, -- Limit < 100% bonus getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end, + sustain_slots = 'celestial_chant', activate = function(self, t) - cancelChants(self) local power = t.getResists(self, t) game:playSoundNear(self, "talents/spell_generic2") - + local ret = { onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.LIGHT]=t.getDamageOnMeleeHit(self, t)}), phys = self:addTemporaryValue("combat_physresist", power), @@ -95,8 +86,8 @@ newTalent{ getDamageChange = function(self, t) return -self:combatTalentLimit(t, 50, 14, 30) -- Limit < 50% damage reduction end, + sustain_slots = 'celestial_chant', activate = function(self, t) - cancelChants(self) game:playSoundNear(self, "talents/spell_generic2") local ret = { onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.LIGHT]=t.getDamageOnMeleeHit(self, t)}), @@ -137,8 +128,8 @@ newTalent{ range = 10, getResists = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end, getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end, + sustain_slots = 'celestial_chant', activate = function(self, t) - cancelChants(self) local power = t.getResists(self, t) game:playSoundNear(self, "talents/spell_generic2") local ret = { @@ -182,8 +173,8 @@ newTalent{ getLightDamageIncrease = function(self, t) return self:combatTalentSpellDamage(t, 20, 50) end, getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end, getLite = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6, "log")) end, + sustain_slots = 'celestial_chant', activate = function(self, t) - cancelChants(self) game:playSoundNear(self, "talents/spell_generic2") local ret = { onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.LIGHT]=t.getDamageOnMeleeHit(self, t)}), diff --git a/game/modules/tome/data/talents/celestial/hymns.lua b/game/modules/tome/data/talents/celestial/hymns.lua index 5e2c8e3f8876ad30012e4cb811f8153c64c4d376..644fa2afaed546f2893f424cb48e2e9baa879a16 100644 --- a/game/modules/tome/data/talents/celestial/hymns.lua +++ b/game/modules/tome/data/talents/celestial/hymns.lua @@ -17,15 +17,6 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -local function cancelHymns(self) - local hymns = {self.T_HYMN_OF_SHADOWS, self.T_HYMN_OF_DETECTION, self.T_HYMN_OF_PERSEVERANCE, self.T_HYMN_OF_MOONLIGHT} - for i, t in ipairs(hymns) do - if self:isTalentActive(t) then - self:forceUseTalent(t, {ignore_energy=true}) - end - end -end - newTalent{ name = "Hymn of Shadows", type = {"celestial/hymns", 1}, @@ -40,8 +31,8 @@ newTalent{ range = 10, getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end, getDarknessDamageIncrease = function(self, t) return self:combatTalentSpellDamage(t, 5, 25) end, + sustain_slots = 'celestial_hymn', activate = function(self, t) - cancelHymns(self) game:playSoundNear(self, "talents/spell_generic2") local ret = { onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.DARKNESS]= t.getDamageOnMeleeHit(self, t)}), @@ -83,8 +74,8 @@ newTalent{ getSeeInvisible = function(self, t) return self:combatTalentSpellDamage(t, 2, 35) end, getSeeStealth = function(self, t) return self:combatTalentSpellDamage(t, 2, 15) end, getInfraVisionPower = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, + sustain_slots = 'celestial_hymn', activate = function(self, t) - cancelHymns(self) game:playSoundNear(self, "talents/spell_generic2") local ret = { onhit = self:addTemporaryValue("on_melee_hit", {[DamageType.DARKNESS]= t.getDamageOnMeleeHit(self, t)}), @@ -130,8 +121,8 @@ newTalent{ range = 10, getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end, getImmunities = function(self, t) return self:combatTalentLimit(t, 1, 0.22, 0.5) end, -- Limit < 100% + sustain_slots = 'celestial_hymn', activate = function(self, t) - cancelHymns(self) local dam = self:combatTalentSpellDamage(t, 5, 25) game:playSoundNear(self, "talents/spell_generic2") local ret = { @@ -205,8 +196,8 @@ newTalent{ self:incNegative(-drain) end end, + sustain_slots = 'celestial_hymn', activate = function(self, t) - cancelHymns(self) game:playSoundNear(self, "talents/spell_generic") game.logSeen(self, "#DARK_GREY#A shroud of shadow dances around %s!", self.name) return { diff --git a/game/modules/tome/data/talents/cursed/endless-hunt.lua b/game/modules/tome/data/talents/cursed/endless-hunt.lua index b9e62c77b27165a068c5f6e859037eab99b60df0..ce6cd62ea6f1f925537e64265a93ae1aa60edea8 100644 --- a/game/modules/tome/data/talents/cursed/endless-hunt.lua +++ b/game/modules/tome/data/talents/cursed/endless-hunt.lua @@ -221,22 +221,19 @@ newTalent{ if self ~= game.player and (self:isTalentActive(self.T_CLEAVE) or self:isTalentActive(self.T_REPEL)) then return false end return true end, + sustain_slots = 'cursed_combat_style', activate = function(self, t) - -- deactivate other talents and place on cooldown - if self:isTalentActive(self.T_CLEAVE) then - self:useTalent(self.T_CLEAVE) - elseif self:knowTalent(self.T_CLEAVE) then - local tCleave = self:getTalentFromId(self.T_CLEAVE) - self.talents_cd[self.T_CLEAVE] = tCleave.cooldown - end - - if self:isTalentActive(self.T_REPEL) then - self:useTalent(self.T_REPEL) - elseif self:knowTalent(self.T_REPEL) then + -- Place other talents on cooldown. + if self:knowTalent(self.T_REPEL) and not self:isTalentActive(self.T_REPEL) then local tRepel = self:getTalentFromId(self.T_REPEL) self.talents_cd[self.T_REPEL] = tRepel.cooldown end + if self:knowTalent(self.T_CLEAVE) and not self:isTalentActive(self.T_CLEAVE) then + local tCleave = self:getTalentFromId(self.T_CLEAVE) + self.talents_cd[self.T_CLEAVE] = tCleave.cooldown + end + local movementSpeedChange = t.getMovementSpeedChange(self, t) return { moveId = self:addTemporaryValue("movement_speed", movementSpeedChange), @@ -252,8 +249,8 @@ newTalent{ info = function(self, t) local movementSpeedChange = t.getMovementSpeedChange(self, t) local defenseChange = t.getDefenseChange(self, t, true) - return ([[Let hate fuel your movements. While active, you gain %d%% movement speed. The recklessness of your movement brings you bad luck (Luck -3). - Cleave, Repel and Surge cannot be active simultaneously, and activating one will place the others in cooldown. + return ([[Let hate fuel your movements. While active, you gain %d%% movement speed. The recklessness of your movement brings you bad luck (Luck -3). + Cleave, Repel and Surge cannot be active simultaneously, and activating one will place the others in cooldown. The speed of your movements, combined with the balance and utility of two weapons, gives you %d extra Defense while dual-wielding. Movement speed and dual-wielding Defense both increase with with the Willpower stat.]]):format(movementSpeedChange * 100, defenseChange) end, diff --git a/game/modules/tome/data/talents/cursed/slaughter.lua b/game/modules/tome/data/talents/cursed/slaughter.lua index 65968402248b4f331e3b4417ee8950396f154fef..59f5d03ed125d8e3e22001300c7ba5387fd20527 100644 --- a/game/modules/tome/data/talents/cursed/slaughter.lua +++ b/game/modules/tome/data/talents/cursed/slaughter.lua @@ -303,18 +303,15 @@ newTalent{ if self ~= game.player and (self:isTalentActive(self.T_SURGE) or self:isTalentActive(self.T_REPEL)) then return false end return true end, + sustain_slots = 'cursed_combat_style', activate = function(self, t) - -- deactivate other talents and place on cooldown - if self:isTalentActive(self.T_SURGE) then - self:useTalent(self.T_SURGE) - elseif self:knowTalent(self.T_SURGE) then + -- Place other talents on cooldown. + if self:knowTalent(self.T_SURGE) and not self:isTalentActive(self.T_SURGE) then local tSurge = self:getTalentFromId(self.T_SURGE) self.talents_cd[self.T_SURGE] = tSurge.cooldown end - if self:isTalentActive(self.T_REPEL) then - self:useTalent(self.T_REPEL) - elseif self:knowTalent(self.T_REPEL) then + if self:knowTalent(self.T_REPEL) and not self:isTalentActive(self.T_REPEL) then local tRepel = self:getTalentFromId(self.T_REPEL) self.talents_cd[self.T_REPEL] = tRepel.cooldown end @@ -353,10 +350,9 @@ newTalent{ info = function(self, t) local chance = t.getChance(self, t, 0) local chance2h = t.getChance(self, t, 1) - return ([[While active, every swing of your weapon has a %d%% (if one-handed) or %d%% (if two-handed) chance of striking a second nearby target for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage (+25%% for two-handed weapons). The recklessness of your attacks brings you bad luck (luck -3). + return ([[While active, every swing of your weapon has a %d%% (if one-handed) or %d%% (if two-handed) chance of striking a second nearby target for %d%% (at 0 Hate) to %d%% (at 100+ Hate) damage (+25%% for two-handed weapons). The recklessness of your attacks brings you bad luck (luck -3). Cleave, Repel and Surge cannot be active simultaneously, and activating one will place the others in cooldown. The Cleave chance and damage increase with your Strength.]]): format(chance, chance2h, t.getDamageMultiplier(self, t, 0) * 100, t.getDamageMultiplier(self, t, 100) * 100) end, } - diff --git a/game/modules/tome/data/talents/cursed/strife.lua b/game/modules/tome/data/talents/cursed/strife.lua index 3cd2ec125dcca94b0ccf05d429f9d687d4d15603..5acfe5dcaf145e001a1430623b9f470e073268ef 100644 --- a/game/modules/tome/data/talents/cursed/strife.lua +++ b/game/modules/tome/data/talents/cursed/strife.lua @@ -378,22 +378,19 @@ newTalent{ if self ~= game.player and (self:isTalentActive(self.T_CLEAVE) or self:isTalentActive(self.T_SURGE)) then return false end return true end, + sustain_slots = 'cursed_combat_style', activate = function(self, t) - -- deactivate other talents and place on cooldown - if self:isTalentActive(self.T_CLEAVE) then - self:useTalent(self.T_CLEAVE) - elseif self:knowTalent(self.T_CLEAVE) then - local tCleave = self:getTalentFromId(self.T_CLEAVE) - self.talents_cd[self.T_CLEAVE] = tCleave.cooldown - end - - if self:isTalentActive(self.T_SURGE) then - self:useTalent(self.T_SURGE) - elseif self:knowTalent(self.T_SURGE) then + -- Place other talents on cooldown. + if self:knowTalent(self.T_SURGE) and not self:isTalentActive(self.T_SURGE) then local tSurge = self:getTalentFromId(self.T_SURGE) self.talents_cd[self.T_SURGE] = tSurge.cooldown end + if self:knowTalent(self.T_CLEAVE) and not self:isTalentActive(self.T_CLEAVE) then + local tCleave = self:getTalentFromId(self.T_CLEAVE) + self.talents_cd[self.T_CLEAVE] = tCleave.cooldown + end + return { luckId = self:addTemporaryValue("inc_stats", { [Stats.STAT_LCK] = -3 }) } @@ -409,7 +406,7 @@ newTalent{ end, info = function(self, t) local chance = t.getChance(self, t) - return ([[Rather than hide from the onslaught, you face down every threat. While active you have a %d%% chance of repelling a melee attack. The recklessness of your defense brings you bad luck (Luck -3). + return ([[Rather than hide from the onslaught, you face down every threat. While active you have a %d%% chance of repelling a melee attack. The recklessness of your defense brings you bad luck (Luck -3). Cleave, Repel and Surge cannot be active simultaneously, and activating one will place the others in cooldown. Repel chance increases with your Strength, and when equipped with a shield.]]):format(chance) end, diff --git a/game/modules/tome/data/talents/spells/acid-alchemy.lua b/game/modules/tome/data/talents/spells/acid-alchemy.lua index 1ca07f4f5810cd8eff16e0609768d061d2ed9da2..29266225d55d4207cb1bfb5fced2d52eaa83f600 100644 --- a/game/modules/tome/data/talents/spells/acid-alchemy.lua +++ b/game/modules/tome/data/talents/spells/acid-alchemy.lua @@ -28,8 +28,8 @@ newTalent{ cooldown = 30, tactical = { BUFF = 2 }, getIncrease = function(self, t) return self:combatTalentScale(t, 0.05, 0.25) * 100 end, + sustain_slots = 'alchemy_infusion', activate = function(self, t) - cancelAlchemyInfusions(self) game:playSoundNear(self, "talents/arcane") local ret = {} self:talentTemporaryValue(ret, "inc_damage", {[DamageType.ACID] = t.getIncrease(self, t)}) diff --git a/game/modules/tome/data/talents/spells/energy-alchemy.lua b/game/modules/tome/data/talents/spells/energy-alchemy.lua index 233d3f8a350527c9e2192c42575981be50effc16..095aa2c10b04bd1bcca14200d541cfa174d9f1a8 100644 --- a/game/modules/tome/data/talents/spells/energy-alchemy.lua +++ b/game/modules/tome/data/talents/spells/energy-alchemy.lua @@ -28,8 +28,8 @@ newTalent{ cooldown = 30, tactical = { BUFF = 2 }, getIncrease = function(self, t) return self:combatTalentScale(t, 0.05, 0.25) * 100 end, + sustain_slots = 'alchemy_infusion', activate = function(self, t) - cancelAlchemyInfusions(self) game:playSoundNear(self, "talents/arcane") local ret = {} self:talentTemporaryValue(ret, "inc_damage", {[DamageType.LIGHTNING] = t.getIncrease(self, t)}) diff --git a/game/modules/tome/data/talents/spells/fire-alchemy.lua b/game/modules/tome/data/talents/spells/fire-alchemy.lua index 45932baf69689bafa8fbebe7c5830ac8400afecf..068154f2f88433cd114f9f13e571640e12b3d13f 100644 --- a/game/modules/tome/data/talents/spells/fire-alchemy.lua +++ b/game/modules/tome/data/talents/spells/fire-alchemy.lua @@ -28,8 +28,8 @@ newTalent{ cooldown = 30, tactical = { BUFF = 2 }, getIncrease = function(self, t) return self:combatTalentScale(t, 0.05, 0.25) * 100 end, + sustain_slots = 'alchemy_infusion', activate = function(self, t) - cancelAlchemyInfusions(self) game:playSoundNear(self, "talents/arcane") local ret = {} self:talentTemporaryValue(ret, "inc_damage", {[DamageType.FIRE] = t.getIncrease(self, t)}) @@ -95,7 +95,7 @@ newTalent{ self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if target and not target:hasEffect(target.EFF_BURNING) and self:reactionToward(target) < 0 then - target:setEffect(target.EFF_BURNING, heat.dur + math.ceil(t.getDuration(self, t)/3), {src=self, power=heat.power}) + target:setEffect(target.EFF_BURNING, heat.dur + math.ceil(t.getDuration(self, t)/3), {src=self, power=heat.power}) end end) end diff --git a/game/modules/tome/data/talents/spells/frost-alchemy.lua b/game/modules/tome/data/talents/spells/frost-alchemy.lua index 5bdecd6eacf91bc1e435e0c406681170fb85dd24..460ed2efc57a4d6e7924f9f911e0fae53ede8e4b 100644 --- a/game/modules/tome/data/talents/spells/frost-alchemy.lua +++ b/game/modules/tome/data/talents/spells/frost-alchemy.lua @@ -28,8 +28,8 @@ newTalent{ cooldown = 30, tactical = { BUFF = 2 }, getIncrease = function(self, t) return self:combatTalentScale(t, 0.05, 0.25) * 100 end, + sustain_slots = 'alchemy_infusion', activate = function(self, t) - cancelAlchemyInfusions(self) game:playSoundNear(self, "talents/arcane") local ret = {} self:talentTemporaryValue(ret, "inc_damage", {[DamageType.COLD] = t.getIncrease(self, t)}) diff --git a/game/modules/tome/data/talents/spells/spells.lua b/game/modules/tome/data/talents/spells/spells.lua index dfacde99af45d9d111c9b8d0474254259d237ecb..440a267f24b8a69598d6497840831c05889b5a92 100644 --- a/game/modules/tome/data/talents/spells/spells.lua +++ b/game/modules/tome/data/talents/spells/spells.lua @@ -239,16 +239,6 @@ function necroEssenceDead(self, checkonly) end ------------------------------------------- -function cancelAlchemyInfusions(self) - local chants = {self.T_FIRE_INFUSION, self.T_FROST_INFUSION, self.T_ACID_INFUSION, self.T_LIGHTNING_INFUSION} - for i, t in ipairs(chants) do - if self:isTalentActive(t) then - self:forceUseTalent(t, {ignore_energy=true}) - end - end -end - - load("/data/talents/spells/arcane.lua") load("/data/talents/spells/aether.lua") load("/data/talents/spells/fire.lua") diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua index a7385a2972d7ffb8c106ec0e912857763d51d603..cd6c64d87e2a146811f11ee133e2b7c3ac72a05d 100644 --- a/game/modules/tome/data/talents/techniques/archery.lua +++ b/game/modules/tome/data/talents/techniques/archery.lua @@ -177,6 +177,7 @@ newTalent{ apr = self:combatScale(self:getTalentLevel(t) * self:getDex(10, true), 3, 0, 53, 50)} return vals end, + sustain_slots = 'stance', activate = function(self, t) local weapon = self:hasArcheryWeapon() if not weapon then @@ -184,7 +185,6 @@ newTalent{ return nil end - if self:isTalentActive(self.T_RAPID_SHOT) then self:forceUseTalent(self.T_RAPID_SHOT, {ignore_energy=true}) end local vals = t.getCombatVals(self, t) return { speed = self:addTemporaryValue("combat_physspeed", vals.speed), @@ -229,6 +229,7 @@ newTalent{ } return vals end, + sustain_slots = 'stance', activate = function(self, t) local weapon = self:hasArcheryWeapon() if not weapon then @@ -236,7 +237,6 @@ newTalent{ return nil end - if self:isTalentActive(self.T_AIM) then self:forceUseTalent(self.T_AIM, {ignore_energy=true}) end local vals = t.getCombatVals(self, t) return { speed = self:addTemporaryValue("combat_physspeed", vals.speed),