diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 1f6301e3deab9637be95ec3c9f44e580ae2870df..9435f0b69ff48b654b77c792d44b1ebe900dcc20 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1515,7 +1515,7 @@ function _M:canSeeNoCache(actor, def, def_pct) -- Check for stealth. Checks against the target cunning and level if actor:attr("stealth") and actor ~= self then - local def = self.level / 2 + self:getCun(25) + local def = self.level / 2 + self:getCun(25) + (self:attr("see_stealth") or 0) local hit, chance = self:checkHit(def, actor:attr("stealth") + (actor:attr("inc_stealth") or 0), 0, 100) if not hit then return false, chance diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index 5d9fb588f0f862065ae50e808cc24327d377f59a..2e760638682115cbd59975b870a9b52fcbe0d062 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -38,6 +38,12 @@ setDefaultProjector(function(src, x, y, type, dam) end print("[PROJECTOR] after difficulty dam", dam) + -- Preemptive shielding + if target.isTalentActive and target:isTalentActive(target.T_PREMONITION) then + local t = target:getTalentFromId(target.T_PREMONITION) + t.on_damage(target, target.T_PREMONITION, type) + end + -- Increases damage if src.inc_damage then local inc = (src.inc_damage.all or 0) + (src.inc_damage[type] or 0) @@ -58,6 +64,7 @@ setDefaultProjector(function(src, x, y, type, dam) end print("[PROJECTOR] after resists dam", dam) + -- Static reduce damage if target.isTalentActive and target:isTalentActive(target.T_ANTIMAGIC_SHIELD) then local t = target:getTalentFromId(target.T_ANTIMAGIC_SHIELD) dam = t.on_damage(target, target.T_ANTIMAGIC_SHIELD, type, dam) diff --git a/game/modules/tome/data/talents/spells/divination.lua b/game/modules/tome/data/talents/spells/divination.lua index 4792b52974bcb8701d318f060710a9380f668226..f5ae4aed45b1eb13f27e38daec27d666220672df 100644 --- a/game/modules/tome/data/talents/spells/divination.lua +++ b/game/modules/tome/data/talents/spells/divination.lua @@ -18,29 +18,35 @@ -- darkgod@te4.org newTalent{ - name = "Sense", + name = "Keen Senses", type = {"spell/divination", 1}, require = spells_req1, + mode = "sustained", points = 5, - random_ego = "utility", - mana = 10, - cooldown = 10, - action = function(self, t) - local rad = 10 + self:combatSpellpower(0.1) * self:getTalentLevel(t) - self:setEffect(self.EFF_SENSE, 2, { - range = rad, - actor = 1, - object = (self:getTalentLevel(t) >= 2) and 1 or 0, - trap = (self:getTalentLevel(t) >= 5) and 1 or 0, - }) + sustain_mana = 40, + cooldown = 30, + activate = function(self, t) game:playSoundNear(self, "talents/spell_generic") + return { + invis = self:addTemporaryValue("see_invisible", self:combatTalentSpellDamage(t, 2, 45)), + stealth = self:addTemporaryValue("see_stealth", self:combatTalentSpellDamage(t, 2, 20)), + crit = self:addTemporaryValue("combat_spellcrit", self:combatTalentSpellDamage(t, 2, 12)), + } + end, + deactivate = function(self, t, p) + self:removeTemporaryValue("see_invisible", p.invis) + self:removeTemporaryValue("see_stealth", p.stealth) + self:removeTemporaryValue("combat_spellcrit", p.crit) return true end, info = function(self, t) - return ([[Sense foes around you in a radius of %d. - At level 2 it detects objects. - At level 5 it detects traps. - The radius will increase with the Magic stat]]):format(10 + self:combatSpellpower(0.1) * self:getTalentLevel(t)) + return ([[You focus your senses, getting informations from moments in the future. + Improves see invisible +%d. + Improves see through stealth +%d. + Improves critical spell chance +%d%%. + The effects will improve with the Magic stat]]):format( + self:combatTalentSpellDamage(t, 2, 45), self:combatTalentSpellDamage(t, 2, 20), self:combatTalentSpellDamage(t, 2, 12) + ) end, } @@ -97,30 +103,33 @@ newTalent{ } newTalent{ - name = "Telepathy", + name = "Premonition", type = {"spell/divination", 4}, mode = "sustained", require = spells_req4, points = 5, - sustain_mana = 200, + sustain_mana = 120, cooldown = 30, + on_damage = function(self, t, damtype) + if damtype == DamageType.PHYSICAL then return end + + if not self:hasEffect(self.EFF_PREMONITION_SHIELD) then + self:setEffect(self.EFF_PREMONITION_SHIELD, 5, {damtype=damtype, resist=10 + self:combatTalentSpellDamage(t, 2, 25)}) + game.logPlayer(self, "#OLIVE_DRAB#Your premonition allows you to raise a shield just in time!") + end + end, activate = function(self, t) - -- There is an implicit +10, as it is the default radius - local rad = self:combatTalentSpellDamage(t, 2, 10) game:playSoundNear(self, "talents/spell_generic") return { - esp = self:addTemporaryValue("esp", {range=rad, all=1}), - drain = self:addTemporaryValue("mana_regen", -3 * self:getTalentLevelRaw(t)), } end, deactivate = function(self, t, p) - self:removeTemporaryValue("esp", p.esp) - self:removeTemporaryValue("mana_regen", p.drain) return true end, info = function(self, t) - return ([[Allows you to sense the presence of foes, in a radius of %d. - This powerful spell will continuously drain mana while active. - The bonus will increase with the Magic stat]]):format(10 + self:combatTalentSpellDamage(t, 2, 10)) + return ([[Echos of the future flashes before your eyes, allowing you to sense some incomming attacks. + If the attack is elemental or magical you will erect a temporary shield that reduces all damage of this type by %d%% for 5 turns. + This effect can only happen once every 5 turns. + The bonus will increase with the Magic stat]]):format(10 + self:combatTalentSpellDamage(t, 2, 25), 5) end, } diff --git a/game/modules/tome/data/timed_effects.lua b/game/modules/tome/data/timed_effects.lua index 9154f78c290f11e0760c4c8f6652c7b1a0473aa8..f450552882b40b94abfde62908e6f7981d3f5f7c 100644 --- a/game/modules/tome/data/timed_effects.lua +++ b/game/modules/tome/data/timed_effects.lua @@ -1918,3 +1918,20 @@ newEffect{ end end, } + +newEffect{ + name = "PREMONITION_SHIELD", + 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", + status = "beneficial", + parameters = { }, + on_gain = function(self, err) return "#Target# casts a protective shield just in time!", "+Premonition Shield" end, + on_lose = function(self, err) return "The protective shield of #Target# disappears.", "-Premonition Shield" end, + activate = function(self, eff) + eff.tmpid = self:addTemporaryValue("resists", {[eff.damtype]=eff.resist}) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("resists", eff.tmpid) + end, +} diff --git a/game/modules/tome/data/zones/tempest-peak/zone.lua b/game/modules/tome/data/zones/tempest-peak/zone.lua index 71520e799b7c94279d77aa8c91bbd956b48cebed..94be3e583148039fc48a5ecfbaa1033b0fb4178d 100644 --- a/game/modules/tome/data/zones/tempest-peak/zone.lua +++ b/game/modules/tome/data/zones/tempest-peak/zone.lua @@ -38,7 +38,7 @@ return { lite_room_chance = 100, ['.'] = "ROCKY_GROUND", ['#'] = "MOUNTAIN_WALL", - up = "UP", + up = "ROCKY_GROUND", down = "DOWN", door = "DOOR", },