From 88485acbf0b19c2ebb7f4272d7cb675fcf5940ef Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Wed, 9 Feb 2011 22:12:17 +0000 Subject: [PATCH] Kinetic Aura spikes are now beams, and Thermal Aura spikes are now cones All auras can be deactivated without triggering a spike by targeting yourself Boosted Conduit damage multiplier given by additional talent points Increased crit boost from Perfect Control Telekinetic Smash applies Conduit damage if Conduit is sustained. Will and cunning affect damage and accuracy of Telekinetic Smash No more than two shields and two auras can be sustained at once. Highly Trained Mind info text changed Conduit only affects the telekinetically wielded weapon Leeches talents get reduced cooldowns with additional talent points. Mindslayers get less health per level Reshaping talents nerfed Shattering Charge automatically spikes Kinetic Shield Nerfed shield spikes and shield efficiency. Clarified shield talent info texts. Matter is Energy regens energy every turn for X turns Mindhook now cancels and explains why if you use it on a target out of range git-svn-id: http://svn.net-core.org/repos/t-engine4@2697 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/modules/tome/class/interface/Combat.lua | 2 +- .../tome/data/birth/classes/psionic.lua | 2 +- game/modules/tome/data/damage_types.lua | 2 +- .../tome/data/talents/psionic/absorption.lua | 48 +++++++++----- .../talents/psionic/augmented-mobility.lua | 15 ++++- .../psionic/finer-energy-manipulations.lua | 52 +++++++++------ .../talents/psionic/mental-discipline.lua | 2 +- .../tome/data/talents/psionic/projection.lua | 65 +++++++++++++------ .../data/talents/psionic/psi-fighting.lua | 14 ++-- .../tome/data/talents/psionic/voracity.lua | 12 +++- game/modules/tome/data/timed_effects.lua | 22 ++++++- 11 files changed, 161 insertions(+), 75 deletions(-) diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index f36548a1c2..ab9fba73a5 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -348,7 +348,7 @@ function _M:attackTargetWith(target, weapon, damtype, mult) end -- Conduit (Psi) - if hitted and not target.dead and self:knowTalent(self.T_CONDUIT) and self:isTalentActive(self.T_CONDUIT) then + if hitted and not target.dead and self:knowTalent(self.T_CONDUIT) and self:isTalentActive(self.T_CONDUIT) and self.use_psi_combat then local t = self:getTalentFromId(self.T_CONDUIT) t.do_combat(self, t, target) end diff --git a/game/modules/tome/data/birth/classes/psionic.lua b/game/modules/tome/data/birth/classes/psionic.lua index c2fcef7248..64aa5f396b 100644 --- a/game/modules/tome/data/birth/classes/psionic.lua +++ b/game/modules/tome/data/birth/classes/psionic.lua @@ -87,6 +87,6 @@ newBirthDescriptor{ end), }, copy_add = { - life_rating = -1, + life_rating = -4, }, } diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index 9ce4cd25ca..7f48e2da0f 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -1206,7 +1206,7 @@ newDamageType{ local target = game.level.map(x, y, Map.ACTOR) if target then if target:checkHit(src:combatMindpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then - target:knockback(src.x, src.y, 2) + target:knockback(src.x, src.y, 3) game.logSeen(target, "%s is knocked back!", target.name:capitalize()) else game.logSeen(target, "%s resists the knockback!", target.name:capitalize()) diff --git a/game/modules/tome/data/talents/psionic/absorption.lua b/game/modules/tome/data/talents/psionic/absorption.lua index 5b938ae8aa..80e55e6b1f 100644 --- a/game/modules/tome/data/talents/psionic/absorption.lua +++ b/game/modules/tome/data/talents/psionic/absorption.lua @@ -28,7 +28,11 @@ end local function getSpikeStrength(self, t) local ss = getShieldStrength(self, t) - return 75*self:getTalentLevel(t) + 2*ss*math.sqrt(ss) + return 75*self:getTalentLevel(t) + ss*math.sqrt(ss) +end + +local function getEfficiency(self, t) + return 0.01*(50 + math.min(self:getCun(30), 50)) end newTalent{ @@ -49,7 +53,7 @@ newTalent{ ks_on_damage = function(self, t, damtype, dam) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) local total_dam = dam - local absorbable_dam = 0.01*(60 + math.min(self:getCun(30), 40))* total_dam + local absorbable_dam = getEfficiency(self,t)* total_dam local guaranteed_dam = total_dam - absorbable_dam dam = absorbable_dam if damtype ~= DamageType.PHYSICAL and damtype ~= DamageType.ACID then return total_dam end @@ -67,6 +71,10 @@ newTalent{ activate = function(self, t) + if self:isTalentActive(self.T_THERMAL_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then + game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") + return false + end game:playSoundNear(self, "talents/heal") local s_str = getShieldStrength(self, t) return { @@ -114,11 +122,11 @@ newTalent{ local s_str = getShieldStrength(self, t) local spike_str = getSpikeStrength(self, t) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) - local absorb = 60 + math.min(self:getCun(30), 40) - return ([[Surround yourself with a shield that will absorb at most %d physical or acid damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. The effect will increase with your Willpower stat. + local absorb = 100*getEfficiency(self,t) + return ([[Surround yourself with a shield that will absorb %d%% of any physical or acidic attack, up to a maximum of %d damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. Every time your shield absorbs damage, you gain two points of energy plus an additional point for every %d points of damage absorbed. Spiked shields absorb energy more efficiently. - %d%% of any given attack is subject to absorption by this shield. The rest gets through as normal. Improve this by increasing Cunning.]]): - format(s_str, spike_str, mast, absorb) + These values scale with Willpower and Cunning.]]): + format(absorb, s_str, spike_str, mast) end, } @@ -142,7 +150,7 @@ newTalent{ ts_on_damage = function(self, t, damtype, dam) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) local total_dam = dam - local absorbable_dam = 0.01*(60 + math.min(self:getCun(30), 40))* total_dam + local absorbable_dam = getEfficiency(self,t)* total_dam local guaranteed_dam = total_dam - absorbable_dam dam = absorbable_dam if damtype ~= DamageType.FIRE and damtype ~= DamageType.COLD then return total_dam end @@ -159,6 +167,10 @@ newTalent{ activate = function(self, t) + if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then + game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") + return false + end game:playSoundNear(self, "talents/heal") local s_str = getShieldStrength(self, t) return { @@ -206,11 +218,11 @@ newTalent{ local s_str = getShieldStrength(self, t) local spike_str = getSpikeStrength(self, t) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) - local absorb = 60 + math.min(self:getCun(30), 40) - return ([[Surround yourself with a shield that will absorb at most %d thermal damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. The effect will increase with your Willpower stat. + local absorb = 100*getEfficiency(self,t) + return ([[Surround yourself with a shield that will absorb %d%% of any fire or cold attack, up to a maximum of %d damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. Every time your shield absorbs damage, you gain two points of energy plus an additional point for every %d points of damage absorbed. Spiked shields absorb energy more efficiently. - %d%% of any given attack is subject to absorption by this shield. The rest gets through as normal. Improve this by increasing Cunning.]]): - format(s_str, spike_str, mast, absorb) + These values scale with Willpower and Cunning.]]): + format(absorb, s_str, spike_str, mast) end, } @@ -232,7 +244,7 @@ newTalent{ cs_on_damage = function(self, t, damtype, dam) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) local total_dam = dam - local absorbable_dam = 0.01*(60 + math.min(self:getCun(30), 40))* total_dam + local absorbable_dam = getEfficiency(self,t)* total_dam local guaranteed_dam = total_dam - absorbable_dam dam = absorbable_dam if damtype ~= DamageType.LIGHTNING and damtype ~= DamageType.BLIGHT then return total_dam end @@ -249,6 +261,10 @@ newTalent{ activate = function(self, t) + if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_THERMAL_SHIELD) then + game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") + return false + end game:playSoundNear(self, "talents/heal") local s_str = getShieldStrength(self, t) return { @@ -295,11 +311,11 @@ newTalent{ local s_str = getShieldStrength(self, t) local spike_str = getSpikeStrength(self, t) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) - local absorb = 60 + math.min(self:getCun(30), 40) - return ([[Surround yourself with a shield that will absorb at most %d lightning or blight damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. The effect will increase with your Willpower stat. + local absorb = 100*getEfficiency(self,t) + return ([[Surround yourself with a shield that will absorb %d%% of any lightning or blight attack, up to a maximum of %d damage per attack. Deactivating the shield spikes it up to a temporary (five turns) %d point shield. Every time your shield absorbs damage, you gain two points of energy plus an additional point for every %d points of damage absorbed. Spiked shields absorb energy more efficiently. - %d%% of any given attack is subject to absorption by this shield. The rest gets through as normal. Improve this by increasing Cunning.]]): - format(s_str, spike_str, mast, absorb) + These values scale with Willpower and Cunning.]]): + format(absorb, s_str, spike_str, mast) end, } diff --git a/game/modules/tome/data/talents/psionic/augmented-mobility.lua b/game/modules/tome/data/talents/psionic/augmented-mobility.lua index 14a71f124d..cccb694ce5 100644 --- a/game/modules/tome/data/talents/psionic/augmented-mobility.lua +++ b/game/modules/tome/data/talents/psionic/augmented-mobility.lua @@ -36,7 +36,10 @@ newTalent{ local tg = {type="bolt", range=self:getTalentRange(t)} local x, y = self:getTarget(tg) if not x or not y then return nil end - + if not self:canProject(tg, x, y) then + game.logPlayer(self, "The target is out of range") + return + end self:project(tg, x, y, function(px, py) local target = game.level.map(px, py, engine.Map.ACTOR) if not target then return end @@ -138,8 +141,8 @@ newTalent{ direct_hit = true, requires_target = true, on_pre_use = function(self, t, silent) - if not self:hasEffect(self.EFF_KINSPIKE_SHIELD) then - if not silent then game.logSeen(self, "You must have a spiked kinetic shield active. Cancelling charge.") end + if not self:hasEffect(self.EFF_KINSPIKE_SHIELD) and not self:isTalentActive(self.T_KINETIC_SHIELD) then + if not silent then game.logSeen(self, "You must either have a spiked kinetic shield or be able to spike one. Cancelling charge.") end return false end return true @@ -150,6 +153,9 @@ newTalent{ local x, y = self:getTarget(tg) if not x or not y then return nil end if self:hasLOS(x, y) and not game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then + if not self:hasEffect(self.EFF_KINSPIKE_SHIELD) and self:isTalentActive(self.T_KINETIC_SHIELD) then + self:forceUseTalent(self.T_KINETIC_SHIELD, {ignore_energy=true}) + end local dam = self:spellCrit(self:combatTalentMindDamage(t, 20, 600)) self:project(tg, x, y, DamageType.BATTER, self:spellCrit(rng.avg(2*dam/3, dam, 3))) local _ _, x, y = self:canProject(tg, x, y) @@ -166,6 +172,9 @@ newTalent{ local tg = {type="beam", range=self:getTalentRange(t), nolock=true, talent=t, display={particle="bolt_earth", trail="earthtrail"}} local x, y = self:getTarget(tg) if not x or not y then return nil end + if not self:hasEffect(self.EFF_KINSPIKE_SHIELD) and self:isTalentActive(self.T_KINETIC_SHIELD) then + self:forceUseTalent(self.T_KINETIC_SHIELD, {ignore_energy=true}) + end local dam = self:spellCrit(self:combatTalentMindDamage(t, 20, 600)) for i = 1, self:getTalentRange(t) do diff --git a/game/modules/tome/data/talents/psionic/finer-energy-manipulations.lua b/game/modules/tome/data/talents/psionic/finer-energy-manipulations.lua index c232803866..100cf29c19 100644 --- a/game/modules/tome/data/talents/psionic/finer-energy-manipulations.lua +++ b/game/modules/tome/data/talents/psionic/finer-energy-manipulations.lua @@ -34,7 +34,7 @@ newTalent{ local dur = 5 + self:getTalentLevelRaw(t) return ([[Encase your body in a sheath of thought-quick forces, allowing you to control your body's movements directly without the inefficiency of dealing with crude mechanisms like nerves and muscles. Increases attack by %d and critical strike chance by %0.2f%% for %d turns. The effect scales with Cunning.]]): - format(boost, 0.3*boost, dur) + format(boost, 0.5*boost, dur) end, } @@ -46,16 +46,20 @@ newTalent{ psi = 0, points = 5, no_npc_use = true, + boost = function(self, t) + return math.floor(self:combatTalentIntervalDamage(t, "wil", 3, 20)) + + end, action = function(self, t) self:showInventory("Reshape which weapon?", self:getInven("INVEN"), function(o) return o.type == "weapon" and not o.fully_reshaped end, function(o, item) --o.wielder = o.wielder or {} - if (o.old_atk or 0) < math.floor(self:getTalentLevel(t)*(1 + self:getWil(3))) then + if (o.old_atk or 0) < t.boost(self, t) then o.combat.atk = (o.combat.atk or 0) - (o.old_atk or 0) o.combat.dam = (o.combat.dam or 0) - (o.old_dam or 0) - o.combat.atk = (o.combat.atk or 0) + math.floor(self:getTalentLevel(t)*(1 + self:getWil(3))) - o.combat.dam = (o.combat.dam or 0) + math.floor(self:getTalentLevel(t)*(1 + self:getWil(3))) - o.old_atk = math.floor(self:getTalentLevel(t)*(1 + self:getWil(3))) - o.old_dam = math.floor(self:getTalentLevel(t)*(1 + self:getWil(3))) + o.combat.atk = (o.combat.atk or 0) + t.boost(self, t) + o.combat.dam = (o.combat.dam or 0) + t.boost(self, t) + o.old_atk = t.boost(self, t) + o.old_dam = t.boost(self, t) game.logPlayer(self, "You reshape your %s.", o:getName{do_colour=true, no_count=true}) if not o.been_reshaped then o.name = "reshaped" .. " "..o.name.."" @@ -68,9 +72,10 @@ newTalent{ return true end, info = function(self, t) + local weapon_boost = t.boost(self, t) return ([[Manipulate forces on the molecular level to realign, rebalance, and hone your weapon. Permanently increases the attack and damage of any weapon by %d. This value scales with Willpower.]]): - format(math.floor(self:getTalentLevel(t)*(1 + self:getWil(3)))) + format(weapon_boost) end, } @@ -82,9 +87,16 @@ newTalent{ psi = 0, points = 5, no_npc_use = true, + arm_boost = function(self, t) + --return math.floor(0.1*self:combatTalentIntervalDamage(t, "wil", 10, 30)) + return math.floor(0.25*t.fat_red(self, t)) + end, + fat_red = function(self, t) + return math.floor(0.1*self:combatTalentIntervalDamage(t, "wil", 50, 100)) + end, action = function(self, t) self:showInventory("Reshape which piece of armor?", self:getInven("INVEN"), function(o) return o.type == "armor" and not o.fully_reshaped end, function(o, item) - if (o.old_fat or 0) < math.ceil(0.5*self:getTalentLevel(t)*(1 + self:getWil(4))) then + if (o.old_fat or 0) < t.fat_red(self, t) then o.wielder = o.wielder or {} if not o.been_reshaped then o.orig_arm = (o.wielder.combat_armor or 0) @@ -92,10 +104,10 @@ newTalent{ end o.wielder.combat_armor = o.orig_arm o.wielder.fatigue = o.orig_fat - o.wielder.combat_armor = (o.wielder.combat_armor or 0) + math.ceil(0.1*self:getTalentLevel(t)*(1 + self:getWil(4))) - o.wielder.fatigue = (o.wielder.fatigue or 0) - math.ceil(0.5*self:getTalentLevel(t)*(1 + self:getWil(4))) + o.wielder.combat_armor = (o.wielder.combat_armor or 0) + t.arm_boost(self, t) + o.wielder.fatigue = (o.wielder.fatigue or 0) - t.fat_red(self, t) if o.wielder.fatigue < 0 then o.wielder.fatigue = 0 end - o.old_fat = math.ceil(0.5*self:getTalentLevel(t)*(1 + self:getWil(4))) + o.old_fat = t.fat_red(self, t) game.logPlayer(self, "You reshape your %s.", o:getName{do_colour=true, no_count=true}) if not o.been_reshaped then o.name = "reshaped" .. " "..o.name.."" @@ -108,8 +120,8 @@ newTalent{ return true end, info = function(self, t) - local arm = math.ceil(0.1*self:getTalentLevel(t)*(1 + self:getWil(4))) - local fat = math.ceil(0.5*self:getTalentLevel(t)*(1 + self:getWil(4))) + local arm = t.arm_boost(self, t) + local fat = t.fat_red(self, t) return ([[Manipulate forces on the molecular level to realign, rebalance, and hone your weapon. Permanently increases the armor rating of any piece of armor by %d. Also permanently reduces the fatigue rating of any piece of armor by %d. These values scale with Willpower.]]): format(arm, fat) @@ -125,20 +137,20 @@ newTalent{ points = 5, no_npc_use = true, action = function(self, t) - self:showInventory("Use which gem?", self:getInven("INVEN"), function(gem) return gem.type == "gem" and gem.material_level and gem.material_level == 5 end, function(gem, gem_item) + self:showInventory("Use which gem?", self:getInven("INVEN"), function(gem) return gem.type == "gem" and gem.material_level and not gem.unique end, function(gem, gem_item) self:removeObject(self:getInven("INVEN"), gem_item) - --game.logPlayer(self, "You imbue your %s with %s.", o:getName{do_colour=true, no_count=true}, gem:getName{do_colour=true, no_count=true}) - local quant = 30 + self:getTalentLevel(t)*self:getCun(30) - self:incPsi(quant) + local amt = 0.1*self:combatTalentIntervalDamage(t, "cun", 100, 400) + local dur = 3 + 2*(gem.material_level or 0) + self:setEffect(self.EFF_PSI_REGEN, dur, {power=amt}) self.changed = true end) return true end, info = function(self, t) - local quant = 30 + self:getTalentLevel(t)*self:getCun(30) + local amt = 0.1*self:combatTalentIntervalDamage(t, "cun", 100, 400) return ([[Matter is energy, as any good Mindslayer knows. Unfortunately, the various bonds and particles involved are just too numerous and complex to make the conversion feasible in most cases. Fortunately, the organized, crystalline structure of gems makes it possible to transform a small percentage of its matter into usable energy. - Turns a high-quality (material level 5) gem into %d energy. This value scales with Cunning.]]): - format(quant) + Grants %d energy per turn for between five and thirteen turns, depending on the quality of the gem used. The amount of energy granted per turn scales with Cunning.]]): + format(amt) end, } diff --git a/game/modules/tome/data/talents/psionic/mental-discipline.lua b/game/modules/tome/data/talents/psionic/mental-discipline.lua index 6c40c9774f..cfbe0ceea3 100644 --- a/game/modules/tome/data/talents/psionic/mental-discipline.lua +++ b/game/modules/tome/data/talents/psionic/mental-discipline.lua @@ -38,7 +38,7 @@ newTalent{ end, info = function(self, t) return ([[A life of the mind has had predictably good effects on your Willpower and Cunning. - Increases Willpower and Cunning (as well as their maximum values) by %d.]]):format(self:getTalentLevelRaw(t)) + Increases Willpower and Cunning by %d.]]):format(self:getTalentLevelRaw(t)) end, } diff --git a/game/modules/tome/data/talents/psionic/projection.lua b/game/modules/tome/data/talents/psionic/projection.lua index 0ac6d07b80..d79b7bad5e 100644 --- a/game/modules/tome/data/talents/psionic/projection.lua +++ b/game/modules/tome/data/talents/psionic/projection.lua @@ -106,7 +106,13 @@ newTalent{ return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0) end, tactical = { ATTACKAREA = 2 }, - range = 1, + range = function(self, t) + local r = 6 + local gem_level = getGemLevel(self) + local mult = (1 + 0.02*gem_level*(self:getTalentLevel(self.T_REACH))) + r = math.floor(r*mult) + return math.min(r, 10) + end, direct_hit = true, getAuraStrength = function(self, t) local add = 0 @@ -145,24 +151,29 @@ newTalent{ end, activate = function(self, t) + if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then + game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") + return false + end return true end, deactivate = function(self, t, p) - local dam = 50 + 0.25 * t.getAuraStrength(self, t)*t.getAuraStrength(self, t) + local dam = 50 + 0.4 * t.getAuraStrength(self, t)*t.getAuraStrength(self, t) local cost = t.sustain_psi - 2*getGemLevel(self) if self:getPsi() <= cost then game.logPlayer(self, "The aura dissipates without producing a spike.") return true end - local tg = {type="hit", nolock=true, range=self:getTalentRange(t)} - local x, y, target = self:getTarget(tg) + + local tg = {type="beam", nolock=true, range=self:getTalentRange(t), talent=t} + local x, y = self:getTarget(tg) if not x or not y then return nil end local actor = game.level.map(x, y, Map.ACTOR) - if not actor then return true end - if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end - local knockback = t.getKnockback(self, t) - forceHit(self, target, self.x, self.y, dam, knockback, 15, 1) - --self:project(tg, x, y, DamageType.BATTER, dam) + --if math.floor(core.fov.distance(self.x, self.y, x, y)) == 1 and not actor then return true end + if math.floor(core.fov.distance(self.x, self.y, x, y)) == 0 then return true end + self:project(tg, x, y, DamageType.BATTER, self:spellCrit(rng.avg(0.8*dam, dam))) + local _ _, x, y = self:canProject(tg, x, y) + game.level.map:particleEmitter(self.x, self.y, tg.radius, "matter_beam", {tx=x-self.x, ty=y-self.y}) self:incPsi(-cost) return true @@ -170,12 +181,13 @@ newTalent{ info = function(self, t) local dam = t.getAuraStrength(self, t) - local spikedam = 50 + 0.25 * dam * dam + local spikedam = 50 + 0.4 * dam * dam local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) local spikecost = t.sustain_psi - 2*getGemLevel(self) return ([[Fills the air around you with reactive currents of force that do %d physical damage to all who approach. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt. - When deactivated, if you have at least %d energy, a massive spike of kinetic energy is released, smashing a target for %d physical damage and sending it flying. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency. - The damage will increase with the Willpower stat.]]):format(dam, mast, spikecost, spikedam) + When deactivated, if you have at least %d energy, a massive spike of kinetic energy is released as a beam, smashing targets for %d physical damage and sending them flying. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency. + The damage will increase with the Willpower stat. + To turn off an aura without spiking it, deactivate it and target yourself.]]):format(dam, mast, spikecost, spikedam) end, } @@ -234,6 +246,10 @@ newTalent{ end, activate = function(self, t) + if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then + game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") + return false + end return true end, deactivate = function(self, t, p) @@ -245,15 +261,14 @@ newTalent{ return true end - local tg = {type="beam", nolock=true, range=self:getTalentRange(t), talent=t, display={particle="bolt_fire", trail="firetrail"}} + local tg = {type="cone", range=1, radius=self:getTalentRange(t), friendlyfire=false, talent=t} local x, y = self:getTarget(tg) if not x or not y then return nil end local actor = game.level.map(x, y, Map.ACTOR) - if math.floor(core.fov.distance(self.x, self.y, x, y)) == 1 and not actor then return true end + --if math.floor(core.fov.distance(self.x, self.y, x, y)) == 1 and not actor then return true end + if math.floor(core.fov.distance(self.x, self.y, x, y)) == 0 then return true end self:project(tg, x, y, DamageType.FIREBURN, self:spellCrit(rng.avg(0.8*dam, dam))) - local _ _, x, y = self:canProject(tg, x, y) - game.level.map:particleEmitter(self.x, self.y, tg.radius, "flamebeam", {tx=x-self.x, ty=y-self.y}) - + game.level.map:particleEmitter(self.x, self.y, tg.radius, "breath_fire", {radius=tg.radius, tx=x-self.x, ty=y-self.y}) game:playSoundNear(self, "talents/fire") self:incPsi(-cost) return true @@ -261,12 +276,14 @@ newTalent{ info = function(self, t) local dam = t.getAuraStrength(self, t) + local rad = self:getTalentRange(t) local spikedam = 50 + 0.4 * dam * dam - local mast = 5 + (self:getTalentLevel(self.T_PROJECTION_MASTERY) or 0) + getGemLevel(self) + local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) local spikecost = t.sustain_psi - 2*getGemLevel(self) return ([[Fills the air around you with reactive currents of furnace-like heat that do %d fire damage to all who approach. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt. - When deactivated, if you have at least %d energy, a massive spike of thermal energy is released as a tunnel of superheated air. Anybody caught in it will suffer %d fire damage. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency. - The damage will increase with the Willpower stat.]]):format(dam, mast, spikecost, spikedam) + When deactivated, if you have at least %d energy, a massive spike of thermal energy is released as a conical blast (radius %d) of superheated air. Anybody caught in it will suffer %d fire damage. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency. + The damage will increase with the Willpower stat. + To turn off an aura without spiking it, deactivate it and target yourself.]]):format(dam, mast, spikecost, rad, spikedam) end, } @@ -323,6 +340,10 @@ newTalent{ end end, activate = function(self, t) + if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_KINETIC_AURA) then + game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") + return false + end game:playSoundNear(self, "talents/thunderstorm") return true end, @@ -338,6 +359,7 @@ newTalent{ local tg = {type="bolt", nolock=true, range=self:getTalentRange(t), talent=t} local fx, fy = self:getTarget(tg) if not fx or not fy then return nil end + if math.floor(core.fov.distance(self.x, self.y, fx, fy)) == 0 then return true end local nb = 1 + math.floor(0.5*self:getTalentLevel(t)) + getGemLevel(self) local affected = {} @@ -395,7 +417,8 @@ newTalent{ local nb = 3 + self:getTalentLevelRaw(t) return ([[Fills the air around you with crackling energy, doing %d lightning damage to all who stand nearby. All damage done by the aura will drain one point of energy per %0.2f points of damage dealt. When deactivated, if you have at least %d energy, a massive spike of electrical energy jumps between up to %d nearby targets, doing %d lightning damage to each. Telekinetically wielding a gem instead of a weapon will result in improved spike efficiency. - The damage will increase with the Willpower stat.]]):format(dam, mast, spikecost, nb, spikedam) + The damage will increase with the Willpower stat. + To turn off an aura without spiking it, deactivate it and target yourself.]]):format(dam, mast, spikecost, nb, spikedam) end, } diff --git a/game/modules/tome/data/talents/psionic/psi-fighting.lua b/game/modules/tome/data/talents/psionic/psi-fighting.lua index 8479b6348a..bebede1439 100644 --- a/game/modules/tome/data/talents/psionic/psi-fighting.lua +++ b/game/modules/tome/data/talents/psionic/psi-fighting.lua @@ -47,12 +47,14 @@ newTalent{ local x, y, target = self:getTarget(tg) if not x or not y or not target then return nil end if math.floor(core.fov.distance(self.x, self.y, x, y)) > 1 then return nil end - self:attackTargetWith(target, tkweapon.combat, nil, self:combatTalentWeaponDamage(t, 1.5, 2.5)) + self.use_psi_combat = true + self:attackTargetWith(target, tkweapon.combat, nil, self:combatTalentWeaponDamage(t, 1.8, 3)) + self.use_psi_combat = false return true end, info = function(self, t) - return ([[Gather your will and brutally smash the target with your mainhand weapon, doing %d%% weapon damage.]]): - format(100 * self:combatTalentWeaponDamage(t, 1.5, 2.5)) + return ([[Gather your will and brutally smash the target with your mainhand weapon, doing %d%% weapon damage. If Conduit is active, it will extend to include your mainhand weapon for this attack. This attack uses your Willpower and Cunning instead of Strength and Dexterity to determine accuracy and damage.]]): + format(100 * self:combatTalentWeaponDamage(t, 1.8, 3)) end, } @@ -113,7 +115,7 @@ newTalent{ return ret end, do_combat = function(self, t, target) - local mult = 1 + 0.1*(self:getTalentLevel(t)) + local mult = 1 + 0.2*(self:getTalentLevel(t)) local auras = self:isTalentActive(t.id) if auras.k_aura_on then local k_aura = self:getTalentFromId(self.T_KINETIC_AURA) @@ -136,8 +138,8 @@ newTalent{ return true end, info = function(self, t) - local mult = 1 + 0.1*(self:getTalentLevel(t)) - return ([[When activated, turns off any active auras and uses your weapons as conduits for the energies that were being channeled through those auras. + local mult = 1 + 0.2*(self:getTalentLevel(t)) + return ([[When activated, turns off any active auras and uses your telekinetically wielded weapon as a conduit for the energies that were being channeled through those auras. Any auras used by Conduit will not start to cool down until Conduit has been deactivated. The damage from each aura applied by Conduit is multiplied by %0.2f, and does not drain energy.]]): format(mult) end, diff --git a/game/modules/tome/data/talents/psionic/voracity.lua b/game/modules/tome/data/talents/psionic/voracity.lua index 8d8ae7b942..3243071341 100644 --- a/game/modules/tome/data/talents/psionic/voracity.lua +++ b/game/modules/tome/data/talents/psionic/voracity.lua @@ -23,7 +23,9 @@ newTalent{ require = psi_wil_req1, points = 5, psi = 0, - cooldown = 40, + cooldown = function(self, t) + return math.ceil(40 - self:getTalentLevel(t)*4) + end, tactical = { DEFEND = 1, DISABLE = 2 }, direct_hit = true, range = function(self, t) @@ -64,7 +66,9 @@ newTalent{ type = {"psionic/voracity", 2}, require = psi_wil_req2, points = 5, - cooldown = 50, + cooldown = function(self, t) + return math.ceil(50 - self:getTalentLevel(t)*4) + end, psi = 0, tactical = { DEFEND = 2, DISABLE = 2 }, range = function(self, t) @@ -108,7 +112,9 @@ newTalent{ require = psi_wil_req3, points = 5, psi = 0, - cooldown = 60, + cooldown = function(self, t) + return math.ceil(50 - self:getTalentLevel(t)*5) + end, tactical = { DEFEND = 2, DAMAGE = 2, DISABLE = 1 }, direct_hit = true, range = function(self, t) diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua index 49289b921b..a4fef3f3fe 100644 --- a/game/modules/tome/data/timed_effects.lua +++ b/game/modules/tome/data/timed_effects.lua @@ -2993,13 +2993,13 @@ newEffect{ newEffect{ name = "CONTROL", desc = "Perfect control", - long_desc = function(self, eff) return ("The target's combat attack and crit chance are improved by %d and %d%%, respectively."):format(eff.power, 0.3*eff.power) end, + long_desc = function(self, eff) return ("The target's combat attack and crit chance are improved by %d and %d%%, respectively."):format(eff.power, 0.5*eff.power) end, type = "physical", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) eff.attack = self:addTemporaryValue("combat_atk", eff.power) - eff.crit = self:addTemporaryValue("combat_physcrit", 0.3*eff.power) + eff.crit = self:addTemporaryValue("combat_physcrit", 0.5*eff.power) end, deactivate = function(self, eff) self:removeTemporaryValue("combat_atk", eff.attack) @@ -3007,6 +3007,24 @@ newEffect{ end, } +newEffect{ + name = "PSI_REGEN", + desc = "Matter is energy", + long_desc = function(self, eff) return ("The gem's matter gradually transforms, granting %0.2f energy per turn."):format(eff.power) end, + type = "physical", + status = "beneficial", + parameters = { power=10 }, + on_gain = function(self, err) return "Energy starts pouring from the gem into #Target#.", "+Energy" end, + on_lose = function(self, err) return "The flow of energy from #Target#'s gem ceases.", "-Energy" end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("psi_regen", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("psi_regen", eff.tmpid) + end, +} + + newEffect{ name = "TURN_BACK_THE_CLOCK", desc = "Turn Back the Clock", -- GitLab