From 7bc54b5856e8e23944e9556991ecdc30011e4631 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sat, 15 Jan 2011 11:52:31 +0000
Subject: [PATCH] fix randart generation

git-svn-id: http://svn.net-core.org/repos/t-engine4@2379 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engines/default/engine/utils.lua         | 14 ++++
 game/modules/tome/class/GameState.lua         | 66 +++++++++---------
 .../data/general/objects/egos/amulets.lua     | 12 ++--
 .../tome/data/general/objects/egos/cloak.lua  | 10 ++-
 .../tome/data/general/objects/egos/digger.lua | 14 ++--
 .../tome/data/general/objects/egos/gloves.lua | 20 +++---
 .../tome/data/general/objects/egos/helm.lua   | 12 ++--
 .../tome/data/general/objects/egos/lite.lua   | 16 ++---
 .../tome/data/general/objects/egos/rings.lua  | 68 ++++++++++---------
 .../data/general/objects/egos/wizard-hat.lua  | 14 ++--
 10 files changed, 134 insertions(+), 112 deletions(-)

diff --git a/game/engines/default/engine/utils.lua b/game/engines/default/engine/utils.lua
index bd5286fd2f..adb83c9b2f 100644
--- a/game/engines/default/engine/utils.lua
+++ b/game/engines/default/engine/utils.lua
@@ -23,6 +23,20 @@ function lpeg.anywhere (p)
 	return lpeg.P{ p + 1 * lpeg.V(1) }
 end
 
+function table.print(src, offset)
+	offset = offset or ""
+	for k, e in pairs(src) do
+		-- Deep copy subtables, but not objects!
+		if type(e) == "table" and not e.__CLASSNAME then
+			print(("%s[%s] = {"):format(offset, tostring(k)))
+			table.print(e, offset.."  ")
+			print(("%s}"):format(offset))
+		else
+			print(("%s[%s] = %s"):format(offset, tostring(k), tostring(e)))
+		end
+	end
+end
+
 function table.clone(tbl, deep)
 	local n = {}
 	for k, e in pairs(tbl) do
diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua
index 8dbd012c28..2b26f6f56d 100644
--- a/game/modules/tome/class/GameState.lua
+++ b/game/modules/tome/class/GameState.lua
@@ -229,6 +229,41 @@ function _M:generateRandart(add, base, lev)
 	print("Creating randart "..name.."("..o.unided_name..") with "..(themename or "nil").." with level "..lev)
 	print(" * using themes", table.concat(table.keys(themes), ','))
 
+	-----------------------------------------------------------
+	-- Add ego properties
+	-----------------------------------------------------------
+	if o.egos then
+		local legos = {}
+		local been_greater = false
+		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":prefix"))
+		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":suffix"))
+		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":"))
+		for i = 1, 2 do
+			local egos = rng.table(legos)
+			local list = {}
+			local filter = nil
+			if rng.percent(lev) and not been_greater then been_greater = true filter = function(e) return e.greater_ego end end
+			for z = 1, #egos do list[#list+1] = egos[z].e end
+			local pick_egos = game.zone:computeRarities("object", list, game.level, filter, nil, nil)
+			local ego = game.zone:pickEntity(pick_egos)
+			if ego then
+				print(" ** selected ego", ego.name)
+				ego = ego:clone()
+				if ego.instant_resolve then ego:resolve(nil, nil, o) end
+				ego.instant_resolve = nil
+				ego.uid = nil
+				ego.name = nil
+				ego.unided_name = nil
+
+				table.mergeAddAppendArray(o, ego, true)
+			end
+		end
+		o.egos = nil o.egos_chance = nil o.force_ego = nil
+		-- Re-resolve with the (possibly) new resolvers
+		o:resolve()
+		o:resolve(nil, true)
+	end
+
 	-----------------------------------------------------------
 	-- Imbue powers in the randart
 	-----------------------------------------------------------
@@ -292,37 +327,6 @@ function _M:generateRandart(add, base, lev)
 		hpoints = hpoints - p.points * 2
 	end
 
-	-----------------------------------------------------------
-	-- Add ego properties
-	-----------------------------------------------------------
-	if o.egos then
-		local legos = {}
-		local been_greater = false
-		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":prefix"))
-		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":suffix"))
-		table.insert(legos, game.level:getEntitiesList("object/"..o.egos..":"))
-		for i = 1, 2 do
-			local egos = rng.table(legos)
-			local list = {}
-			local filter = nil
-			if rng.percent(lev) and not been_greater then been_greater = true filter = function(e) return e.greater_ego end end
-			for z = 1, #egos do list[#list+1] = egos[z].e end
-			local pick_egos = game.zone:computeRarities("object", list, game.level, filter, nil, nil)
-			local ego = game.zone:pickEntity(pick_egos)
-			if ego then
-				print(" ** selected ego", ego.name)
-				ego = ego:clone()
-				ego.name = nil
-				ego.unided_name = nil
-				if ego.instant_resolve then ego:resolve(nil, nil, o) end
-				ego.instant_resolve = nil
-				ego.uid = nil
-				table.mergeAddAppendArray(o, ego, true)
-			end
-		end
-		o.egos = nil o.egos_chance = nil o.force_ego = nil
-	end
-
 	-- Setup the name
 	o.name = name
 
diff --git a/game/modules/tome/data/general/objects/egos/amulets.lua b/game/modules/tome/data/general/objects/egos/amulets.lua
index 1c43e89ee6..b21c9538b7 100644
--- a/game/modules/tome/data/general/objects/egos/amulets.lua
+++ b/game/modules/tome/data/general/objects/egos/amulets.lua
@@ -27,7 +27,7 @@ local Talents = require "engine.interface.ActorTalents"
 --load("/data/general/objects/egos/charged-utility.lua")
 
 newEntity{
-	name = " of cunning (#STATBONUS#)", suffix=true,
+	name = " of cunning (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -36,7 +36,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of willpower (#STATBONUS#)", suffix=true,
+	name = " of willpower (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -114,7 +114,7 @@ newEntity{
 
 
 newEntity{
-	name = "insulating ", prefix=true,
+	name = "insulating ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 5,
@@ -151,7 +151,7 @@ newEntity{
 }
 
 newEntity{
-	name = "shielding ", prefix=true,
+	name = "shielding ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 5,
@@ -162,7 +162,7 @@ newEntity{
 }
 
 newEntity{
-	name = "cleansing ", prefix=true,
+	name = "cleansing ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 9,
 	cost = 9,
@@ -176,7 +176,7 @@ newEntity{
 }
 
 newEntity{
-	name = "vitalizing ", prefix=true,
+	name = "vitalizing ", prefix=true, instant_resolve=true,
 	level_range = {20, 50},
 	greater_ego = true,
 	rarity = 15,
diff --git a/game/modules/tome/data/general/objects/egos/cloak.lua b/game/modules/tome/data/general/objects/egos/cloak.lua
index d552f9b780..2fc90c197c 100644
--- a/game/modules/tome/data/general/objects/egos/cloak.lua
+++ b/game/modules/tome/data/general/objects/egos/cloak.lua
@@ -52,7 +52,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of Eldoral", suffix=true,
+	name = " of Eldoral", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 10,
@@ -65,7 +65,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of the Shaloren", suffix=true,
+	name = " of the Shaloren", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 10,
@@ -78,7 +78,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of Iron Throne", suffix=true,
+	name = " of Iron Throne", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 10,
@@ -191,7 +191,7 @@ newEntity{
 		cut_immune = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return v * 8, v end),
 		life_regen = resolvers.mbonus_material(10, 5, function(e, v) v=v/10 return v * 10, v end),
 		poison_immune = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.15, v/100 end),
-		
+
 	},
 }
 
@@ -225,5 +225,3 @@ newEntity{
 		},
 	},
 }
-
-
diff --git a/game/modules/tome/data/general/objects/egos/digger.lua b/game/modules/tome/data/general/objects/egos/digger.lua
index 194972ad35..1f1d654473 100644
--- a/game/modules/tome/data/general/objects/egos/digger.lua
+++ b/game/modules/tome/data/general/objects/egos/digger.lua
@@ -28,7 +28,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of strength", suffix=true,
+	name = " of strength", suffix=true, instant_resolve=true,
 	level_range = {10, 50},
 	rarity = 6,
 	cost = 10,
@@ -38,7 +38,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of delving", suffix=true,
+	name = " of delving", suffix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 20,
@@ -80,7 +80,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of the Iron Throne", suffix=true,
+	name = " of the Iron Throne", suffix=true, instant_resolve=true,
 	level_range = {20, 50},
 	greater_ego = true,
 	rarity = 15,
@@ -93,7 +93,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of Reknor", suffix=true,
+	name = " of Reknor", suffix=true, instant_resolve=true,
 	level_range = {20, 50},
 	greater_ego = true,
 	rarity = 15,
@@ -108,7 +108,7 @@ newEntity{
 }
 
 newEntity{
-	name = "brutal ", prefix=true,
+	name = "brutal ", prefix=true, instant_resolve=true,
 	level_range = {40, 50},
 	greater_ego = true,
 	rarity = 20,
@@ -122,7 +122,7 @@ newEntity{
 }
 
 newEntity{
-	name = "builder's ", prefix=true,
+	name = "builder's ", prefix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 15,
@@ -137,7 +137,7 @@ newEntity{
 }
 
 newEntity{
-	name = "soldier's ", prefix=true,
+	name = "soldier's ", prefix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 15,
diff --git a/game/modules/tome/data/general/objects/egos/gloves.lua b/game/modules/tome/data/general/objects/egos/gloves.lua
index edf64fdc68..6b5095e6a8 100644
--- a/game/modules/tome/data/general/objects/egos/gloves.lua
+++ b/game/modules/tome/data/general/objects/egos/gloves.lua
@@ -148,7 +148,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of strength (#STATBONUS#)", suffix=true,
+	name = " of strength (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -158,7 +158,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of dexterity (#STATBONUS#)", suffix=true,
+	name = " of dexterity (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -168,7 +168,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of magic (#STATBONUS#)", suffix=true,
+	name = " of magic (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -178,7 +178,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of iron grip", suffix=true,
+	name = " of iron grip", suffix=true, instant_resolve=true,
 	level_range = {20, 50},
 	rarity = 9,
 	cost = 15,
@@ -189,7 +189,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of protection", suffix=true,
+	name = " of protection", suffix=true, instant_resolve=true,
 	level_range = {20, 50},
 	greater_ego = true,
 	rarity = 15,
@@ -204,7 +204,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of warmaking", suffix=true,
+	name = " of warmaking", suffix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 17,
@@ -220,7 +220,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of regeneration", suffix=true,
+	name = " of regeneration", suffix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 18,
@@ -233,7 +233,7 @@ newEntity{
 }
 
 newEntity{
-	name = "heroic ", prefix=true,
+	name = "heroic ", prefix=true, instant_resolve=true,
 	level_range = {40, 50},
 	greater_ego = true,
 	rarity = 20,
@@ -249,7 +249,7 @@ newEntity{
 }
 
 newEntity{
-	name = "alchemist's ", prefix=true,
+	name = "alchemist's ", prefix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 17,
@@ -265,7 +265,7 @@ newEntity{
 }
 
 newEntity{
-	name = "archer's ", prefix=true,
+	name = "archer's ", prefix=true, instant_resolve=true,
 	level_range = {30, 50},
 	greater_ego = true,
 	rarity = 17,
diff --git a/game/modules/tome/data/general/objects/egos/helm.lua b/game/modules/tome/data/general/objects/egos/helm.lua
index cd620285f9..4d0a58a8d0 100644
--- a/game/modules/tome/data/general/objects/egos/helm.lua
+++ b/game/modules/tome/data/general/objects/egos/helm.lua
@@ -25,7 +25,7 @@ local DamageType = require "engine.DamageType"
 
 
 newEntity{
-	name = " of strength (#STATBONUS#)", suffix=true,
+	name = " of strength (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -34,7 +34,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of constitution (#STATBONUS#)", suffix=true,
+	name = " of constitution (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -43,7 +43,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of dexterity (#STATBONUS#)", suffix=true,
+	name = " of dexterity (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -204,7 +204,7 @@ newEntity{
 		inc_stats = {
 			[Stats.STAT_MAG] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
 			[Stats.STAT_WIL] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
-			},		
+			},
 	},
 }
 
@@ -220,7 +220,7 @@ newEntity{
 		inc_stats = {
 			[Stats.STAT_STR] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
 			[Stats.STAT_CON] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
-			},		
+			},
 	},
 }
 
@@ -235,7 +235,7 @@ newEntity{
 		inc_stats = {
 			[Stats.STAT_DEX] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
 			[Stats.STAT_CUN] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
-			},		
+			},
 	},
 }
 
diff --git a/game/modules/tome/data/general/objects/egos/lite.lua b/game/modules/tome/data/general/objects/egos/lite.lua
index f9d8cdb331..b89ea3f79e 100644
--- a/game/modules/tome/data/general/objects/egos/lite.lua
+++ b/game/modules/tome/data/general/objects/egos/lite.lua
@@ -65,7 +65,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of revealing", suffix=true,
+	name = " of revealing", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 10,
@@ -76,7 +76,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of clarity", suffix=true,
+	name = " of clarity", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 10,
@@ -86,7 +86,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of health", suffix=true,
+	name = " of health", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 10,
@@ -96,7 +96,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of guile", suffix=true,
+	name = " of guile", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 10,
@@ -108,7 +108,7 @@ newEntity{
 }
 
 newEntity{
-	name = "burglar's ", prefix=true,
+	name = "burglar's ", prefix=true, instant_resolve=true,
 	level_range = {15, 50},
 	rarity = 9,
 	cost = 12,
@@ -119,7 +119,7 @@ newEntity{
 }
 
 newEntity{
-	name = "guard's ", prefix=true,
+	name = "guard's ", prefix=true, instant_resolve=true,
 	level_range = {15, 50},
 	rarity = 9,
 	cost = 12,
@@ -129,7 +129,7 @@ newEntity{
 }
 
 newEntity{
-	name = "healer's ", prefix=true,
+	name = "healer's ", prefix=true, instant_resolve=true,
 	level_range = {15, 50},
 	rarity = 9,
 	cost = 12,
@@ -139,7 +139,7 @@ newEntity{
 }
 
 newEntity{
-	name = "guide's ", prefix=true,
+	name = "guide's ", prefix=true, instant_resolve=true,
 	level_range = {15, 50},
 	rarity = 9,
 	cost = 12,
diff --git a/game/modules/tome/data/general/objects/egos/rings.lua b/game/modules/tome/data/general/objects/egos/rings.lua
index 4351616732..94080c294a 100644
--- a/game/modules/tome/data/general/objects/egos/rings.lua
+++ b/game/modules/tome/data/general/objects/egos/rings.lua
@@ -25,7 +25,7 @@ local DamageType = require "engine.DamageType"
 --load("/data/general/objects/egos/charged-utility.lua")
 
 newEntity{
-	name = " of see invisible", suffix=true,
+	name = " of see invisible", suffix=true, instant_resolve=true,
 	level_range = {1, 20},
 	rarity = 4,
 	cost = 2,
@@ -45,7 +45,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of mana (#REGEN#)", suffix=true,
+	name = " of mana (#REGEN#)", suffix=true, instant_resolve=true,
 	level_range = {10, 20},
 	rarity = 8,
 	cost = 3,
@@ -55,73 +55,79 @@ newEntity{
 }
 
 newEntity{
-	name = " of fire (#RESIST#)", suffix=true,
+	name = " of fire (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.FIRE] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.FIRE] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.FIRE] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.FIRE] = (e.wielder.resists[engine.DamageType.FIRE] or 0) + e.wielder.inc_damage[engine.DamageType.FIRE] end),
 	},
 }
 
 newEntity{
-	name = " of frost (#RESIST#)", suffix=true,
+	name = " of frost (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.COLD] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.COLD] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.COLD] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.COLD] = (e.wielder.resists[engine.DamageType.COLD] or 0) + e.wielder.inc_damage[engine.DamageType.COLD] end),
 	},
 }
 
 newEntity{
-	name = " of nature (#RESIST#)", suffix=true,
+	name = " of nature (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.NATURE] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.NATURE] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.NATURE] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.NATURE] = (e.wielder.resists[engine.DamageType.NATURE] or 0) + e.wielder.inc_damage[engine.DamageType.NATURE] end),
 	},
 }
 
 newEntity{
-	name = " of lightning (#RESIST#)", suffix=true,
+	name = " of lightning (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.LIGHTNING] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.LIGHTNING] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.LIGHTNING] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.LIGHTNING] = (e.wielder.resists[engine.DamageType.LIGHTNING] or 0) + e.wielder.inc_damage[engine.DamageType.LIGHTNING] end),
 	},
 }
 
 newEntity{
-	name = " of corrosion (#RESIST#)", suffix=true,
+	name = " of corrosion (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.ACID] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.ACID] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.ACID] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.ACID] = (e.wielder.resists[engine.DamageType.ACID] or 0) + e.wielder.inc_damage[engine.DamageType.ACID] end),
 	},
 }
 
 newEntity{
-	name = " of blight (#RESIST#)", suffix=true,
+	name = " of blight (#RESIST#)", suffix=true, instant_resolve=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
 		inc_damage = { [DamageType.BLIGHT] = resolvers.mbonus_material(10, 10, function(e, v) return v * 0.8 end) },
-		resists = {[DamageType.BLIGHT] = resolvers.genericlast(function(e) return e.wielder.inc_damage[engine.DamageType.BLIGHT] end) },
+		resists = {},
+		resolvers.genericlast(function(e) e.wielder.resists[engine.DamageType.BLIGHT] = (e.wielder.resists[engine.DamageType.BLIGHT] or 0) + e.wielder.inc_damage[engine.DamageType.BLIGHT] end),
 	},
 }
 
 newEntity{
-	name = " of massacre (#DAMBONUS#)", suffix=true,
+	name = " of massacre (#DAMBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {6, 50},
 	rarity = 4,
 	cost = 4,
@@ -131,7 +137,7 @@ newEntity{
 }
 
 newEntity{ define_as = "RING_ARCANE_POWER",
-	name = " of arcane power (#DAMBONUS#)", suffix=true,
+	name = " of arcane power (#DAMBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {6, 50},
 	rarity = 4,
 	cost = 4,
@@ -153,51 +159,51 @@ newEntity{
 }
 
 newEntity{
-	name = "brawler's ", prefix=true,
+	name = "brawler's ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 6,
 	wielder = {
 		inc_stats = { [Stats.STAT_STR] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
-		combat_def = resolvers.genericlast(function(e) return e.wielder.inc_stats[engine.interface.ActorStats.STAT_STR] end),
+		resolvers.genericlast(function(e) e.wielder.combat_def = (e.wielder.combat_def or 0) + e.wielder.inc_stats[engine.interface.ActorStats.STAT_STR] end),
 	},
 }
 
 newEntity{
-	name = "titan's ", prefix=true,
+	name = "titan's ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 6,
 	wielder = {
 		inc_stats = { [Stats.STAT_CON] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
-		combat_physresist = resolvers.genericlast(function(e) return e.wielder.inc_stats[engine.interface.ActorStats.STAT_CON] end),
+		resolvers.genericlast(function(e) e.wielder.combat_physresist = (e.wielder.combat_physresist or 0) + e.wielder.inc_stats[engine.interface.ActorStats.STAT_CON] end),
 	},
 }
 
 newEntity{
-	name = "duelist's ", prefix=true,
+	name = "duelist's ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 6,
 	wielder = {
 		inc_stats = { [Stats.STAT_DEX] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
-		combat_atk = resolvers.genericlast(function(e) return e.wielder.inc_stats[engine.interface.ActorStats.STAT_DEX] end),
+		resolvers.genericlast(function(e) e.wielder.combat_atk = (e.wielder.combat_atk or 0) + e.wielder.inc_stats[engine.interface.ActorStats.STAT_DEX] end),
 	},
 }
 
 newEntity{ define_as = "RING_MAGIC",
-	name = "wizard's ", prefix=true,
+	name = "wizard's ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 6,
 	wielder = {
 		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
-		combat_spellresist = resolvers.genericlast(function(e) return e.wielder.inc_stats[engine.interface.ActorStats.STAT_MAG] end),
+		resolvers.genericlast(function(e) e.wielder.combat_spellresist = (e.wielder.combat_spellresist or 0) + e.wielder.inc_stats[engine.interface.ActorStats.STAT_MAG] end),
 	},
 }
 
 newEntity{
-	name = "mule's ", prefix=true,
+	name = "mule's ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 7,
 	cost = 6,
@@ -214,7 +220,7 @@ newEntity{
 	rarity = 12,
 	cost = 20,
 	wielder = {
-		lite = -2,	
+		lite = -2,
 		inc_stats = {
 			[Stats.STAT_DEX] = resolvers.mbonus_material(6, 4, function(e, v) return v * 3 end),
 			[Stats.STAT_CUN] = resolvers.mbonus_material(6, 4, function(e, v) return v * 3 end),
@@ -248,7 +254,7 @@ newEntity{
 		inc_stats = {
 			[Stats.STAT_MAG] = resolvers.mbonus_material(4, 4, function(e, v) return v * 3 end),
 			[Stats.STAT_WIL] = resolvers.mbonus_material(4, 4, function(e, v) return v * 3 end),
-			},	
+			},
 	},
 }
 
@@ -261,7 +267,7 @@ newEntity{
 	wielder = {
 		pin_immune = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return v * 8, v end),
 		knockback_immune = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return v * 8, v end),
-		disarm_immune = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return v * 8, v end),	
+		disarm_immune = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return v * 8, v end),
 	},
 }
 
@@ -275,7 +281,7 @@ newEntity{
 	wielder = {
 		combat_spellpower = resolvers.mbonus_material(3, 3, function(e, v) return v * 0.8 end),
 		combat_spellcrit = resolvers.mbonus_material(3, 3, function(e, v) return v * 0.4 end),
-		inc_damage = { [DamageType.ARCANE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },	
+		inc_damage = { [DamageType.ARCANE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 
@@ -285,10 +291,10 @@ newEntity{
 	greater_ego = true,
 	rarity = 12,
 	cost = 50,
-	wielder = {	
+	wielder = {
 		max_life=resolvers.mbonus_material(60, 40, function(e, v) return v * 0.1 end),
 		life_regen = resolvers.mbonus_material(15, 5, function(e, v) v=v/10 return v * 10, v end),
-		healing_factor = resolvers.mbonus_material(20, 10, function(e, v) v=v/100 return v * 80, v end),	
+		healing_factor = resolvers.mbonus_material(20, 10, function(e, v) v=v/100 return v * 80, v end),
 
 	},
 }
diff --git a/game/modules/tome/data/general/objects/egos/wizard-hat.lua b/game/modules/tome/data/general/objects/egos/wizard-hat.lua
index f26c5b44f1..4552219b0f 100644
--- a/game/modules/tome/data/general/objects/egos/wizard-hat.lua
+++ b/game/modules/tome/data/general/objects/egos/wizard-hat.lua
@@ -37,7 +37,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of magic (#STATBONUS#)", suffix=true,
+	name = " of magic (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -46,7 +46,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of willpower (#STATBONUS#)", suffix=true,
+	name = " of willpower (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -55,7 +55,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = " of cunning (#STATBONUS#)", suffix=true,
+	name = " of cunning (#STATBONUS#)", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 6,
 	cost = 4,
@@ -84,7 +84,7 @@ newEntity{
 	},
 }
 newEntity{
-	name = "shimmering ", prefix=true,
+	name = "shimmering ", prefix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 10,
 	cost = 4,
@@ -94,7 +94,7 @@ newEntity{
 }
 
 newEntity{
-	name = " of seeing ", suffix=true,
+	name = " of seeing ", suffix=true, instant_resolve=true,
 	level_range = {1, 50},
 	rarity = 5,
 	cost = 6,
@@ -192,7 +192,7 @@ newEntity{
 		inc_stats = {
 			[Stats.STAT_MAG] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
 			[Stats.STAT_WIL] = resolvers.mbonus_material(3, 2, function(e, v) return v * 3 end),
-		},		
+		},
 	},
 }
 
@@ -208,7 +208,7 @@ newEntity{
 			[DamageType.COLD] = resolvers.mbonus_material(7, 5, function(e, v) return v * 0.25 end),
 			[DamageType.ACID] = resolvers.mbonus_material(7, 5, function(e, v) return v * 0.25 end),
 			[DamageType.LIGHTNING] = resolvers.mbonus_material(7, 5, function(e, v) return v * 0.25 end),
-		},		
+		},
 	},
 }
 
-- 
GitLab