From c34b8f48abd00f4d45c0724491a4e9e061ce72be Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Thu, 22 Sep 2011 08:14:54 +0000 Subject: [PATCH] Psi, paradox, and unarmed combat should show up in the vault now Reduced scaling on Fade from Time and Haste All timed effects now have a subtype Moved many timed effects into more logical types (many rage effects are now mental for instance, burning is physical, etc.), players should double check timed effects to learn the new system Body Reversion now only removes physical effects Timeless and Providence no longer remove saturation effects (since these were moved to other) Fixed Darkest Light no damage bug Starting characters will now have a wild infusion that clears all physical effects rather then just poison (poison is now a physical effect with a poison subtype) git-svn-id: http://svn.net-core.org/repos/t-engine4@4446 51575b47-30f0-44d4-a5cc-537603b46e54 --- .../tome/class/interface/PlayerDumpJSON.lua | 14 + .../tome/data/talents/celestial/eclipse.lua | 1 + .../tome/data/talents/chronomancy/paradox.lua | 4 +- .../talents/chronomancy/speed-control.lua | 2 +- game/modules/tome/data/timed_effects.lua | 9 + .../tome/data/timed_effects/magical.lua | 166 +++---- .../tome/data/timed_effects/mental.lua | 305 ++++++++++++- .../modules/tome/data/timed_effects/other.lua | 22 +- .../tome/data/timed_effects/physical.lua | 422 +++++++----------- game/modules/tome/dialogs/CharacterSheet.lua | 19 +- 10 files changed, 581 insertions(+), 383 deletions(-) diff --git a/game/modules/tome/class/interface/PlayerDumpJSON.lua b/game/modules/tome/class/interface/PlayerDumpJSON.lua index e36e41620e..e04f05e5dc 100644 --- a/game/modules/tome/class/interface/PlayerDumpJSON.lua +++ b/game/modules/tome/class/interface/PlayerDumpJSON.lua @@ -79,7 +79,9 @@ function _M:dumpToJSON(js) if self:knowTalent(self.T_POSITIVE_POOL) then r[#r+1] = {positive=string.format("%d/%d", self.positive, self.max_positive)} end if self:knowTalent(self.T_NEGATIVE_POOL) then r[#r+1] = {negative=string.format("%d/%d", self.negative, self.max_negative)} end if self:knowTalent(self.T_VIM_POOL) then r[#r+1] = {vim=string.format("%d/%d", self.vim, self.max_vim)} end + if self:knowTalent(self.T_PSI_POOL) then r[#r+1] = {psi=string.format("%d/%d", self.psi, self.max_psi)} end if self:knowTalent(self.T_EQUILIBRIUM_POOL) then r[#r+1] = {equilibrium=string.format("%d", self.equilibrium)} end + if self:knowTalent(self.T_PARADOX_POOL) then r[#r+1] = {paradox=string.format("%d", self.paradox)} end if self:knowTalent(self.T_HATE_POOL) then r[#r+1] = {hate=string.format("%0.2f/%0.2f", self.hate, self.max_hate)} end ------------------------------------------------------------------- @@ -123,6 +125,18 @@ function _M:dumpToJSON(js) if mean and mean.range then c[#c+1] = { ["range (main hand)"] = mean.range } end end end + --Unarmed? + if self:isUnarmed() then + local mean, dam = self.combat, self.combat + if mean and dam then + c[#c+1] = { ["accuracy (unarmed)"] = string.format("%d", self:combatAttack(mean)) } + c[#c+1] = { ["damage (unarmed)"] = string.format("%d", self:combatDamage(dam)) } + c[#c+1] = { ["APR (unarmed)"] = string.format("%d", self:combatAPR(dam)) } + c[#c+1] = { ["crit (unarmed)"] = string.format("%d%%", self:combatCrit(dam)) } + c[#c+1] = { ["speed (unarmed)"] = string.format("%0.2f", self:combatSpeed(mean)) } + end + if mean and mean.range then c[#c+1] = { ["range (unarmed)"] = mean.range } end + end if self:getInven(self.INVEN_OFFHAND) then local offmult = self:getOffHandMult() for i, o in ipairs(self:getInven(self.INVEN_OFFHAND)) do diff --git a/game/modules/tome/data/talents/celestial/eclipse.lua b/game/modules/tome/data/talents/celestial/eclipse.lua index 597488f108..d83fb3013e 100644 --- a/game/modules/tome/data/talents/celestial/eclipse.lua +++ b/game/modules/tome/data/talents/celestial/eclipse.lua @@ -159,6 +159,7 @@ newTalent{ end, deactivate = function(self, t, p) self:removeTemporaryValue("invisible", p.invisible) + self:removeTemporaryValue("invisible_damage_penalty", p.invisible_damage_penalty) self:removeTemporaryValue("positive_regen", p.fill) self:removeTemporaryValue("negative_regen", p.drain) local tg = {type="ball", range=0, selffire=true, radius= t.getRadius(self, t), talent=t} diff --git a/game/modules/tome/data/talents/chronomancy/paradox.lua b/game/modules/tome/data/talents/chronomancy/paradox.lua index ca87cfb95b..f9285f9ae2 100644 --- a/game/modules/tome/data/talents/chronomancy/paradox.lua +++ b/game/modules/tome/data/talents/chronomancy/paradox.lua @@ -122,7 +122,7 @@ newTalent{ paradox = 10, cooldown = 24, tactical = { DEFEND = 2 }, - getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 70) * getParadoxModifier(self, pm) end, + getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) * getParadoxModifier(self, pm) end, action = function(self, t) self:setEffect(self.EFF_FADE_FROM_TIME, 10, {power=t.getResist(self, t)}) game:playSoundNear(self, "talents/heal") @@ -130,7 +130,7 @@ newTalent{ end, info = function(self, t) local resist = t.getResist(self, t) - return ([[You partially remove yourself from the timeline for 10 turns, increasing your resistance to all damage by %d%%, reducing the duration of all detrimental effects by %d%%, and reducing all damage you deal by 10%%. + return ([[You partially remove yourself from the timeline for 10 turns, increasing your resistance to all damage by %d%%, reducing the duration of all detrimental effects by %d%%, and reducing all damage you deal by 20%%. The resistance bonus, detrimental effect reduction, and damage penalty will gradually lose power over the course of the spell. The effect will scale with your Paradox and Spellpower.]]): format(resist, resist, resist/10) diff --git a/game/modules/tome/data/talents/chronomancy/speed-control.lua b/game/modules/tome/data/talents/chronomancy/speed-control.lua index ddb19f7d43..316983f752 100644 --- a/game/modules/tome/data/talents/chronomancy/speed-control.lua +++ b/game/modules/tome/data/talents/chronomancy/speed-control.lua @@ -146,7 +146,7 @@ newTalent{ cooldown = 50, tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 }, no_energy = true, - getPower = function(self, t) return ((10 + (self:combatTalentSpellDamage(t, 10, 50) * getParadoxModifier(self, pm))) / 100) end, + getPower = function(self, t) return (self:combatTalentSpellDamage(t, 10, 50) * getParadoxModifier(self, pm)) / 100 end, action = function(self, t) self:setEffect(self.EFF_HASTE, 8, {power=t.getPower(self, t)}) return true diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua index c6b35fec52..23eed6c274 100644 --- a/game/modules/tome/data/timed_effects.lua +++ b/game/modules/tome/data/timed_effects.lua @@ -17,6 +17,15 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +-- All timed effects are divided into physical, mental, magical, or other types. Timed effect types are organized based on what saving throw or dispel would be most appropriate +-- along with consideration based on how it can be applied. There's a lot of overlap between natural and magical timed effects so when in doubt an effect will not be magical. +-- Frozen is a good example of this because of Frost Breath. Effects falling into the other category have no save and generally can not be removed unless they're specifically called. + +-- All subtype organization is based off the root cause if one is available or effect if not. For example burning is a fire effect, caused by fire. +-- Stun is a more general effect and can have many causes, thus it's subtype is based off its effect, so in this case the subtype is simply 'stun'. +-- Burning Shock could easily fall into either of these subtypes. First we ask if it has a cause, it does, fire. Therefore it is subtype 'fire' rather then subtype 'stun'. + + local Stats = require "engine.interface.ActorStats" local Particles = require "engine.Particles" local Entity = require "engine.Entity" diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua index ade6d2d92a..806fb61a7b 100644 --- a/game/modules/tome/data/timed_effects/magical.lua +++ b/game/modules/tome/data/timed_effects/magical.lua @@ -29,6 +29,7 @@ newEffect{ desc = "Surging mana", long_desc = function(self, eff) return ("The mana surge engulfs the target, regenerating %0.2f mana per turn."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# starts to surge mana.", "+Manasurge" end, @@ -53,86 +54,12 @@ newEffect{ end, } -newEffect{ - name = "FROZEN", - desc = "Frozen", - long_desc = function(self, eff) return ("The target is encased in ice. All damage done to you will be split, 40%% absorbed by the ice and 60%% by yourself. Your defense is nullified while in the ice and you may only attack the ice but you are also immune to any new detrimental status effects. The target can not teleport or heal while frozen. %d HP on the iceblock remaining."):format(eff.hp) end, - type = "magical", - status = "detrimental", - parameters = {}, - on_gain = function(self, err) return "#Target# is encased in ice!", "+Frozen" end, - on_lose = function(self, err) return "#Target# is free from the ice.", "-Frozen" end, - activate = function(self, eff) - -- Change color - eff.old_r = self.color_r - eff.old_g = self.color_g - eff.old_b = self.color_b - self.color_r = 0 - self.color_g = 255 - self.color_b = 155 - if not self.add_displays then - self.add_displays = { Entity.new{image='npc/iceblock.png', display=' ', display_on_seen=true } } - eff.added_display = true - end - if self._mo then self._mo:invalidate() self._mo = nil end - game.level.map:updateMap(self.x, self.y) - - eff.hp = eff.hp or 100 - eff.tmpid = self:addTemporaryValue("encased_in_ice", 1) - eff.healid = self:addTemporaryValue("no_healing", 1) - eff.moveid = self:addTemporaryValue("never_move", 1) - eff.frozid = self:addTemporaryValue("frozen", 1) - eff.defid = self:addTemporaryValue("combat_def", -1000) - eff.rdefid = self:addTemporaryValue("combat_def_ranged", -1000) - eff.sefid = self:addTemporaryValue("negative_status_effect_immune", 1) - - self:setTarget(self) - end, - on_timeout = function(self, eff) - self:setTarget(self) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("encased_in_ice", eff.tmpid) - self:removeTemporaryValue("no_healing", eff.healid) - self:removeTemporaryValue("never_move", eff.moveid) - self:removeTemporaryValue("frozen", eff.frozid) - self:removeTemporaryValue("combat_def", eff.defid) - self:removeTemporaryValue("combat_def_ranged", eff.rdefid) - self:removeTemporaryValue("negative_status_effect_immune", eff.sefid) - self.color_r = eff.old_r - self.color_g = eff.old_g - self.color_b = eff.old_b - if eff.added_display then self.add_displays = nil end - if self._mo then self._mo:invalidate() self._mo = nil end - game.level.map:updateMap(self.x, self.y) - self:setTarget(nil) - end, -} - -newEffect{ - name = "FROZEN_FEET", - desc = "Frozen Feet", - long_desc = function(self, eff) return "The target is frozen on the ground, able to act freely but not move." end, - type = "magical", - status = "detrimental", - parameters = {}, - on_gain = function(self, err) return "#Target# is frozen to the ground!", "+Frozen" end, - on_lose = function(self, err) return "#Target# warms up.", "-Frozen" end, - activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("never_move", 1) - eff.frozid = self:addTemporaryValue("frozen", 1) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("never_move", eff.tmpid) - self:removeTemporaryValue("frozen", eff.frozid) - end, -} - newEffect{ name = "STONED", desc = "Stoned", long_desc = function(self, eff) return "The target has been turned to stone, making it subject to shattering but improving physical(+20%), fire(+80%) and lightning(+50%) resistances." end, type = "magical", + subtype = "earth", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# turns to stone!", "+Stoned" end, @@ -156,6 +83,7 @@ newEffect{ desc = "Earthen Barrier", long_desc = function(self, eff) return ("Reduces physical damage received by %d%%."):format(eff.power) end, type = "magical", + subtype = "earth", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# hardens its skin.", "+Earthen barrier" end, @@ -175,6 +103,7 @@ newEffect{ desc = "Molten Skin", long_desc = function(self, eff) return ("Reduces fire damage received by %d%%."):format(eff.power) end, type = "magical", + subtype = "fire", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target#'s skin turns into molten lava.", "+Molten Skin" end, @@ -194,6 +123,7 @@ newEffect{ desc = "Reflective Skin", long_desc = function(self, eff) return ("Magically returns %d%% of any damage done to the attacker."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target#'s skin starts to shimmer.", "+Reflective Skin" end, @@ -211,6 +141,7 @@ newEffect{ desc = "Vimsense", long_desc = function(self, eff) return ("Reduces blight resistance by %d%%."):format(eff.power) end, type = "magical", + subtype = "blight", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -226,6 +157,7 @@ newEffect{ desc = "Invisibility", long_desc = function(self, eff) return ("Improves/gives invisibility (power %d)."):format(eff.power) end, type = "magical", + subtype = "phantasm", status = "beneficial", parameters = { power=10, penalty=0, regen=false }, on_gain = function(self, err) return "#Target# vanishes from sight.", "+Invis" end, @@ -254,6 +186,7 @@ newEffect{ desc = "See Invisible", long_desc = function(self, eff) return ("Improves/gives the ability to see invisible creatures (power %d)."):format(eff.power) end, type = "magical", + subtype = "sense", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target#'s eyes tingle." end, @@ -323,6 +256,7 @@ newEffect{ desc = "Supercharge Golem", long_desc = function(self, eff) return ("The target is supercharged, increasing life regen by %0.2f and damage done by 20%%."):format(eff.regen) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { regen=10 }, on_gain = function(self, err) return "#Target# is overloaded with power.", "+Supercharge" end, @@ -342,6 +276,7 @@ newEffect{ desc = "Power Overload", long_desc = function(self, eff) return ("The target radiates incredible power, increasing all damage done by %d%%."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is overloaded with power.", "+Overload" end, @@ -359,6 +294,7 @@ newEffect{ desc = "Life Tap", long_desc = function(self, eff) return ("The target taps its blood's hidden power, increasing all damage done by %d%%."):format(eff.power) end, type = "magical", + subtype = "vim", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is overloaded with power.", "+Life Tap" end, @@ -376,6 +312,7 @@ newEffect{ desc = "Arcane Eye", long_desc = function(self, eff) return ("You have an arcane eye observing for you in a radius of %d."):format(eff.radius) end, type = "magical", + subtype = "sense", status = "beneficial", cancel_on_level_change = true, parameters = { range=10, actor=1, object=0, trap=0 }, @@ -408,6 +345,7 @@ newEffect{ desc = "All stats increase", long_desc = function(self, eff) return ("All primary stats of the target are increased by %d."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { power=1 }, activate = function(self, eff) @@ -431,6 +369,7 @@ newEffect{ desc = "Displacement Shield", long_desc = function(self, eff) return ("The target is surrounded by a space distortion that randomly sends (%d%% chance) incoming damage to another target (%s). Absorbs %d/%d damage before it crumbles."):format(eff.chance, eff.target.name or "unknown", self.displacement_shield, eff.power) end, type = "magical", + subtype = "teleport", status = "beneficial", parameters = { power=10, target=nil, chance=25 }, on_gain = function(self, err) return "The very fabric of space alters around #target#.", "+Displacement Shield" end, @@ -468,6 +407,7 @@ newEffect{ desc = "Damage Shield", long_desc = function(self, eff) return ("The target is surrounded by a magical shield, absorbing %d/%d damage before it crumbles."):format(self.damage_shield_absorb, eff.power) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { power=100 }, on_gain = function(self, err) return "A shield forms around #target#.", "+Shield" end, @@ -497,6 +437,7 @@ newEffect{ desc = "Martyrdom", long_desc = function(self, eff) return ("All damage done by the target will also hurt it for %d%%."):format(eff.power) end, type = "magical", + subtype = "light", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is a martyr.", "+Martyr" end, @@ -619,32 +560,12 @@ newEffect{ end, } -newEffect{ - name = "FREE_ACTION", - desc = "Free Action", - long_desc = function(self, eff) return ("The target gains %d%% stun, daze and pinning immunity."):format(eff.power * 100) end, - type = "magical", - status = "beneficial", - parameters = { power=1 }, - on_gain = function(self, err) return "#Target# is moving freely.", "+Free Action" end, - on_lose = function(self, err) return "#Target# is moving less freely.", "-Free Action" end, - activate = function(self, eff) - eff.stun = self:addTemporaryValue("stun_immune", eff.power) - eff.daze = self:addTemporaryValue("daze_immune", eff.power) - eff.pin = self:addTemporaryValue("pin_immune", eff.power) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("stun_immune", eff.stun) - self:removeTemporaryValue("daze_immune", eff.daze) - self:removeTemporaryValue("pin_immune", eff.pin) - end, -} - newEffect{ name = "BLOODLUST", desc = "Bloodlust", long_desc = function(self, eff) return ("The target is in a magical bloodlust, improving spellpower by %d."):format(eff.dur) end, type = "magical", + subtype = "frenzy", status = "beneficial", parameters = { power=1 }, on_merge = function(self, old_eff, new_eff) @@ -672,6 +593,7 @@ newEffect{ desc = "Acid Splash", long_desc = function(self, eff) return ("The target has been splashed with acid, taking %0.2f acid damage per turn, reducing armour by %d and attack by %d."):format(eff.dam, eff.armor or 0, eff.atk) end, type = "magical", + subtype = "acid", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is covered in acid!" end, @@ -695,6 +617,7 @@ newEffect{ desc = "Bloodfury", long_desc = function(self, eff) return ("The target's blight and acid damage is increased by %d%%."):format(eff.power) end, type = "magical", + subtype = "frenzy", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -710,6 +633,7 @@ newEffect{ desc = "Reviving Phoenix", long_desc = function(self, eff) return "Target is being brought back to life." end, type = "magical", + subtype = "fire", status = "beneficial", parameters = { life_regen = 25, mana_regen = -9.75, never_move = 1, silence = 1 }, on_gain = function(self, err) return "#Target# is consumed in a burst of flame. All that remains is a fiery egg.", "+Phoenix" end, @@ -743,6 +667,7 @@ newEffect{ desc = "Hurricane", long_desc = function(self, eff) return ("The target is in the center of a lightning hurricane, doing %0.2f to %0.2f lightning damage to itself and others around every turn."):format(eff.dam / 3, eff.dam) end, type = "magical", + subtype = "lightning", status = "detrimental", parameters = { dam=10, radius=2 }, on_gain = function(self, err) return "#Target# is caught inside a Hurricane.", "+Hurricane" end, @@ -772,6 +697,7 @@ newEffect{ desc = "Recalling", long_desc = function(self, eff) return "The target is waiting to be recalled back to the worldmap." end, type = "magical", + subtype = "unknown", status = "beneficial", cancel_on_level_change = true, parameters = { }, @@ -797,6 +723,7 @@ newEffect{ desc = "Teleport: Angolwen", long_desc = function(self, eff) return "The target is waiting to be recalled back to Angolwen." end, type = "magical", + subtype = "teleport", status = "beneficial", cancel_on_level_change = true, parameters = { }, @@ -833,6 +760,7 @@ newEffect{ desc = "Premonition Shield", long_desc = function(self, eff) return ("Reduces %s damage received by %d%%."):format(DamageType:get(eff.damtype).name, eff.resist) end, type = "magical", + subtype = "sense", status = "beneficial", parameters = { }, on_gain = function(self, err) return "#Target# casts a protective shield just in time!", "+Premonition Shield" end, @@ -850,6 +778,7 @@ newEffect{ desc = "Corrosive Worm", long_desc = function(self, eff) return ("Target is infected with a corrosive worm doing %0.2f acid damage per turn."):format(eff.dam) end, type = "magical", + subtype = "acid", status = "detrimental", parameters = { dam=1, explosion=10 }, on_gain = function(self, err) return "#Target# is infected by a corrosive worm.", "+Corrosive Worm" end, @@ -864,6 +793,7 @@ newEffect{ desc = "Wraithform", long_desc = function(self, eff) return ("Turn into a wraith, passing through walls (but not natural obstacles), granting %d defense and %d armour."):format(eff.def, eff.armor) end, type = "magical", + subtype = "darkness", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# turns into a wraith.", "+Wraithform" end, @@ -885,6 +815,7 @@ newEffect{ desc = "Empowered Healing", long_desc = function(self, eff) return ("Increases the effectiveness of all healing the target receives by %d%%."):format(eff.power * 100) end, type = "magical", + subtype = "light", status = "beneficial", parameters = { power = 0.1 }, activate = function(self, eff) @@ -900,6 +831,7 @@ newEffect{ desc = "Providence", long_desc = function(self, eff) return ("The target is under protection and its life regeneration is boosted by %d."):format(eff.power) end, type = "magical", + subtype = "light", status = "beneficial", parameters = {}, on_timeout = function(self, eff) @@ -932,6 +864,7 @@ newEffect{ desc = "Totality", long_desc = function(self, eff) return ("The target's light and darkness spell penetration has been increased by %d%%."):format(eff.power) end, type = "magical", + subtype = "darkness", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -951,6 +884,7 @@ newEffect{ desc = "Sanctity", long_desc = function(self, eff) return ("The target is protected from silence effects.") end, type = "magical", + subtype = "circle", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -966,6 +900,7 @@ newEffect{ desc = "Shifting Shadows", long_desc = function(self, eff) return ("The target's defense is increased by %d."):format(eff.power) end, type = "magical", + subtype = "circle", status = "beneficial", parameters = {power = 1}, activate = function(self, eff) @@ -981,6 +916,7 @@ newEffect{ desc = "Blazing Light", long_desc = function(self, eff) return ("The target is gaining %d positive energy each turn."):format(eff.power) end, type = "magical", + subtype = "circle", status = "beneficial", parameters = {power = 1}, activate = function(self, eff) @@ -996,6 +932,7 @@ newEffect{ desc = "Warding", long_desc = function(self, eff) return ("Projectiles aimed at the target are slowed by %d%%."):format (eff.power) end, type = "magical", + subtype = "circle", status = "beneficial", parameters = {power = 1}, activate = function(self, eff) @@ -1011,6 +948,7 @@ newEffect{ desc = "Turn Back the Clock", long_desc = function(self, eff) return ("The target has been returned to a much younger state, reducing all its stats by %d."):format(eff.power) end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = { }, on_gain = function(self, err) return "#Target# is returned to a much younger state!", "+Turn Back the Clock" end, @@ -1039,6 +977,7 @@ newEffect{ desc = "Wasting", long_desc = function(self, eff) return ("The target is wasting away, taking %0.2f temporal damage per turn."):format(eff.power) end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is wasting away!", "+Wasting" end, @@ -1062,6 +1001,7 @@ newEffect{ desc = "Prescience", long_desc = function(self, eff) return ("The target's awareness is fully in the present, increasing both physical and spell critical hit chance by %d%%."):format(eff.power) end, type = "magical", + subtype = "sense", status = "beneficial", parameters = { power = 10 }, on_gain = function(self, err) return "#Target# seems more aware." end, @@ -1081,6 +1021,7 @@ newEffect{ desc = "Invigorate", long_desc = function(self, eff) return ("The target is regaining %d stamina per turn."):format(eff.power) end, type = "magical", + subtype = "temporal", status = "beneficial", parameters = {power = 10}, on_gain = function(self, err) return "#Target# is recovering stamina.", "+Invigorate" end, @@ -1099,6 +1040,7 @@ newEffect{ long_desc = function(self, eff) return ("The target will inflict %d%% more damage on its next attack plus an additional %d%% for each turn spent gathering threads beyond the first."): format(eff.power + (eff.power / 5), eff.power/5) end, type = "magical", + subtype = "temporal", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is gathering energy from other timelines.", "+Gather the Threads" end, @@ -1132,6 +1074,7 @@ newEffect{ desc = "Flawed Design", long_desc = function(self, eff) return ("The target's past has been altered, reducing all its resistances by %d%%."):format(eff.power) end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is flawed.", "+Flawed" end, @@ -1151,6 +1094,7 @@ newEffect{ desc = "Spacetime Tuning", long_desc = function(self, eff) return "The target is retuning the fabric of spacetime; any damage will stop it." end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = {}, on_timeout = function(self, eff) @@ -1198,6 +1142,7 @@ newEffect{ desc = "Foresight", long_desc = function(self, eff) return ("The target has peered into the future and will ignore all damage from the next dangerous attack."):format() end, type = "magical", + subtype = "sense", status = "beneficial", parameters = {}, activate = function(self, eff) @@ -1211,6 +1156,7 @@ newEffect{ desc = "Manaworm", long_desc = function(self, eff) return ("The target is infected by a manaworm, draining %0.2f mana per turns and releasing it as arcane damage to the target."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "detrimental", parameters = {power=10}, on_gain = function(self, err) return "#Target# is infected by a manaworm!", "+Manaworm" end, @@ -1228,6 +1174,7 @@ newEffect{ desc = "Surge of Undeath", long_desc = function(self, eff) return ("Increases the target combat power, spellpower, accuracy by %d, armour penetration by %d and critical chances by %d."):format(eff.power, eff.apr, eff.crit) end, type = "magical", + subtype = "frenzy", status = "beneficial", parameters = { power=10, crit=10, apr=10 }, on_gain = function(self, err) return "#Target# is engulfed in dark energies.", "+Undeath Surge" end, @@ -1255,6 +1202,7 @@ newEffect{ desc = "Bone Shield", long_desc = function(self, eff) return ("Fully protects from %d damaging actions."):format(#eff.particles) end, type = "magical", + subtype = "arcane", status = "beneficial", parameters = { nb=3 }, on_gain = function(self, err) return "#Target# protected by flying bones.", "+Bone Shield" end, @@ -1283,6 +1231,7 @@ newEffect{ desc = "Redux", long_desc = function(self, eff) return "The next activated chronomancy talent that the target uses will be cast twice." end, type = "magical", + subtype = "temporal", status = "beneficial", parameters = { power=1}, activate = function(self, eff) @@ -1296,6 +1245,7 @@ newEffect{ desc = "Temporal Destabilization", long_desc = function(self, eff) return ("Target is destabilized and suffering %0.2f temporal damage per turn. If it dies with this effect active it will explode."):format(eff.dam) end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = { dam=1, explosion=10 }, on_gain = function(self, err) return "#Target# is unstable.", "+Temporal Destabilization" end, @@ -1316,6 +1266,7 @@ newEffect{ desc = "Haste", long_desc = function(self, eff) return ("Increases global action speed by %d%% and casting speed by %d%%."):format(eff.power * 100, eff.power * 50) end, type = "magical", + subtype = "temporal", status = "beneficial", parameters = { power=0.1 }, on_gain = function(self, err) return "#Target# speeds up.", "+Haste" end, @@ -1335,6 +1286,7 @@ newEffect{ desc = "Cease to Exist", long_desc = function(self, eff) return ("The target is being removed from the timeline and is suffering %d temporal damage per turn."):format(eff.dam) end, type = "magical", + subtype = "temporal", status = "detrimental", parameters = { power = 1 }, on_gain = function(self, err) return "#Target# is being removed from the timeline.", "+Cease to Exist" end, @@ -1354,6 +1306,7 @@ newEffect{ desc = "Impending Doom", long_desc = function(self, eff) return ("The target's final doom is drawing near, preventing all forms of healing and dealing %0.2f arcane damage per turn. The effect will stop if the caster dies."):format(eff.dam) end, type = "magical", + subtype = "arcane", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is doomed!", "+Doomed" end, @@ -1375,6 +1328,7 @@ newEffect{ desc = "Rigor Mortis", long_desc = function(self, eff) return ("The target takes %d%% more damage from necrotic minions."):format(eff.power) end, type = "magical", + subtype = "arcane", status = "detrimental", parameters = {power=20}, on_gain = function(self, err) return "#Target# feels death coming!", "+Rigor Mortis" end, @@ -1385,4 +1339,24 @@ newEffect{ deactivate = function(self, eff) self:removeTemporaryValue("inc_necrotic_minions", eff.tmpid) end, +} + +newEffect{ + name = "ABYSSAL_SHROUD", + desc = "Abyssal Shroud", + long_desc = function(self, eff) return ("The target's lite radius has been reduced by %d and it's darkness resistance by %d%%."):format(eff.lite, eff.power) end, + type = "magical", + subtype = "darkness", + status = "detrimental", + parameters = {power=20}, + on_gain = function(self, err) return "#Target# feels closer to the abyss!", "+Abyssal Shroud" end, + on_lose = function(self, err) return "#Target# is free from the abyss.", "-Abyssal Shroud" end, + activate = function(self, eff) + eff.liteid = self:addTemporaryValue("lite", -eff.lite) + eff.darkid = self:addTemporaryValue("resists", { [DamageType.DARKNESS] = -eff.power }) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("lite", eff.liteid) + self:removeTemporaryValue("resists", eff.darkid) + end, } \ No newline at end of file diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua index 8b14ac48a9..8fbb5e806f 100644 --- a/game/modules/tome/data/timed_effects/mental.lua +++ b/game/modules/tome/data/timed_effects/mental.lua @@ -29,6 +29,7 @@ newEffect{ desc = "Silenced", long_desc = function(self, eff) return "The target is silenced, preventing it from casting spells and using some vocal talents." end, type = "mental", + subtype = "silence", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is silenced!", "+Silenced" end, @@ -46,6 +47,7 @@ newEffect{ desc = "Meditation", long_desc = function(self, eff) return "The target is meditating. Any damage will stop it." end, type = "mental", + subtype = "focus", status = "detrimental", parameters = {}, on_timeout = function(self, eff) @@ -67,6 +69,7 @@ newEffect{ desc = "Summon Control", long_desc = function(self, eff) return ("Reduces damage received by %d%% and increases summon time by %d."):format(eff.res, eff.incdur) end, type = "mental", + subtype = "focus", status = "beneficial", parameters = { res=10, incdur=10 }, activate = function(self, eff) @@ -87,6 +90,7 @@ newEffect{ desc = "Confused", long_desc = function(self, eff) return ("The target is confused, acting randomly (chance %d%%) and unable to perform complex actions."):format(eff.power) end, type = "mental", + subtype = "confusion", status = "detrimental", parameters = { power=50 }, on_gain = function(self, err) return "#Target# wanders around!.", "+Confused" end, @@ -106,6 +110,7 @@ newEffect{ desc = "Dominated", long_desc = function(self, eff) return ("The target's mind has been shattered. Its body remains as a thrall to your mind.") end, type = "mental", + subtype = "dominate", status = "detrimental", parameters = { }, on_gain = function(self, err) return "#Target#'s mind is shattered." end, @@ -140,6 +145,7 @@ newEffect{ desc = "Battle Shout", long_desc = function(self, eff) return ("Increases maximum life and stamina by %d%%."):format(eff.power) end, type = "mental", + subtype = "morale", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -159,6 +165,7 @@ newEffect{ desc = "Battle Cry", long_desc = function(self, eff) return ("The target's will to defend itself is shattered by the powerful battle cry, reducing defense by %d."):format(eff.power) end, type = "mental", + subtype = "morale", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target#'s will is shattered.", "+Battle Cry" end, @@ -176,6 +183,7 @@ newEffect{ desc = "Willful Combat", long_desc = function(self, eff) return ("The target puts all its willpower into its blows, improving damage by %d."):format(eff.power) end, type = "mental", + subtype = "focus", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# lashes out with pure willpower." end, @@ -193,6 +201,7 @@ newEffect{ desc = "Gloom Weakness", long_desc = function(self, eff) return ("The gloom reduces the target's attack by %d and damage rating by %d."):format(eff.atk, eff.dam) end, type = "mental", + subtype = "gloom", status = "detrimental", parameters = { atk=10, dam=10 }, on_gain = function(self, err) return "#F53CBE##Target# is weakened by the gloom." end, @@ -214,6 +223,7 @@ newEffect{ desc = "Slowed by the gloom", long_desc = function(self, eff) return ("The gloom reduces the target's global speed by %d%%."):format(eff.power * 100) end, type = "mental", + subtype = "gloom", status = "detrimental", parameters = { power=0.1 }, on_gain = function(self, err) return "#F53CBE##Target# moves reluctantly!", "+Slow" end, @@ -233,6 +243,7 @@ newEffect{ desc = "Paralyzed by the gloom", long_desc = function(self, eff) return "The gloom has paralyzed the target, rendering it unable to act." end, type = "mental", + subtype = "gloom", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#F53CBE##Target# is paralyzed with fear!", "+Paralyzed" end, @@ -255,6 +266,7 @@ newEffect{ desc = "Confused by the gloom", long_desc = function(self, eff) return ("The gloom has confused the target, making it act randomly (%d%% chance) and unable to perform complex actions."):format(eff.power) end, type = "mental", + subtype = "gloom", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#F53CBE##Target# is lost in despair!", "+Confused" end, @@ -274,6 +286,7 @@ newEffect{ desc = "Stalking", long_desc = function(self, eff) return ("Stalking %s."):format(eff.target.name) end, type = "mental", + subtype = "veil", status = "beneficial", parameters = {}, activate = function(self, eff) @@ -293,6 +306,7 @@ newEffect{ desc = "Being Stalked", long_desc = function(self, eff) return "The target is being stalked." end, type = "mental", + subtype = "veil", status = "detrimental", parameters = {}, activate = function(self, eff) @@ -312,6 +326,7 @@ newEffect{ desc = "Dominated", long_desc = function(self, eff) return ("The target is dominated, increasing damage done to it by its master by %d%%."):format(eff.dominatedDamMult * 100) end, type = "mental", + subtype = "dominate", status = "detrimental", on_gain = function(self, err) return "#F53CBE##Target# has been dominated!", "+Dominated" end, on_lose = function(self, err) return "#F53CBE##Target# is no longer dominated.", "-Dominated" end, @@ -335,6 +350,7 @@ newEffect{ desc = "Radiating Fear", long_desc = function(self, eff) return "The target is frightening, pushing away other creatures." end, type = "mental", + subtype = "fear", status = "beneficial", parameters = { knockback = 1, radius = 3 }, on_gain = function(self, err) return "#F53CBE##Target# is surrounded by fear!", "+Radiant Fear" end, @@ -381,6 +397,7 @@ newEffect{ desc = "Invigorated", long_desc = function(self, eff) return ("The target is invigorated by death, increasing global speed by %d%%."):format(eff.speed) end, type = "mental", + subtype = "morale", status = "beneficial", parameters = { speed = 30, duration = 3 }, on_gain = function(self, err) return nil, "+Invigorated" end, @@ -402,6 +419,7 @@ newEffect{ desc = "Feeding", long_desc = function(self, eff) return ("%s is feeding from %s."):format(self.name:capitalize(), eff.target.name) end, type = "mental", + subtype = "psychic drain", status = "beneficial", parameters = { }, activate = function(self, eff) @@ -513,6 +531,7 @@ newEffect{ desc = "Fed Upon", long_desc = function(self, eff) return ("%s is fed upon by %s."):format(self.name:capitalize(), eff.src.name) end, type = "mental", + subtype = "psychic drain", status = "detrimental", remove_on_clone = true, parameters = { }, @@ -530,6 +549,7 @@ newEffect{ desc = "Agony", long_desc = function(self, eff) return ("%s is writhing in agony, suffering from %d to %d damage over %d turns."):format(self.name:capitalize(), eff.damage / eff.duration, eff.damage, eff.duration) end, type = "mental", + subtype = "pain", status = "detrimental", parameters = { damage=10, mindpower=10, range=10, minPercent=10 }, on_gain = function(self, err) return "#Target# is writhing in agony!", "+Agony" end, @@ -565,6 +585,7 @@ newEffect{ desc = "Hateful Whisper", long_desc = function(self, eff) return ("%s has heard the hateful whisper."):format(self.name:capitalize()) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = { }, on_gain = function(self, err) return "#Target# has heard the hateful whisper!", "+Hateful Whisper" end, @@ -640,6 +661,7 @@ newEffect{ desc = "Slowed by madness", long_desc = function(self, eff) return ("Madness reduces the target's global speed by %d%%."):format(eff.power * 100) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = { power=0.1 }, on_gain = function(self, err) return "#F53CBE##Target# slows in the grip of madness!", "+Slow" end, @@ -659,6 +681,7 @@ newEffect{ desc = "Paralyzed by madness", long_desc = function(self, eff) return "Madness has paralyzed the target, rendering it unable to act." end, type = "mental", + subtype = "madness", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#F53CBE##Target# is paralyzed by madness!", "+Paralyzed" end, @@ -681,6 +704,7 @@ newEffect{ desc = "Confused by madness", long_desc = function(self, eff) return ("Madness has confused the target, making it act randomly (%d%% chance) and unable to perform complex actions."):format(eff.power) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#F53CBE##Target# is lost in madness!", "+Confused" end, @@ -700,6 +724,7 @@ newEffect{ desc = "Quick", long_desc = function(self, eff) return ("Increases run speed by %d%%."):format(eff.power * 100) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = { power=0.1 }, on_gain = function(self, err) return "#Target# speeds up.", "+Quick" end, @@ -716,6 +741,7 @@ newEffect{ desc = "Frenzied Psi-fighting", long_desc = function(self, eff) return ("Causes telekinetically-wielded weapons to hit up to %d targets each turn."):format(eff.power) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = {dam=10}, on_gain = function(self, err) return "#Target# enters a frenzy!", "+Frenzy" end, @@ -727,6 +753,7 @@ newEffect{ desc = "Spiked Kinetic Shield", long_desc = function(self, eff) return ("The target erects a powerful kinetic shield capable of absorbing %d/%d physical or acid damage before it crumbles."):format(self.kinspike_shield_absorb, eff.power) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = { power=100 }, on_gain = function(self, err) return "A powerful kinetic shield forms around #target#.", "+Shield" end, @@ -745,6 +772,7 @@ newEffect{ desc = "Spiked Thermal Shield", long_desc = function(self, eff) return ("The target erects a powerful thermal shield capable of absorbing %d/%d thermal damage before it crumbles."):format(self.thermspike_shield_absorb, eff.power) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = { power=100 }, on_gain = function(self, err) return "A powerful thermal shield forms around #target#.", "+Shield" end, @@ -763,6 +791,7 @@ newEffect{ desc = "Spiked Charged Shield", long_desc = function(self, eff) return ("The target erects a powerful charged shield capable of absorbing %d/%d lightning or blight damage before it crumbles."):format(self.chargespike_shield_absorb, eff.power) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = { power=100 }, on_gain = function(self, err) return "A powerful charged shield forms around #target#.", "+Shield" end, @@ -782,6 +811,7 @@ newEffect{ 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.5*eff.power) end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -799,6 +829,7 @@ newEffect{ 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 = "mental", + subtype = "psychic drain", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "Energy starts pouring from the gem into #Target#.", "+Energy" end, @@ -816,6 +847,7 @@ newEffect{ desc = "Telekinetic Archery", long_desc = function(self, eff) return ("Your telekinetically-wielded bow automatically attacks the nearest target each turn.") end, type = "mental", + subtype = "telekinesis", status = "beneficial", parameters = {dam=10}, on_gain = function(self, err) return "#Target# enters a telekinetic archer's trance!", "+Telekinetic archery" end, @@ -827,6 +859,7 @@ newEffect{ desc = "Weakened Mind", long_desc = function(self, eff) return ("Decreases mind save by %d."):format(eff.power) end, type = "mental", + subtype = "morale", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -842,6 +875,7 @@ newEffect{ desc = "Void Echoes", long_desc = function(self, eff) return ("The target is seeing echoes from the void and will take %0.2f mind damage as well as some resource damage each turn it fails a mental save."):format(eff.power) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is being driven mad by the void.", "+Void Echoes" end, @@ -863,6 +897,7 @@ newEffect{ desc = "Waking Nightmare", long_desc = function(self, eff) return ("The target is lost in a waking nightmare that deals %0.2f darkness damage each turn and has a %d%% chance to cause a random effect detrimental."):format(eff.dam, eff.chance) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = { chance=10, dam = 10 }, on_gain = function(self, err) return "#Target# is lost in a waking nightmare.", "+Waking Nightmare" end, @@ -890,30 +925,12 @@ newEffect{ end, } -newEffect{ - name = "ABYSSAL_SHROUD", - desc = "Abyssal Shroud", - long_desc = function(self, eff) return ("The target's lite radius has been reduced by %d and it's darkness resistance by %d%%."):format(eff.lite, eff.power) end, - type = "mental", - status = "detrimental", - parameters = {power=20}, - on_gain = function(self, err) return "#Target# feels closer to the abyss!", "+Abyssal Shroud" end, - on_lose = function(self, err) return "#Target# is free from the abyss.", "-Abyssal Shroud" end, - activate = function(self, eff) - eff.liteid = self:addTemporaryValue("lite", -eff.lite) - eff.darkid = self:addTemporaryValue("resists", { [DamageType.DARKNESS] = -eff.power }) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("lite", eff.liteid) - self:removeTemporaryValue("resists", eff.darkid) - end, -} - newEffect{ name = "INNER_DEMONS", desc = "Inner Demons", long_desc = function(self, eff) return ("The target is plagued by inner demons and each turn there's a %d%% chance that one will appear. If the caster is killed or the target resists setting his demons loose the effect will end early."):format(eff.chance) end, type = "mental", + subtype = "madness", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is plagued by inner demons!", "+Inner Demons" end, @@ -1001,3 +1018,253 @@ newEffect{ self.faction = eff.olf_faction end, } + +newEffect{ + name = "HALFLING_LUCK", + desc = "Halflings's Luck", + long_desc = function(self, eff) return ("The target's luck and cunning combine to grant it %d%% higher combat critical chance and %d%% higher spell critical chance."):format(eff.physical, eff.spell) end, + type = "mental", + subtype = "focus", + status = "beneficial", + parameters = { spell=10, physical=10 }, + on_gain = function(self, err) return "#Target# seems more aware." end, + on_lose = function(self, err) return "#Target#'s awareness returns to normal." end, + activate = function(self, eff) + eff.pid = self:addTemporaryValue("combat_physcrit", eff.physical) + eff.sid = self:addTemporaryValue("combat_spellcrit", eff.spell) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("combat_physcrit", eff.pid) + self:removeTemporaryValue("combat_spellcrit", eff.sid) + end, +} + +newEffect{ + name = "ATTACK", + desc = "Attack", + long_desc = function(self, eff) return ("The target's combat attack is improved by %d."):format(eff.power) end, + type = "mental", + subtype = "focus", + status = "beneficial", + parameters = { power=10 }, + on_gain = function(self, err) return "#Target# aims carefully." end, + on_lose = function(self, err) return "#Target# aims less carefully." end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("combat_atk", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("combat_atk", eff.tmpid) + end, +} + +newEffect{ + name = "DEADLY_STRIKES", + desc = "Deadly Strikes", + long_desc = function(self, eff) return ("The target's armour penetration is increased by %d."):format(eff.power) end, + type = "mental", + subtype = "focus", + status = "beneficial", + parameters = { power=10 }, + on_gain = function(self, err) return "#Target# aims carefully." end, + on_lose = function(self, err) return "#Target# aims less carefully." end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("combat_apr", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("combat_apr", eff.tmpid) + end, +} + +newEffect{ + name = "FRENZY", + desc = "Frenzy", + long_desc = function(self, eff) return ("Increases global action speed by %d%% and physical crit by %d%%.\nAdditionally the target will continue to fight until it's hit points reach -%d%%."):format(eff.power * 100, eff.crit, eff.dieat * 100) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { power=0.1 }, + on_gain = function(self, err) return "#Target# goes into a killing frenzy.", "+Frenzy" end, + on_lose = function(self, err) return "#Target# calms down.", "-Frenzy" end, + on_merge = function(self, old_eff, new_eff) + -- use on merge so reapplied frenzy doesn't kill off creatures with negative life + old_eff.dur = new_eff.dur + old_eff.power = new_eff.power + old_eff.crit = new_eff.crit + return old_eff + end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("global_speed_add", eff.power) + eff.critid = self:addTemporaryValue("combat_physcrit", eff.crit) + eff.dieatid = self:addTemporaryValue("die_at", -self.max_life * eff.dieat) + end, + deactivate = function(self, eff) + -- check negative life first incase the creature has healing + if self.life <= 0 then + local sx, sy = game.level.map:getTileToScreen(self.x, self.y) + game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, rng.float(-2.5, -1.5), "Falls dead!", {255,0,255}) + game.logSeen(self, "%s dies when its frenzy ends!", self.name:capitalize()) + self:die(self) + end + self:removeTemporaryValue("global_speed_add", eff.tmpid) + self:removeTemporaryValue("combat_physcrit", eff.critid) + self:removeTemporaryValue("die_at", eff.dieatid) + end, +} + +newEffect{ + name = "BLOODBATH", + desc = "Bloodbath", + long_desc = function(self, eff) return ("The thrill of combat improves the target's maximum life by %d, life regeneration by %d%% and stamina regeneration by %d%%."):format(eff.hp, eff.regen, eff.regen) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { hp=10, regen=10 }, + on_gain = function(self, err) return nil, "+Bloodbath" end, + on_lose = function(self, err) return nil, "-Bloodbath" end, + on_merge = function(self, old_eff, new_eff) + self:removeTemporaryValue("max_life", old_eff.life_id) + self:removeTemporaryValue("life_regen", old_eff.life_regen_id) + self:removeTemporaryValue("stamina_regen", old_eff.stamina_regen_id) + + -- Take the new values, dont heal, otherwise you get a free heal each crit .. which is totaly broken + local v = new_eff.hp * self.max_life / 100 + new_eff.life_id = self:addTemporaryValue("max_life", v) + new_eff.life_regen_id = self:addTemporaryValue("life_regen", new_eff.regen * self.life_regen / 100) + new_eff.stamina_regen_id = self:addTemporaryValue("stamina_regen", new_eff.regen * self.stamina_regen / 100) + return new_eff + end, + activate = function(self, eff) + local v = eff.hp * self.max_life / 100 + eff.life_id = self:addTemporaryValue("max_life", v) + self:heal(v) + eff.life_regen_id = self:addTemporaryValue("life_regen", eff.regen * self.life_regen / 100) + eff.stamina_regen_id = self:addTemporaryValue("stamina_regen", eff.regen * self.stamina_regen / 100) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("max_life", eff.life_id) + self:removeTemporaryValue("life_regen", eff.life_regen_id) + self:removeTemporaryValue("stamina_regen", eff.stamina_regen_id) + end, +} + +newEffect{ + name = "BLOODRAGE", + desc = "Bloodrage", + long_desc = function(self, eff) return ("The target's strength is increased by %d by the thrill of combat."):format(eff.inc) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { inc=1, max=10 }, + on_merge = function(self, old_eff, new_eff) + self:removeTemporaryValue("inc_stats", old_eff.tmpid) + old_eff.cur_inc = math.min(old_eff.cur_inc + new_eff.inc, new_eff.max) + old_eff.tmpid = self:addTemporaryValue("inc_stats", {[Stats.STAT_STR] = old_eff.cur_inc}) + + old_eff.dur = new_eff.dur + return old_eff + end, + activate = function(self, eff) + eff.cur_inc = eff.inc + eff.tmpid = self:addTemporaryValue("inc_stats", {[Stats.STAT_STR] = eff.inc}) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("inc_stats", eff.tmpid) + end, +} + +newEffect{ + name = "UNSTOPPABLE", + desc = "Unstoppable", + long_desc = function(self, eff) return ("The target is unstoppable! It refuses to die, and at the end it will heal %d Life."):format(eff.kills * eff.hp_per_kill * self.max_life / 100) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { hp_per_kill=2 }, + activate = function(self, eff) + eff.kills = 0 + eff.tmpid = self:addTemporaryValue("unstoppable", 1) + eff.healid = self:addTemporaryValue("no_life_regen", 1) + end, + deactivate = function(self, eff) + self:heal(eff.kills * eff.hp_per_kill * self.max_life / 100) + self:removeTemporaryValue("unstoppable", eff.tmpid) + self:removeTemporaryValue("no_life_regen", eff.healid) + end, +} + +newEffect{ + name = "INCREASED_LIFE", + desc = "Increased Life", + long_desc = function(self, eff) return ("The target's maximum life is increased by %d."):format(eff.life) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + on_gain = function(self, err) return "#Target# gains extra life.", "+Life" end, + on_lose = function(self, err) return "#Target# loses extra life.", "-Life" end, + parameters = { life = 50 }, + activate = function(self, eff) + self.max_life = self.max_life + eff.life + self.life = self.life + eff.life + self.changed = true + end, + deactivate = function(self, eff) + self.max_life = self.max_life - eff.life + self.life = self.life - eff.life + self.changed = true + if self.life <= 0 then + self.life = 1 + self:setEffect(self.EFF_STUNNED, 3, {}) + game.logSeen(self, "%s's increased life wears off and is stunned by the change.", self.name:capitalize()) + end + end, +} + +newEffect{ + name = "RAMPAGE", + desc = "Rampaging", + long_desc = function(self, eff) return "The target is rampaging!" end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { hateLoss = 0, critical = 0, damage = 0, speed = 0, attack = 0, evasion = 0 }, -- use percentages not fractions + on_gain = function(self, err) return "#F53CBE##Target# begins rampaging!", "+Rampage" end, + on_lose = function(self, err) return "#F53CBE##Target# is no longer rampaging.", "-Rampage" end, + activate = function(self, eff) + if eff.hateLoss or 0 > 0 then eff.hateLossId = self:addTemporaryValue("hate_regen", -eff.hateLoss) end + if eff.critical or 0 > 0 then eff.criticalId = self:addTemporaryValue("combat_physcrit", eff.critical) end + if eff.damage or 0 > 0 then eff.damageId = self:addTemporaryValue("inc_damage", {[DamageType.PHYSICAL]=eff.damage}) end + if eff.speed or 0 > 0 then eff.speedId = self:addTemporaryValue("global_speed_add", eff.speed * 0.01) end + if eff.attack or 0 > 0 then eff.attackId = self:addTemporaryValue("combat_atk", self:combatAttack() * eff.attack * 0.01) end + if eff.evasion or 0 > 0 then eff.evasionId = self:addTemporaryValue("evasion", eff.evasion) end + + eff.particle = self:addParticles(Particles.new("rampage", 1)) + end, + deactivate = function(self, eff) + if eff.hateLossId then self:removeTemporaryValue("hate_regen", eff.hateLossId) end + if eff.criticalId then self:removeTemporaryValue("combat_physcrit", eff.criticalId) end + if eff.damageId then self:removeTemporaryValue("inc_damage", eff.damageId) end + if eff.speedId then self:removeTemporaryValue("global_speed_add", eff.speedId) end + if eff.attackId then self:removeTemporaryValue("combat_atk", eff.attackId) end + if eff.evasionId then self:removeTemporaryValue("evasion", eff.evasionId) end + + self:removeParticles(eff.particle) + end, +} + +newEffect{ + name = "ORC_FURY", + desc = "Orcish Fury", + long_desc = function(self, eff) return ("The target enters a destructive fury, increasing all damage done by %d%%."):format(eff.power) end, + type = "mental", + subtype = "frenzy", + status = "beneficial", + parameters = { power=10 }, + on_gain = function(self, err) return "#Target# enters a state of bloodlust." end, + on_lose = function(self, err) return "#Target# calms down." end, + activate = function(self, eff) + eff.pid = self:addTemporaryValue("inc_damage", {all=eff.power}) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("inc_damage", eff.pid) + end, +} \ No newline at end of file diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua index 1e63e74cfe..a5ad96f48d 100644 --- a/game/modules/tome/data/timed_effects/other.lua +++ b/game/modules/tome/data/timed_effects/other.lua @@ -151,6 +151,7 @@ newEffect{ desc = "Golem out of sight", long_desc = function(self, eff) return "The golem is out of sight of the alchemist; direct control will be lost!" end, type = "other", + subtype = "miscellaneous", status = "detrimental", parameters = { }, on_gain = function(self, err) return "#LIGHT_RED##Target# is out of sight of its master; direct control will break!.", "+Out of sight" end, @@ -177,7 +178,7 @@ newEffect{ desc = "Continuum Destabilization", long_desc = function(self, eff) return ("The target has been affected by space or time manipulations and is becoming more resistant to them (+%d)."):format(eff.power) end, type = "other", - subtype = "spacetime", + subtype = "time", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# looks a little pale around the edges.", "+Destabilized" end, @@ -207,6 +208,7 @@ newEffect{ desc = "Summoning Destabilization", long_desc = function(self, eff) return ("The more the target summons creatures the longer it will take to summon more (+%d turns)."):format(eff.power) end, type = "other", -- Type "other" so that nothing can dispel it + subtype = "miscellaneous", status = "detrimental", parameters = { power=10 }, on_merge = function(self, old_eff, new_eff) @@ -291,7 +293,7 @@ newEffect{ desc = "Temporal Stun", long_desc = function(self, eff) return "The target is paralyzed, preventing any actions." end, type = "other", - --subtype = "time", --no subtype so it can't be removed + subtype = "time", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is paralyzed!", "+Paralyzed" end, @@ -309,7 +311,7 @@ newEffect{ desc = "Precognition", long_desc = function(self, eff) return "You walk into the future; when the effect ends, if you are not dead, you are brought back to the past." end, type = "other", - --subtype = "time", --no subtype so it can't be removed + subtype = "time", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -335,7 +337,7 @@ newEffect{ desc = "See the Threads", long_desc = function(self, eff) return ("You walk three different timelines, choosing the one you prefer at the end (current timeline: %d)."):format(eff.thread) end, type = "other", - --subtype = "time", --no subtype so it can't be removed + subtype = "time", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -390,7 +392,7 @@ newEffect{ desc = "Imminent Paradox Clone", long_desc = function(self, eff) return "When the effect expires you'll be pulled into the past." end, type = "other", - --subtype = "time", --no subtype so it can't be removed + subtype = "time", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -442,7 +444,7 @@ newEffect{ desc = "Paradox Clone", long_desc = function(self, eff) return "You've been pulled into the past." end, type = "other", - --subtype = "time", --no subtype so it can't be removed + subtype = "time", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -467,6 +469,7 @@ newEffect{ desc = "Militant Mind", long_desc = function(self, eff) return ("Increases physical power, spellpower and mindpower by %d."):format(eff.power) end, type = "other", + subtype = "miscellaneous", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -520,7 +523,7 @@ newEffect{ name = "FADE_FROM_TIME", desc = "Fade From Time", long_desc = function(self, eff) return ("The target is partially removed from the timeline, reducing all damage dealt by %d%%, all damage recieved by %d%%, and the duration of all detrimental effects by %d%%."): - format(eff.dur + 1, eff.cur_power or eff.power, eff.cur_power or eff.power) end, + format(eff.dur + 1 * 2, eff.cur_power or eff.power, eff.cur_power or eff.power) end, type = "other", subtype = "time", status = "beneficial", @@ -531,7 +534,7 @@ newEffect{ self:removeTemporaryValue("inc_damage", old_eff.dmgid) self:removeTemporaryValue("resists", old_eff.rstid) old_eff.cur_power = (new_eff.power) - old_eff.dmgid = self:addTemporaryValue("inc_damage", {all = - old_eff.dur}) + old_eff.dmgid = self:addTemporaryValue("inc_damage", {all = - old_eff.dur * 2}) old_eff.rstid = self:addTemporaryValue("resists", {all = old_eff.cur_power}) old_eff.dur = old_eff.dur @@ -544,7 +547,7 @@ newEffect{ activate = function(self, eff) eff.cur_power = eff.power eff.rstid = self:addTemporaryValue("resists", { all = eff.power}) - eff.dmgid = self:addTemporaryValue("inc_damage", {all = -10}) + eff.dmgid = self:addTemporaryValue("inc_damage", {all = -20}) end, deactivate = function(self, eff) self:removeTemporaryValue("resists", eff.rstid) @@ -557,6 +560,7 @@ newEffect{ desc = "Shadow Veil", long_desc = function(self, eff) return ("You veil yourself in shadows and let them control you. While in the veil you become immune to status effects, gain %d%% all damage reduction and each turn you blink to a nearby foe, hitting it for %d%% darkness weapon damage. While this goes on you can not be stopped unless you are killed and can not control you character."):format(eff.res, eff.dam * 100) end, type = "other", + subtype = "darkness", status = "beneficial", parameters = { res=10, dam=1.5 }, on_gain = function(self, err) return "#Target# is covered in a veil of shadows!", "+Assail" end, diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index fac86e91e1..5aa61c5da5 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -29,6 +29,7 @@ newEffect{ desc = "Bleeding", long_desc = function(self, eff) return ("Huge cut that bleeds, doing %0.2f physical damage per turn."):format(eff.power) end, type = "physical", + subtype = "wound", status = "detrimental", parameters = { power=1 }, on_gain = function(self, err) return "#Target# starts to bleed.", "+Bleeds" end, @@ -52,6 +53,7 @@ newEffect{ desc = "Deep Wound", long_desc = function(self, eff) return ("Huge cut that bleeds, doing %0.2f physical damage per turn and decreasing all heals received by %d%%."):format(eff.power, eff.heal_factor) end, type = "physical", + subtype = "wound", status = "detrimental", parameters = {power=10, heal_factor=30}, on_gain = function(self, err) return "#Target# starts to bleed.", "+Deep Wounds" end, @@ -72,6 +74,7 @@ newEffect{ desc = "Regeneration", long_desc = function(self, eff) return ("A flow of life spins around the target, regenerating %0.2f life per turn."):format(eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# starts regenerating health quickly.", "+Regen" end, @@ -84,29 +87,6 @@ newEffect{ end, } -newEffect{ - name = "BURNING", - desc = "Burning", - long_desc = function(self, eff) return ("The target is on fire, taking %0.2f fire damage per turn."):format(eff.power) end, - type = "physical", - status = "detrimental", - parameters = { power=10 }, - on_gain = function(self, err) return "#Target# is on fire!", "+Burn" end, - on_lose = function(self, err) return "#Target# stops burning.", "-Burn" end, - on_merge = function(self, old_eff, new_eff) - -- Merge the flames! - local olddam = old_eff.power * old_eff.dur - local newdam = new_eff.power * new_eff.dur - local dur = math.ceil((old_eff.dur + new_eff.dur) / 2) - old_eff.dur = dur - old_eff.power = (olddam + newdam) / dur - return old_eff - end, - on_timeout = function(self, eff) - DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.FIRE, eff.power) - end, -} - newEffect{ name = "POISONED", desc = "Poisoned", @@ -251,11 +231,36 @@ newEffect{ end, } +newEffect{ + name = "BURNING", + desc = "Burning", + long_desc = function(self, eff) return ("The target is on fire, taking %0.2f fire damage per turn."):format(eff.power) end, + type = "physical", + subtype = "fire", + status = "detrimental", + parameters = { power=10 }, + on_gain = function(self, err) return "#Target# is on fire!", "+Burn" end, + on_lose = function(self, err) return "#Target# stops burning.", "-Burn" end, + on_merge = function(self, old_eff, new_eff) + -- Merge the flames! + local olddam = old_eff.power * old_eff.dur + local newdam = new_eff.power * new_eff.dur + local dur = math.ceil((old_eff.dur + new_eff.dur) / 2) + old_eff.dur = dur + old_eff.power = (olddam + newdam) / dur + return old_eff + end, + on_timeout = function(self, eff) + DamageType:get(DamageType.FIRE).projector(eff.src, self.x, self.y, DamageType.FIRE, eff.power) + end, +} + newEffect{ name = "BURNING_SHOCK", desc = "Burning Shock", long_desc = function(self, eff) return ("The target is on fire, taking %0.2f fire damage per turn and unable to act."):format(eff.power) end, type = "physical", + subtype = "fire", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is paralyzed by the burning flame!", "+Burning Shock" end, @@ -279,6 +284,7 @@ newEffect{ desc = "Stunned", long_desc = function(self, eff) return ("The target is stunned, reducing damage by 70%%, healing received by 50%%, putting random talents on cooldown and reducing movement speed by 50%%. While stunned talents do not cooldown."):format() end, type = "physical", + subtype = "stun", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is stunned!", "+Stunned" end, @@ -309,6 +315,7 @@ newEffect{ desc = "Disarmed", long_desc = function(self, eff) return "The target is maimed, unable to correctly wield a weapon." end, type = "physical", + subtype = "disarm", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is disarmed!", "+Disarmed" end, @@ -326,6 +333,7 @@ newEffect{ desc = "Constricted", long_desc = function(self, eff) return ("The target is constricted, preventing movement and making it suffocate (loses %0.2f air per turn)."):format(eff.power) end, type = "physical", + subtype = "grapple", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is constricted!", "+Constricted" end, @@ -349,6 +357,7 @@ newEffect{ desc = "Dazed", long_desc = function(self, eff) return "The target is dazed, rendering it unable to act. Any damage will remove the daze." end, type = "physical", + subtype = "stun", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is dazed!", "+Dazed" end, @@ -366,6 +375,7 @@ newEffect{ desc = "Evasion", long_desc = function(self, eff) return ("The target has %d%% chance to evade melee attacks."):format(eff.chance) end, type = "physical", + subtype = "evasion", status = "beneficial", parameters = { chance=10 }, on_gain = function(self, err) return "#Target# tries to evade attacks.", "+Evasion" end, @@ -383,6 +393,7 @@ newEffect{ desc = "Speed", long_desc = function(self, eff) return ("Increases global action speed by %d%%."):format(eff.power * 100) end, type = "physical", + subtype = "speed", status = "beneficial", parameters = { power=0.1 }, on_gain = function(self, err) return "#Target# speeds up.", "+Fast" end, @@ -400,6 +411,7 @@ newEffect{ desc = "Slow", long_desc = function(self, eff) return ("Reduces global action speed by %d%%."):format( eff.power * 100) end, type = "physical", + subtype = "slow", status = "detrimental", parameters = { power=0.1 }, on_gain = function(self, err) return "#Target# slows down.", "+Slow" end, @@ -417,6 +429,7 @@ newEffect{ desc = "Blinded", long_desc = function(self, eff) return "The target is blinded, unable to see anything." end, type = "physical", + subtype = "blind", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# loses sight!", "+Blind" end, @@ -442,6 +455,7 @@ newEffect{ desc = "Dwarven Resilience", long_desc = function(self, eff) return ("The target's skin turns to stone, granting %d armour, %d physical save and %d spell save."):format(eff.armor, eff.physical, eff.spell) end, type = "physical", + subtype = "earth", status = "beneficial", parameters = { armor=10, spell=10, physical=10 }, on_gain = function(self, err) return "#Target#'s skin turns to stone." end, @@ -463,6 +477,7 @@ newEffect{ desc = "Stoneskin", long_desc = function(self, eff) return ("The target's skin reacts to damage, granting %d armour."):format(eff.power) end, type = "physical", + subtype = "earth", status = "beneficial", parameters = { power=10 }, activate = function(self, eff) @@ -474,21 +489,79 @@ newEffect{ } newEffect{ - name = "HALFLING_LUCK", - desc = "Halflings's Luck", - long_desc = function(self, eff) return ("The target's luck and cunning combine to grant it %d%% higher combat critical chance and %d%% higher spell critical chance."):format(eff.physical, eff.spell) end, + name = "FROZEN_FEET", + desc = "Frozen Feet", + long_desc = function(self, eff) return "The target is frozen on the ground, able to act freely but not move." end, type = "physical", - status = "beneficial", - parameters = { spell=10, physical=10 }, - on_gain = function(self, err) return "#Target# seems more aware." end, - on_lose = function(self, err) return "#Target#'s awareness returns to normal." end, + subtype = "cold", + status = "detrimental", + parameters = {}, + on_gain = function(self, err) return "#Target# is frozen to the ground!", "+Frozen" end, + on_lose = function(self, err) return "#Target# warms up.", "-Frozen" end, activate = function(self, eff) - eff.pid = self:addTemporaryValue("combat_physcrit", eff.physical) - eff.sid = self:addTemporaryValue("combat_spellcrit", eff.spell) + eff.tmpid = self:addTemporaryValue("never_move", 1) + eff.frozid = self:addTemporaryValue("frozen", 1) end, deactivate = function(self, eff) - self:removeTemporaryValue("combat_physcrit", eff.pid) - self:removeTemporaryValue("combat_spellcrit", eff.sid) + self:removeTemporaryValue("never_move", eff.tmpid) + self:removeTemporaryValue("frozen", eff.frozid) + end, +} + +newEffect{ + name = "FROZEN", + desc = "Frozen", + long_desc = function(self, eff) return ("The target is encased in ice. All damage done to you will be split, 40%% absorbed by the ice and 60%% by yourself. Your defense is nullified while in the ice and you may only attack the ice but you are also immune to any new detrimental status effects. The target can not teleport or heal while frozen. %d HP on the iceblock remaining."):format(eff.hp) end, + type = "physical", -- Frozen has some serious effects beyond just being frozen, no healing, no teleport, etc. But it can be applied by clearly non-magical sources i.e. Ice Breath + subtype = "cold", + status = "detrimental", + parameters = {}, + on_gain = function(self, err) return "#Target# is encased in ice!", "+Frozen" end, + on_lose = function(self, err) return "#Target# is free from the ice.", "-Frozen" end, + activate = function(self, eff) + -- Change color + eff.old_r = self.color_r + eff.old_g = self.color_g + eff.old_b = self.color_b + self.color_r = 0 + self.color_g = 255 + self.color_b = 155 + if not self.add_displays then + self.add_displays = { Entity.new{image='npc/iceblock.png', display=' ', display_on_seen=true } } + eff.added_display = true + end + if self._mo then self._mo:invalidate() self._mo = nil end + game.level.map:updateMap(self.x, self.y) + + eff.hp = eff.hp or 100 + eff.tmpid = self:addTemporaryValue("encased_in_ice", 1) + eff.healid = self:addTemporaryValue("no_healing", 1) + eff.moveid = self:addTemporaryValue("never_move", 1) + eff.frozid = self:addTemporaryValue("frozen", 1) + eff.defid = self:addTemporaryValue("combat_def", -1000) + eff.rdefid = self:addTemporaryValue("combat_def_ranged", -1000) + eff.sefid = self:addTemporaryValue("negative_status_effect_immune", 1) + + self:setTarget(self) + end, + on_timeout = function(self, eff) + self:setTarget(self) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("encased_in_ice", eff.tmpid) + self:removeTemporaryValue("no_healing", eff.healid) + self:removeTemporaryValue("never_move", eff.moveid) + self:removeTemporaryValue("frozen", eff.frozid) + self:removeTemporaryValue("combat_def", eff.defid) + self:removeTemporaryValue("combat_def_ranged", eff.rdefid) + self:removeTemporaryValue("negative_status_effect_immune", eff.sefid) + self.color_r = eff.old_r + self.color_g = eff.old_g + self.color_b = eff.old_b + if eff.added_display then self.add_displays = nil end + if self._mo then self._mo:invalidate() self._mo = nil end + game.level.map:updateMap(self.x, self.y) + self:setTarget(nil) end, } @@ -497,6 +570,7 @@ newEffect{ desc = "Wrath of the Eternals", long_desc = function(self, eff) return ("The target calls upon its inner resources, improving all damage by %d%% and reducing all damage taken by %d%%."):format(eff.power, eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# radiates power." end, @@ -511,28 +585,12 @@ newEffect{ end, } -newEffect{ - name = "ORC_FURY", - desc = "Orcish Fury", - long_desc = function(self, eff) return ("The target enters a destructive fury, increasing all damage done by %d%%."):format(eff.power) end, - type = "physical", - status = "beneficial", - parameters = { power=10 }, - on_gain = function(self, err) return "#Target# enters a state of bloodlust." end, - on_lose = function(self, err) return "#Target# calms down." end, - activate = function(self, eff) - eff.pid = self:addTemporaryValue("inc_damage", {all=eff.power}) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("inc_damage", eff.pid) - end, -} - newEffect{ name = "SHELL_SHIELD", desc = "Shell Shield", long_desc = function(self, eff) return ("The target takes cover in its shell, reducing all damage taken by %d%%."):format(eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { power=50 }, on_gain = function(self, err) return "#Target# takes cover under its shell.", "+Shell Shield" end, @@ -550,6 +608,7 @@ newEffect{ desc = "Pain Suppression", long_desc = function(self, eff) return ("The target ignores pain, reducing all damage taken by %d%%."):format(eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { power=20 }, on_gain = function(self, err) return "#Target# lessens the pain.", "+Pain Suppression" end, @@ -567,6 +626,7 @@ newEffect{ desc = "Sensing", long_desc = function(self, eff) return "Improves senses, allowing the detection of unseen things." end, type = "physical", + subtype = "sense", status = "beneficial", parameters = { range=10, actor=1, object=0, trap=0 }, activate = function(self, eff) @@ -591,6 +651,7 @@ newEffect{ desc = "Heroism", long_desc = function(self, eff) return ("Increases your three highest stats by %d."):format(eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { power=1 }, activate = function(self, eff) @@ -610,6 +671,7 @@ newEffect{ desc = "Sunder Armour", long_desc = function(self, eff) return ("The target's armour is broken, reducing it by %d."):format(eff.power) end, type = "physical", + subtype = "sunder", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -625,6 +687,7 @@ newEffect{ desc = "Sunder Arms", long_desc = function(self, eff) return ("The target's combat ability is reduced, reducing its attack by %d."):format(eff.power) end, type = "physical", + subtype = "sunder", status = "detrimental", parameters = { power=10 }, activate = function(self, eff) @@ -640,6 +703,7 @@ newEffect{ desc = "Pinned to the ground", long_desc = function(self, eff) return "The target is pinned to the ground, unable to move." end, type = "physical", + subtype = "pin", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is pinned to the ground.", "+Pinned" end, @@ -652,45 +716,12 @@ newEffect{ end, } -newEffect{ - name = "ATTACK", - desc = "Attack", - long_desc = function(self, eff) return ("The target's combat attack is improved by %d."):format(eff.power) end, - type = "physical", - status = "beneficial", - parameters = { power=10 }, - on_gain = function(self, err) return "#Target# aims carefully." end, - on_lose = function(self, err) return "#Target# aims less carefully." end, - activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("combat_atk", eff.power) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("combat_atk", eff.tmpid) - end, -} - -newEffect{ - name = "DEADLY_STRIKES", - desc = "Deadly Strikes", - long_desc = function(self, eff) return ("The target's armour penetration is increased by %d."):format(eff.power) end, - type = "physical", - status = "beneficial", - parameters = { power=10 }, - on_gain = function(self, err) return "#Target# aims carefully." end, - on_lose = function(self, err) return "#Target# aims less carefully." end, - activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("combat_apr", eff.power) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("combat_apr", eff.tmpid) - end, -} - newEffect{ name = "MIGHTY_BLOWS", desc = "Mighty Blows", long_desc = function(self, eff) return ("The target's combat damage is improved by %d."):format(eff.power) end, type = "physical", + subtype = "golem", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# looks menacing." end, @@ -809,6 +840,7 @@ newEffect{ desc = "Cripple", long_desc = function(self, eff) return ("The target is crippled, reducing attack by %d and damage by %d."):format(eff.atk, eff.dam) end, type = "physical", + subtype = "wound", status = "detrimental", parameters = { atk=10, dam=10 }, on_gain = function(self, err) return "#Target# is crippled." end, @@ -828,6 +860,7 @@ newEffect{ desc = "Golem Mount", long_desc = function(self, eff) return "The target is inside his golem." end, type = "physical", + subtype = "golem", status = "beneficial", parameters = { }, activate = function(self, eff) @@ -855,6 +888,7 @@ newEffect{ desc = "Burrow", long_desc = function(self, eff) return "The target is able to burrow into walls." end, type = "physical", + subtype = "earth", status = "beneficial", parameters = { }, activate = function(self, eff) @@ -867,181 +901,12 @@ newEffect{ end, } -newEffect{ - name = "INCREASED_LIFE", - desc = "Increased Life", - long_desc = function(self, eff) return ("The target's maximum life is increased by %d."):format(eff.life) end, - type = "physical", - status = "beneficial", - on_gain = function(self, err) return "#Target# gains extra life.", "+Life" end, - on_lose = function(self, err) return "#Target# loses extra life.", "-Life" end, - parameters = { life = 50 }, - activate = function(self, eff) - self.max_life = self.max_life + eff.life - self.life = self.life + eff.life - self.changed = true - end, - deactivate = function(self, eff) - self.max_life = self.max_life - eff.life - self.life = self.life - eff.life - self.changed = true - if self.life <= 0 then - self.life = 1 - self:setEffect(self.EFF_STUNNED, 3, {}) - game.logSeen(self, "%s's increased life wears off and is stunned by the change.", self.name:capitalize()) - end - end, -} - -newEffect{ - name = "RAMPAGE", - desc = "Rampaging", - long_desc = function(self, eff) return "The target is rampaging!" end, - type = "physical", - status = "beneficial", - parameters = { hateLoss = 0, critical = 0, damage = 0, speed = 0, attack = 0, evasion = 0 }, -- use percentages not fractions - on_gain = function(self, err) return "#F53CBE##Target# begins rampaging!", "+Rampage" end, - on_lose = function(self, err) return "#F53CBE##Target# is no longer rampaging.", "-Rampage" end, - activate = function(self, eff) - if eff.hateLoss or 0 > 0 then eff.hateLossId = self:addTemporaryValue("hate_regen", -eff.hateLoss) end - if eff.critical or 0 > 0 then eff.criticalId = self:addTemporaryValue("combat_physcrit", eff.critical) end - if eff.damage or 0 > 0 then eff.damageId = self:addTemporaryValue("inc_damage", {[DamageType.PHYSICAL]=eff.damage}) end - if eff.speed or 0 > 0 then eff.speedId = self:addTemporaryValue("global_speed_add", eff.speed * 0.01) end - if eff.attack or 0 > 0 then eff.attackId = self:addTemporaryValue("combat_atk", self:combatAttack() * eff.attack * 0.01) end - if eff.evasion or 0 > 0 then eff.evasionId = self:addTemporaryValue("evasion", eff.evasion) end - - eff.particle = self:addParticles(Particles.new("rampage", 1)) - end, - deactivate = function(self, eff) - if eff.hateLossId then self:removeTemporaryValue("hate_regen", eff.hateLossId) end - if eff.criticalId then self:removeTemporaryValue("combat_physcrit", eff.criticalId) end - if eff.damageId then self:removeTemporaryValue("inc_damage", eff.damageId) end - if eff.speedId then self:removeTemporaryValue("global_speed_add", eff.speedId) end - if eff.attackId then self:removeTemporaryValue("combat_atk", eff.attackId) end - if eff.evasionId then self:removeTemporaryValue("evasion", eff.evasionId) end - - self:removeParticles(eff.particle) - end, -} - -newEffect{ - name = "FRENZY", - desc = "Frenzy", - long_desc = function(self, eff) return ("Increases global action speed by %d%% and physical crit by %d%%.\nAdditionally the target will continue to fight until it's hit points reach -%d%%."):format(eff.power * 100, eff.crit, eff.dieat * 100) end, - type = "physical", - status = "beneficial", - parameters = { power=0.1 }, - on_gain = function(self, err) return "#Target# goes into a killing frenzy.", "+Frenzy" end, - on_lose = function(self, err) return "#Target# calms down.", "-Frenzy" end, - on_merge = function(self, old_eff, new_eff) - -- use on merge so reapplied frenzy doesn't kill off creatures with negative life - old_eff.dur = new_eff.dur - old_eff.power = new_eff.power - old_eff.crit = new_eff.crit - return old_eff - end, - activate = function(self, eff) - eff.tmpid = self:addTemporaryValue("global_speed_add", eff.power) - eff.critid = self:addTemporaryValue("combat_physcrit", eff.crit) - eff.dieatid = self:addTemporaryValue("die_at", -self.max_life * eff.dieat) - end, - deactivate = function(self, eff) - -- check negative life first incase the creature has healing - if self.life <= 0 then - local sx, sy = game.level.map:getTileToScreen(self.x, self.y) - game.flyers:add(sx, sy, 30, (rng.range(0,2)-1) * 0.5, rng.float(-2.5, -1.5), "Falls dead!", {255,0,255}) - game.logSeen(self, "%s dies when its frenzy ends!", self.name:capitalize()) - self:die(self) - end - self:removeTemporaryValue("global_speed_add", eff.tmpid) - self:removeTemporaryValue("combat_physcrit", eff.critid) - self:removeTemporaryValue("die_at", eff.dieatid) - end, -} - -newEffect{ - name = "BLOODBATH", - desc = "Bloodbath", - long_desc = function(self, eff) return ("The thrill of combat improves the target's maximum life by %d, life regeneration by %d%% and stamina regeneration by %d%%."):format(eff.hp, eff.regen, eff.regen) end, - type = "physical", - status = "beneficial", - parameters = { hp=10, regen=10 }, - on_gain = function(self, err) return nil, "+Bloodbath" end, - on_lose = function(self, err) return nil, "-Bloodbath" end, - on_merge = function(self, old_eff, new_eff) - self:removeTemporaryValue("max_life", old_eff.life_id) - self:removeTemporaryValue("life_regen", old_eff.life_regen_id) - self:removeTemporaryValue("stamina_regen", old_eff.stamina_regen_id) - - -- Take the new values, dont heal, otherwise you get a free heal each crit .. which is totaly broken - local v = new_eff.hp * self.max_life / 100 - new_eff.life_id = self:addTemporaryValue("max_life", v) - new_eff.life_regen_id = self:addTemporaryValue("life_regen", new_eff.regen * self.life_regen / 100) - new_eff.stamina_regen_id = self:addTemporaryValue("stamina_regen", new_eff.regen * self.stamina_regen / 100) - return new_eff - end, - activate = function(self, eff) - local v = eff.hp * self.max_life / 100 - eff.life_id = self:addTemporaryValue("max_life", v) - self:heal(v) - eff.life_regen_id = self:addTemporaryValue("life_regen", eff.regen * self.life_regen / 100) - eff.stamina_regen_id = self:addTemporaryValue("stamina_regen", eff.regen * self.stamina_regen / 100) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("max_life", eff.life_id) - self:removeTemporaryValue("life_regen", eff.life_regen_id) - self:removeTemporaryValue("stamina_regen", eff.stamina_regen_id) - end, -} - -newEffect{ - name = "BLOODRAGE", - desc = "Bloodrage", - long_desc = function(self, eff) return ("The target's strength is increased by %d by the thrill of combat."):format(eff.inc) end, - type = "physical", - status = "beneficial", - parameters = { inc=1, max=10 }, - on_merge = function(self, old_eff, new_eff) - self:removeTemporaryValue("inc_stats", old_eff.tmpid) - old_eff.cur_inc = math.min(old_eff.cur_inc + new_eff.inc, new_eff.max) - old_eff.tmpid = self:addTemporaryValue("inc_stats", {[Stats.STAT_STR] = old_eff.cur_inc}) - - old_eff.dur = new_eff.dur - return old_eff - end, - activate = function(self, eff) - eff.cur_inc = eff.inc - eff.tmpid = self:addTemporaryValue("inc_stats", {[Stats.STAT_STR] = eff.inc}) - end, - deactivate = function(self, eff) - self:removeTemporaryValue("inc_stats", eff.tmpid) - end, -} - -newEffect{ - name = "UNSTOPPABLE", - desc = "Unstoppable", - long_desc = function(self, eff) return ("The target is unstoppable! It refuses to die, and at the end it will heal %d Life."):format(eff.kills * eff.hp_per_kill * self.max_life / 100) end, - type = "physical", - status = "beneficial", - parameters = { hp_per_kill=2 }, - activate = function(self, eff) - eff.kills = 0 - eff.tmpid = self:addTemporaryValue("unstoppable", 1) - eff.healid = self:addTemporaryValue("no_life_regen", 1) - end, - deactivate = function(self, eff) - self:heal(eff.kills * eff.hp_per_kill * self.max_life / 100) - self:removeTemporaryValue("unstoppable", eff.tmpid) - self:removeTemporaryValue("no_life_regen", eff.healid) - end, -} - newEffect{ name = "DIM_VISION", desc = "Reduced Vision", long_desc = function(self, eff) return ("The target's vision range is decreased by %d."):format(eff.sight) end, type = "physical", + subtype = "sense", status = "detrimental", parameters = { sight=5 }, on_gain = function(self, err) return "#Target# is surrounded by a thick smoke.", "+Dim Vision" end, @@ -1063,6 +928,7 @@ newEffect{ desc = "Suppress Summon", long_desc = function(self, eff) return "Your summons are suppressed by some force." end, type = "physical", + subtype = "suppression", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# attunes to the damage.", "+Resolve" end, @@ -1080,6 +946,7 @@ newEffect{ desc = "Resolve", long_desc = function(self, eff) return ("You gain %d%% resistance against %s."):format(eff.res, DamageType:get(eff.damtype).name) end, type = "physical", + subtype = "antimagic", status = "beneficial", parameters = { res=10, damtype=DamageType.ARCANE }, on_gain = function(self, err) return "#Target# attunes to the damage.", "+Resolve" end, @@ -1097,6 +964,7 @@ newEffect{ desc = "Wild Speed", long_desc = function(self, eff) return ("The movement infusion allows you to run at extreme fast pace. Any other action other than movement will cancel it .Movement is %d%% faster."):format(eff.power) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = {power=1000}, on_gain = function(self, err) return "#Target# prepares for the next kill!.", "+Wild Speed" end, @@ -1118,6 +986,7 @@ newEffect{ desc = "Step Up", long_desc = function(self, eff) return ("Movement is %d%% faster."):format(eff.power) end, type = "physical", + subtype = "speed", status = "beneficial", parameters = {power=1000}, on_gain = function(self, err) return "#Target# prepares for the next kill!.", "+Step Up" end, @@ -1139,6 +1008,7 @@ newEffect{ desc = "Lightning Speed", long_desc = function(self, eff) return ("Turn into pure lightning, moving %d%% faster. It also increases your lightning resistance by 100%% and your physical resistance by 30%%."):format(eff.power) end, type = "physical", + subtype = "lightning", status = "beneficial", parameters = {}, on_gain = function(self, err) return "#Target# turns into pure lightning!.", "+Lightning Speed" end, @@ -1167,6 +1037,7 @@ newEffect{ desc = "Dragon's Fire", long_desc = function(self, eff) return ("Dragon blood runs through your veins. You can breathe fire (or have it improved if you already could)."):format() end, type = "physical", + subtype = "fire", status = "beneficial", parameters = {power=1}, on_gain = function(self, err) return "#Target#'s throat seems to be burning.", "+Dragon's fire" end, @@ -1206,6 +1077,7 @@ newEffect{ desc = "Crushed", long_desc = function(self, eff) return ("Intense gravity that pins and deals %0.2f physical damage per turn."):format(eff.power) end, type = "physical", + subtype = "gravity", status = "detrimental", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is being crushed!", "+Crushed" end, @@ -1229,6 +1101,7 @@ newEffect{ desc = "Greater Weapon Focus", long_desc = function(self, eff) return ("%d%% chance to score a secondary blow."):format(eff.chance) end, type = "physical", + subtype = "tactic", status = "beneficial", parameters = { chance=50 }, activate = function(self, eff) @@ -1243,6 +1116,7 @@ newEffect{ desc = "Grappling", long_desc = function(self, eff) return ("The target is engaged in a grapple. Any movement will break the effect as will some unarmed talents."):format() end, type = "physical", + subtype = "grapple", status = "beneficial", parameters = {}, on_gain = function(self, err) return "#Target# is engaged in a grapple!", "+Grappling" end, @@ -1267,6 +1141,7 @@ newEffect{ desc = "Grappled", long_desc = function(self, eff) return ("The target is grappled, unable to move, and has it's defense and attack reduced by %d."):format(eff.power) end, type = "physical", + subtype = "grapple", status = "detrimental", parameters = {}, remove_on_clone = true, @@ -1294,6 +1169,7 @@ newEffect{ desc = "Crushing Hold", long_desc = function(self, eff) return ("The target is being crushed and suffers %d damage each turn"):format(eff.power) end, type = "physical", + subtype = "grapple", status = "detrimental", parameters = { power=1 }, on_gain = function(self, err) return "#Target# is being crushed.", "+Crushing Hold" end, @@ -1313,6 +1189,7 @@ newEffect{ desc = "Strangle Hold", long_desc = function(self, eff) return ("The target is being strangled and may not cast spells and suffers %d damage each turn."):format(eff.power) end, type = "physical", + subtype = "grapple", status = "detrimental", parameters = { power=1 }, on_gain = function(self, err) return "#Target# is being strangled.", "+Strangle Hold" end, @@ -1338,6 +1215,7 @@ newEffect{ desc = "Maimed", long_desc = function(self, eff) return ("The target is maimed, reducing damage by %d and global speed by 30%%."):format(eff.power) end, type = "physical", + subtype = "wound", status = "detrimental", parameters = { atk=10, dam=10 }, on_gain = function(self, err) return "#Target# is maimed.", "+Maimed" end, @@ -1358,6 +1236,7 @@ newEffect{ display_desc = function(self, eff) return eff.cur_power.." Combo" end, long_desc = function(self, eff) return ("The target is in the middle of a combo chain and has earned %d combo points."):format(eff.cur_power) end, type = "physical", + subtype = "tactic", status = "beneficial", parameters = { power=1, max=5 }, on_merge = function(self, old_eff, new_eff) @@ -1382,6 +1261,7 @@ newEffect{ desc = "Defensive Maneuver", long_desc = function(self, eff) return ("The target's defense is increased by %d."):format(eff.power) end, type = "physical", + subtype = "evasion", status = "beneficial", parameters = {power = 1}, on_gain = function(self, err) return "#Target# is moving defensively!", "+Defensive Maneuver" end, @@ -1399,6 +1279,7 @@ newEffect{ desc = "Set Up", long_desc = function(self, eff) return ("The target is off balance and is %d%% more likely to be crit by the target that set it up. In addition all it's saves are reduced by %d."):format(eff.power, eff.power) end, type = "physical", + subtype = "tactic", status = "detrimental", parameters = {power = 1}, on_gain = function(self, err) return "#Target# has been set up!", "+Set Up" end, @@ -1420,6 +1301,7 @@ newEffect{ desc = "Recovery", long_desc = function(self, eff) return ("The target is recovering from a damaging blow and regaining %d life each turn."):format(eff.power) end, type = "physical", + subtype = "conditioning", status = "beneficial", parameters = { power=10 }, on_gain = function(self, err) return "#Target# is recovering from the attack!", "+Recovery" end, @@ -1437,6 +1319,7 @@ newEffect{ desc = "Reflexive Dodging", long_desc = function(self, eff) return ("Increases global action speed by %d%%."):format(eff.power * 100) end, type = "physical", + subtype = "evasion", status = "beneficial", parameters = { power=0.1 }, on_gain = function(self, err) return "#Target# speeds up.", "+Reflexive Dodging" end, @@ -1454,6 +1337,7 @@ newEffect{ desc = "Weakened Defenses", long_desc = function(self, eff) return ("The target's physical resistance has been reduced by %d%%."):format(eff.inc) end, type = "physical", + subtype = "sunder", status = "detrimental", parameters = { inc=1, max=5 }, on_merge = function(self, old_eff, new_eff) @@ -1480,6 +1364,7 @@ newEffect{ desc = "Stone Vine", long_desc = function(self, eff) return ("A living stone vine holds the target on the ground and doing %0.2f physical damage per turn."):format(eff.dam) end, type = "physical", + subtype = "earth", status = "detrimental", parameters = { dam=10 }, on_gain = function(self, err) return "#Target# is grabbed by a stone vine.", "+Stone Vine" end, @@ -1519,6 +1404,7 @@ newEffect{ desc = "Waters of Life", long_desc = function(self, eff) return ("The target purifies all diseases and poisons, turning them into healing effects.") end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { }, activate = function(self, eff) @@ -1543,6 +1429,7 @@ newEffect{ end end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { }, activate = function(self, eff) @@ -1586,6 +1473,7 @@ newEffect{ desc = "Healing Nexus", long_desc = function(self, eff) return ("All healing done to the target is instead redirected to %s by %d%%."):format(eff.src.name, eff.pct * 100, eff.src.name) end, type = "physical", + subtype = "nature", status = "beneficial", parameters = { pct = 1 }, activate = function(self, eff) @@ -1649,6 +1537,7 @@ newEffect{ desc = "Immobilized", long_desc = function(self, eff) return "Immobilized by telekinetic forces." end, type = "physical", + subtype = "telekinesis", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#F53CBE##Target# is bound by telekinetic forces!", "+Paralyzed" end, @@ -1671,6 +1560,7 @@ newEffect{ desc = "Slow", long_desc = function(self, eff) return ("Slowed by 50%% and taking %d crushing damage per turn."):format( eff.power) end, type = "physical", + subtype = "telekinesis", status = "detrimental", parameters = {}, on_gain = function(self, err) return "#Target# is being crushed.", "+Imploding" end, @@ -1684,4 +1574,26 @@ newEffect{ on_timeout = function(self, eff) DamageType:get(DamageType.PHYSICAL).projector(eff.src, self.x, self.y, DamageType.PHYSICAL, eff.power) end, +} + +newEffect{ + name = "FREE_ACTION", + desc = "Free Action", + long_desc = function(self, eff) return ("The target gains %d%% stun, daze and pinning immunity."):format(eff.power * 100) end, + type = "physical", + subtype = "nature", + status = "beneficial", + parameters = { power=1 }, + on_gain = function(self, err) return "#Target# is moving freely.", "+Free Action" end, + on_lose = function(self, err) return "#Target# is moving less freely.", "-Free Action" end, + activate = function(self, eff) + eff.stun = self:addTemporaryValue("stun_immune", eff.power) + eff.daze = self:addTemporaryValue("daze_immune", eff.power) + eff.pin = self:addTemporaryValue("pin_immune", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("stun_immune", eff.stun) + self:removeTemporaryValue("daze_immune", eff.daze) + self:removeTemporaryValue("pin_immune", eff.pin) + end, } \ No newline at end of file diff --git a/game/modules/tome/dialogs/CharacterSheet.lua b/game/modules/tome/dialogs/CharacterSheet.lua index 4795b03ad4..443da0a513 100644 --- a/game/modules/tome/dialogs/CharacterSheet.lua +++ b/game/modules/tome/dialogs/CharacterSheet.lua @@ -852,7 +852,6 @@ function _M:dump() nl(("CON: %d"):format(player:getCon())) -- All weapons in main hands - local strings = {} for i = 1, 6 do strings[i]="" end if player:getInven(player.INVEN_MAINHAND) then @@ -871,6 +870,18 @@ function _M:dump() if mean and mean.range then strings[6] = ("Range (Main Hand): %3d"):format(mean.range) end end end + --Unarmed?? + if player:isUnarmed() then + local mean, dam = player.combat, player.combat + if mean and dam then + strings[1] = ("Accuracy(Unarmed): %3d"):format(player:combatAttack(mean)) + strings[2] = ("Damage (Unarmed): %3d"):format(player:combatDamage(dam)) + strings[3] = ("APR (Unarmed): %3d"):format(player:combatAPR(dam)) + strings[4] = ("Crit (Unarmed): %3d%%"):format(player:combatCrit(dam)) + strings[5] = ("Speed (Unarmed): %0.2f"):format(player:combatSpeed(mean)) + end + if mean and mean.range then strings[6] = ("Range (Unarmed): %3d"):format(mean.range) end + end local enc, max = player:getEncumbrance(), player:getMaxEncumbrance() @@ -918,6 +929,12 @@ function _M:dump() else nl() end + nnl(("%-32s"):format("")) + if player:knowTalent(player.T_PARADOX_POOL) then + nl((makelabel("Paradox", (" %d"):format(player:getParadox())))) + else + nl() + end -- All weapons in off hands -- Offhand attacks are with a damage penalty, that can be reduced by talents -- GitLab