From f2ed20673441a23d0419366bd9b592e258dccdac Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 1 May 2012 12:26:18 +0000
Subject: [PATCH] moar

git-svn-id: http://svn.net-core.org/repos/t-engine4@5067 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Object.lua            | 84 ++++++++++++-------
 .../general/objects/egos/torques-powers.lua   |  8 +-
 .../data/general/objects/egos/torques.lua     | 46 ++++++++++
 .../general/objects/egos/totems-powers.lua    |  4 +
 .../tome/data/general/objects/egos/totems.lua | 46 ++++++++++
 .../general/objects/egos/wands-powers.lua     |  8 +-
 .../tome/data/general/objects/egos/wands.lua  | 72 ++++++++++++++++
 .../tome/data/general/objects/torques.lua     | 12 +--
 .../tome/data/general/objects/totems.lua      | 12 +--
 .../tome/data/general/objects/wands.lua       | 12 +--
 10 files changed, 252 insertions(+), 52 deletions(-)
 create mode 100644 game/modules/tome/data/general/objects/egos/torques.lua
 create mode 100644 game/modules/tome/data/general/objects/egos/totems.lua
 create mode 100644 game/modules/tome/data/general/objects/egos/wands.lua

diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index ceb5e21ae8..a3f0f7750c 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -89,6 +89,12 @@ function _M:use(who, typ, inven, item)
 	if typ == "use" then
 		local ret = self:useObject(who, inven, item)
 		if ret.used then
+			if self.charm_on_use then
+				for fct, d in pairs(self.charm_on_use) do
+					if rng.percent(d[1]) then fct(self, who) end
+				end
+			end
+
 			if self.use_sound then game:playSoundNear(who, self.use_sound) end
 			if not self.use_no_energy then
 				who:useEnergy(game.energy_to_act * (inven.use_speed or 1))
@@ -155,7 +161,12 @@ function _M:descAttribute(attr)
 		return (" [power %d]"):format(self:getCharmPower())
 	elseif attr == "CHARGES" then
 		if self.talent_cooldown and (self.use_power or self.use_talent) then
-			return " ("..(self.use_power or self.use_talent).power.." cooldown)"
+			local cd = game.player.talents_cd[self.talent_cooldown]
+			if cd and cd > 0 then
+				return " ("..cd.."/"..(self.use_power or self.use_talent).power.." cooldown)"
+			else
+				return " ("..(self.use_power or self.use_talent).power.." cooldown)"
+			end
 		elseif self.use_power or self.use_talent then
 			return (" (%d/%d)"):format(math.floor(self.power / (self.use_power or self.use_talent).power), math.floor(self.max_power / (self.use_power or self.use_talent).power))
 		else
@@ -481,7 +492,7 @@ 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
@@ -514,7 +525,7 @@ function _M:getTextualDesc(compare_with)
 		end
 
 		compare_fields(combat, compare_with, field, "travel_speed", "%+d%%", "Travel speed: ", 100, false, false, add_table)
-		
+
 		compare_fields(combat, compare_with, field, "phase_power", "%+d%%", "Damage Shield penetration (this weapon only): ", 1, false, false, add_table)
 
 		if combat.tg_type and combat.tg_type == "beam" then
@@ -525,22 +536,22 @@ 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, "ranged_project", "%+d", "Damage when this weapon hits(ranged): ", 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_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"}
@@ -597,7 +608,7 @@ 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(item == "all" and "all" or DamageType.dam_def[item].name), {"color","LAST"}
 			end)
-		
+
 		compare_table_fields(w, compare_with, field, "resists_cap", "%+d%%", "Changes resistances cap: ", function(item)
 				local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString()
 				return col[2], (" %s"):format(item == "all" and "all" or DamageType.dam_def[item].name), {"color","LAST"}
@@ -606,8 +617,8 @@ function _M:getTextualDesc(compare_with)
 		compare_table_fields(w, compare_with, field, "wards", "%+d", "Maximum wards: ", function(item)
 				local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString()
 				return col[2], (" %s"):format(item == "all" and "all" or DamageType.dam_def[item].name), {"color","LAST"}
-			end)	
-		
+			end)
+
 		compare_table_fields(w, compare_with, field, "resists_pen", "%+d%%", "Changes resistances penetration: ", function(item)
 				local col = (DamageType.dam_def[item] and DamageType.dam_def[item].text_color or "#WHITE#"):toTString()
 				return col[2], (" %s"):format(item == "all" and "all" or DamageType.dam_def[item].name), {"color","LAST"}
@@ -745,7 +756,7 @@ function _M:getTextualDesc(compare_with)
 			end
 			desc:add(true)
 		end
-		
+
 		-- Display learned talents
 		local any_learn_talent = 0
 		local learn_talents = {}
@@ -780,7 +791,7 @@ function _M:getTextualDesc(compare_with)
 			end
 			desc:add(true)
 		end
-	
+
 		local any_breath = 0
 		local breaths = {}
 		for i, v in ipairs(compare_with or {}) do
@@ -852,11 +863,11 @@ function _M:getTextualDesc(compare_with)
 		compare_fields(w, compare_with, field, "mana_on_crit", "%+.2f", "Mana when firing critical spell: ")
 		compare_fields(w, compare_with, field, "vim_on_crit", "%+.2f", "Vim when firing critical spell: ")
 		compare_fields(w, compare_with, field, "spellsurge_on_crit", "%+d", "Spellpower on spell critical (stacks up to 3 times): ")
-		
+
 		compare_fields(w, compare_with, field, "hate_on_crit", "%+.2f", "Hate when firing a critical mind attack: ")
 		compare_fields(w, compare_with, field, "psi_on_crit", "%+.2f", "Psi when firing a critical mind attack: ")
 		compare_fields(w, compare_with, field, "equilibrium_on_crit", "%+.2f", "Equilibrium when firing a critical mind attack: ")
-		
+
 		compare_fields(w, compare_with, field, "hate_per_kill", "+%0.2f", "Hate per kill: ")
 		compare_fields(w, compare_with, field, "psi_per_kill", "+%0.2f", "Psi per kill: ")
 
@@ -882,7 +893,7 @@ function _M:getTextualDesc(compare_with)
 
 		compare_fields(w, compare_with, field, "see_invisible", "%+d", "See invisible: ")
 		compare_fields(w, compare_with, field, "invisible", "%+d", "Invisibility: ")
-		
+
 		compare_fields(w, compare_with, field, "global_speed_add", "%+d%%", "Global speed: ", 100)
 		compare_fields(w, compare_with, field, "movement_speed", "%+d%%", "Movement speed: ", 100)
 		compare_fields(w, compare_with, field, "combat_physspeed", "%+d%%", "Combat speed: ", 100)
@@ -890,26 +901,26 @@ function _M:getTextualDesc(compare_with)
 
 		compare_fields(w, compare_with, field, "healing_factor", "%+d%%", "Healing mod.: ", 100)
 		compare_fields(w, compare_with, field, "heal_on_nature_summon", "%+d", "Heals friendly targets nearby when you use a nature summon: ")
-		
+
 		compare_fields(w, compare_with, field, "life_leech_chance", "%+d%%", "Life leech chance: ")
 		compare_fields(w, compare_with, field, "life_leech_value", "%+d%%", "Life leech: ")
 
 		compare_fields(w, compare_with, field, "resource_leech_chance", "%+d%%", "Resource leech chance: ")
 		compare_fields(w, compare_with, field, "resource_leech_value", "%+d", "Resource leech: ")
-		
+
 		compare_fields(w, compare_with, field, "damage_shield_penetrate", "%+d%%", "Damage Shield penetration: ")
-		
+
 		compare_fields(w, compare_with, field, "defense_on_teleport", "%+d", "Defense after a teleport: ")
 		compare_fields(w, compare_with, field, "resist_all_on_teleport", "%+d%%", "Resist all after a teleport: ")
 		compare_fields(w, compare_with, field, "effect_reduction_on_teleport", "%+d%%", "Effect duration reduction after a teleport: ")
-		
+
 		compare_fields(w, compare_with, field, "damage_resonance", "%+d%%", "Damage Resonance (when hit): ")
-		
+
 		compare_fields(w, compare_with, field, "size_category", "%+d", "Size category: ")
-		
+
 		compare_fields(w, compare_with, field, "nature_summon_max", "%+d", "Max wilder summons: ")
 		compare_fields(w, compare_with, field, "nature_summon_regen", "%+.2f", "Life regen bonus (wilder-summons): ")
-		
+
 		if w.undead then
 			desc:add("The wearer is treated as an undead.", true)
 		end
@@ -917,11 +928,11 @@ function _M:getTextualDesc(compare_with)
 		if w.blind_fight then
 			desc:add({"color", "YELLOW"}, "Blind-Fight:", {"color", "LAST"}, "This item allows the wearer to attack unseen targets without any penalties.", true)
 		end
-		
+
 		if w.avoid_pressure_traps then
 			desc:add({"color", "YELLOW"}, "Avoid Pressure Traps: ", {"color", "LAST"}, "The wearer never triggers traps that require pressure.", true)
 		end
-		
+
 		if w.speaks_shertul then
 			desc:add("Allows you to speak and read the old Sher'Tul language.", true)
 		end
@@ -1055,35 +1066,43 @@ function _M:getTextualDesc(compare_with)
 	end
 
 
-	
+
 	local use_desc = self:getUseDesc()
 	if use_desc then desc:merge(use_desc:toTString()) end
 	return desc
 end
 
 function _M:getUseDesc()
+	local ret = tstring{}
 	if self.use_power then
 		if self.show_charges then
-			return tstring{{"color","YELLOW"}, ("It can be used to %s, with %d charges out of %d."):format(util.getval(self.use_power.name, self), math.floor(self.power / self.use_power.power), math.floor(self.max_power / self.use_power.power)), {"color","LAST"}}
+			ret = tstring{{"color","YELLOW"}, ("It can be used to %s, with %d charges out of %d."):format(util.getval(self.use_power.name, self), math.floor(self.power / self.use_power.power), math.floor(self.max_power / self.use_power.power)), {"color","LAST"}}
 		elseif self.talent_cooldown then
-			return tstring{{"color","YELLOW"}, ("It can be used to %s, placing all other charms into a %d cooldown."):format(util.getval(self.use_power.name, self):format(self:getCharmPower()), self.use_power.power), {"color","LAST"}}
+			ret = tstring{{"color","YELLOW"}, ("It can be used to %s, placing all other charms into a %d cooldown."):format(util.getval(self.use_power.name, self):format(self:getCharmPower()), self.use_power.power), {"color","LAST"}}
 		else
-			return tstring{{"color","YELLOW"}, ("It can be used to %s, costing %d power out of %d/%d."):format(util.getval(self.use_power.name, self), self.use_power.power, self.power, self.max_power), {"color","LAST"}}
+			ret = tstring{{"color","YELLOW"}, ("It can be used to %s, costing %d power out of %d/%d."):format(util.getval(self.use_power.name, self), self.use_power.power, self.power, self.max_power), {"color","LAST"}}
 		end
 	elseif self.use_simple then
-		return tstring{{"color","YELLOW"}, ("It can be used to %s."):format(self.use_simple.name), {"color","LAST"}}
+		ret = tstring{{"color","YELLOW"}, ("It can be used to %s."):format(self.use_simple.name), {"color","LAST"}}
 	elseif self.use_talent then
 		local t = game.player:getTalentFromId(self.use_talent.id)
 		local desc = game.player:getTalentFullDescription(t, nil, {force_level=self.use_talent.level, ignore_cd=true, ignore_ressources=true, ignore_use_time=true, custom=self.use_talent.power and tstring{{"color",0x6f,0xff,0x83}, "Power cost: ", {"color",0x7f,0xff,0xd4},("%d out of %d/%d."):format(self.use_talent.power, self.power, self.max_power)}})
-		local ret
 		if self.talent_cooldown then
 			ret = tstring{{"color","YELLOW"}, "It can be used to activate talent ", t.name,", placing all other charms into a ", tostring(math.floor(self.use_talent.power)) ," cooldown :", {"color","LAST"}, true}
 		else
 			ret = tstring{{"color","YELLOW"}, "It can be used to activate talent ", t.name," (costing ", tostring(math.floor(self.use_talent.power)), " power out of ", tostring(math.floor(self.power)), "/", tostring(math.floor(self.max_power)), ") :", {"color","LAST"}, true}
 		end
 		ret:merge(desc)
-		return ret
 	end
+
+	if self.charm_on_use then
+		ret:add(true, "When used:", true)
+		for fct, d in pairs(self.charm_on_use) do
+			ret:add(tostring(d[1]), "% chances to ", d[2](self, game.player), ".", true)
+		end
+	end
+
+	return ret
 end
 
 --- Gets the full desc of the object
@@ -1330,7 +1349,8 @@ function _M:specialSetAdd(prop, value)
 	self._special_set[prop] = self:addTemporaryValue(prop, value)
 end
 
-function _M:getCharmPower()
+function _M:getCharmPower(raw)
+	if raw then return self.charm_power or 1 end
 	local def = self.charm_power_def or {add=0, max=100}
 	local v = def.add + ((self.charm_power or 1) * def.max / 100)
 	if def.floor then v = math.floor(v) end
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 7d4698da14..f9320dfecf 100644
--- a/game/modules/tome/data/general/objects/egos/torques-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/torques-powers.lua
@@ -22,11 +22,12 @@ Torques
 *psionic shield
 *psychoportation
 *clear mind
-mind wave
+*mind wave
 ]]
 
 newEntity{
 	name = " of psychoportation", addon=true, instant_resolve=true,
+	keywords = {psyport=true},
 	level_range = {15, 50},
 	rarity = 10,
 
@@ -42,6 +43,7 @@ newEntity{
 
 newEntity{
 	name = " of kinetic psionic shield", addon=true, instant_resolve=true,
+	keywords = {kinshield=true},
 	level_range = {1, 50},
 	rarity = 7,
 
@@ -55,6 +57,7 @@ newEntity{
 
 newEntity{
 	name = " of thermal psionic shield", addon=true, instant_resolve=true,
+	keywords = {thermshield=true},
 	level_range = {1, 50},
 	rarity = 7,
 
@@ -68,6 +71,7 @@ newEntity{
 
 newEntity{
 	name = " of charged psionic shield", addon=true, instant_resolve=true,
+	keywords = {chargedshield=true},
 	level_range = {10, 50},
 	rarity = 8,
 
@@ -81,6 +85,7 @@ newEntity{
 
 newEntity{
 	name = " of clear mind", addon=true, instant_resolve=true,
+	keywords = {clearmind=true},
 	level_range = {15, 50},
 	rarity = 12,
 
@@ -94,6 +99,7 @@ newEntity{
 
 newEntity{
 	name = " of mindblast", addon=true, instant_resolve=true,
+	keywords = {mindblast=true},
 	level_range = {15, 50},
 	rarity = 8,
 
diff --git a/game/modules/tome/data/general/objects/egos/torques.lua b/game/modules/tome/data/general/objects/egos/torques.lua
new file mode 100644
index 0000000000..f621d98e73
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/torques.lua
@@ -0,0 +1,46 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+load("/data/general/objects/egos/charms.lua")
+
+newEntity{
+	name = "psionic ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incPsi(self:getCharmPower(true) / 7)
+		end] = {100, function(self, who) return ("regenerate %d psi"):format(self:getCharmPower(true) / 7) end},
+	}
+}
+
+newEntity{
+	name = "hateful ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incHate(-self:getCharmPower(true) / 7)
+		end] = {100, function(self, who) return ("regenerate %d hate"):format(self:getCharmPower(true) / 7) end},
+	}
+}
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 7a5a54f041..fd16a7200b 100644
--- a/game/modules/tome/data/general/objects/egos/totems-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/totems-powers.lua
@@ -27,6 +27,7 @@ Totems
 
 newEntity{
 	name = " of cure illness", addon=true, instant_resolve=true,
+	keywords = {cureill=true},
 	level_range = {15, 50},
 	rarity = 8,
 
@@ -66,6 +67,7 @@ newEntity{
 
 newEntity{
 	name = " of cure poisons", addon=true, instant_resolve=true,
+	keywords = {curepoison=true},
 	level_range = {1, 50},
 	rarity = 8,
 
@@ -105,6 +107,7 @@ newEntity{
 
 newEntity{
 	name = " of thorny skin", addon=true, instant_resolve=true,
+	keywords = {thorny=true},
 	level_range = {1, 50},
 	rarity = 6,
 
@@ -119,6 +122,7 @@ newEntity{
 
 newEntity{
 	name = " of healing", addon=true, instant_resolve=true,
+	keywords = {heal=true},
 	level_range = {25, 50},
 	rarity = 20,
 
diff --git a/game/modules/tome/data/general/objects/egos/totems.lua b/game/modules/tome/data/general/objects/egos/totems.lua
new file mode 100644
index 0000000000..0851e1dde2
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/totems.lua
@@ -0,0 +1,46 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+load("/data/general/objects/egos/charms.lua")
+
+newEntity{
+	name = "natural ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incEquilibrium(-self:getCharmPower(true) / 5)
+		end] = {100, function(self, who) return ("regenerate %d equilibrium"):format(self:getCharmPower(true) / 5) end},
+	}
+}
+
+newEntity{
+	name = "forcefull ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incStamina(self:getCharmPower(true) / 6)
+		end] = {100, function(self, who) return ("regenerate %d stamina"):format(self:getCharmPower(true) / 6) end},
+	}
+}
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 21ee176ddf..f6371d31d6 100644
--- a/game/modules/tome/data/general/objects/egos/wands-powers.lua
+++ b/game/modules/tome/data/general/objects/egos/wands-powers.lua
@@ -29,6 +29,7 @@ Wands
 
 newEntity{
 	name = " of detection", addon=true, instant_resolve=true,
+	keywords = {detect=true},
 	level_range = {1, 50},
 	rarity = 8,
 
@@ -46,6 +47,7 @@ newEntity{
 
 newEntity{
 	name = " of illumination", addon=true, instant_resolve=true,
+	keywords = {illuminate=true},
 	level_range = {1, 50},
 	rarity = 8,
 
@@ -59,6 +61,7 @@ newEntity{
 
 newEntity{
 	name = " of trap destruction", addon=true, instant_resolve=true,
+	keywords = {trap=true},
 	level_range = {1, 50},
 	rarity = 14,
 
@@ -86,6 +89,7 @@ newEntity{
 
 newEntity{
 	name = " of lightning", addon=true, instant_resolve=true,
+	keywords = {lightning=true},
 	level_range = {15, 50},
 	rarity = 10,
 
@@ -106,6 +110,7 @@ newEntity{
 
 newEntity{
 	name = " of firewall", addon=true, instant_resolve=true,
+	keywords = {firewall=true},
 	level_range = {15, 50},
 	rarity = 10,
 
@@ -126,7 +131,8 @@ newEntity{
 
 newEntity{
 	name = " of conjuration", addon=true, instant_resolve=true,
-	level_range = {10, 50},
+	keywords = {conjure=true},
+	level_range = {6, 50},
 	rarity = 6,
 
 	charm_power_def = {add=25, max=250, floor=true},
diff --git a/game/modules/tome/data/general/objects/egos/wands.lua b/game/modules/tome/data/general/objects/egos/wands.lua
new file mode 100644
index 0000000000..a030168954
--- /dev/null
+++ b/game/modules/tome/data/general/objects/egos/wands.lua
@@ -0,0 +1,72 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009, 2010, 2011, 2012 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+load("/data/general/objects/egos/charms.lua")
+
+newEntity{
+	name = "arcane ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incMana(self:getCharmPower(true) / 5)
+		end] = {100, function(self, who) return ("regenerate %d mana"):format(self:getCharmPower(true) / 5) end},
+	}
+}
+
+newEntity{
+	name = "defiled ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incVim(self:getCharmPower(true) / 6)
+		end] = {100, function(self, who) return ("regenerate %d vim"):format(self:getCharmPower(true) / 6) end},
+	}
+}
+
+newEntity{
+	name = "bright ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incPositive(self:getCharmPower(true) / 8)
+		end] = {100, function(self, who) return ("regenerate %d positive energy"):format(self:getCharmPower(true) / 8) end},
+	}
+}
+
+newEntity{
+	name = "shadowy ", prefix=true,
+	level_range = {10, 50},
+	rarity = 12,
+	cost = 5,
+
+	charm_on_use = {
+		[function(self, who)
+			who:incNegative(self:getCharmPower(true) / 8)
+		end] = {100, function(self, who) return ("regenerate %d negative energy"):format(self:getCharmPower(true) / 8) end},
+	}
+}
diff --git a/game/modules/tome/data/general/objects/torques.lua b/game/modules/tome/data/general/objects/torques.lua
index 52ac7af001..5e60bc9f93 100644
--- a/game/modules/tome/data/general/objects/torques.lua
+++ b/game/modules/tome/data/general/objects/torques.lua
@@ -28,14 +28,14 @@ newEntity{
 	add_name = "#CHARM# #CHARGES#",
 	use_sound = "talents/spell_generic",
 	desc = [[Torques are made by powerful psionics to store psionic powers.]],
-	egos = "/data/general/objects/egos/charms.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
+	egos = "/data/general/objects/egos/torques.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
 	addons = "/data/general/objects/egos/torques-powers.lua",
 	power_source = {psionic=true},
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
 newEntity{ base = "BASE_TORQUE",
-	name = "iron torque",
+	name = "iron torque", short_name = "iron",
 	color = colors.UMBER,
 	level_range = {1, 10},
 	cost = 1,
@@ -44,7 +44,7 @@ newEntity{ base = "BASE_TORQUE",
 }
 
 newEntity{ base = "BASE_TORQUE",
-	name = "steel torque",
+	name = "steel torque", short_name = "steel",
 	color = colors.UMBER,
 	level_range = {10, 20},
 	cost = 2,
@@ -53,7 +53,7 @@ newEntity{ base = "BASE_TORQUE",
 }
 
 newEntity{ base = "BASE_TORQUE",
-	name = "dwarven-steel torque",
+	name = "dwarven-steel torque", short_name = "d.steel",
 	color = colors.UMBER,
 	level_range = {20, 30},
 	cost = 3,
@@ -62,7 +62,7 @@ newEntity{ base = "BASE_TORQUE",
 }
 
 newEntity{ base = "BASE_TORQUE",
-	name = "stralite torque",
+	name = "stralite torque", short_name = "stralite",
 	color = colors.UMBER,
 	level_range = {30, 40},
 	cost = 4,
@@ -71,7 +71,7 @@ newEntity{ base = "BASE_TORQUE",
 }
 
 newEntity{ base = "BASE_TORQUE",
-	name = "voratun torque",
+	name = "voratun torque", short_name = "voratun",
 	color = colors.UMBER,
 	level_range = {40, 50},
 	cost = 5,
diff --git a/game/modules/tome/data/general/objects/totems.lua b/game/modules/tome/data/general/objects/totems.lua
index 9307940fc3..a7fc75ddd3 100644
--- a/game/modules/tome/data/general/objects/totems.lua
+++ b/game/modules/tome/data/general/objects/totems.lua
@@ -28,14 +28,14 @@ newEntity{
 	add_name = "#CHARM# #CHARGES#",
 	use_sound = "talents/spell_generic",
 	desc = [[Natural totems are made by powerful wilders to store nature power.]],
-	egos = "/data/general/objects/egos/charms.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
+	egos = "/data/general/objects/egos/totems.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
 	addons = "/data/general/objects/egos/totems-powers.lua",
 	power_source = {nature=true},
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
 newEntity{ base = "BASE_TOTEM",
-	name = "elm totem",
+	name = "elm totem", short_name = "elm",
 	color = colors.UMBER,
 	level_range = {1, 10},
 	cost = 1,
@@ -44,7 +44,7 @@ newEntity{ base = "BASE_TOTEM",
 }
 
 newEntity{ base = "BASE_TOTEM",
-	name = "ash totem",
+	name = "ash totem", short_name = "ash",
 	color = colors.UMBER,
 	level_range = {10, 20},
 	cost = 2,
@@ -53,7 +53,7 @@ newEntity{ base = "BASE_TOTEM",
 }
 
 newEntity{ base = "BASE_TOTEM",
-	name = "yew totem",
+	name = "yew totem", short_name = "yew",
 	color = colors.UMBER,
 	level_range = {20, 30},
 	cost = 3,
@@ -62,7 +62,7 @@ newEntity{ base = "BASE_TOTEM",
 }
 
 newEntity{ base = "BASE_TOTEM",
-	name = "elven-wood totem",
+	name = "elven-wood totem", short_name = "e.wood",
 	color = colors.UMBER,
 	level_range = {30, 40},
 	cost = 4,
@@ -71,7 +71,7 @@ newEntity{ base = "BASE_TOTEM",
 }
 
 newEntity{ base = "BASE_TOTEM",
-	name = "dragonbone totem",
+	name = "dragonbone totem", short_name = "dragonbone",
 	color = colors.UMBER,
 	level_range = {40, 50},
 	cost = 5,
diff --git a/game/modules/tome/data/general/objects/wands.lua b/game/modules/tome/data/general/objects/wands.lua
index 0576d91c8e..ea6c5dba03 100644
--- a/game/modules/tome/data/general/objects/wands.lua
+++ b/game/modules/tome/data/general/objects/wands.lua
@@ -28,14 +28,14 @@ newEntity{
 	add_name = "#CHARM# #CHARGES#",
 	use_sound = "talents/spell_generic",
 	desc = [[Magical wands are made by powerful Alchemists and Archmagi to store spells. Anybody can use them to release the spells.]],
-	egos = "/data/general/objects/egos/charms.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
+	egos = "/data/general/objects/egos/wands.lua", egos_chance = { prefix=resolvers.mbonus(20, 5), suffix=resolvers.mbonus(20, 5) },
 	addons = "/data/general/objects/egos/wands-powers.lua",
 	power_source = {arcane=true},
 	talent_cooldown = "T_GLOBAL_CD",
 }
 
 newEntity{ base = "BASE_WAND",
-	name = "elm wand",
+	name = "elm wand", short_name = "elm",
 	color = colors.UMBER,
 	level_range = {1, 10},
 	cost = 1,
@@ -44,7 +44,7 @@ newEntity{ base = "BASE_WAND",
 }
 
 newEntity{ base = "BASE_WAND",
-	name = "ash wand",
+	name = "ash wand", short_name = "ash",
 	color = colors.UMBER,
 	level_range = {10, 20},
 	cost = 2,
@@ -53,7 +53,7 @@ newEntity{ base = "BASE_WAND",
 }
 
 newEntity{ base = "BASE_WAND",
-	name = "yew wand",
+	name = "yew wand", short_name = "yew",
 	color = colors.UMBER,
 	level_range = {20, 30},
 	cost = 3,
@@ -62,7 +62,7 @@ newEntity{ base = "BASE_WAND",
 }
 
 newEntity{ base = "BASE_WAND",
-	name = "elven-wood wand",
+	name = "elven-wood wand", short_name = "e.wood",
 	color = colors.UMBER,
 	level_range = {30, 40},
 	cost = 4,
@@ -71,7 +71,7 @@ newEntity{ base = "BASE_WAND",
 }
 
 newEntity{ base = "BASE_WAND",
-	name = "dragonbone wand",
+	name = "dragonbone wand", short_name = "dargonbone",
 	color = colors.UMBER,
 	level_range = {40, 50},
 	cost = 5,
-- 
GitLab