From 6b5e64a56df18016358f53c68002fe2a969c8a95 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Tue, 6 Mar 2012 14:10:34 +0000 Subject: [PATCH] Rewrote, rebalanced, and added many weapon egos Two-handed wepaons now have a small eqo multiplier Daggers now have a small ego penalty Gaping maw is now anti-magic Withering orbs and allettas diadem now psionic Halfling foot now arcane, hareskin sling now nature Stop talent now properly accounts for paradox level Foresight now properly senses actors Greater weapon egos generally less powerful Lesser weapon egos generally more powerful New anti-magic egos Resolve equilebrium and stamina regen more in line with other forms of regen for these resource types Added costs to ranged egos Set many artifact material levels to be more in line with their level range (should improve drops) Buffed many artifacts Reduced infravision given by many items Infravision and heightened senses no longer stack Fixed cease to exist double paradox cost git-svn-id: http://svn.net-core.org/repos/t-engine4@4954 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/modules/tome/class/Actor.lua | 30 +- game/modules/tome/class/Object.lua | 46 +- game/modules/tome/class/Player.lua | 7 +- game/modules/tome/class/interface/Combat.lua | 49 +- game/modules/tome/data/damage_types.lua | 28 +- .../tome/data/general/objects/2haxes.lua | 1 + .../tome/data/general/objects/2hmaces.lua | 1 + .../tome/data/general/objects/2hswords.lua | 1 + .../tome/data/general/objects/2htridents.lua | 1 + .../data/general/objects/boss-artifacts.lua | 50 +- .../tome/data/general/objects/bows.lua | 2 +- .../tome/data/general/objects/egos/ammo.lua | 15 +- .../data/general/objects/egos/mindstars.lua | 254 +++++ .../tome/data/general/objects/egos/weapon.lua | 1004 ++++++++++++----- .../tome/data/general/objects/knifes.lua | 1 + .../tome/data/general/objects/mindstars.lua | 2 +- .../tome/data/general/objects/slings.lua | 2 +- .../data/general/objects/world-artifacts.lua | 197 ++-- .../tome/data/talents/chronomancy/paradox.lua | 5 +- .../talents/chronomancy/speed-control.lua | 2 +- .../tome/data/talents/gifts/antimagic.lua | 22 +- .../modules/tome/data/timed_effects/other.lua | 2 +- .../tome/data/timed_effects/physical.lua | 25 + game/modules/tome/dialogs/CharacterSheet.lua | 2 +- game/modules/tome/resolvers.lua | 4 + 25 files changed, 1337 insertions(+), 416 deletions(-) diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 93969e1214..f69c3441f3 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -1249,14 +1249,28 @@ function _M:onTakeHit(value, src) end if self:attr("damage_shield") then - -- Absorb damage into the shield - self.damage_shield_absorb = self.damage_shield_absorb or 0 - if value <= self.damage_shield_absorb then - self.damage_shield_absorb = self.damage_shield_absorb - value - value = 0 + -- Phased attack? + if src and src:attr("damage_shield_penetrate") then + local adjusted_value = value * (1 - (util.bound(src.damage_shield_penetrate, 0, 100) / 100)) + self.damage_shield_absorb = self.damage_shield_absorb or 0 + if adjusted_value <= self.damage_shield_absorb then + self.damage_shield_absorb = self.damage_shield_absorb - adjusted_value + value = value - adjusted_value + else + adjusted_value = adjusted_value - self.damage_shield_absorb + value = value + adjusted_value + self.damage_shield_absorb = 0 + end else - value = value - self.damage_shield_absorb - self.damage_shield_absorb = 0 + -- Absorb damage into the shield + self.damage_shield_absorb = self.damage_shield_absorb or 0 + if value <= self.damage_shield_absorb then + self.damage_shield_absorb = self.damage_shield_absorb - value + value = 0 + else + value = value - self.damage_shield_absorb + self.damage_shield_absorb = 0 + end end -- If we are at the end of the capacity, release the time shield damage @@ -2595,7 +2609,7 @@ function _M:preUseTalent(ab, silent, fake) -- Spells can fail if (ab.is_spell and not self:isTalentActive(ab.id)) and not fake and self:attr("spell_failure") then if rng.percent(self:attr("spell_failure")) then - if not silent then game.logPlayer(self, "You fail to cast %s!", ab.name) end + if not silent then game.logSeen(self, "%s's %s has been disrupted by anti-magic forces!", self.name:capitalize(), ab.name) end self:useEnergy() return false end diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua index b1769b2986..2e25cc5e75 100644 --- a/game/modules/tome/class/Object.lua +++ b/game/modules/tome/class/Object.lua @@ -128,7 +128,7 @@ function _M:descAttribute(attr) local stat, i = next(self.wielder.resists) return (i and i > 0 and "+"..i or tostring(i)).."%" elseif attr == "REGEN" then - local i = self.wielder.mana_regen or self.wielder.stamina_regen or self.wielder.life_regen or self.wielder.hate_regen + local i = self.wielder.mana_regen or self.wielder.stamina_regen or self.wielder.life_regen or self.wielder.hate_regen or self.wielder.positive_regen return ("%s%0.2f/turn"):format(i > 0 and "+" or "-", math.abs(i)) elseif attr == "COMBAT" then local c = self.combat @@ -475,6 +475,24 @@ function _M:getTextualDesc(compare_with) if special ~= "" then desc:add(found and {"color","WHITE"} or {"color","GREEN"}, "Special effect when this weapon hits: "..special, {"color","LAST"}, true) end + + special = "" + if combat.special_on_crit then + special = combat.special_on_crit.desc + end + found = false + for i, v in ipairs(compare_with or {}) do + if v[field] and v[field].special_on_crit then + if special ~= v[field].special_on_crit.desc then + desc:add({"color","RED"}, "Special effect when this weapon crits: "..v[field].special_on_crit.desc, {"color","LAST"}, true) + else + found = true + end + end + end + if special ~= "" then + desc:add(found and {"color","WHITE"} or {"color","GREEN"}, "Special effect when this weapon crits: "..special, {"color","LAST"}, true) + end found = false for i, v in ipairs(compare_with or {}) do @@ -490,6 +508,8 @@ function _M:getTextualDesc(compare_with) end compare_fields(combat, compare_with, field, "travel_speed", "%+d%%", "Travel speed: ", 1, false, false, add_table) + + compare_fields(combat, compare_with, field, "phase_power", "%+d%%", "Damage Shield penetration: ", 1, false, false, add_table) if combat.tg_type and combat.tg_type == "beam" then desc:add({"color","YELLOW"}, ("Shots beam through all targets."), {"color","LAST"}, true) @@ -504,8 +524,23 @@ function _M:getTextualDesc(compare_with) local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString() return col[2], (" %s"):format(DamageType.dam_def[item].name),{"color","LAST"} end) + + compare_table_fields(combat, compare_with, field, "burst_on_hit", "%+d", "Burst (radius 1) on hit: ", function(item) + local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString() + return col[2], (" %s"):format(DamageType.dam_def[item].name),{"color","LAST"} + end) + + compare_table_fields(combat, compare_with, field, "burst_on_crit", "%+d", "Burst (radius 2) on crit: ", function(item) + local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString() + return col[2], (" %s"):format(DamageType.dam_def[item].name),{"color","LAST"} + end) + + compare_table_fields(combat, compare_with, field, "convert_damage", "%d%%", "Damage conversion: ", function(item) + local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString() + return col[2], (" %s"):format(DamageType.dam_def[item].name),{"color","LAST"} + end) - compare_table_fields(combat, compare_with, field, "inc_damage_type", "%+d%%", "Damage against: ", function(item) + compare_table_fields(combat, compare_with, field, "inc_damage_type", "%+d%% ", "Damage against: ", function(item) local _, _, t, st = item:find("^([^/]+)/?(.*)$") if st and st ~= "" then return st:capitalize() @@ -760,6 +795,7 @@ function _M:getTextualDesc(compare_with) compare_fields(w, compare_with, field, "stamina_regen", "%+.2f", "Stamina each turn: ") 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, "positive_regen", "%+.2f", "P.Energy each turn: ") compare_fields(w, compare_with, field, "stamina_regen_on_hit", "%+.2f", "Stamina when hit: ") compare_fields(w, compare_with, field, "mana_regen_on_hit", "%+.2f", "Mana when hit: ") @@ -943,6 +979,8 @@ function _M:getTextualDesc(compare_with) end end + + local use_desc = self:getUseDesc() if use_desc then desc:merge(use_desc:toTString()) end return desc @@ -1010,6 +1048,10 @@ function _M:getDesc(name_param, compare_with, never_compare) if self.encumber then desc:add({"color",0x67,0xAD,0x00}, ("%0.2f Encumbrance."):format(self.encumber), {"color", "LAST"}) end + if self.ego_bonus_mult then + desc:add(true) + desc:add({"color",0x67,0xAD,0x00}, ("%0.2f Ego Multiplier."):format(1 + self.ego_bonus_mult), {"color", "LAST"}) + end desc:add(true, true) diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index b08987a28f..80439c461a 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -406,9 +406,10 @@ function _M:playerFOV() -- Handle infravision/heightened_senses which allow to see outside of lite radius but with LOS if self:attr("infravision") or self:attr("heightened_senses") then - local rad = (self.heightened_senses or 0) + (self.infravision or 0) - local rad2 = math.max(1, math.floor(rad / 4)) - self:computeFOV(rad, "block_sight", function(x, y, dx, dy, sqdist) if game.level.map(x, y, game.level.map.ACTOR) then game.level.map.seens(x, y, fovdist[sqdist]) end end, true, true, true) + local rad1 = math.max((self.heightened_senses or 0), (self.infravision or 0)) + rad1 = math.min(rad, self.sight) + local rad2 = math.max(1, math.floor(rad1 / 4)) + self:computeFOV(rad1, "block_sight", function(x, y, dx, dy, sqdist) if game.level.map(x, y, game.level.map.ACTOR) then game.level.map.seens(x, y, fovdist[sqdist]) end end, true, true, true) self:computeFOV(rad2, "block_sight", function(x, y, dx, dy, sqdist) game.level.map:applyLite(x, y, fovdist[sqdist]) end, true, true, true) end diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua index 52d8e622e1..7ecf23027c 100644 --- a/game/modules/tome/class/interface/Combat.lua +++ b/game/modules/tome/class/interface/Combat.lua @@ -364,7 +364,35 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) end if crit then game.logSeen(self, "#{bold}#%s performs a critical strike!#{normal}#", self.name:capitalize()) end - DamageType:get(damtype).projector(self, target.x, target.y, damtype, math.max(0, dam)) + + -- Phasing, percent of weapon damage bypasses shields + if weapon and weapon.phasing then + self:attr("damage_shield_penetrate", weapon.phasing) + end + + -- Damage conversion? + -- Reduces base damage but converts it into another damage type + local conv_dam + local conv_damtype + if weapon and weapon.convert_damage then + for typ, conv in pairs(weapon.convert_damage) do + if dam > 0 then + conv_dam = math.min(dam, dam * (conv / 100)) + conv_damtype = typ + dam = dam - conv_dam + DamageType:get(conv_damtype).projector(self, target.x, target.y, conv_damtype, math.max(0, conv_dam)) + end + end + end + + if dam > 0 then + DamageType:get(damtype).projector(self, target.x, target.y, damtype, math.max(0, dam)) + end + + if weapon and weapon.phasing then + self:attr("damage_shield_penetrate", -weapon.phasing) + end + hitted = true else local srcname = game.level.map.seens(self.x, self.y) and self.name:capitalize() or "Something" @@ -481,6 +509,20 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) self.shattering_impact_last_turn = game.turn end + -- Burst on Hit + if hitted and crit and weapon.burst_on_hit then + for typ, dam in pairs(weapon.burst_on_hit) do + self:project({type="ball", radius=1, friendlyfire=false}, target.x, target.y, typ, dam) + end + end + + -- Critical Burst (generally more damage then burst on hit and larger radius) + if hitted and crit and weapon.burst_on_crit then + for typ, dam in pairs(weapon.burst_on_crit) do + self:project({type="ball", radius=2, friendlyfire=false}, target.x, target.y, typ, dam) + end + end + -- Onslaught if hitted and self:attr("onslaught") then local dir = util.getDir(target.x, target.y, self.x, self.y) or 6 @@ -549,6 +591,11 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam) weapon.special_on_hit.fct(weapon, self, target) end + if hitted and crit and not target.dead and weapon and weapon.special_on_crit and weapon.special_on_crit.fct then + weapon.special_on_crit.fct(weapon, self, target) + end + + -- Poison coating if hitted and not target.dead and self.vile_poisons and next(self.vile_poisons) and target:canBe("poison") then local tid = rng.table(table.keys(self.vile_poisons)) diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index b55f95dd1d..df251839c7 100644 --- a/game/modules/tome/data/damage_types.lua +++ b/game/modules/tome/data/damage_types.lua @@ -595,7 +595,7 @@ newDamageType{ -- Fire damage + DOT newDamageType{ - name = "fireburn", type = "FIREBURN", + name = "fire burn", type = "FIREBURN", text_color = "#LIGHT_RED#", projector = function(src, x, y, type, dam) local dur = 3 local perc = 50 @@ -705,7 +705,7 @@ newDamageType{ -- Cold damage + freeze chance newDamageType{ - name = "ice", type = "ICE", + name = "ice", type = "ICE", text_color = "#1133F3#", projector = function(src, x, y, type, dam) local realdam = DamageType:get(DamageType.COLD).projector(src, x, y, DamageType.COLD, dam) if rng.percent(25) then @@ -765,7 +765,7 @@ newDamageType{ -- Acid damage + blind chance newDamageType{ - name = "acid blind", type = "ACID_BLIND", + name = "acid blind", type = "ACID_BLIND", text_color = "#GREEN#", projector = function(src, x, y, type, dam) local realdam = DamageType:get(DamageType.ACID).projector(src, x, y, DamageType.ACID, dam) local target = game.level.map(x, y, Map.ACTOR) @@ -799,7 +799,7 @@ newDamageType{ -- Lightning damage + daze chance newDamageType{ - name = "lightning daze", type = "LIGHTNING_DAZE", + name = "lightning daze", type = "LIGHTNING_DAZE", text_color = "#ROYAL_BLUE#", projector = function(src, x, y, type, dam) if _G.type(dam) == "number" then dam = {dam=dam, daze=25} end local realdam = DamageType:get(DamageType.LIGHTNING).projector(src, x, y, DamageType.LIGHTNING, dam.dam) @@ -987,7 +987,7 @@ newDamageType{ -- Poisoning damage newDamageType{ - name = "poison", type = "POISON", + name = "poison", type = "POISON", text_color = "#LIGHT_GREEN#", projector = function(src, x, y, t, dam) local power if type(dam) == "table" then @@ -1041,8 +1041,9 @@ newDamageType{ -- Insidious poison: prevents healing newDamageType{ - name = "insidious poison", type = "INSIDIOUS_POISON", + name = "insidious poison", type = "INSIDIOUS_POISON", text_color = "#LIGHT_GREEN#", projector = function(src, x, y, type, dam) + if _G.type(dam) == "number" then dam = {dam=dam, dur=7, heal_factor=dam} end DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam / dam.dur) local target = game.level.map(x, y, Map.ACTOR) if target and target:canBe("poison") then @@ -1079,12 +1080,13 @@ newDamageType{ -- Slime damage newDamageType{ - name = "slime", type = "SLIME", + name = "slime", type = "SLIME", text_color = "#LIGHT_GREEN#", projector = function(src, x, y, type, dam) - DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam) + if _G.type(dam) == "number" then dam = {dam=dam, power=0.15} end + DamageType:get(DamageType.NATURE).projector(src, x, y, DamageType.NATURE, dam.dam) local target = game.level.map(x, y, Map.ACTOR) if target then - target:setEffect(target.EFF_SLOW, 3, {power=0.15, no_ct_effect=true}) + target:setEffect(target.EFF_SLOW, 3, {power=dam.power, no_ct_effect=true}) end end, } @@ -1613,7 +1615,7 @@ newDamageType{ -- Temporal + Stat damage newDamageType{ - name = "clock", type = "CLOCK", + name = "reverse aging", type = "CLOCK", projector = function(src, x, y, type, dam) local target = game.level.map(x, y, Map.ACTOR) if target then @@ -1627,7 +1629,7 @@ newDamageType{ -- Temporal Over Time newDamageType{ - name = "wasting", type = "WASTING", + name = "wasting", type = "WASTING", text_color = "#LIGHT_STEEL_BLUE#", projector = function(src, x, y, type, dam) local target = game.level.map(x, y, Map.ACTOR) local dur = 3 @@ -1670,7 +1672,7 @@ newDamageType{ if target:canBe("stun") then target:setEffect(target.EFF_STUNNED, 3, {apply_power=src:combatSpellpower()}) else - game.logSeen(target, "%s resists the daze!", target.name:capitalize()) + game.logSeen(target, "%s resists the stun!", target.name:capitalize()) end elseif chance == 2 then if target:canBe("blind") then @@ -1966,7 +1968,7 @@ newDamageType{ } newDamageType{ - name = "manaburn", type = "MANABURN", + name = "manaburn", type = "MANABURN", text_color = "#PURPLE#", projector = function(src, x, y, type, dam) local target = game.level.map(x, y, Map.ACTOR) if target then diff --git a/game/modules/tome/data/general/objects/2haxes.lua b/game/modules/tome/data/general/objects/2haxes.lua index 8c926212fe..511b19dcc4 100644 --- a/game/modules/tome/data/general/objects/2haxes.lua +++ b/game/modules/tome/data/general/objects/2haxes.lua @@ -31,6 +31,7 @@ newEntity{ combat = { talented = "axe", damrange = 1.5, physspeed = 1, sound = {"actions/melee", pitch=0.6, vol=1.2}, sound_miss = {"actions/melee", pitch=0.6, vol=1.2} }, desc = [[Massive two-handed battleaxes.]], twohanded = true, + ego_bonus_mult = 0.2, randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 }, egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) }, } diff --git a/game/modules/tome/data/general/objects/2hmaces.lua b/game/modules/tome/data/general/objects/2hmaces.lua index caa4e8eccc..36b3239460 100644 --- a/game/modules/tome/data/general/objects/2hmaces.lua +++ b/game/modules/tome/data/general/objects/2hmaces.lua @@ -31,6 +31,7 @@ newEntity{ combat = { talented = "mace", damrange = 1.5, physspeed = 1, sound = {"actions/melee", pitch=0.6, vol=1.2}, sound_miss = {"actions/melee", pitch=0.6, vol=1.2} }, desc = [[Massive two-handed maul.]], twohanded = true, + ego_bonus_mult = 0.2, randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 }, egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) }, } diff --git a/game/modules/tome/data/general/objects/2hswords.lua b/game/modules/tome/data/general/objects/2hswords.lua index 1697ce0369..5eb6082d5c 100644 --- a/game/modules/tome/data/general/objects/2hswords.lua +++ b/game/modules/tome/data/general/objects/2hswords.lua @@ -31,6 +31,7 @@ newEntity{ desc = [[Massive two-handed swords.]], twohanded = true, metallic = true, + ego_bonus_mult = 0.2, randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 }, egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) }, } diff --git a/game/modules/tome/data/general/objects/2htridents.lua b/game/modules/tome/data/general/objects/2htridents.lua index 51c58e9b6f..0143b12bb3 100644 --- a/game/modules/tome/data/general/objects/2htridents.lua +++ b/game/modules/tome/data/general/objects/2htridents.lua @@ -33,6 +33,7 @@ newEntity{ desc = [[A two-handed massive trident. Tridents require the exotic weapons mastery talent to use correctly.]], twohanded = true, + ego_bonus_mult = 0.2, randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 }, egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) }, } diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua index 159483ce98..68fec8024a 100644 --- a/game/modules/tome/data/general/objects/boss-artifacts.lua +++ b/game/modules/tome/data/general/objects/boss-artifacts.lua @@ -68,7 +68,7 @@ newEntity{ base = "BASE_LITE", define_as = "WINTERTIDE_PHIAL", rarity = 200, encumber = 2, cost = 50, - material_level = 2, + material_level = 1, wielder = { lite = 1, @@ -114,6 +114,7 @@ newEntity{ base = "BASE_AMULET", level_range = {32, 42}, rarity = 220, cost = 190, + material_level = 3, wielder = { inc_stats = { [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 4, [Stats.STAT_CUN] = 3 }, combat_spellpower = 7, @@ -143,6 +144,7 @@ newEntity{ base = "BASE_LEATHER_BOOT", desc = [[A pair of leather boots. Cold to the touch, they radiate a cold blue light.]], require = { stat = { dex=16 }, }, level_range = {10, 18}, + material_level = 2, rarity = 220, cost = 40, @@ -169,6 +171,7 @@ newEntity{ base = "BASE_HELM", desc = [[Traces of a dragon's power still remain in this bleached and cracked skull.]], require = { stat = { wil=24 }, }, level_range = {45, 50}, + material_level = 5, rarity = 280, cost = 200, @@ -311,7 +314,7 @@ newEntity{ base = "BASE_RING", level_range = {15, 23}, rarity = 250, cost = 500, - material_level = 4, + material_level = 2, wielder = { max_stamina = 25, combat_def = 6, @@ -338,7 +341,7 @@ newEntity{ base = "BASE_HELM", level_range = {12, 22}, rarity = 200, cost = 20, - material_level = 3, + material_level = 2, skullcracker_mult = 5, wielder = { @@ -454,6 +457,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", level_range = {40, 50}, rarity = 280, cost = 500, + material_level = 5, wielder = { inc_stats = { [Stats.STAT_MAG] = 5, [Stats.STAT_WIL] = 4, [Stats.STAT_CUN] = 3 }, see_invisible = 10, @@ -480,6 +484,7 @@ newEntity{ base = "BASE_WARAXE", level_range = {35, 45}, rarity = 290, cost = 375, + material_level = 4, combat = { dam = 55, apr = 15, @@ -504,6 +509,7 @@ newEntity{ base = "BASE_STAFF", level_range = {1, 10}, rarity = 200, cost = 60, + material_level = 1, combat = { dam = 10, apr = 0, @@ -533,6 +539,7 @@ newEntity{ base = "BASE_AMULET", level_range = {40, 50}, rarity = 220, cost = 3000, + material_level = 5, wielder = { see_invisible = 20, silence_immune = 0.8, @@ -555,6 +562,7 @@ newEntity{ base = "BASE_STAFF", level_range = {40, 50}, rarity = 210, encumber = 2.5, + material_level = 5, cost = 500, combat = { dam = 35, @@ -579,6 +587,7 @@ newEntity{ base = "BASE_AMULET", level_range = {20, 28}, rarity = 220, cost = 5000, + material_level = 3, wielder = { see_invisible = 10, blind_immune = 1, @@ -671,6 +680,7 @@ newEntity{ base = "BASE_GREATMAUL", desc = [[This is a big, nasty-looking tree trunk that Bill the Troll used as a weapon. It could still serve this purpose, should you be strong enough to wield it!]], require = { stat = { str=25 }, }, level_range = {1, 10}, + material_level = 1, rarity = 200, metallic = false, cost = 70, @@ -695,6 +705,7 @@ newEntity{ base = "BASE_SHIELD", desc = [[Though tarnished and spattered with blood, the emblem of the Sun still manages to shine through on this shield.]], require = { stat = { str=39 }, }, level_range = {35, 45}, + material_level = 4, rarity = 240, cost = 120, @@ -1001,6 +1012,7 @@ newEntity{ base = "BASE_WARAXE", desc = [[A small but sharp axe, with a handle made of polished bone. The blade has chopped through the skulls of many, and has been stained a deep crimson.]], require = { stat = { str=18 }, }, level_range = {5, 12}, + material_level = 1, rarity = 220, cost = 50, combat = { @@ -1024,7 +1036,7 @@ newEntity{ base = "BASE_DIGGER", desc = [[A huge tooth taken from the Mouth, in the Deep Bellow.]], level_range = {5, 12}, cost = 50, - material_level = 3, + material_level = 1, digspeed = 12, wielder = { inc_damage = { [DamageType.BLIGHT] = 4 }, @@ -1060,7 +1072,7 @@ newEntity{ base = "BASE_HEAVY_BOOTS", } newEntity{ base = "BASE_BATTLEAXE", - power_source = {nature=true,}, + power_source = {nature=true, antimagic=true}, define_as = "GAPING_MAW", name = "The Gaping Maw", color = colors.SLATE, image = "object/artifact/battleaxe_the_gaping_maw.png", unided_name = "huge granite battleaxe", unique = true, @@ -1069,7 +1081,7 @@ newEntity{ base = "BASE_BATTLEAXE", rarity = 300, require = { stat = { str=60 }, }, cost = 650, - material_level = 4, + material_level = 5, combat = { dam = 72, apr = 4, @@ -1078,20 +1090,26 @@ newEntity{ base = "BASE_BATTLEAXE", melee_project={[DamageType.SLIME] = 50, [DamageType.ACID] = 50}, }, wielder = { - inc_stats = { [Stats.STAT_STR] = 6, [Stats.STAT_WIL] = 6, }, - inc_damage={ - [DamageType.NATURE] = 15, - }, talent_cd_reduction= { [Talents.T_SWALLOW] = 2, [Talents.T_MANA_CLASH] = 2, [Talents.T_ICE_CLAW] = 1, }, }, + on_wear = function(self, who) + if who:attr("forbid_arcane") then + local Stats = require "engine.interface.ActorStats" + local DamageType = require "engine.DamageType" + + self:specialWearAdd({"wielder","inc_damage"}, {[DamageType.NATURE]=15}) + self:specialWearAdd({"wielder","inc_stats"}, { [Stats.STAT_STR] = 6, [Stats.STAT_WIL] = 6, }) + game.logPlayer(who, "#DARK_GREEN#You feel like Nature's Wrath incarnate!") + end + end, } newEntity{ base = "BASE_AMULET", - power_source = {nature=true}, + power_source = {psionic=true}, define_as = "WITHERING_ORBS", unique = true, name = "Withering Orbs", color = colors.WHITE, image = "object/artifact/artifact_jewelry_withering_orbs.png", @@ -1127,7 +1145,7 @@ Though clearly a powerful piece, it must once have been much greater.]], rarity = 200, require = { stat = { str=35 }, }, cost = 500, - material_level = 5, + material_level = 3, wielder = { combat_def = 10, combat_armor = 15, @@ -1150,7 +1168,7 @@ Though clearly a powerful piece, it must once have been much greater.]], } newEntity{ base = "BASE_LEATHER_CAP", -- No armor training requirement - power_source = {nature=true}, + power_source = {psionic=true}, define_as = "ALETTA_DIADEM", name = "Aletta's Diadem", unique=true, unided_name="jeweled diadem", image = "object/artifact/diadem_alettas_diadem.png", desc = [[A filigree of silver set with many small jewels, this diadem seems radiant - ethereal almost. But its touch seems to freeze your skin and brings wild thoughts to your mind. You want to drop it, throw it away, and yet you cannot resist thinking of what powers it might bring you. @@ -1173,7 +1191,7 @@ Is this temptation a weak will on your part, or some domination from the artifac } newEntity{ base = "BASE_SLING", - power_source = {technique=true}, + power_source = {nature=true}, define_as = "HARESKIN_SLING", name = "Hare-Skin Sling", unique=true, unided_name = "hare-skin sling", image = "object/artifact/sling_hareskin_sling.png", desc = [[This well-tended sling is made from the leather and sinews of a large hare. It feels smooth to the touch yet very durable. Some say that the skin of a hare brings luck and fortune. @@ -1182,7 +1200,7 @@ Hard to tell if that really helped its former owner, but it's clear that the ski rarity = 200, require = { stat = { dex=35 }, }, cost = 50, - material_level = 4, + material_level = 3, use_no_energy = true, combat = { range = 10, @@ -1200,7 +1218,7 @@ Hard to tell if that really helped its former owner, but it's clear that the ski } newEntity{ base = "BASE_TOOL_MISC", - power_source = {nature=true}, + power_source = {arcane=true}, define_as = "LUCKY_FOOT", unique = true, name = "Prox's Lucky Halfling Foot", color = colors.WHITE, diff --git a/game/modules/tome/data/general/objects/bows.lua b/game/modules/tome/data/general/objects/bows.lua index 43b95d1f7d..c604aefa94 100644 --- a/game/modules/tome/data/general/objects/bows.lua +++ b/game/modules/tome/data/general/objects/bows.lua @@ -105,7 +105,7 @@ newEntity{ type = "ammo", subtype="arrow", add_name = " (#COMBAT_AMMO#)", display = "{", color=colors.UMBER, image = resolvers.image_material("arrow", "wood"), - encumber = 5, + encumber = 3, rarity = 11, combat = { talented = "bow", diff --git a/game/modules/tome/data/general/objects/egos/ammo.lua b/game/modules/tome/data/general/objects/egos/ammo.lua index 77f431b0cd..b206d2304e 100644 --- a/game/modules/tome/data/general/objects/egos/ammo.lua +++ b/game/modules/tome/data/general/objects/egos/ammo.lua @@ -25,6 +25,7 @@ newEntity{ keywords = {quick=true}, level_range = {1, 50}, rarity = 5, + cost = 6, wielder = { ammo_reload_speed = resolvers.mbonus_material(4, 1), }, @@ -36,6 +37,7 @@ newEntity{ keywords = {capacity=true}, level_range = {1, 50}, rarity = 5, + cost = 6, combat = { capacity = resolvers.generic(function(e) return e.combat.capacity * rng.float(1.3, 1.6) end), }, @@ -47,6 +49,7 @@ newEntity{ keywords = {self=true}, level_range = {1, 50}, rarity = 5, + cost = 6, combat = { ammo_regen = resolvers.mbonus_material(3, 1), }, @@ -62,6 +65,7 @@ newEntity{ level_range = {1, 50}, rarity = 7, greater_ego = 1, + cost = 6, combat = { capacity = resolvers.generic(function(e) return e.combat.capacity * rng.float(1.2, 1.5) end), }, @@ -77,6 +81,7 @@ newEntity{ level_range = {1, 50}, rarity = 7, greater_ego = 1, + cost = 6, combat = { ammo_regen = resolvers.mbonus_material(3, 1), }, @@ -95,6 +100,7 @@ newEntity{ level_range = {1, 50}, rarity = 7, greater_ego = 1, + cost = 6, combat = { ammo_regen = resolvers.mbonus_material(3, 1), capacity = resolvers.generic(function(e) return e.combat.capacity * rng.float(1.2, 1.5) end), @@ -110,6 +116,7 @@ newEntity{ keywords = {fire=true}, level_range = {1, 50}, rarity = 5, + cost = 6, combat = { ranged_project={[DamageType.FIRE] = resolvers.mbonus_material(20, 5)}, }, @@ -120,6 +127,7 @@ newEntity{ keywords = {ice=true}, level_range = {15, 50}, rarity = 5, + cost = 6, combat = { ranged_project={[DamageType.ICE] = resolvers.mbonus_material(10, 4)}, }, @@ -130,6 +138,7 @@ newEntity{ keywords = {cunning=true}, level_range = {1, 50}, rarity = 5, + cost = 6, combat = { ranged_project={[DamageType.ACID] = resolvers.mbonus_material(20, 5)}, }, @@ -140,6 +149,7 @@ newEntity{ keywords = {lightning=true}, level_range = {1, 50}, rarity = 5, + cost = 6, combat = { ranged_project={[DamageType.LIGHTNING] = resolvers.mbonus_material(20, 5)}, }, @@ -151,6 +161,7 @@ newEntity{ keywords = {slime=true}, level_range = {10, 50}, rarity = 5, + cost = 6, combat = { ranged_project={[DamageType.SLIME] = resolvers.mbonus_material(10, 4)}, }, @@ -163,6 +174,7 @@ newEntity{ level_range = {1, 50}, rarity = 3, cost = 4, + cost = 6, combat = { atk = resolvers.mbonus_material(20, 5), }, @@ -192,6 +204,7 @@ newEntity{ keywords = {wind=true}, level_range = {10, 50}, rarity = 7, + cost = 6, combat = { travel_speed = 200, }, @@ -203,7 +216,7 @@ newEntity{ keywords = {annihilation=true}, level_range = {30, 50}, greater_ego = 1, - cost = 1, + cost = 6, rarity = 15, combat = { dam = resolvers.mbonus_material(10, 2), diff --git a/game/modules/tome/data/general/objects/egos/mindstars.lua b/game/modules/tome/data/general/objects/egos/mindstars.lua index 30c54b95fd..b0b353ca69 100644 --- a/game/modules/tome/data/general/objects/egos/mindstars.lua +++ b/game/modules/tome/data/general/objects/egos/mindstars.lua @@ -31,3 +31,257 @@ newEntity{ combat_mindpower = resolvers.mbonus_material(16, 3), }, } + +------------------------------------------------------- +--Nature and Antimagic--------------------------------- +------------------------------------------------------- + newEntity{ + power_source = {arcane=true}, + power_source = {nature=true}, + name = "summoner's ", prefix=true, instant_resolve=true, + keywords = {summoners=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "druid's ", prefix=true, instant_resolve=true, + keywords = {druid=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "nature's ", prefix=true, instant_resolve=true, + keywords = {nature=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "wyrmic's ", prefix=true, instant_resolve=true, + keywords = {wyrmic=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = " of harmony", suffix=true, instant_resolve=true, + keywords = {harmony=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "fire-drake's ", prefix=true, instant_resolve=true, + keywords = {fire=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "cold-drake's ", prefix=true, instant_resolve=true, + keywords = {cold=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "storm-drake's ", prefix=true, instant_resolve=true, + keywords = {storm=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = "sand-drake's ", prefix=true, instant_resolve=true, + keywords = {storm=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = " of calling", suffix=true, instant_resolve=true, + keywords = {calling=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = " of the arch-druid", suffix=true, instant_resolve=true, + keywords = {archdruid=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {nature=true}, + name = " of the great-wyrm", suffix=true, instant_resolve=true, + keywords = {wyrm=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +------------------------------------------------------- +--Psionic---------------------------------------------- +------------------------------------------------------- +newEntity{ + power_source = {psionic=true}, + name = "gifted ", prefix=true, instant_resolve=true, + keywords = {gifted=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = "psychic's ", prefix=true, instant_resolve=true, + keywords = {psychic=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of clarity", suffix=true, instant_resolve=true, + keywords = {power=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of nightmares", suffix=true, instant_resolve=true, + keywords = {night=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of power", suffix=true, instant_resolve=true, + keywords = {power=true}, + level_range = {1, 50}, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, + } + +newEntity{ + power_source = {psionic=true}, + name = " of shrouds", suffix=true, instant_resolve=true, + keywords = {shrouds=true}, + level_range = {1, 50}, + rarity = 4, + cost = 8, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = "spire dragon's ", prefix=true, instant_resolve=true, + keywords = {spire=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of convergence", suffix=true, instant_resolve=true, + keywords = {conv=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 40, + cost = 40, + wielder = { + combat_mindpower = resolvers.mbonus_material(16, 3), + }, +} \ No newline at end of file diff --git a/game/modules/tome/data/general/objects/egos/weapon.lua b/game/modules/tome/data/general/objects/egos/weapon.lua index 22d8fd0e59..a81e7674a3 100644 --- a/game/modules/tome/data/general/objects/egos/weapon.lua +++ b/game/modules/tome/data/general/objects/egos/weapon.lua @@ -22,140 +22,172 @@ local Stats = require "engine.interface.ActorStats" local Talents = require "engine.interface.ActorTalents" -newEntity{ - power_source = {arcane=true}, - name = "flaming ", prefix=true, instant_resolve=true, - keywords = {flaming=true}, +-- Idea: Giant(technique, chance to stun on hit and increased weight), Sharp, Jagged, Deft (of deftness-quick swap), +-- Wolf, Bear, Snake based nature egos (maybe wolf could summon wolves), +-- TODO: Talk to Darkgod about instant_resolve +------------------------------------------------------- +-- Techniques------------------------------------------ +------------------------------------------------------- +-- Craftsmanship based egos multiply the bonuses on any other ego applied and may have other minor bonuses based on item type +--[[newEntity{ + power_source = {technique=true}, + name = "fine ", prefix=true, instant_resolve=true, + keywords = {fine=true}, level_range = {1, 50}, - rarity = 5, - combat = { - melee_project={[DamageType.FIRE] = resolvers.mbonus_material(25, 4)}, - }, -} -newEntity{ - power_source = {arcane=true}, - name = "icy ", prefix=true, instant_resolve=true, - keywords = {icy=true}, - level_range = {15, 50}, - rarity = 5, + rarity = 60, + cost = 30, + ego_bonus_mult = 0.2, combat = { - melee_project={[DamageType.ICE] = resolvers.mbonus_material(15, 4)}, + dam = 2, + apr = 2, + physcrit = 2, }, } + newEntity{ - power_source = {nature=true}, - name = "acidic ", prefix=true, instant_resolve=true, - keywords = {acidic=true}, + power_source = {technique=true}, + name = " of quality", suffix=true, instant_resolve=true, + keywords = {quality=true}, level_range = {1, 50}, - rarity = 5, + rarity = 60, + cost = 30, + ego_bonus_mult = 0.2, combat = { - melee_project={[DamageType.ACID] = resolvers.mbonus_material(25, 4)}, + dam = 2, + apr = 2, + physcrit = 2, }, } + newEntity{ - power_source = {arcane=true}, - name = "shocking ", prefix=true, instant_resolve=true, - keywords = {shocking=true}, - level_range = {1, 50}, - rarity = 5, + power_source = {technique=true}, + name = "exceptional ", prefix=true, instant_resolve=true, + keywords = {except=true}, + greater_ego = 1, + level_range = {25, 50}, + rarity = 60, + cost = 60, + ego_bonus_mult = 0.4, combat = { - melee_project={[DamageType.LIGHTNING] = resolvers.mbonus_material(25, 4)}, + dam = 4, + apr = 4, + physcrit = 4, }, } newEntity{ - power_source = {nature=true}, - name = "poisonous ", prefix=true, instant_resolve=true, - keywords = {poisonous=true}, - level_range = {1, 50}, - rarity = 5, + power_source = {technique=true}, + name = " of the master", suffix=true, instant_resolve=true, + keywords = {master=true}, + greater_ego = 1, + level_range = {25, 50}, + rarity = 60, + cost = 60, + ego_bonus_mult = 0.4, combat = { - melee_project={[DamageType.POISON] = resolvers.mbonus_material(45, 6)}, + dam = 4, + apr = 4, + physcrit = 4, }, -} - +}]]-- +-- Lesser newEntity{ - power_source = {nature=true}, - name = "slime-covered ", prefix=true, instant_resolve=true, - keywords = {slime=true}, - level_range = {10, 50}, + power_source = {technique=true}, + name = "balanced ", prefix=true, instant_resolve=true, + keywords = {balanced=true}, + level_range = {1, 50}, rarity = 5, - combat = { - melee_project={[DamageType.SLIME] = resolvers.mbonus_material(45, 6)}, + cost = 15, + wielder={ + combat_atk = resolvers.mbonus_material(10, 2), + combat_def = resolvers.mbonus_material(10, 2), }, } newEntity{ power_source = {technique=true}, - name = " of accuracy", suffix=true, instant_resolve=true, - keywords = {accuracy=true}, + name = " of crippling", suffix=true, instant_resolve=true, + keywords = {crippling=true}, level_range = {1, 50}, rarity = 3, cost = 4, - wielder={combat_atk = resolvers.mbonus_material(20, 5)}, + wielder = { + combat_physcrit = resolvers.mbonus_material(10, 2), + }, + combat = { + special_on_crit = {desc="cripple the target", fct=function(combat, who, target) + local power = 5 + (who:combatPhysicalpower()/5) + target:setEffect(target.EFF_CRIPPLE, 4, {src=who, atk=power, dam=power, apply_power=who:combatAttack(combat)}) + end}, + }, } newEntity{ - power_source = {arcane=true}, - name = "phase ", prefix=true, instant_resolve=true, - keywords = {phase=true}, + power_source = {technique=true}, + name = " of massacre", suffix=true, instant_resolve=true, + keywords = {massacre=true}, level_range = {1, 50}, rarity = 3, - cost = 6, - combat={apr = resolvers.mbonus_material(20, 5)}, + cost = 4, + combat = { + dam = resolvers.mbonus_material(10, 2), + }, } +-- Greater newEntity{ - power_source = {arcane=true}, - name = "elemental ", prefix=true, instant_resolve=true, - keywords = {elemental=true}, - level_range = {35, 50}, + power_source = {technique=true}, + name = "quick ", prefix=true, instant_resolve=true, + keywords = {quick=true}, + level_range = {30, 50}, greater_ego = 1, rarity = 25, - cost = 35, - combat = { - melee_project={ - [DamageType.FIRE] = resolvers.mbonus_material(25, 4), - [DamageType.ICE] = resolvers.mbonus_material(15, 4), - [DamageType.ACID] = resolvers.mbonus_material(25, 4), - [DamageType.LIGHTNING] = resolvers.mbonus_material(25, 4), + cost = 30, + combat = { physspeed = -0.1 }, + wielder = { + combat_atk = resolvers.mbonus_material(10, 2), + inc_stats = { + [Stats.STAT_DEX] = resolvers.mbonus_material(6, 1), }, }, } newEntity{ power_source = {technique=true}, - name = " of massacre", suffix=true, instant_resolve=true, - keywords = {massacre=true}, - level_range = {1, 50}, - rarity = 3, - cost = 4, - combat = { - dam = resolvers.mbonus_material(15, 5), + name = "warbringer's ", prefix=true, instant_resolve=true, + keywords = {warbringer=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 30, + cost = 40, + wielder = { + inc_stats = { + [Stats.STAT_CON] = resolvers.mbonus_material(6, 1), + }, + disarm_immune = resolvers.mbonus_material(25, 5, function(e, v) v=v/100 return 0, v end), + combat_dam = resolvers.mbonus_material(10, 2), + resists_pen = { + [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 2), + }, }, } newEntity{ - power_source = {arcane=true}, - name = " of torment", suffix=true, instant_resolve=true, - keywords = {torment=true}, - level_range = {15, 50}, - rarity = 18, - cost = 22, - combat = { - special_on_hit = {desc="10% chance to torment the target", fct=function(combat, who, target) - if not rng.percent(10) then return end - local eff = rng.table{"stun", "blind", "pin", "teleport", "stone", "confusion", "silence", "knockback"} - if not target:canBe(eff) then return end - if not target:checkHit(who:combatAttack(combat), target:combatPhysicalResist(), 15) then return end - if eff == "stun" then target:setEffect(target.EFF_STUNNED, 3, {}) - elseif eff == "blind" then target:setEffect(target.EFF_BLINDED, 3, {}) - elseif eff == "pin" then target:setEffect(target.EFF_PINNED, 3, {}) - elseif eff == "confusion" then target:setEffect(target.EFF_CONFUSED, 3, {power=60}) - elseif eff == "silence" then target:setEffect(target.EFF_SILENCED, 3, {}) - elseif eff == "knockback" then target:knockback(who.x, who.y, 3) - elseif eff == "teleport" then target:teleportRandom(target.x, target.y, 10) - end + power_source = {technique=true}, + name = " of evisceration", suffix=true, instant_resolve=true , + keywords = {evisc=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 20, + cost = 40, + wielder = { + combat_physcrit = resolvers.mbonus_material(10, 2), + combat_dam = resolvers.mbonus_material(10, 2), + }, + combat = { + special_on_crit = {desc="wounds the target", fct=function(combat, who, target) + local dam = 5 + (who:combatPhysicalpower()/5) + target:setEffect(target.EFF_DEEP_WOUND, 7, {src=who, heal_factor=dam * 2, power=dam, apply_power=who:combatAttack()}) end}, }, } @@ -171,369 +203,781 @@ newEntity{ wielder = { combat_atk = resolvers.mbonus_material(10, 2), inc_damage = { - [DamageType.PHYSICAL] = resolvers.mbonus_material(15, 4), + [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 2), }, inc_stats = { - [Stats.STAT_DEX] = resolvers.mbonus_material(4, 3), - [Stats.STAT_STR] = resolvers.mbonus_material(4, 3), + [Stats.STAT_STR] = resolvers.mbonus_material(6, 1), }, - stamina_regen_on_hit = resolvers.mbonus_material(23, 7, function(e, v) v=v/10 return 0, v end), + stamina_regen_on_hit = resolvers.mbonus_material(20, 5, function(e, v) v=v/10 return 0, v end), }, - combat = { - apr = resolvers.mbonus_material(8, 1), +} + +newEntity{ + power_source = {technique=true}, + name = " of ruin", suffix=true, instant_resolve=true, + keywords = {ruin=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 20, + cost = 25, + wielder = { + combat_physcrit = resolvers.mbonus_material(10, 2), + combat_critical_power = resolvers.mbonus_material(10, 10), + combat_apr = resolvers.mbonus_material(10, 2), }, } newEntity{ - power_source = {arcane=true}, - name = " of corruption", suffix=true, instant_resolve=true, - keywords = {corruption=true}, - level_range = {35, 50}, + power_source = {technique=true}, + name = " of shearing", suffix=true, instant_resolve=true, + keywords = {shearing=true}, + level_range = {30, 50}, greater_ego = 1, rarity = 20, - cost = 35, + cost = 40, + wielder = { + combat_apr = resolvers.mbonus_material(10, 2), + inc_damage = { + [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 2), + }, + resists_pen = { + [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 2), + }, + }, +} + +------------------------------------------------------- +-- Arcane Egos----------------------------------------- +------------------------------------------------------- +newEntity{ + power_source = {arcane=true}, + name = "acidic ", prefix=true, instant_resolve=true, + keywords = {acidic=true}, + level_range = {1, 50}, + rarity = 5, + cost = 10, combat = { melee_project={ - [DamageType.BLIGHT] = resolvers.mbonus_material(25, 4), - [DamageType.DARKNESS] = resolvers.mbonus_material(25, 4), + [DamageType.ACID] = resolvers.mbonus_material(15, 4) }, + special_on_crit = {desc="splashes the target", fct=function(combat, who, target) + local power = 5 + (who:combatSpellpower()/10) + target:setEffect(target.EFF_ACID_SPLASH, 5, {src=who, dam=power, atk=power, armor=power}) + end}, }, - wielder = { - see_invisible = resolvers.mbonus_material(20, 5), - combat_physcrit = resolvers.mbonus_material(10, 4), +} + +newEntity{ + power_source = {arcane=true}, + name = "flaming ", prefix=true, instant_resolve=true, + keywords = {flaming=true}, + level_range = {1, 50}, + rarity = 5, + cost = 10, + combat = { + burst_on_hit={ + [DamageType.FIRE] = resolvers.mbonus_material(15, 4) + }, }, } newEntity{ - power_source = {technique=true}, - name = " of crippling", suffix=true, instant_resolve=true, - keywords = {crippling=true}, + power_source = {arcane=true}, + name = "icy ", prefix=true, instant_resolve=true, + keywords = {icy=true}, + level_range = {15, 50}, + rarity = 5, + cost = 10, + combat = { + melee_project={ + [DamageType.ICE] = resolvers.mbonus_material(15, 4) + }, + }, +} + +newEntity{ + power_source = {arcane=true}, + name = "arcing ", prefix=true, instant_resolve=true, + keywords = {shocking=true}, level_range = {1, 50}, - rarity = 3, - cost = 4, - wielder = { - combat_physcrit = resolvers.mbonus_material(7, 3), + rarity = 5, + cost = 10, + combat = { + melee_project={ + [DamageType.LIGHTNING] = resolvers.mbonus_material(15, 4), + }, + special_on_hit = {desc="25% chance for lightning to arc to a second target", fct=function(combat, who, target) + if not rng.percent(25) then return end + local tgts = {} + local x, y = target.x, target.y + local grids = core.fov.circle_grids(x, y, 5, true) + for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do + local a = game.level.map(x, y, engine.Map.ACTOR) + if a and a ~= target and who:reactionToward(a) < 0 then + tgts[#tgts+1] = a + end + end end + + -- Randomly take targets + local tg = {type="beam", range=5, friendlyfire=false} + if #tgts <= 0 then return end + local a, id = rng.table(tgts) + table.remove(tgts, id) + local dam = 30 + (who:combatSpellpower()) + + who:project(tg, a.x, a.y, engine.DamageType.LIGHTNING, rng.avg(1, dam, 3)) + game.level.map:particleEmitter(x, y, math.max(math.abs(a.x-x), math.abs(a.y-y)), "lightning", {tx=a.x-x, ty=a.y-y}) + game:playSoundNear(who, "talents/lightning") + end}, }, } newEntity{ - power_source = {nature=true}, + power_source = {arcane=true}, name = " of daylight", suffix=true, instant_resolve=true, keywords = {daylight=true}, level_range = {1, 50}, - rarity = 3, - cost = 4, + rarity = 10, + cost = 20, combat = { - melee_project={[DamageType.LIGHT] = resolvers.mbonus_material(45, 6)}, + melee_project={[DamageType.LIGHT] = resolvers.mbonus_material(15, 4)}, + inc_damage_type = {undead=resolvers.mbonus_material(25, 5)}, }, } newEntity{ - power_source = {technique=true}, - name = " of defense", suffix=true, instant_resolve=true, - keywords = {defense=true}, + power_source = {arcane=true}, + name = " of phasing", suffix=true, instant_resolve=true, + keywords = {phase=true}, level_range = {1, 50}, - rarity = 3, - cost = 4, + rarity = 15, + cost = 30, + combat={ + apr = resolvers.mbonus_material(10, 2), + phasing = resolvers.mbonus_material(50, 10) + }, +} + +newEntity{ + power_source = {arcane=true}, + name = " of vileness", suffix=true, instant_resolve=true, + keywords = {vile=true}, + level_range = {1, 50}, + rarity = 15, + cost = 30, + combat={ + melee_project = { + [DamageType.BLIGHT] = resolvers.mbonus_material(15, 4) + }, + burst_on_crit = { + [DamageType.CORRUPTED_BLOOD] = resolvers.mbonus_material(25, 5), + }, + }, +} + +newEntity{ + power_source = {arcane=true}, + name = " of paradox", suffix=true, instant_resolve=true, + keywords = {paradox=true}, + level_range = {1, 50}, + rarity = 15, + cost = 30, wielder = { - combat_def = resolvers.mbonus_material(7, 3), + resists={ + [DamageType.TEMPORAL] = resolvers.mbonus_material(15, 5), + }, + on_melee_hit = { + [DamageType.TEMPORAL] = resolvers.mbonus_material(10, 2), + }, + }, + combat = { + melee_project = { + [DamageType.TEMPORAL] = resolvers.mbonus_material(15, 4) + }, }, } +-- Greater Egos newEntity{ - power_source = {technique=true}, - name = " of ruin", suffix=true, instant_resolve=true, - keywords = {ruin=true}, - level_range = {15, 50}, + power_source = {arcane=true}, + name = "elemental ", prefix=true, instant_resolve=true, + keywords = {elemental=true}, + level_range = {35, 50}, + greater_ego = 1, + rarity = 25, + cost = 35, + combat = { + convert_damage ={ + [DamageType.FIRE] = resolvers.mbonus_material(25, 10), + [DamageType.COLD] = resolvers.mbonus_material(25, 10), + [DamageType.ACID] = resolvers.mbonus_material(25, 10), + [DamageType.LIGHTNING] = resolvers.mbonus_material(25, 10), + }, + special_on_hit = {desc="random elemental effect", fct=function(combat, who, target) + local dam = 20 + (who:combatSpellpower()/5) + local tg = {type="hit", range=1} + local elem = rng.table{ + {engine.DamageType.FIREBURN, "flame"}, + {engine.DamageType.ICE, "freeze"}, + {engine.DamageType.LIGHTNING_DAZE, "lightning_explosion"}, + {engine.DamageType.ACID_BLIND, "acid"}, + } + who:project(tg, target.x, target.y, elem[1], rng.avg(dam / 2, dam, 3), {type=elem[2]}) + end}, + }, +} + +newEntity{ + power_source = {arcane=true}, + name = "plaguebringer's ", prefix=true, instant_resolve=true, + keywords = {plague=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 30, + cost = 60, + wielder = { + disease_immune = resolvers.mbonus_material(25, 10, function(e, v) v=v/100 return 0, v end), + }, + combat = { + melee_project = { + [DamageType.BLIGHT] = resolvers.mbonus_material(15, 4), + }, + talent_on_hit = { [Talents.T_EPIDEMIC] = {level=1, chance=10} }, + }, +} + +newEntity{ + power_source = {arcane=true}, + name = " of corruption", suffix=true, instant_resolve=true, + keywords = {corruption=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 35, + cost = 40, + combat = { + melee_project={ + [DamageType.BLIGHT] = resolvers.mbonus_material(15, 4), + [DamageType.DARKNESS] = resolvers.mbonus_material(15, 4), + }, + special_on_hit = {desc="20% chance to curse the target", fct=function(combat, who, target) + if not rng.percent(20) then return end + local eff = rng.table{"vuln", "defenseless", "impotence", "death", } + if not target:checkHit(who:combatSpellpower(), target:combatSpellResist()) then return end + if eff == "vuln" then target:setEffect(target.EFF_CURSE_VULNERABILITY, 2, {power=20}) + elseif eff == "defenseless" then target:setEffect(target.EFF_CURSE_DEFENSELESSNESS, 2, {power=20}) + elseif eff == "impotence" then target:setEffect(target.EFF_CURSE_IMPOTENCE, 2, {power=20}) + elseif eff == "death" then target:setEffect(target.EFF_CURSE_DEATH, 2, {src=who, power=20}) + end + end}, + }, +} + +newEntity{ + power_source = {arcane=true}, + name = " of the mystic", suffix=true, instant_resolve=true, + keywords = {mystic=true}, + level_range = {30, 50}, greater_ego = 1, - rarity = 20, - cost = 25, + rarity = 30, + cost = 30, wielder = { + combat_spellcrit = resolvers.mbonus_material(10, 2), inc_stats = { - [Stats.STAT_STR] = resolvers.mbonus_material(4, 3), + [Stats.STAT_MAG] = resolvers.mbonus_material(6, 1), + [Stats.STAT_WIL] = resolvers.mbonus_material(6, 1), }, - combat_physcrit = resolvers.mbonus_material(7, 3), - combat_critical_power = resolvers.mbonus_material(10, 10), - combat_apr = resolvers.mbonus_material(7, 3), }, +} +------------------------------------------------------- +-- Nature/Antimagic Egos:------------------------------ +------------------------------------------------------- +newEntity{ + power_source = {nature=true}, + name = "huntsmen's ", prefix=true, instant_resolve=true, + keywords = {hunt=true}, + level_range = {1, 50}, + rarity = 10, + cost = 20, + combat = { + melee_project={[DamageType.NATURE] = resolvers.mbonus_material(15, 4)}, + inc_damage_type = {animal=resolvers.mbonus_material(25, 5)}, + }, } newEntity{ - power_source = {technique=true}, - name = "quick ", prefix=true, instant_resolve=true, - keywords = {quick=true}, - level_range = {20, 50}, - greater_ego = 1, - rarity = 25, - cost = 30, - combat = { physspeed = -0.1 }, - wielder = { - combat_atk = resolvers.mbonus_material(20, 2), - inc_stats = { - [Stats.STAT_DEX] = resolvers.mbonus_material(4, 3), - [Stats.STAT_CUN] = resolvers.mbonus_material(4, 3), + power_source = {nature=true}, + name = "insidious ", prefix=true, instant_resolve=true, + keywords = {insid=true}, + level_range = {10, 50}, + rarity = 5, + cost = 15, + combat = { + melee_project={ + [DamageType.INSIDIOUS_POISON] = resolvers.mbonus_material(48, 8), -- this gets divided by 7 for damage }, }, } newEntity{ - power_source = {arcane=true}, - name = "mystic ", prefix=true, instant_resolve=true, - keywords = {mystic=true}, - level_range = {20, 50}, - greater_ego = 1, - rarity = 20, - cost = 30, - wielder = { - combat_spellcrit = resolvers.mbonus_material(7, 3), - inc_stats = { - [Stats.STAT_MAG] = resolvers.mbonus_material(4, 3), - [Stats.STAT_WIL] = resolvers.mbonus_material(4, 3), + power_source = {nature=true}, + name = " of erosion", suffix=true, instant_resolve=true, + keywords = {erosion=true}, + level_range = {1, 50}, + rarity = 5, + cost = 15, + combat = { + melee_project={ + [DamageType.NATURE] = resolvers.mbonus_material(15, 4), + [DamageType.WASTING] = resolvers.mbonus_material(15, 4), }, }, } newEntity{ - power_source = {technique=true}, + power_source = {nature=true}, name = "blazebringer's ", prefix=true, instant_resolve=true, keywords = {blaze=true}, - level_range = {10, 50}, + level_range = {30, 50}, greater_ego = 1, - rarity = 35, + rarity = 45, cost = 40, wielder = { - on_melee_hit = { - [DamageType.FIRE] = resolvers.mbonus_material(20, 5), - }, + global_speed_add = resolvers.mbonus_material(10, 5, function(e, v) v=v/100 return 0, v end), resists_pen = { - [DamageType.FIRE] = resolvers.mbonus_material(20, 5), + [DamageType.FIRE] = resolvers.mbonus_material(10, 2), }, }, combat = { - melee_project = { - [DamageType.FIRE] = resolvers.mbonus_material(46, 5), + convert_damage = { + [DamageType.FIREBURN] = resolvers.mbonus_material(25, 5, function(e, v) v=math.min(50, v) return 0, v end), }, }, } newEntity{ - power_source = {technique=true}, - name = "glacial ", prefix=true, instant_resolve=true, - keywords = {glacial=true}, + power_source = {nature=true}, + name = "caustic ", prefix=true, instant_resolve=true, + keywords = {caustic=true}, level_range = {30, 50}, greater_ego = 1, rarity = 45, cost = 40, wielder = { - on_melee_hit = { - [DamageType.ICE] = resolvers.mbonus_material(20, 5), - }, + life_regen = resolvers.mbonus_material(20, 5, function(e, v) v=v/10 return 0, v end), resists_pen = { - [DamageType.COLD] = resolvers.mbonus_material(20, 5), + [DamageType.ACID] = resolvers.mbonus_material(10, 2), }, }, combat = { - melee_project = { - [DamageType.COLD] = resolvers.mbonus_material(46, 5), + convert_damage = { + [DamageType.ACID_BLIND] = resolvers.mbonus_material(25, 5, function(e, v) v=math.min(50, v) return 0, v end), }, }, } newEntity{ - power_source = {technique=true}, + power_source = {nature=true}, name = "thunderous ", prefix=true, instant_resolve=true, keywords = {thunder=true}, - level_range = {10, 50}, + level_range = {30, 50}, greater_ego = 1, - rarity = 35, + rarity = 45, cost = 40, wielder = { - on_melee_hit = { - [DamageType.LIGHTNING] = resolvers.mbonus_material(20, 5), + inc_stats = { + [Stats.STAT_STR] = resolvers.mbonus_material(3, 1), + [Stats.STAT_DEX] = resolvers.mbonus_material(3, 1), + [Stats.STAT_MAG] = resolvers.mbonus_material(3, 1), + [Stats.STAT_WIL] = resolvers.mbonus_material(3, 1), + [Stats.STAT_CUN] = resolvers.mbonus_material(3, 1), + [Stats.STAT_CON] = resolvers.mbonus_material(3, 1), }, resists_pen = { - [DamageType.LIGHTNING] = resolvers.mbonus_material(20, 5), + [DamageType.LIGHTNING] = resolvers.mbonus_material(10, 2), }, }, combat = { - melee_project = { - [DamageType.LIGHTNING] = resolvers.mbonus_material(46, 5), + convert_damage = { + [DamageType.LIGHTNING_DAZE] = resolvers.mbonus_material(25, 5, function(e, v) v=math.min(50, v) return 0, v end), }, }, } newEntity{ - power_source = {technique=true}, - name = "caustic ", prefix=true, instant_resolve=true, - keywords = {caustic=true}, - level_range = {10, 50}, + power_source = {nature=true}, + name = "glacial ", prefix=true, instant_resolve=true, + keywords = {glacial=true}, + level_range = {30, 50}, greater_ego = 1, - rarity = 35, + rarity = 45, cost = 40, wielder = { - on_melee_hit = { - [DamageType.ACID] = resolvers.mbonus_material(20, 5), - }, + combat_armor = resolvers.mbonus_material(10, 2), resists_pen = { - [DamageType.ACID] = resolvers.mbonus_material(20, 5), + [DamageType.COLD] = resolvers.mbonus_material(10, 2), }, }, combat = { - melee_project = { - [DamageType.ACID] = resolvers.mbonus_material(46, 5), + convert_damage = { + [DamageType.ICE] = resolvers.mbonus_material(25, 5, function(e, v) v=math.min(50, v) return 0, v end), }, }, } newEntity{ power_source = {nature=true}, - name = "vile ", prefix=true, instant_resolve=true, - keywords = {vile=true}, + name = " of gravity", suffix=true, instant_resolve=true, + keywords = {gravity=true}, level_range = {30, 50}, greater_ego = 1, - rarity = 45, - cost = 40, + rarity = 30, + cost = 30, wielder = { - on_melee_hit = { - [DamageType.SLIME] = resolvers.mbonus_material(20, 5), - }, - resists_pen = { - [DamageType.NATURE] = resolvers.mbonus_material(20, 5), + inc_damage = { + [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 2), }, }, combat = { - melee_project = { - [DamageType.SLIME] = resolvers.mbonus_material(46, 5), - }, + melee_project={ + [DamageType.GRAVITY] = resolvers.mbonus_material(15, 4), + }, + special_on_hit = {desc="25% chance to crush the target", fct=function(combat, who, target) + if not rng.percent(25) then return end + if target:attr("never_move") then + local tg = {type="hit", range=1} + who:project(tg, target.x, target.y, engine.DamageType.IMPLOSION, 10 + who:combatMindpower()/4) + elseif target:canBe("pin") then + target:setEffect(target.EFF_PINNED, 3, {src=who, apply_power=who:combatAttack(combat)}) + else + game.logSeen(target, "%s resists the pin!", target.name:capitalize()) + end + end}, }, } newEntity{ - power_source = {technique=true}, - name = "warbringer's ", prefix=true, instant_resolve=true, - keywords = {warbringer=true}, + power_source = {nature=true}, + name = " of nature", suffix=true, instant_resolve=true, + keywords = {nature=true}, level_range = {30, 50}, greater_ego = 1, - rarity = 30, + rarity = 45, cost = 40, wielder = { - inc_stats = { - [Stats.STAT_CON] = resolvers.mbonus_material(9, 1), - }, - disarm_immune = resolvers.mbonus_material(25, 10, function(e, v) v=v/100 return 0, v end), - combat_dam = resolvers.mbonus_material(15, 5), + resists = { all = resolvers.mbonus_material(10, 2) }, resists_pen = { - [DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5), + [DamageType.NATURE] = resolvers.mbonus_material(10, 2), + }, + }, + combat = { + convert_damage = { + [DamageType.POISON] = resolvers.mbonus_material(25, 4), }, }, } +-- Antimagic newEntity{ - power_source = {technique=true}, - name = " of shearing", suffix=true, instant_resolve=true, - keywords = {shearing=true}, - level_range = {20, 50}, - greater_ego = 1, + power_source = {antimagic=true}, + name = "manaburning ", prefix=true, instant_resolve=true, + keywords = {manaburning=true}, + level_range = {1, 50}, rarity = 20, cost = 40, - wielder = { - combat_apr = resolvers.mbonus_material(15, 5), - inc_damage = { - [DamageType.PHYSICAL] = resolvers.mbonus_material(10, 5), - }, - resists_pen = { - [DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5), + combat = { + melee_project = { + [DamageType.MANABURN] = resolvers.mbonus_material(25, 8), }, }, } newEntity{ - power_source = {arcane=true}, - name = " of plague", suffix=true, instant_resolve=true, - keywords = {plague=true}, - level_range = {20, 50}, - greater_ego = 1, - rarity = 30, - cost = 60, - max_power = 80, power_regen = 1, - use_talent = { id = Talents.T_EPIDEMIC, level = 4, power = 80 }, - wielder = { - inc_stats = { - [Stats.STAT_CON] = resolvers.mbonus_material(10, 5, function(e, v) return 0, -v end), - [Stats.STAT_MAG] = resolvers.mbonus_material(5, 1), - }, - disease_immune = resolvers.mbonus_material(55, 10, function(e, v) v=v/100 return 0, v end), + power_source = {antimagic=true}, + name = "slime-covered ", prefix=true, instant_resolve=true, + keywords = {slime=true}, + level_range = {1, 50}, + rarity = 20, + cost = 15, + combat = { + melee_project={[DamageType.SLIME] = resolvers.mbonus_material(15, 4)}, }, +} + +newEntity{ + power_source = {antimagic=true}, + name = " of banishment", suffix=true, instant_resolve=true, + keywords = {banishment=true}, + level_range = {1, 50}, + rarity = 20, + cost = 20, combat = { - melee_project = { - [DamageType.BLIGHT] = resolvers.mbonus_material(46, 5), - }, + inc_stats = { [Stats.STAT_WIL] = resolvers.mbonus_material(6, 1), }, + inc_damage_type = {demon=resolvers.mbonus_material(25, 5)}, }, } newEntity{ - power_source = {technique=true}, - name = " of projection", suffix=true, instant_resolve=true, - keywords = {projection=true}, + power_source = {antimagic=true}, + name = " of purging", suffix=true, instant_resolve=true, + keywords = {purging=true}, + level_range = {1, 50}, + rarity = 20, + cost = 20, + combat = { + melee_project={[DamageType.NATURE] = resolvers.mbonus_material(15, 4)}, + special_on_hit = {desc="25% chance to remove a magical effect", fct=function(combat, who, target) + if not rng.percent(25) then return end + -- Go through all spell effects + for eff_id, p in pairs(target.tmp) do + local e = target.tempeffect_def[eff_id] + if e.type == "magical" then + effs[#effs+1] = {"effect", eff_id} + end + end + + -- Go through all sustained spells + for tid, act in pairs(target.sustain_talents) do + if act then + local talent = target:getTalentFromId(tid) + if talent.is_spell then effs[#effs+1] = {"talent", tid} end + end + end + + local eff = rng.tableRemove(effs) + + if eff[1] == "effect" then + target:removeEffect(eff[2]) + else + target:forceUseTalent(eff[2], {ignore_energy=true}) + end + end}, + }, +} + +newEntity{ + power_source = {antimagic=true}, + name = "inquisitor's ", prefix=true, instant_resolve=true, + keywords = {inquisitors=true}, level_range = {30, 50}, + rarity = 45, greater_ego = 1, - rarity = 30, - cost = 60, - max_power = 20, power_regen = 1, - use_talent = { id = Talents.T_WAVE_OF_POWER, level = 4, power = 12 }, + cost = 40, + combat = { + melee_project = { + [DamageType.MANABURN] = resolvers.mbonus_material(25, 8), + }, + special_on_crit = {desc="burns latenet spell energy", fct=function(combat, who, target) + local turns = 1 + math.ceil(who:combatMindpower() / 20) + if not who:checkHit(who:combatMindpower(), target:combatMentalResist()) then game.logSeen(target, "%s resists!", target.name:capitalize()) return nil end + + local tids = {} + for tid, lev in pairs(target.talents) do + local t = target:getTalentFromId(tid) + if t and not target.talents_cd[tid] and t.mode == "activated" and t.is_spell and not t.innate then tids[#tids+1] = t end + end + + local t = rng.tableRemove(tids) + if not t then return nil end + local damage = t.mana or t.vim or t.positive or t.negative or t.paradox or 0 + target.talents_cd[t.id] = turns + + local tg = {type="hit", range=1} + who:project(tg, target.x, target.y, engine.DamageType.ARCANE, damage) + + game.logSeen(target, "%s's %s has been burned!", target.name:capitalize(), t.name) + end}, + }, } newEntity{ - power_source = {technique=true}, - name = " of sacrifice", suffix=true, instant_resolve=true, - keywords = {sacrifice=true}, - level_range = {20, 50}, + power_source = {antimagic=true}, + name = " of disruption", suffix=true, instant_resolve=true, + keywords = {disruption=true}, + level_range = {30, 50}, greater_ego = 1, - rarity = 20, + rarity = 50, cost = 40, - max_power = 80, power_regen = 1, - use_talent = { id = Talents.T_LIFE_TAP, level = 3, power = 80 }, wielder = { - combat_physcrit = resolvers.mbonus_material(4, 3), - combat_dam = resolvers.mbonus_material(12, 3), + }, + combat = { + inc_damage_type = { + undead=resolvers.mbonus_material(25, 5), + construct=resolvers.mbonus_material(25, 5), + }, + special_on_hit = {desc="disrupts spell-casting", fct=function(combat, who, target) + target:setEffect(target.EFF_SPELL_DISRUPTION, 10, {src=who, power = 10, max = 50, apply_power=who:combatMindpower()}) + end}, }, } newEntity{ - power_source = {arcane=true}, - name = " of paradox", suffix=true, instant_resolve=true, - keywords = {paradox=true}, - level_range = {1, 50}, + power_source = {antimagic=true}, + name = " of the leech", suffix=true, instant_resolve=true, + keywords = {leech=true}, + level_range = {30, 50}, greater_ego = 1, - rarity = 15, - cost = 30, + rarity = 50, + cost = 40, wielder = { - resists={ - [DamageType.TEMPORAL] = resolvers.mbonus_material(15, 5), - }, on_melee_hit = { - [DamageType.TEMPORAL] = resolvers.mbonus_material(10, 5), + [DamageType.SLIME] = resolvers.mbonus_material(15, 4), }, }, combat = { - melee_project = { - [DamageType.TEMPORAL] = resolvers.mbonus_material(46, 5), + melee_project={[DamageType.SLIME] = resolvers.mbonus_material(15, 4)}, + special_on_hit = {desc="leeches stamina from the target", fct=function(combat, who, target) + if target and target:getStamina() > 0 then + local leech = who:combatMindpower() / 50 + local leeched = math.min(leech, target:getStamina()) + who:incStamina(leeched) + target:incStamina(-leeched) + end + end}, + }, +} + +------------------------------------------------------- +-- Psionic Egos: -------------------------------------- +------------------------------------------------------- +newEntity{ + power_source = {psionic=true}, + name = "hateful ", prefix=true, instant_resolve=true, + keywords = {hateful=true}, + level_range = {1, 50}, + rarity = 10, + cost = 20, + combat = { + melee_project={[DamageType.DARKNESS] = resolvers.mbonus_material(15, 4)}, + inc_damage_type = {humanoid=resolvers.mbonus_material(25, 5)}, + }, +} + +newEntity{ + power_source = {psionic=true}, + name = "thought-forged ", prefix=true, instant_resolve=true, + keywords = {thought=true}, + level_range = {1, 50}, + rarity = 5, + cost = 10, + combat = { + melee_project={ + [DamageType.MIND] = resolvers.mbonus_material(15, 4), + }, + convert_damage = { + [DamageType.MIND] = resolvers.mbonus_material(25, 5), }, }, } newEntity{ - power_source = {nature=true, antimagic=true}, - name = "manaburning ", prefix=true, instant_resolve=true, - keywords = {manaburning=true}, + power_source = {psionic=true}, + name = " of amnesia", suffix=true, instant_resolve=true, + keywords = {forgotten=true}, level_range = {10, 50}, - greater_ego = 1, - rarity = 25, - cost = 40, + rarity = 25, -- very rare because no one can remember how to make them... haha + cost = 15, + wielder = { + on_melee_hit = { + [DamageType.MIND] = resolvers.mbonus_material(15, 4), + }, + }, combat = { - melee_project = { - [DamageType.MANABURN] = resolvers.mbonus_material(50, 15), + special_on_hit = {desc="25% chance to put talents on cooldown", fct=function(combat, who, target) + if not rng.percent(25) then return nil end + local turns = 1 + math.ceil(who:combatMindpower() / 20) + local number = 2 + math.ceil(who:combatMindpower() / 50) + if not who:checkHit(who:combatMindpower(), target:combatMentalResist()) then game.logSeen(target, "%s resists!", target.name:capitalize()) return nil end + + local tids = {} + for tid, lev in pairs(target.talents) do + local t = target:getTalentFromId(tid) + if t and not target.talents_cd[tid] and t.mode == "activated" and not t.innate then tids[#tids+1] = t end + end + + for i = 1, number do + local t = rng.tableRemove(tids) + if not t then break end + target.talents_cd[t.id] = turns + game.logSeen(target, "%s has temporarily forgotten %s!", target.name:capitalize(), t.name) + end + end}, + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of projection", suffix=true, instant_resolve=true, + keywords = {projection=true}, + level_range = {1, 50}, + rarity = 5, + cost = 15, + max_power = 6, power_regen = 1, + use_power = { name = "project an attack as mind damage", power = 6, + use = function(self, who) + local tg = {type="bolt", range=5} + local x, y = who:getTarget(tg) + if not x or not y then return nil end + local _ _, x, y = who:canProject(tg, x, y) + local target = game.level.map(x, y, engine.Map.ACTOR) + if target then + who:attackTarget(target, engine.DamageType.MIND, 1, true) + else + return + end + return {id=true, used=true} + end + }, + combat = { + melee_project={ + [DamageType.MIND] = resolvers.mbonus_material(15, 4), + }, + }, +} + +newEntity{ + power_source = {psionic=true}, + name = "psychic's ", prefix=true, instant_resolve=true, + keywords = {psychic=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 30, + cost = 30, + wielder = { + combat_mindcrit = resolvers.mbonus_material(10, 2), + inc_stats = { + [Stats.STAT_CUN] = resolvers.mbonus_material(6, 1), + [Stats.STAT_WIL] = resolvers.mbonus_material(6, 1), + }, + }, +} + +newEntity{ + power_source = {psionic=true}, + name = " of torment", suffix=true, instant_resolve=true, + keywords = {torment=true}, + level_range = {30, 50}, + greater_ego = 1, + rarity = 30, + cost = 30, + wielder = { + resists_pen = { + [DamageType.MIND] = resolvers.mbonus_material(10, 2), + [DamageType.DARKNESS] = resolvers.mbonus_material(10, 2), }, }, + combat = { + special_on_hit = {desc="20% chance to torment the target", fct=function(combat, who, target) + if not rng.percent(20) then return end + local eff = rng.table{"stun", "blind", "pin", "confusion", "silence",} + if not target:canBe(eff) then return end + if not target:checkHit(who:combatMindpower(), target:combatMentalResist()) then return end + if eff == "stun" then target:setEffect(target.EFF_STUNNED, 3, {}) + elseif eff == "blind" then target:setEffect(target.EFF_BLINDED, 3, {}) + elseif eff == "pin" then target:setEffect(target.EFF_PINNED, 3, {}) + elseif eff == "confusion" then target:setEffect(target.EFF_CONFUSED, 3, {power=60}) + elseif eff == "silence" then target:setEffect(target.EFF_SILENCED, 3, {}) + end + end}, + }, } diff --git a/game/modules/tome/data/general/objects/knifes.lua b/game/modules/tome/data/general/objects/knifes.lua index da79b57621..99d67f1359 100644 --- a/game/modules/tome/data/general/objects/knifes.lua +++ b/game/modules/tome/data/general/objects/knifes.lua @@ -29,6 +29,7 @@ newEntity{ metallic = true, combat = { talented = "knife", damrange = 1.3, physspeed = 1, sound = {"actions/melee", pitch=1.2, vol=1.2}, sound_miss = {"actions/melee", pitch=1.2, vol=1.2} }, desc = [[Sharp, short and deadly.]], + ego_bonus_mult = -0.2, randart_able = { attack=40, physical=80, spell=20, def=10, misc=10 }, egos = "/data/general/objects/egos/weapon.lua", egos_chance = { prefix=resolvers.mbonus(40, 5), suffix=resolvers.mbonus(40, 5) }, } diff --git a/game/modules/tome/data/general/objects/mindstars.lua b/game/modules/tome/data/general/objects/mindstars.lua index 8be411ed38..c055ecb4c8 100644 --- a/game/modules/tome/data/general/objects/mindstars.lua +++ b/game/modules/tome/data/general/objects/mindstars.lua @@ -25,7 +25,7 @@ newEntity{ display = "!", color=colors.LIGHT_RED, image = resolvers.image_material("mindstar", "wood"), moddable_tile = resolvers.moddable_tile("mindstar"), randart_able = { attack=10, physical=40, spell=1, def=10, misc=10 }, - encumber = 5, + encumber = 3, rarity = 4, power_source = {nature=true}, combat = { diff --git a/game/modules/tome/data/general/objects/slings.lua b/game/modules/tome/data/general/objects/slings.lua index 8a2397cc86..4d0fe6ec71 100644 --- a/game/modules/tome/data/general/objects/slings.lua +++ b/game/modules/tome/data/general/objects/slings.lua @@ -104,7 +104,7 @@ newEntity{ type = "ammo", subtype="shot", add_name = " (#COMBAT_AMMO#)", display = "{", color=colors.UMBER, image = resolvers.image_material("shot", "metal"), - encumber = 5, + encumber = 3, rarity = 11, combat = { talented = "sling", damrange = 1.2}, proj_image = resolvers.image_material("shot_s", "metal"), diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua index 1f03c8bb47..5b11009326 100644 --- a/game/modules/tome/data/general/objects/world-artifacts.lua +++ b/game/modules/tome/data/general/objects/world-artifacts.lua @@ -37,7 +37,7 @@ newEntity{ base = "BASE_STAFF", rarity = 170, desc = [[This unique-looking staff is carved with runes of destruction.]], cost = 200, - material_level = 3, + material_level = 2, require = { stat = { mag=24 }, }, combat = { @@ -66,7 +66,7 @@ newEntity{ base = "BASE_STAFF", rarity = 200, desc = [[A powerful staff sent in secret to Angolwen by the Shaloren, to aid their fighting of the plagues following the Spellblaze.]], cost = 200, - material_level = 2, + material_level = 1, require = { stat = { mag=24 }, }, combat = { @@ -157,7 +157,7 @@ newEntity{ base = "BASE_STAFF", rarity = 220, desc = [[A thick staff with a heavy knob on the end. It was said to be used by the grand alchemist Bolbum in the Age of Allure. Much renowned is the fear of his students for their master, and the high rate of cranial injuries amongst them. Bolbum died with seven daggers in his back and his much-cursed staff went missing after.]], cost = 300, - material_level = 4, + material_level = 3, require = { stat = { mag=38 }, }, combat = { @@ -305,10 +305,10 @@ newEntity{ base = "BASE_AMULET", rarity = 200, cost = 90, material_level = 2, - wielder = { max_encumber = 20, fatigue = -20, + avoid_pressure_traps = 1, }, } @@ -333,6 +333,16 @@ newEntity{ base = "BASE_AMULET", }, max_power = 60, power_regen = 1, use_talent = { id = Talents.T_JUGGERNAUT, level = 2, power = 30 }, + on_wear = function(self, who) + if who.descriptor and who.descriptor.race == "Halfling" then + local Talents = require "engine.interface.ActorStats" + + self:specialWearAdd({"wielder", "talents_types_mastery"}, { ["technique/battle-tactics"] = 0.2 }) + self:specialWearAdd({"wielder","combat_armor"}, 5) + self:specialWearAdd({"wielder","combat_crit_reduction"}, 10) + game.logPlayer(who, "#LIGHT_BLUE#You feel invincible!") + end + end, } newEntity{ base = "BASE_AMULET", define_as = "SET_GARKUL_TEETH", @@ -344,7 +354,7 @@ newEntity{ base = "BASE_AMULET", define_as = "SET_GARKUL_TEETH", level_range = {40, 50}, rarity = 300, cost = 1000, - material_level = 4, + material_level = 5, wielder = { inc_stats = { [Stats.STAT_STR] = 10, @@ -395,7 +405,20 @@ newEntity{ base = "BASE_LITE", }, wielder = { lite = 4, + healing_factor = 0.1, + talent_cd_reduction= { + [Talents.T_HEALING_LIGHT] = 1, + [Talents.T_BATHE_IN_LIGHT] = 1, + [Talents.T_BARRIER] = 2, + [Talents.T_PROVIDENCE] = 5, + }, }, + on_wear = function(self, who) + if who.descriptor and who.descriptor.subclass == "Sun Paladin" then + self:specialWearAdd({"wielder", "positive_regen"}, 0.2) + game.logPlayer(who, "#GOLD#You feel a swell of positive energy!") + end + end, } newEntity{ base = "BASE_LITE", @@ -407,6 +430,7 @@ newEntity{ base = "BASE_LITE", color=colors.YELLOW, encumber = 1, rarity = 250, + material_level = 3, desc = [[The first Halfling mages during the Age of Allure discovered how to capture the Sunlight and infuse gems with it. This star is the culmination of their craft. Light radiates from its ever-shifting yellow surface.]], cost = 400, @@ -433,12 +457,13 @@ newEntity{ base = "BASE_LITE", color = colors.RED, encumber = 1, rarity = 300, + material_level = 4, desc = [[This dark red heart still beats despite being seperated from its owner. It also snuffs out any light source that comes near it.]], cost = 100, wielder = { lite = -1000, - infravision = 7, + infravision = 6, resists_cap = { [DamageType.LIGHT] = 10 }, resists = { [DamageType.LIGHT] = 30 }, }, @@ -459,7 +484,7 @@ newEntity{ base = "BASE_LITE", desc = [[Said to have once belonged to Inquisitor Marcus Dunn during the Spellhunt this fist sized quartz crystal glows constantly with a soft white light and was rumoured to be a great aid in meditation, helping focus the mind, body, and soul of the owner as well as protecting them from the foulest of magics. It seems somebody well versed in antimagic could use it to its fullest potential.]], cost = 100, - material_level = 4, + material_level = 5, wielder = { lite = 4, @@ -617,7 +642,7 @@ newEntity{ base = "BASE_GREATSWORD", desc = [[Farian was King Toknor's captain, and fought by his side in the great Battle of Last Hope. However, when he returned after the battle to find his hometown burnt in an orcish pyre, a madness overtook him. The desire for vengeance made him quit the army and strike out on his own, lightly armoured and carrying nought but his sword. Most thought him dead until the reports came back of a fell figure tearing through the orcish encampments, slaughtering all before him and mercilessly butchering the corpses after. It is said his blade drank the blood of 100 orcs each day until finally all of Maj'Eyal was cleared of their presence. When the final orc was slain and no more were to be found, Farian at the last turned the blade on himself and stuck it through his chest. Those nearby said his body shook with convulsions as he did so, though they could not tell whether he was laughing or crying.]], cost = 400, require = { stat = { str=40, wil=20 }, }, - material_level = 5, + material_level = 3, combat = { dam = 42, apr = 4, @@ -633,7 +658,7 @@ newEntity{ base = "BASE_GREATSWORD", } newEntity{ base = "BASE_KNIFE", - power_source = {technique=true}, + power_source = {arcane=true}, unique = true, name = "Unerring Scalpel", image = "object/artifact/unerring_scalpel.png", unided_name = "long sharp scalpel", @@ -642,12 +667,13 @@ newEntity{ base = "BASE_KNIFE", rarity = 200, require = { stat = { cun=16 }, }, cost = 80, - material_level = 3, + material_level = 1, combat = { dam = 15, - apr = 10, + apr = 25, physcrit = 0, dammod = {dex=0.55, str=0.45}, + phasing = 50, }, wielder = {combat_atk=20}, } @@ -663,7 +689,7 @@ newEntity{ base = "BASE_LEATHER_BOOT", level_range = {1, 20}, rarity = 200, cost = 100, - material_level = 3, + material_level = 2, wielder = { combat_armor = 1, combat_def = 2, @@ -693,7 +719,7 @@ newEntity{ base = "BASE_SHIELD", rarity = 300, require = { stat = { str=28 }, }, cost = 350, - material_level = 5, + material_level = 4, special_combat = { dam = 58, physcrit = 4.5, @@ -721,7 +747,7 @@ newEntity{ base = "BASE_SHIELD", rarity = 270, require = { stat = { str=37 }, }, cost = 300, - material_level = 4, + material_level = 3, special_combat = { dam = 48, physcrit = 4.5, @@ -746,7 +772,7 @@ newEntity{ base = "BASE_LIGHT_ARMOR", rarity = 270, cost = 200, require = { stat = { str=22 }, }, - material_level = 4, + material_level = 3, wielder = { combat_def = 6, combat_armor = 7, @@ -817,7 +843,7 @@ newEntity{ base = "BASE_HELM", level_range = {20, 28}, rarity = 240, cost = 700, - material_level = 3, + material_level = 2, wielder = { lite = 1, combat_armor = 6, @@ -825,6 +851,9 @@ newEntity{ base = "BASE_HELM", blind_immune = 0.3, confusion_immune = 0.3, inc_stats = { [Stats.STAT_WIL] = 3, [Stats.STAT_MAG] = 4, }, + inc_damage={ + [DamageType.LIGHT] = 8, + }, }, max_power = 30, power_regen = 1, use_talent = { id = Talents.T_SUN_FLARE, level = 3, power = 30 }, @@ -869,7 +898,7 @@ newEntity{ base = "BASE_KNIFE", rarity = 200, require = { stat = { cun=25 }, }, cost = 250, - material_level = 3, + material_level = 2, combat = { dam = 25, apr = 10, @@ -956,7 +985,7 @@ newEntity{ base = "BASE_RING", name = "Ring of the War Master", color = colors.DARK_GREY, image = "object/artifact/ring_of_war_master.png", unided_name = "blade-edged ring", desc = [[A blade-edged ring that radiates power. As you put it on, strange thoughts of pain and destruction come to your mind.]], - level_range = {15, 30}, + level_range = {40, 50}, rarity = 200, cost = 500, material_level = 5, @@ -1041,7 +1070,7 @@ newEntity{ base = "BASE_MACE", name = "Crooked Club", color = colors.GREEN, image = "object/artifact/weapon_crooked_club.png", unided_name = "weird club", desc = [[An oddly twisted club with a hefty weight on the end.]], - level_range = {3, 12}, + level_range = {12, 20}, rarity = 192, require = { stat = { str=20 }, }, cost = 250, @@ -1066,7 +1095,7 @@ newEntity{ base = "BASE_MACE", rarity = 340, require = { stat = { str=42 } }, cost = 350, - material_level = 4, + material_level = 3, combat = { dam = 40, apr = 4, @@ -1111,7 +1140,7 @@ newEntity{ base = "BASE_HELM", level_range = {37, 45}, rarity = 280, cost = 400, - material_level = 5, + material_level = 4, wielder = { inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_CON] = 5, [Stats.STAT_LCK] = -4, }, combat_def = 5, @@ -1132,7 +1161,7 @@ newEntity{ base = "BASE_HELM", level_range = {20, 35}, rarity = 280, cost = 300, - material_level = 5, + material_level = 3, wielder = { inc_stats = { [Stats.STAT_CON] = 3, [Stats.STAT_WIL] = 10, }, combat_def = 3, @@ -1178,7 +1207,7 @@ newEntity{ base = "BASE_GAUNTLETS", level_range = {40, 50}, rarity = 300, cost = 2000, - material_level = 3, + material_level = 5, wielder = { inc_stats = { [Stats.STAT_STR] = 6, [Stats.STAT_MAG] = 6 }, inc_damage = { [DamageType.PHYSICAL] = 10 }, @@ -1233,7 +1262,7 @@ Finally The Scorpion was defeated by the alchemist Nessylia, who went to face th } newEntity{ base = "BASE_GLOVES", - power_source = {nature=true}, + power_source = {nature=true}, define_as = "SET_GIANT_WRAPS", unique = true, name = "Snow Giant Wraps", color = colors.SANDY_BROWN, image = "object/artifact/snow_giant_arm_wraps.png", unided_name = "fur-lined leather wraps", @@ -1241,7 +1270,7 @@ newEntity{ base = "BASE_GLOVES", level_range = {15, 25}, rarity = 200, cost = 500, - material_level = 1, + material_level = 3, wielder = { inc_stats = { [Stats.STAT_STR] = 4, }, resists = { [DamageType.COLD]= 10, [DamageType.LIGHTNING] = 10, }, @@ -1259,6 +1288,40 @@ newEntity{ base = "BASE_GLOVES", }, max_power = 6, power_regen = 1, use_talent = { id = Talents.T_THROW_BOULDER, level = 2, power = 6 }, + + set_list = { {"define_as", "SET_MIGHTY_GIRDLE"} }, + on_set_complete = function(self, who) + self:specialSetAdd({"wielder","combat_dam"}, 10) + self:specialSetAdd({"wielder","combat_physresist"}, 10) + end, +} + +newEntity{ base = "BASE_LEATHER_BELT", + power_source = {technique=true}, define_as = "SET_MIGHTY_GIRDLE", + unique = true, + name = "Mighty Girdle", image = "object/artifact/belt_mighty_girdle.png", + unided_name = "massive, stained girdle", + desc = [[This girdle is enchanted with mighty wards against expanding girth. Whatever the source of its wondrous strength, it will prove of great aid in the transport of awkward burdens.]], + color = colors.LIGHT_RED, + level_range = {1, 25}, + rarity = 170, + cost = 350, + material_level = 2, + wielder = { + knockback_immune = 0.4, + max_encumber = 70, + combat_armor = 4, + }, + + set_list = { {"define_as", "SET_GIANT_WRAPS"} }, + on_set_complete = function(self, who) + self:specialSetAdd({"wielder","max_life"}, 100) + self:specialSetAdd({"wielder","size_category"}, 2) + game.logPlayer(who, "#GOLD#You grow to immense size!") + end, + on_set_broken = function(self, who) + game.logPlayer(who, "#LIGHT_BLUE#You feel a lot smaller...") + end, } newEntity{ base = "BASE_GAUNTLETS", @@ -1270,7 +1333,7 @@ newEntity{ base = "BASE_GAUNTLETS", level_range = {25, 35}, rarity = 250, cost = 1000, - material_level = 5, + material_level = 3, require = nil, wielder = { inc_stats = { [Stats.STAT_MAG] = 4, }, @@ -1345,7 +1408,7 @@ It was made by Humans for Humans; only they can harness the true power of the ro level_range = {12, 22}, rarity = 220, cost = 150, - material_level = 3, + material_level = 2, wielder = { inc_damage = {[DamageType.ARCANE]=10}, inc_stats = { [Stats.STAT_MAG] = 6 }, @@ -1373,7 +1436,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", level_range = {20, 30}, rarity = 300, cost = 280, - material_level = 4, + material_level = 3, wielder = { inc_damage = {[DamageType.FIRE]=20}, combat_def = 8, @@ -1394,7 +1457,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", level_range = {30, 40}, rarity = 290, cost = 550, - material_level = 5, + material_level = 4, moddable_tile = "special/robe_of_the_archmage", moddable_tile_big = true, wielder = { @@ -1422,7 +1485,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", level_range = {30, 40}, rarity = 310, cost = 540, - material_level = 5, + material_level = 4, wielder = { inc_damage = {[DamageType.TEMPORAL]=20}, combat_def = 9, @@ -1531,7 +1594,7 @@ newEntity{ base = "BASE_WAND", elec_proof = true, add_name = false, - material_level = 5, + material_level = 2, max_power = 75, power_regen = 1, use_power = { name = "shoot a cone of fire", power = 20, @@ -1591,7 +1654,7 @@ newEntity{ base = "BASE_BATTLEAXE", rarity = 300, cost = 400, level_range = {20, 35}, - material_level = 4, + material_level = 3, combat = { dam = 52, apr = 21, @@ -1617,19 +1680,26 @@ newEntity{ base = "BASE_WARAXE", rarity = 235, require = { stat = { str=40, dex=24 }, }, cost = 330, - material_level = 4, + material_level = 3, + wielder = { + combat_armor = 20, + resists_pen = { + [DamageType.COLD] = 20, + }, + }, combat = { dam = 33, apr = 4.5, physcrit = 7, dammod = {str=1}, - melee_project={[DamageType.COLD] = 25}, - }, - wielder = { - combat_atk = 15, + convert_damage = { + [DamageType.ICE] = 50, + }, }, + talent_on_hit = { [Talents.T_ICE_BREATH] = {level=2, chance=15} }, } + newEntity{ base = "BASE_WHIP", power_source = {nature=true}, unided_name = "metal whip", @@ -1637,39 +1707,24 @@ newEntity{ base = "BASE_WHIP", desc = [[A long whip of linked metal joints finished with a viciously sharp barb leaking venomous poison.]], require = { stat = { dex=28 }, }, cost = 150, + rarity = 340, + level_range = {20, 30}, material_level = 3, combat = { dam = 28, apr = 8, physcrit = 5, dammod = {dex=1}, - melee_project={[DamageType.POISON] = 22}, + melee_project={[DamageType.POISON] = 22, [DamageType.BLEED] = 22}, + talent_on_hit = { T_DISARM = {level=3, chance=10} }, }, wielder = { combat_atk = 10, see_invisible = 9, + see_stealth = 9, }, } -newEntity{ base = "BASE_LEATHER_BELT", - power_source = {technique=true}, - unique = true, - name = "Mighty Girdle", image = "object/artifact/belt_mighty_girdle.png", - unided_name = "massive, stained girdle", - desc = [[This girdle is enchanted with mighty wards against expanding girth. Whatever the source of its wondrous strength, it will prove of great aid in the transport of awkward burdens.]], - color = colors.LIGHT_RED, - level_range = {1, 25}, - rarity = 170, - cost = 350, - material_level = 5, - wielder = { - knockback_immune = 0.4, - max_encumber = 70, - combat_armor = 4, - }, -} - - newEntity{ base = "BASE_LEATHER_BELT", power_source = {nature=true}, unique = true, @@ -1680,7 +1735,7 @@ newEntity{ base = "BASE_LEATHER_BELT", level_range = {20, 30}, rarity = 200, cost = 450, - material_level = 5, + material_level = 2, wielder = { inc_stats = { [Stats.STAT_CUN] = 7, [Stats.STAT_WIL] = 8, }, combat_mindpower = 12, @@ -1730,7 +1785,7 @@ newEntity{ base = "BASE_LEATHER_BELT", level_range = {5, 14}, rarity = 120, cost = 75, - material_level = 3, + material_level = 1, wielder = { inc_stats = { [Stats.STAT_WIL] = 3, }, resists = { @@ -1753,7 +1808,7 @@ newEntity{ base = "BASE_LIGHT_ARMOR", rarity = 230, require = { stat = { str=22 }, }, cost = 250, - material_level = 3, + material_level = 2, wielder = { inc_stats = { [Stats.STAT_STR] = 2, [Stats.STAT_CON] = 2 }, @@ -1790,7 +1845,7 @@ newEntity{ base = "BASE_LIGHT_ARMOR", combat_def = 12, fatigue = 7, max_life = 40, - infravision = 6, + infravision = 3, talents_types_mastery = { ["cunning/stealth"] = -0.2, }, }, } @@ -1806,7 +1861,7 @@ newEntity{ base = "BASE_LIGHT_ARMOR", rarity = 350, require = { stat = { str=20 }, {wil=20} }, cost = 350, - material_level = 4, + material_level = 2, wielder = { inc_stats = { [Stats.STAT_WIL] = 3, [Stats.STAT_CON] = 4 }, @@ -1840,7 +1895,7 @@ newEntity{ base = "BASE_HEAVY_ARMOR", rarity = 190, require = { stat = { str=14 }, }, cost = 200, - material_level = 1, + material_level = 2, wielder = { inc_stats = { [Stats.STAT_CON] = 2, [Stats.STAT_STR] = 2 }, resists = { @@ -1960,12 +2015,12 @@ newEntity{ base = "BASE_GREATSWORD", unided_name = "three-edged sword", desc = [[The wise ones say that truth is a three-edged sword. And sometimes, the truth hurts.]], level_range = {25, 32}, - require = { stat = { str=26, wil=26, cun=26 }, }, + require = { stat = { str=18, wil=18, cun=18 }, }, color = colors.GOLD, encumber = 12, cost = 350, rarity = 240, - material_level = 4, + material_level = 3, moddable_tile = "special/golden_sword_right", moddable_tile_big = true, combat = { @@ -2263,7 +2318,7 @@ newEntity{ base = "BASE_AMULET", material_level = 4, metallic = false, wielder = { - infravision = 5, + infravision = 3, resists = { [DamageType.LIGHT] = -25 }, resists_cap = { [DamageType.LIGHT] = -25 }, blind_immune = 1, @@ -2283,7 +2338,7 @@ newEntity{ base = "BASE_CLOAK", level_range = {40, 50}, rarity = 400, cost = 300, - material_level = 3, + material_level = 5, wielder = { resists_cap = { [DamageType.FIRE] = 5, @@ -2310,10 +2365,10 @@ newEntity{ base = "BASE_DIGGER", name = "Pick of Dwarven Emperors", color = colors.GREY, image = "object/artifact/pick_of_dwarven_emperors.png", unided_name = "crude iron pickaxe", desc = [[This ancient pickaxe was used to pass down dwarven legends from one generation to the next. Every bit of the head and shaft are covered in runes that recount the stories of the dwarven people.]], - level_range = {26, 35}, + level_range = {40, 50}, rarity = 290, cost = 150, - material_level = 3, + material_level = 5, digspeed = 12, wielder = { resists_pen = { [DamageType.PHYSICAL] = 10, }, @@ -2406,7 +2461,7 @@ Touching the cloth you feel a sense of knowledge and power from bygone ages, yet max_power = 40, power_regen = 1, set_list = { {"define_as", "SET_STAFF_CHANNELERS"} }, on_set_complete = function(self, who) -local Talents = require "engine.interface.ActorTalents" + local Talents = require "engine.interface.ActorTalents" self.use_talent = { id = Talents.T_METAFLOW, level = 3, power = 40 } game.player:learnLore("channelers-set") end, @@ -2426,7 +2481,7 @@ newEntity{ base = "BASE_ARROW", level_range = {20, 40}, rarity = 300, cost = 100, - material_level = 3, + material_level = 4, require = { stat = { dex=24 }, }, combat = { capacity = 6, diff --git a/game/modules/tome/data/talents/chronomancy/paradox.lua b/game/modules/tome/data/talents/chronomancy/paradox.lua index fe420b5acd..1e1ca16851 100644 --- a/game/modules/tome/data/talents/chronomancy/paradox.lua +++ b/game/modules/tome/data/talents/chronomancy/paradox.lua @@ -91,10 +91,9 @@ newTalent{ return true end - -- Manualy start cooldown and spend paradox before the chronoworld is made + -- Manualy start cooldown before the chronoworld is made game.player:startTalentCooldown(t) - game.player:incParadox(t.paradox * (1 + (game.player.paradox / 300))) - + -- set up chronoworld next, we'll load it when the target dies in class\actor game:onTickEnd(function() game:chronoClone("cease_to_exist") diff --git a/game/modules/tome/data/talents/chronomancy/speed-control.lua b/game/modules/tome/data/talents/chronomancy/speed-control.lua index d8bb4cbf1c..52321a0036 100644 --- a/game/modules/tome/data/talents/chronomancy/speed-control.lua +++ b/game/modules/tome/data/talents/chronomancy/speed-control.lua @@ -54,7 +54,7 @@ newTalent{ return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t} end, getDuration = function(self, t) return 2 + math.ceil(((self:getTalentLevel(t) / 2)) * getParadoxModifier(self, pm)) end, - getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170) end, + getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170) * getParadoxModifier(self, pm) end, action = function(self, t) local tg = self:getTalentTarget(t) local x, y = self:getTarget(tg) diff --git a/game/modules/tome/data/talents/gifts/antimagic.lua b/game/modules/tome/data/talents/gifts/antimagic.lua index 853c2b180d..b91a24d441 100644 --- a/game/modules/tome/data/talents/gifts/antimagic.lua +++ b/game/modules/tome/data/talents/gifts/antimagic.lua @@ -23,28 +23,26 @@ newTalent{ require = gifts_req1, mode = "passive", points = 5, + getRegen = function(self, t) return 1 + (self:combatTalentMindDamage(t, 1, 10) /10) end, + getResist = function(self, t) return self:combatTalentMindDamage(t, 10, 40) end, on_absorb = function(self, t, damtype) if not DamageType:get(damtype).antimagic_resolve then return end if not self:isTalentActive(self.T_ANTIMAGIC_SHIELD) then - local equi = 1 + self:combatTalentMindDamage(t, 10, 5) - local stamina = 1 + self:combatTalentMindDamage(t, 10, 10) - self:incEquilibrium(-equi) - self:incStamina(stamina) + self:incEquilibrium(-t.getRegen(self, t)) + self:incStamina(t.getRegen(self, t)) end - self:setEffect(self.EFF_RESOLVE, 7, {damtype=damtype, res=self:combatTalentMindDamage(t, 10, 40)}) + self:setEffect(self.EFF_RESOLVE, 7, {damtype=damtype, res=t.getResist(self, t)}) game.logSeen(self, "%s is invigorated by the attack!", self.name:capitalize()) end, info = function(self, t) + local resist = t.getResist(self, t) + local regen = t.getRegen(self, t) return ([[You stand in the way of magical damage. That which does not kill you makes you stronger. Each time you are hit by a magical damage you get a %d%% resistance to this elemental for 7 turns. - If antimagic shield is not active you also absorb part of the impact and use it to fuel your own powers, decreasing your equilibrium by %d and increasing your stamina by %d. + If antimagic shield is not active you also absorb part of the impact and use it to fuel your own powers, decreasing your equilibrium and increasing your stamina by %0.2f. The effects will increase with your Mindpower.]]): - format( - self:combatTalentMindDamage(t, 10, 40), - 1 + self:combatTalentMindDamage(t, 10, 5), - 1 + self:combatTalentMindDamage(t, 10, 10) - ) + format( resist, regen ) end, } @@ -124,7 +122,7 @@ newTalent{ require = gifts_req4, points = 5, equilibrium = 10, - cooldown = 6, + cooldown = 8, range = 10, tactical = { ATTACK = { ARCANE = 3 } }, direct_hit = true, diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua index aa342820c3..4c1d708475 100644 --- a/game/modules/tome/data/timed_effects/other.lua +++ b/game/modules/tome/data/timed_effects/other.lua @@ -336,7 +336,7 @@ newEffect{ if game._chronoworlds then game._chronoworlds = nil end if game.player:knowTalent(game.player.T_FORESIGHT) then local t = game.player:getTalentFromId(game.player.T_FORESIGHT) - t.do_precog_foresight(self, t) + t.do_precog_foresight(game.player, t) end game.player.energy.value = game.energy_to_act game.paused = true diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua index 932992d6e4..53c9ff9008 100644 --- a/game/modules/tome/data/timed_effects/physical.lua +++ b/game/modules/tome/data/timed_effects/physical.lua @@ -1615,3 +1615,28 @@ newEffect{ end, } +newEffect{ + name = "SPELL_DISRUPTION", image = "talents/mana_clash.png", + desc = "Spell Disruption", + --display_desc = function(self, eff) return eff.cur_power.."% Spell Disruption" end, + long_desc = function(self, eff) return ("The target has a %d%% chance to fail any spell it casts and a chance each turn to lose spell sustains."):format(eff.cur_power) end, + type = "physical", + subtype = { antimagic=true }, + status = "beneficial", + parameters = { power=10, max=50 }, + on_merge = function(self, old_eff, new_eff) + self:removeTemporaryValue("spell_failure", old_eff.tmpid) + old_eff.cur_power = math.min(old_eff.cur_power + new_eff.power, new_eff.max) + old_eff.tmpid = self:addTemporaryValue("spell_failure", old_eff.cur_power) + + old_eff.dur = new_eff.dur + return old_eff + end, + activate = function(self, eff) + eff.cur_power = eff.power + eff.tmpid = self:addTemporaryValue("spell_failure", eff.power) + end, + deactivate = function(self, eff) + self:removeTemporaryValue("spell_failure", eff.tmpid) + end, +} diff --git a/game/modules/tome/dialogs/CharacterSheet.lua b/game/modules/tome/dialogs/CharacterSheet.lua index bb9a91936f..bc00a89c49 100644 --- a/game/modules/tome/dialogs/CharacterSheet.lua +++ b/game/modules/tome/dialogs/CharacterSheet.lua @@ -409,7 +409,7 @@ function _M:drawDialog(kind, actor_to_compare) if text then self:mouseTooltip(self.TOOLTIP_VISION_SIGHT, s:drawColorStringBlended(self.font, ("Vision range : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h end - text = compare_fields(player, actor_to_compare, function(actor) return (actor:attr("infravision") or actor:attr("heightened_senses")) and (actor.heightened_senses or 0) + (actor.infravision or 0) end, "%d", "%+.0f") + text = compare_fields(player, actor_to_compare, function(actor) return (actor:attr("infravision") or actor:attr("heightened_senses")) and math.max((actor.heightened_senses or 0), (actor.infravision or 0)) end, "%d", "%+.0f") if text then self:mouseTooltip(self.TOOLTIP_VISION_INFRA, s:drawColorStringBlended(self.font, ("Infravision : #00ff00#%s"):format(text), w, h, 255, 255, 255, true)) h = h + self.font_h end diff --git a/game/modules/tome/resolvers.lua b/game/modules/tome/resolvers.lua index d0428067e2..2f5b2db449 100644 --- a/game/modules/tome/resolvers.lua +++ b/game/modules/tome/resolvers.lua @@ -260,6 +260,10 @@ function resolvers.calc.mbonus_material(t, e) e.cost = e.cost + ap v = nv or v end + + if e.ego_bonus_mult then + v = math.ceil(v * (1 + e.ego_bonus_mult)) + end return v end -- GitLab