diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index ea268f59f688a64f309a40677ac9974dc18976fc..4caf86150ecd34ef98fa2f7897da8d60cb52d4fc 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -57,26 +57,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) end end - -- Reduce damage with resistance - if target.resists then - local pen = 0 - if src.resists_pen then pen = (src.resists_pen.all or 0) + (src.resists_pen[type] or 0) end - local res = math.min((target.resists.all or 0) + (target.resists[type] or 0), (target.resists_cap.all or 0) + (target.resists_cap[type] or 0)) - res = res * (100 - pen) / 100 - print("[PROJECTOR] res", res, (100 - res) / 100, " on dam", dam) - if res >= 100 then dam = 0 - elseif res <= -100 then dam = dam * 2 - else dam = dam * ((100 - res) / 100) - end - end - print("[PROJECTOR] after resists dam", dam) - - -- Static reduce damage - if target.isTalentActive and target:isTalentActive(target.T_ANTIMAGIC_SHIELD) then - local t = target:getTalentFromId(target.T_ANTIMAGIC_SHIELD) - dam = t.on_damage(target, t, type, dam) - end - -- Static reduce damage for psionic kinetic shield if target.isTalentActive and target:isTalentActive(target.T_KINETIC_SHIELD) then local t = target:getTalentFromId(target.T_KINETIC_SHIELD) @@ -107,6 +87,26 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr) local t = target:getTalentFromId(target.T_CHARGED_SHIELD) dam = t.css_on_damage(target, t, type, dam) end + + -- Reduce damage with resistance + if target.resists then + local pen = 0 + if src.resists_pen then pen = (src.resists_pen.all or 0) + (src.resists_pen[type] or 0) end + local res = math.min((target.resists.all or 0) + (target.resists[type] or 0), (target.resists_cap.all or 0) + (target.resists_cap[type] or 0)) + res = res * (100 - pen) / 100 + print("[PROJECTOR] res", res, (100 - res) / 100, " on dam", dam) + if res >= 100 then dam = 0 + elseif res <= -100 then dam = dam * 2 + else dam = dam * ((100 - res) / 100) + end + end + print("[PROJECTOR] after resists dam", dam) + + -- Static reduce damage + if target.isTalentActive and target:isTalentActive(target.T_ANTIMAGIC_SHIELD) then + local t = target:getTalentFromId(target.T_ANTIMAGIC_SHIELD) + dam = t.on_damage(target, t, type, dam) + end print("[PROJECTOR] final dam", dam) diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua index 49e44e41d7d4d3dbe5c2c13223f034f20a08dc8d..4e3b7666c2cddca2e71ce334ff27b0c9056f8ce1 100644 --- a/game/modules/tome/data/general/objects/boss-artifacts.lua +++ b/game/modules/tome/data/general/objects/boss-artifacts.lua @@ -842,3 +842,25 @@ newEntity{ base = "BASE_WAND", define_as = "ROD_OF_ANNULMENT", end }, } + +newEntity{ base = "BASE_WARAXE", + power_source = {arcane=true}, + define_as = "SKULLCLEAVER", rarity=false, + unided_name = "crimson waraxe", + name = "Skullcleaver", unique=true, + desc = [[A small but sharp axe, with a handle made of polished bone. The blade has chopped through the skulls of many, and has been stained a deep crimson.]], + require = { stat = { str=18 }, }, + level_range = {5, 12}, + rarity = 220, + cost = 50, + combat = { + dam = 16, + apr = 3, + physcrit = 12, + dammod = {str=1}, + talent_on_hit = { [Talents.T_GREATER_WEAPON_FOCUS] = {level=2, chance=10} }, + }, + wielder = { + inc_damage = { [DamageType.BLIGHT] = 8 }, + }, +} diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index 398a695171f75e93bd26337c3b05157b8fbbde82..92031b80d592fdd569b70579f97c7a55d04c50b8 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -1279,6 +1279,10 @@ newEntity{ base = "BASE_GEM", fear_immune = 0.7, resists={[DamageType.MIND] = 35,}, }, + wielder = { + inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CON] = 5, }, + lite = 2, + }, imbue_powers = { inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_DEX] = 5, [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 5, [Stats.STAT_CUN] = 5, [Stats.STAT_CON] = 5, }, lite = 2, diff --git a/game/modules/tome/data/talents/psionic/absorption.lua b/game/modules/tome/data/talents/psionic/absorption.lua index 80e55e6b1f78e21398fad420e44bde3fa029929e..1359df1bea1f1ad1114b3fade4ac594b912904e2 100644 --- a/game/modules/tome/data/talents/psionic/absorption.lua +++ b/game/modules/tome/data/talents/psionic/absorption.lua @@ -48,7 +48,13 @@ newTalent{ range = 10, no_energy = true, tactical = { DEFEND = 2 }, - + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_THERMAL_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then + if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end + return false + end + return true + end, --called when damage gets absorbed by kinetic shield ks_on_damage = function(self, t, damtype, dam) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) @@ -71,10 +77,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 + --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 { @@ -145,6 +151,13 @@ newTalent{ range = 10, no_energy = true, tactical = { DEFEND = 2 }, + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_CHARGED_SHIELD) then + if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end + return false + end + return true + end, --called when damage gets absorbed by thermal shield ts_on_damage = function(self, t, damtype, dam) @@ -167,10 +180,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 + --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 { @@ -239,7 +252,13 @@ newTalent{ range = 10, no_energy = true, tactical = { DEFEND = 2 }, - + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_KINETIC_SHIELD) and self:isTalentActive(self.T_THERMAL_SHIELD) then + if not silent then game.logSeen(self, "You may only sustain two shields at once. Shield activation cancelled.") end + return false + end + return true + end, --called when damage gets absorbed by charged shield cs_on_damage = function(self, t, damtype, dam) local mast = 30 - (2*self:getTalentLevel(self.T_SHIELD_DISCIPLINE) or 0) - 0.4*getGemLevel(self) @@ -261,10 +280,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 + --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 { diff --git a/game/modules/tome/data/talents/psionic/augmented-mobility.lua b/game/modules/tome/data/talents/psionic/augmented-mobility.lua index cccb694ce5d3a380c3c99500b8e2053c53e7e8c0..8adec10c9148ef3f8bdd6fdc146182f3da75e61a 100644 --- a/game/modules/tome/data/talents/psionic/augmented-mobility.lua +++ b/game/modules/tome/data/talents/psionic/augmented-mobility.lua @@ -21,7 +21,9 @@ newTalent{ name = "Mindhook", type = {"psionic/augmented-mobility", 1}, require = psi_wil_high1, - cooldown = 40, + cooldown = function(self, t) + return math.ceil(20 - self:getTalentLevel(t)*2) + end, psi = 20, points = 5, tactical = { CLOSEIN = 2 }, @@ -55,7 +57,7 @@ newTalent{ info = function(self, t) local range = self:getTalentRange(t) return ([[Briefly extend your telekinetic reach to grab an enemy and haul them towards you. - Works on enemies up to %d squares away.]]): + Works on enemies up to %d squares away. The cooldown decreases and the range increases with additional talent points spent.]]): format(range) end, } diff --git a/game/modules/tome/data/talents/psionic/mental-discipline.lua b/game/modules/tome/data/talents/psionic/mental-discipline.lua index cfbe0ceea362d6564a69fbacda48ed402c0f5704..d9ffc40f149160958ecbe95886d5f7076f3adea1 100644 --- a/game/modules/tome/data/talents/psionic/mental-discipline.lua +++ b/game/modules/tome/data/talents/psionic/mental-discipline.lua @@ -18,36 +18,45 @@ -- darkgod@te4.org + + newTalent{ - name = "Highly Trained Mind", + name = "Aura Discipline", type = {"psionic/mental-discipline", 1}, - mode = "passive", require = psi_wil_req1, points = 5, - on_learn = function(self, t) - self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] + 1 - self:onStatChange(self.STAT_WIL, 1) - self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 1 - self:onStatChange(self.STAT_CUN, 1) - end, - on_unlearn = function(self, t) - self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] - 1 - self:onStatChange(self.STAT_WIL, -1) - self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 1 - self:onStatChange(self.STAT_CUN, -1) - end, + mode = "passive", info = function(self, t) - return ([[A life of the mind has had predictably good effects on your Willpower and Cunning. - Increases Willpower and Cunning by %d.]]):format(self:getTalentLevelRaw(t)) + local cooldown = self:getTalentLevelRaw(t) + local mast = (self:getTalentLevel(t) or 0) + return ([[Your expertise in the art of energy projection grows. + Aura cooldowns are all reduced by %d turns. Aura damage drains energy more slowly (+%0.2f damage required to lose a point of energy).]]):format(cooldown, mast) end, } newTalent{ - name = "Iron Will", + name = "Shield Discipline", type = {"psionic/mental-discipline", 2}, require = psi_wil_req2, points = 5, mode = "passive", + info = function(self, t) + local cooldown = 2*self:getTalentLevelRaw(t) + local mast = 2*self:getTalentLevel(t) + return ([[Your expertise in the art of energy absorption grows. Shield cooldowns are all reduced by %d turns, and the amount of damage absorption required to gain a point of energy is reduced by %0.2f.]]): + format(cooldown, mast) + end, + +} + + + +newTalent{ + name = "Iron Will", + type = {"psionic/mental-discipline", 3}, + require = psi_wil_req3, + points = 5, + mode = "passive", on_learn = function(self, t) self.combat_mentalresist = self.combat_mentalresist + 6 self.stun_immune = (self.stun_immune or 0) + .1 @@ -64,31 +73,25 @@ newTalent{ } newTalent{ - name = "Shield Discipline", - type = {"psionic/mental-discipline", 3}, - require = psi_wil_req3, - points = 5, - mode = "passive", - info = function(self, t) - local cooldown = 2*self:getTalentLevelRaw(t) - local mast = 2*self:getTalentLevel(t) - return ([[Your expertise in the art of energy absorption grows. Shield cooldowns are all reduced by %d turns, and the amount of damage absorption required to gain a point of energy is reduced by %0.2f.]]): - format(cooldown, mast) - end, - -} - -newTalent{ - name = "Aura Discipline", + name = "Highly Trained Mind", type = {"psionic/mental-discipline", 4}, + mode = "passive", require = psi_wil_req4, points = 5, - mode = "passive", + on_learn = function(self, t) + self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] + 2 + self:onStatChange(self.STAT_WIL, 2) + self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] + 2 + self:onStatChange(self.STAT_CUN, 2) + end, + on_unlearn = function(self, t) + self.inc_stats[self.STAT_WIL] = self.inc_stats[self.STAT_WIL] - 2 + self:onStatChange(self.STAT_WIL, -2) + self.inc_stats[self.STAT_CUN] = self.inc_stats[self.STAT_CUN] - 2 + self:onStatChange(self.STAT_CUN, -2) + end, info = function(self, t) - local cooldown = self:getTalentLevelRaw(t) - local mast = (self:getTalentLevel(t) or 0) - return ([[Your expertise in the art of energy projection grows. - Aura cooldowns are all reduced by %d turns. Aura damage drains energy more slowly (+%0.2f damage required to lose a point of energy).]]):format(cooldown, mast) + return ([[A life of the mind has had predictably good effects on your Willpower and Cunning. + Increases Willpower and Cunning by %d.]]):format(2*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 0a079d537c6057f1070d8336b7c01520051b3cc6..804f63f27d05de3cb7ea4d9a4b94d2fdd3494f4c 100644 --- a/game/modules/tome/data/talents/psionic/projection.lua +++ b/game/modules/tome/data/talents/psionic/projection.lua @@ -16,82 +16,17 @@ -- -- Nicolas Casalini "DarkGod" -- darkgod@te4.org - -local function combatTalentDamage(self, t, min, max) - return self:combatTalentSpellDamage(t, min, max, self.level + self:getWil()) -end - --- damage: initial physical damage and used for fractional knockback damage --- knockback: distance to knockback --- knockbackDamage: when knockback strikes something, both parties take damage - percent of damage * remaining knockback --- power: used to determine the initial radius of particles -local function forceHit(self, target, sourceX, sourceY, damage, knockback, knockbackDamage, power) - -- apply initial damage - if not target then return end - if damage > 0 then - self:project(target, target.x, target.y, DamageType.PHYSICAL, damage) - game.level.map:particleEmitter(target.x, target.y, 1, "force_hit", {power=power, dx=target.x - sourceX, dy=target.y - sourceY}) +local function aura_strength(self, t) + local add = 0 + if self:knowTalent(self.T_FOCUSED_CHANNELING) then + add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0)) end + --return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add + return self:combatTalentIntervalDamage(t, "wil", 10, 50) + add +end - -- knockback? - if not target.dead and knockback and knockback > 0 and target:canBe("knockback") and (target.never_move or 0) < 1 then - -- give direct hit a direction? - if sourceX == target.x and sourceY == target.y then - local newDirection = rng.range(1, 8) - sourceX = sourceX + dir_to_coord[newDirection][1] - sourceY = sourceY + dir_to_coord[newDirection][2] - end - - local lineFunction = line.new(sourceX, sourceY, target.x, target.y, true) - local finalX, finalY = target.x, target.y - local knockbackCount = 0 - local blocked = false - while knockback > 0 do - blocked = true - local x, y = lineFunction(true) - - if not game.level.map:isBound(x, y) or game.level.map:checkAllEntities(x, y, "block_move", target) then - -- blocked - local nextTarget = game.level.map(x, y, Map.ACTOR) - if nextTarget then - if knockbackCount > 0 then - game.logPlayer(self, "%s was blasted %d spaces into %s!", target.name:capitalize(), knockbackCount, nextTarget.name) - else - game.logPlayer(self, "%s was blasted into %s!", target.name:capitalize(), nextTarget.name) - end - elseif knockbackCount > 0 then - game.logPlayer(self, "%s was smashed back %d spaces!", target.name:capitalize(), knockbackCount) - else - game.logPlayer(self, "%s was smashed!", target.name:capitalize()) - end - - -- take partial damage - local blockDamage = damage * knockback * knockbackDamage / 100 - self:project(target, target.x, target.y, DamageType.PHYSICAL, blockDamage) - - if nextTarget then - -- start a new force hit with the knockback damage and current knockback - - forceHit(self, nextTarget, sourceX, sourceY, blockDamage, knockback, knockbackDamage, power / 2) - end - - knockback = 0 - else - -- allow move - finalX, finalY = x, y - knockback = knockback - 1 - knockbackCount = knockbackCount + 1 - end - end - - if not blocked and knockbackCount > 0 then - game.logPlayer(self, "%s was blasted back %d spaces!", target.name:capitalize()) - end - - if not target.dead and (finalX ~= target.x or finalY ~= target.y) then - target:move(finalX, finalY, true) - end - end +local function aura_mastery(self, t) + return 10 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) end local function aura_range(self, t) @@ -142,6 +77,13 @@ newTalent{ return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0) end, tactical = { ATTACKAREA = 2 }, + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_THERMAL_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then + if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end + return false + end + return true + end, range = aura_range, radius = aura_radius, target = aura_target, @@ -180,33 +122,28 @@ newTalent{ return t.sustain_psi - 2*getGemLevel(self) end, getAuraStrength = function(self, t) - local add = 0 - if self:knowTalent(self.T_FOCUSED_CHANNELING) then - add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0)) - end - --return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add - return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add + return aura_strength(self, t) end, getKnockback = function(self, t) return 3 + math.floor(self:getTalentLevel(t)) end, do_kineticaura = function(self, t) - local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local dam = t.getAuraStrength(self, t) local tg = t.getNormalTarget(self, t) self:project(tg, self.x, self.y, function(tx, ty) - DamageType:get(DamageType.PHYSICAL).projector(self, tx, ty, DamageType.PHYSICAL, dam) local act = game.level.map(tx, ty, engine.Map.ACTOR) if act then self:incPsi(-dam/mast) end + DamageType:get(DamageType.PHYSICAL).projector(self, tx, ty, DamageType.PHYSICAL, dam) end) 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 + --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) @@ -234,7 +171,7 @@ newTalent{ info = function(self, t) local dam = t.getAuraStrength(self, t) local spikedam = 50 + 0.4 * dam * dam - local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local spikecost = t.getSpikeCost(self, t) 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 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. @@ -256,6 +193,13 @@ newTalent{ return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0) end, tactical = { ATTACKAREA = 2 }, + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_CHARGED_AURA) then + if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end + return false + end + return true + end, range = aura_range, radius = aura_radius, target = aura_target, @@ -290,33 +234,28 @@ newTalent{ end end, getAuraStrength = function(self, t) - local add = 0 - if self:knowTalent(self.T_FOCUSED_CHANNELING) then - add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0)) - end - --return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add - return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add + return aura_strength(self, t) end, getSpikeCost = function(self, t) return t.sustain_psi - 2*getGemLevel(self) end, do_thermalaura = function(self, t) - local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local dam = t.getAuraStrength(self, t) local tg = t.getNormalTarget(self, t) self:project(tg, self.x, self.y, function(tx, ty) - DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam) local act = game.level.map(tx, ty, engine.Map.ACTOR) if act then self:incPsi(-dam/mast) end + DamageType:get(DamageType.FIRE).projector(self, tx, ty, DamageType.FIRE, dam) end) 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 + --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) @@ -345,7 +284,7 @@ newTalent{ 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_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local spikecost = t.getSpikeCost(self, t) 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 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. @@ -367,6 +306,13 @@ newTalent{ return 15 - (self:getTalentLevelRaw(self.T_AURA_DISCIPLINE) or 0) end, tactical = { ATTACKAREA = 2 }, + on_pre_use = function(self, t, silent) + if self:isTalentActive(self.T_KINETIC_AURA) and self:isTalentActive(self.T_THERMAL_AURA) then + if not silent then game.logSeen(self, "You may only sustain two auras at once. Aura activation cancelled.") end + return false + end + return true + end, range = aura_range, radius = aura_radius, target = aura_target, @@ -405,33 +351,28 @@ newTalent{ return t.sustain_psi - 2*getGemLevel(self) end, getAuraStrength = function(self, t) - local add = 0 - if self:knowTalent(self.T_FOCUSED_CHANNELING) then - add = getGemLevel(self)*(1 + 0.1*(self:getTalentLevel(self.T_FOCUSED_CHANNELING) or 0)) - end - --return 5 + (1+ self:getWil(5))*self:getTalentLevel(t) + add - return self:combatTalentIntervalDamage(t, "wil", 6, 50) + add + return aura_strength(self, t) end, getNumSpikeTargets = function(self, t) return 1 + math.floor(0.5*self:getTalentLevel(t)) + getGemLevel(self) end, do_chargedaura = function(self, t) - local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local dam = t.getAuraStrength(self, t) local tg = t.getNormalTarget(self, t) self:project(tg, self.x, self.y, function(tx, ty) - DamageType:get(DamageType.LIGHTNING).projector(self, tx, ty, DamageType.LIGHTNING, dam) local act = game.level.map(tx, ty, engine.Map.ACTOR) if act then self:incPsi(-dam/mast) end + DamageType:get(DamageType.LIGHTNING).projector(self, tx, ty, DamageType.LIGHTNING, dam) 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 + --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, @@ -500,7 +441,7 @@ newTalent{ info = function(self, t) local dam = t.getAuraStrength(self, t) local spikedam = 50 + 0.4 * dam * dam - local mast = 5 + (self:getTalentLevel(self.T_AURA_DISCIPLINE) or 0) + getGemLevel(self) + local mast = aura_mastery(self, t) local spikecost = t.getSpikeCost(self, t) local nb = t.getNumSpikeTargets(self, 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. diff --git a/game/modules/tome/data/zones/reknor-escape/npcs.lua b/game/modules/tome/data/zones/reknor-escape/npcs.lua index 1f8ad98e59f620865f78851171e4a74a563edec5..9c019b129d6f7186b29e6ecba3abb3a1d1406328 100644 --- a/game/modules/tome/data/zones/reknor-escape/npcs.lua +++ b/game/modules/tome/data/zones/reknor-escape/npcs.lua @@ -44,7 +44,7 @@ newEntity{ define_as = "BROTOQ", body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 }, equipment = resolvers.equip{ - {type="weapon", subtype="longsword", autoreq=true}, + {type="weapon", subtype="waraxe", defined="SKULLCLEAVER", random_art_replace={chance=75}, autoreq=true}, {type="weapon", subtype="longsword", autoreq=true}, {type="armor", subtype="light", autoreq=true}, },