From 72dd324ed4c57df1410e03012cf011803d672beb Mon Sep 17 00:00:00 2001
From: Shibari <ShibariTOME@Gmail.com>
Date: Thu, 25 Oct 2018 18:34:04 -0400
Subject: [PATCH] Revise revise revise

---
 game/modules/tome/class/Object.lua            |  4 +-
 .../tome/data/general/objects/egos/charms.lua | 67 +++++++++++++++--
 .../general/objects/egos/torques-powers.lua   |  5 +-
 .../general/objects/egos/totems-powers.lua    | 71 ++++++++-----------
 .../general/objects/egos/wands-powers.lua     | 45 ++++++++++--
 .../tome/data/timed_effects/mental.lua        |  5 ++
 .../modules/tome/data/timed_effects/other.lua | 15 ++++
 7 files changed, 157 insertions(+), 55 deletions(-)

diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index c1d677374b..0d6d2d8998 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -2041,9 +2041,9 @@ function _M:getUseDesc(use_actor)
 			ret = tstring{{"color","YELLOW"}, ("It can be used to %s, with %d charges out of %d."):format(desc, math.floor(self.power / usepower(self.use_power.power)), math.floor(self.max_power / usepower(self.use_power.power))), {"color","LAST"}}
 		elseif self.talent_cooldown then
 			local t_name = self.talent_cooldown == "T_GLOBAL_CD" and "all charms" or "Talent "..use_actor:getTalentDisplayName(use_actor:getTalentFromId(self.talent_cooldown))
-			ret = tstring{{"color","YELLOW"}, ("It can be used to %s\nActivation puts %s on cooldown for %d turns."):format(desc:format(self:getCharmPower(use_actor)), t_name, usepower(self.use_power.power)), {"color","LAST"}}
+			ret = tstring{{"color","YELLOW"}, ("It can be used to %s\n\nActivation puts %s on cooldown for %d turns."):format(desc:format(self:getCharmPower(use_actor)), t_name, usepower(self.use_power.power)), {"color","LAST"}}
 		else
-			ret = tstring{{"color","YELLOW"}, ("It can be used to %s\nActivation costs %d power out of %d/%d."):format(desc, usepower(self.use_power.power), self.power, self.max_power), {"color","LAST"}}
+			ret = tstring{{"color","YELLOW"}, ("It can be used to %s\n\nActivation costs %d power out of %d/%d."):format(desc, usepower(self.use_power.power), self.power, self.max_power), {"color","LAST"}}
 		end
 	elseif self.use_simple then
 		ret = tstring{{"color","YELLOW"}, ("It can be used to %s."):format(util.getval(self.use_simple.name, self, use_actor)), {"color","LAST"}}
diff --git a/game/modules/tome/data/general/objects/egos/charms.lua b/game/modules/tome/data/general/objects/egos/charms.lua
index cb599c8761..405a2721c4 100644
--- a/game/modules/tome/data/general/objects/egos/charms.lua
+++ b/game/modules/tome/data/general/objects/egos/charms.lua
@@ -112,6 +112,32 @@ newEntity{
 	use_power = {tactical = {BUFF = 0.2}}
 }
 
+newEntity{
+	name = "extending ", prefix=true,
+	keywords = {extending=true},
+	level_range = {1, 50},
+	greater_ego = 1,
+	unique_ego = 1,
+	rarity = 12,
+	cost = 5,
+	extending_amt = resolvers.mbonus_material(2, 1),
+	extending_dur = resolvers.mbonus_material(1.5, 1),
+
+	charm_on_use = {
+		{100, function(self, who) return ("increase the duration of %d beneficial effects by %d"):format(self.extending_amt, self.extending_dur) end, function(self, who)
+			local effs = self:effectsFilter(function(eff)
+				if eff.status == "beneficial" and eff.type ~= "other" then return true end
+			end)
+			if #effs <= 0 then return end
+			for i = 1, math.floor(self.extending_amt) do
+				local eff = rng.tableRemove(effs)
+				eff.dur = eff.dur + math.floor(self.extending_amt)
+			end
+		end},
+	},
+	use_power = {tactical = {BUFF = 0.2}}
+}
+
 newEntity{
 	name = "evasive ", prefix=true,
 	keywords = {evasive=true},
@@ -147,6 +173,22 @@ newEntity{
 	use_power = {tactical = {HEAL = 0.2}}
 }
 
+newEntity{
+	name = "cleansing ", prefix=true,
+	keywords = {cleansing=true},
+	level_range = {1, 50},
+	rarity = 12,
+	cost = 5,
+	greater_ego = 1,
+	cleansing_amount = resolvers.mbonus_material(3, 1),
+	charm_on_use = {
+		{100, function(self, who) return ("cleanse %d total effects of type disease, wound, or poison"):format(self.cleansing_amount) end, function(self, who)
+			who:removeEffectsFilter(function(e) return e.subtype.poison or e.subtype.wound or e.subtype.disease end, self.cleansing_amount)	
+		end},
+	},
+	use_power = {tactical = {CURE = 0.2}}
+}
+
 newEntity{
 	name = "piercing ", prefix=true,
 	keywords = {piercing=true},
@@ -164,12 +206,30 @@ newEntity{
 	use_power = {tactical = {BUFF = 0.2}}
 }
 
+newEntity{
+	name = "powerful ", prefix=true,
+	keywords = {piercing=true},
+	level_range = {1, 50},
+	rarity = 12,
+	greater_ego = 1,
+	unique_ego = 1,
+	cost = 5,
+	powerful_damage = resolvers.mbonus_material(30, 10),
+	charm_on_use = {
+		{100, function(self, who) return ("increase all damage by %d%% for 2 turns"):format(self.powerful_damage) end, function(self, who)
+			who:setEffect(who.EFF_ITEM_CHARM_POWERFUL, 2, {damage = self.powerful_damage})
+		end},
+	},
+	use_power = {tactical = {BUFF = 0.2}}
+}
+
+--[[
 newEntity{
 	name = "savior's ", prefix=true,
 	keywords = {savior=true},
 	level_range = {1, 50},
 	rarity = 12,
-	greater_ego = 1,
+	--greater_ego = 1,
 	unique_ego = 1,
 	cost = 5,
 	savior_saves = resolvers.mbonus_material(30, 10),
@@ -179,7 +239,7 @@ newEntity{
 		end},
 	},
 	use_power = {tactical = {BUFF = 0.2}}
-}
+}]]
 
 newEntity{
 	name = "innervating ", prefix=true,
@@ -187,9 +247,8 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 18,
 	cost = 5,
-	greater_ego = 1,
 	unique_ego = 1,
-	innervating_fatigue = resolvers.mbonus_material(30, 10),
+	innervating_fatigue = resolvers.mbonus_material(40, 20),
 	charm_on_use = {
 		{100, function(self, who) return ("reduce fatigue by %d%% for 2 turns"):format(self.innervating_fatigue) end, function(self, who)
 			who:setEffect(who.EFF_ITEM_CHARM_INNERVATING, 2, {fatigue = self.innervating_fatigue})
diff --git a/game/modules/tome/data/general/objects/egos/torques-powers.lua b/game/modules/tome/data/general/objects/egos/torques-powers.lua
index a3dab1062e..3e607c3a55 100644
--- a/game/modules/tome/data/general/objects/egos/torques-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/torques-powers.lua
@@ -88,7 +88,7 @@ newEntity{
 	keywords = {galeforce=true},
 	level_range = {1, 50},
 	rarity = 10,
-	charm_power_def = {add=45, max=400, floor=true},
+	charm_power_def = {add=15, max=800, floor=true},
 	resolvers.charm(
 		function(self, who)
 			local dam = who:damDesc(engine.DamageType.Mind, self.use_power.damage(self, who))
@@ -113,6 +113,7 @@ newEntity{
 					target:knockback(who.x, who.y, kb)		
 				end
 			end, dam)
+			return {id=true, used=true}
 		end,
 		"T_GLOBAL_CD",
 		{
@@ -130,7 +131,7 @@ newEntity{
 	keywords = {mindblast=true},
 	level_range = {1, 50},
 	rarity = 10,
-	charm_power_def = {add=45, max=600, floor=true},
+	charm_power_def = {add=25, max=600, floor=true},
 	resolvers.charm(function(self, who)
 			local dam = self.use_power.damage(self, who)
 			return ("blast the opponent's mind dealing %d mind damage and silencing them for 4 turns"):format(dam )
diff --git a/game/modules/tome/data/general/objects/egos/totems-powers.lua b/game/modules/tome/data/general/objects/egos/totems-powers.lua
index be9731db2b..4ddbf615e4 100644
--- a/game/modules/tome/data/general/objects/egos/totems-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/totems-powers.lua
@@ -24,57 +24,42 @@ Totems
 *thorny skin
 ]]
 
+-- gfx
 newEntity{
-	name = " of cure ailments", addon=true, instant_resolve=true,
-	keywords = {ailments=true},
+	name = " of healing", addon=true, instant_resolve=true,
+	keywords = {healing=true},
 	level_range = {1, 50},
 	rarity = 8,
 
-	charm_power_def = {add=30, max=300, floor=true},
+	charm_power_def = {add=50, max=500, floor=true},
 	resolvers.charm(
 		function(self, who) 
 			local heal = self.use_power.heal(self, who)
-			return ("remove 1 poison, disease, and wound from the target then heal them for %d + %d per effect cleansed"):
-				format(heal, heal / 2) end,
+			return ("heals yourself and all friendly characters within 10 spaces for %d"):
+				format(heal) end,
 		20,
 		function(self, who)
 			local tg = self.use_power.target(self, who)
-			local x, y = who:getTarget(tg)
-			if not x or not y then return nil end
+			local heal = who:mindCrit(self.use_power.heal(self, who))
 			game.logSeen(who, "%s activates %s %s!", who.name:capitalize(), who:his_her(), self:getName{no_add_name = true, do_color = true})
-			who:project(tg, x, y, function(px, py)
+			who:project(tg, who.x, who.y, function(px, py)
 				local target = game.level.map(px, py, engine.Map.ACTOR)
 				if not target then return end
-					local cleansed = 0
-					local heal = self.use_power.heal(self, who)
-
-					cleansed = cleansed + target:removeEffectsFilter(function(e) return e.subtype.poison end, 1)
-					cleansed = cleansed + target:removeEffectsFilter(function(e) return e.subtype.cut end, 1)
-					cleansed = cleansed + target:removeEffectsFilter(function(e) return e.subtype.disease end, 1)
-
-					target:attr("allow_on_heal", 1)
-					target:heal(heal + (heal / 2 * cleansed), who)
-					target:attr("allow_on_heal", -1)
-					game:playSoundNear(who, "talents/heal")
+				if target:reactionToward(who) < 0 then return end
+				target:attr("allow_on_heal", 1)
+				target:heal(heal, who)
+				target:attr("allow_on_heal", -1)
+				game:playSoundNear(who, "talents/heal")
+			end) 
 			return {id=true, used=true}
-		end) end,
+		end,
 	"T_GLOBAL_CD",
-	{range = function(self, who) return 10 end,
+	{
+	radius = function(self, who) return 10 end,
 	heal = function(self, who) return self:getCharmPower(who) end,
-	target = function(self, who) return {default_target=who, type="hit", nowarning=true, range=self.use_power.range(self, who), first_target="friend"} end,
-	tactical = {CURE = function(who, t, aitarget) -- count number of effects that can be removed
-			local nb = 0
-			for eff_id, p in pairs(who.tmp) do
-				local e = who.tempeffect_def[eff_id]
-				if e.status == "detrimental" and (e.subtype.poison or e.subtype.disease) then
-					nb = nb + 1
-				end
-			end
-			return nb
-			end,
-			__wt_cache_turns = 0
-			},
-	}),
+	target = function(self, who) return {type="ball", nowarning=true, radius=self.use_power.radius(self, who)} end,
+	tactical = {HEAL = 1},
+	})
 }
 
 newEntity{
@@ -83,12 +68,12 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 8,
 
-	charm_power_def = {add=25, max=600, floor=true},
+	charm_power_def = {add=15, max=800, floor=true},
 	resolvers.charm(function(self, who)
 			local dam = self.use_power.damage(self, who)
 			return ("instantly sting an enemy dealing %d nature damage over 7 turns and reducing their healing by 50%%%%"):format(dam, 50)
 		end,
-		10,
+		12,
 		function(self, who)
 			local tg = self.use_power.target(self, who)
 			local x, y = who:getTarget(tg)
@@ -136,9 +121,9 @@ newEntity{
 	charm_power_def = {add=45, max=500, floor=true},
 	resolvers.charm(function(self, who)
 		local stats = self.use_power.tentacleStats(self, who)
-		local str = ("(Tentacle Bonus Stats)\nLife:  %d\nBase Damage:  %d\nArmor:  %d\nAll Resist:  %d"):format(stats.max_life, stats.combat.dam, stats.combat_armor, stats.resists.all)
-		return	("summon a resilient tentacle up to %d spaces away.  Each turn the tentacle will strike a random enemy in range 3 dealing physical damage and attempting to pin them.\n\n%s"):
-			format(5, str) 
+		local str = ("(Tentacle Stats)\nLife:  %d\nBase Damage:  %d\nArmor:  %d\nAll Resist:  %d"):format(stats.max_life, stats.combat.dam, stats.combat_armor, stats.resists.all)
+		return	("summon a resilient tentacle up to %d spaces away for %d turns.  Each turn the tentacle will strike a random enemy in range 3 dealing physical damage and attempting to pin them.\n\n%s"):
+			format(5, stats.summon_time, str) 
 		end,
 		 20, 
 		 function(self, who)
@@ -201,7 +186,7 @@ newEntity{
 				end,
 				faction = who.faction,
 				summoner = who, summoner_gain_exp=true,
-				summon_time=10,
+				summon_time = 0,
 			}
 
 			m:resolve()
@@ -212,7 +197,6 @@ newEntity{
 				control=false,
 				type="summon",
 				title="Summon",
-				orders = {target=true, leash=true, anchor=true, talents=true},
 			})
 
 			local stats = self.use_power.tentacleStats(self, who)
@@ -233,7 +217,8 @@ newEntity{
 		combat = {dam = resolvers.mbonus_material(100, 0)},
 		max_life = resolvers.mbonus_material(400, 0),
 		combat_armor = resolvers.mbonus_material(50, 0),
-		resists = {all = resolvers.mbonus_material(50, 0)}
+		resists = {all = resolvers.mbonus_material(50, 0)},
+		summon_time = resolvers.mbonus_material(10, 3),
 	},
 	tentacleStats = function(self, who)
 		local stats = {
diff --git a/game/modules/tome/data/general/objects/egos/wands-powers.lua b/game/modules/tome/data/general/objects/egos/wands-powers.lua
index 6192471fb3..21455dbdb8 100644
--- a/game/modules/tome/data/general/objects/egos/wands-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/wands-powers.lua
@@ -61,7 +61,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 10,
 
-	charm_power_def = {add=25, max=400, floor=true},
+	charm_power_def = {add=10, max=400, floor=true},
 	resolvers.charm(function(self, who)
 		local dam = who:damDesc(engine.DamageType.LIGHTNING, self.use_power.damage(self, who))
 		local radius = self.use_power.radius
@@ -88,11 +88,11 @@ newEntity{
 	"T_GLOBAL_CD",
 	{
 	range = 8,
-	radius = 3,
+	radius = 4,
 	requires_target = true,
 	no_npc_use = function(self, who) return self:restrictAIUseObject(who) end, -- don't let dumb ai hurt friends
 	target = function(self, who) return {type="ball", range=self.use_power.range, radius=self.use_power.radius} end,
-	tactical = {ATTACKAREA = {FIRE = 2}},
+	tactical = {ATTACKAREA = {LIGHTNING = 2}},
 	damage = function(self, who) return self:getCharmPower(who) end
 	}),
 }
@@ -112,7 +112,7 @@ newEntity{
 		}
 	end),
 
-	charm_power_def = {add=50, max=700, floor=true},
+	charm_power_def = {add=30, max=800, floor=true},
 	resolvers.charm(function(self, who)
 			local dam = self.use_power.damage(self, who)
 			return ("fire a magical bolt dealing %d %s damage"):format(dam, self.elem[3] )
@@ -137,3 +137,40 @@ newEntity{
 		tactical = {ATTACK = 1}}
 	),
 }
+
+-- gfx
+newEntity{
+	name = " of shielding", addon=true, instant_resolve=true,
+	keywords = {shielding=true},
+	level_range = {1, 50},
+	rarity = 8,
+
+	charm_power_def = {add=50, max=500, floor=true},
+	resolvers.charm(
+		function(self, who) 
+			local shield = self.use_power.shield(self, who)
+			return ("create a shield absorbing up to %d damage on yourself and all friendly characters within 10 spaces for %d turns"):
+				format(shield, 4) end,
+		20,
+		function(self, who)
+			local tg = self.use_power.target(self, who)
+			local shield = who:spellCrit(self.use_power.shield(self, who))
+			game.logSeen(who, "%s activates %s %s!", who.name:capitalize(), who:his_her(), self:getName{no_add_name = true, do_color = true})
+			who:project(tg, who.x, who.y, function(px, py)
+				local target = game.level.map(px, py, engine.Map.ACTOR)
+				if not target then return end
+				if target:reactionToward(who) < 0 then return end
+				target:setEffect(target.EFF_DAMAGE_SHIELD, 4, {power=shield})
+
+				--game:playSoundNear(who, "talents/heal")
+			end) 
+			return {id=true, used=true}
+		end,
+	"T_GLOBAL_CD",
+	{
+	radius = function(self, who) return 10 end,
+	shield = function(self, who) return self:getCharmPower(who) end,
+	target = function(self, who) return {type="ball", nowarning=true, radius=self.use_power.radius(self, who)} end,
+	tactical = {HEAL = 1},
+	})
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua
index c0816f9786..dd8d9428a9 100644
--- a/game/modules/tome/data/timed_effects/mental.lua
+++ b/game/modules/tome/data/timed_effects/mental.lua
@@ -2377,6 +2377,11 @@ newEffect{
 				[DamageType.DARKNESS] = eff.power,
 				})
 			eff.what = "lightning, blight, mind, darkness"
+		elseif eff.kind == "all" then
+			eff.sid = self:addTemporaryValue("flat_damage_armor", {
+				all = eff.power,
+				})
+			eff.what = "all"
 		end
 	end,
 	deactivate = function(self, eff)
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index c73a1e1470..4fcf3ba97a 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -74,6 +74,21 @@ newEffect{
 	end,
 }
 
+newEffect{
+	name = "ITEM_CHARM_POWERFUL", image = "talents/intricate_tools.png",
+	desc = "Charm:  Damage",
+	long_desc = function(self, eff) return ("All damage increased by %d%%."):format(eff.damage) end,
+	type = "other",
+	subtype = { },
+	status = "beneficial",
+	parameters = { damage=10 },
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "inc_damage", {all = eff.damage})
+	end,
+	deactivate = function(self, eff)
+	end,
+}
+
 newEffect{
 	name = "ITEM_CHARM_SAVIOR", image = "talents/intricate_tools.png",
 	desc = "Charm:  Saves",
-- 
GitLab