diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index 4f2246839c9113e13fc6a372faa0da5ac1e654d0..83baec62ddcc779e7ab34277bfbca6ae9a0b263c 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -1585,6 +1585,7 @@ function _M:getTextualDesc(compare_with, use_actor) compare_fields(w, compare_with, field, "mana_regen", "%+.2f", "Mana each turn: ") compare_fields(w, compare_with, field, "hate_regen", "%+.2f", "Hate each turn: ") compare_fields(w, compare_with, field, "psi_regen", "%+.2f", "Psi each turn: ") + compare_fields(w, compare_with, field, "equilibrium_regen", "%+.2f", "Equilibrium each turn: ", nil, true, true) compare_fields(w, compare_with, field, "vim_regen", "%+.2f", "Vim each turn: ") compare_fields(w, compare_with, field, "positive_regen_ref_mod", "%+.2f", "P.Energy each turn: ") compare_fields(w, compare_with, field, "negative_regen_ref_mod", "%+.2f", "N.Energy each turn: ") diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index b8829f37c36f54d957c05f13ceaf7b2a1b22eb2a..3b1bb32bf087b5ab56df538b12b29f2730cad127 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -1700,7 +1700,7 @@ newEntity{ base = "BASE_MACE", unided_name = "a strangely colored bone", unique = true, moddable_tile = "special/%s_club_ureslaks_femur", moddable_tile_big = true, - desc = [[A shortened femur of the mighty prismatic dragon, this erratic club still pulses with Ureslak's volatile nature.]], + desc = [[A shortened femur of the mighty prismatic dragon Ureslak, this erratic club still resonates with his volatile nature.]], level_range = {42, 50}, require = { stat = { str=45, dex=30 }, }, rarity = 400, @@ -1762,6 +1762,71 @@ newEntity{ base = "BASE_MACE", inc_damage = { all = 12, [DamageType.ARCANE] = 30 }, } }, }, + set_list = { {"define_as","URESLAK_CLOAK"} }, + set_desc = { + ureslak = "What would happen if more of Ureslak's remains were reunited?", + }, +} + +newEntity{ base = "BASE_CLOAK", + power_source = {nature=true}, + unique = true, + name = "Ureslak's Molted Scales", define_as = "URESLAK_CLOAK", image = "object/artifact/ureslaks_molted_scales.png", + unided_name = "scaly multi-hued cloak", + desc = [[This cloak is fashioned from the scales of some large reptilian creature. It appears to reflect every color of the rainbow.]], + level_range = {40, 50}, + rarity = 400, + cost = 300, + material_level = 5, + wielder = { + resists_cap = { + [DamageType.FIRE] = 10, + [DamageType.COLD] = 10, + [DamageType.LIGHTNING] = 10, + [DamageType.NATURE] = 10, + [DamageType.DARKNESS] = 10, + [DamageType.ARCANE] = -30, + }, + resists = { + [DamageType.FIRE] = 20, + [DamageType.COLD] = 20, + [DamageType.LIGHTNING] = 20, + [DamageType.NATURE] = 20, + [DamageType.DARKNESS] = 20, + [DamageType.ARCANE] = -30, + }, + }, + max_power = 50, power_regen = 1, + use_power = { + name = function(self, who) + local resists={"Fire", "Cold", "Lightning", "Nature", "Darkness"} + if self.set_complete then table.insert(resists, "Arcane") end + return ("energize the scales for 16 turns, increasing resistance to %s damage by 15%% just before you are damaged. (This effect lasts 5 turns and only works on one type of damage.)"):format(table.concatNice(resists, ", ", ", or ")) + end, + tactical = { DEFEND = 1 }, + power = 50, + use = function(self, who) + game.logSeen(who, "%s empowers %s %s!", who.name:capitalize(), who:his_her(), self:getName({do_color = true, no_add_name = true})) + local resists = table.values({engine.DamageType.FIRE, engine.DamageType.COLD, engine.DamageType.LIGHTNING, engine.DamageType.NATURE, engine.DamageType.DARKNESS2, engine.DamageType.DARKNESS}) + if self.set_complete then table.insert(resists, engine.DamageType.ARCANE) end + who:setEffect(who.EFF_CHROMATIC_RESONANCE, 16, {resist_types=resists}) + return {id=true, used=true} + end, + }, + set_list = { {"define_as","URESLAK_FEMUR"} }, + set_desc = { + ureslak = "It would go well with another part of Ureslak.", + }, + on_set_complete = function(self, who) + self:specialSetAdd({"wielder","equilibrium_regen"}, -1) + self:specialSetAdd({"wielder","resists"}, {[engine.DamageType.ARCANE]=15}) + self:specialSetAdd({"wielder","resists_cap"}, {[engine.DamageType.ARCANE]=15}) + game.logSeen(who, "#YELLOW_GREEN#An ironic harmony surrounds Ureslak's remains as they reunite.") + end, + on_set_broken = function(self, who) + self.wielder.equilibrium_regen = nil + game.logSeen(who, "#YELLOW_GREEN#Ureslak's remains seem more unsettled.") + end, } newEntity{ base = "BASE_WARAXE", @@ -1961,47 +2026,6 @@ newEntity{ base = "BASE_AMULET", use_talent = { id = Talents.T_ARCANE_EYE, level = 2, power = 60 }, } -newEntity{ base = "BASE_CLOAK", - power_source = {nature=true}, - unique = true, - name = "Ureslak's Molted Scales", image = "object/artifact/ureslaks_molted_scales.png", - unided_name = "scaley multi-hued cloak", - desc = [[This cloak is fashioned from the scales of some large reptilian creature. It appears to reflect every color of the rainbow.]], - level_range = {40, 50}, - rarity = 400, - cost = 300, - material_level = 5, - wielder = { - resists_cap = { - [DamageType.FIRE] = 10, - [DamageType.COLD] = 10, - [DamageType.LIGHTNING] = 10, - [DamageType.NATURE] = 10, - [DamageType.DARKNESS] = 10, - [DamageType.ARCANE] = -30, - }, - resists = { - [DamageType.FIRE] = 20, - [DamageType.COLD] = 20, - [DamageType.LIGHTNING] = 20, - [DamageType.NATURE] = 20, - [DamageType.DARKNESS] = 20, - [DamageType.ARCANE] = -30, - }, - }, - max_power = 50, power_regen = 1, - use_power = { - name = function(self, who) return "empower the scales for 16 turns, increasing a resistance (fire, cold, lightning, nature, darkness) by 15% when you are about to be hit (this effect can only happen once every 5 turns and lasts 5 turns)." end, - tactical = { BUFF = 1 }, - power = 50, - use = function(self, who) - game.logSeen(who, "%s empowers %s %s!", who.name:capitalize(), who:his_her(), self:getName({do_color = true, no_add_name = true})) - who:setEffect(who.EFF_URESLAK_MOLTEN_SCALES, 16, {}) - return {id=true, used=true} - end, - }, -} - newEntity{ base = "BASE_DIGGER", power_source = {technique=true}, unique = true, diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index 29bf9dadf90e704afa97c32c0def51fea95aeb51..79d032538d0f6f1c042c77bb70a5fbe564a20c1c 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -3981,29 +3981,40 @@ newEffect{ end, } +-- Premptive Chromatic resistance newEffect{ - name = "URESLAK_MOLTEN_SCALES", image = "shockbolt/object/artifact/ureslaks_molted_scales.png", - desc = "Ureslak's Molten Scales", - long_desc = function(self, eff) return ("Reacts to attacks by raising resistances for 5 turns."):format() end, + name = "CHROMATIC_RESONANCE", image = "shockbolt/object/artifact/ureslaks_molted_scales.png", + desc = "Chromatic Resonance", + long_desc = function(self, eff) + local dt_descs = table.concatNice(eff.type_descs, ", ", ", or ") + return ("Preemptively reacts to %s damage, increasing the appropriate resistance by %d for 5 turns."):format(dt_descs, eff.power) + end, type = "physical", subtype = { nature=true, resist=true }, status = "beneficial", - parameters = { }, - on_gain = function(self, err) return nil, true end, - on_lose = function(self, err) return nil, true end, + parameters = {power=15, resist_types={"FIRE", "COLD", "LIGHTNING", "NATURE", "DARKNESS"} }, + on_gain = function(self, err) return "#Target##OLIVE_DRAB# shimmers in multiple hues.", true end, + on_lose = function(self, err) return "#Target#'s#OLIVE_DRAB# multi-hued shimmer fades.", true end, callbackOnTakeDamageBeforeResists = function(self, eff, src, x, y, type, dam, state) - if not self:hasEffect(self.EFF_URESLAK_MOLTEN_SCALES_RESIST) and dam > 0 and src ~= self and ( - (type == DamageType.FIRE) or - (type == DamageType.COLD) or - (type == DamageType.LIGHTNING) or - (type == DamageType.NATURE) or - (type == DamageType.DARKNESS) - ) then - self:setEffect(self.EFF_URESLAK_MOLTEN_SCALES_RESIST, 5, {type=type}) + if dam > 0 and src ~= self and not self:hasEffect(self.EFF_CHROMATIC_RESISTANCE) then + for i, r_type in ipairs(eff.resist_types) do + if type == r_type then + self:setEffect(self.EFF_CHROMATIC_RESISTANCE, 5, {type=type, power=eff.power}) + break + end + end end return {dam=dam} end, activate = function(self, eff) + eff.type_descs = {} + for i = #eff.resist_types, 1, -1 do + local dt = DamageType[eff.resist_types[i]] and DamageType:get(eff.resist_types[i]) + if dt then + table.insert(eff.type_descs, (dt.text_color or "#aaaaaa#")..dt.name:capitalize().."#LAST#") + else table.remove(eff.resist_types, i) + end + end if core.shader.active() then self:effectParticles(eff, {type="shader_shield", args={size_factor=1.5, img="ureslak_tentacles"}, shader={type="tentacles", wobblingType=0, appearTime=0.8, time_factor=2000, noup=0.0}}) end @@ -4011,16 +4022,36 @@ newEffect{ } newEffect{ - name = "URESLAK_MOLTEN_SCALES_RESIST", image = "shockbolt/object/artifact/ureslaks_molted_scales.png", - desc = "Ureslak's Molten Scales (Resistance)", - long_desc = function(self, eff) return ("%s resistance increased by 15%%."):format(DamageType:get(eff.type).name:capitalize()) end, + name = "CHROMATIC_RESISTANCE", image = "shockbolt/object/artifact/ureslaks_molted_scales.png", + desc = "Chromatic Resistance", + long_desc = function(self, eff) + local dt = DamageType[eff.type] and DamageType:get(eff.type) + local type_desc = dt and ((dt.text_color or "#aaaaaa#")..dt.name:capitalize().."#LAST# ") or "" + return ("%sresistance increased by %d%%."):format(type_desc, eff.power) + end, type = "physical", subtype = { nature=true, resist=true }, + charges = function(self, eff) return eff.dtype.name:capitalize() end, status = "beneficial", - parameters = { }, - on_gain = function(self, err) return "#OLIVE_DRAB##Target#'s molten scales react to the incomming damage and start glowing!", true end, - on_lose = function(self, err) return "#Target#'s molten scales do not glow anymore.", true end, + parameters = { power=15 }, + on_gain = function(self, eff) + local dt = DamageType[eff.type] and DamageType:get(eff.type) + if dt then + eff.dtype = dt + return "#Target##OLIVE_DRAB# resonates with "..(dt.text_color or "#aaaaaa#")..dt.name:capitalize().."#LAST# damage!", true + else eff.type = nil + end + end, + on_lose = function(self, eff) + if eff.dtype then + return "#Target##OLIVE_DRAB# no longer resonates with "..(eff.dtype.text_color or "#aaaaaa#")..eff.dtype.name:capitalize().."#LAST# damage.", true + end + end, activate = function(self, eff) - self:effectTemporaryValue(eff, "resists", {[eff.type] = 15}) + if eff.type then + self:effectTemporaryValue(eff, "resists", {[eff.type] = eff.power}) + else + self:removeEffect(eff.effect_id) + end end, }