From 923419f193f1236a3cb8cdc33b5a334b95978644 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Fri, 18 Jun 2010 17:53:13 +0000
Subject: [PATCH] ego items now vary in price based on their level of bonus

git-svn-id: http://svn.net-core.org/repos/t-engine4@812 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Object.lua            | 12 +++-
 .../data/general/objects/egos/amulets.lua     | 10 +--
 .../tome/data/general/objects/egos/armor.lua  | 10 +--
 .../tome/data/general/objects/egos/rings.lua  | 69 ++++++++++---------
 .../tome/data/general/objects/egos/robe.lua   | 32 ++++-----
 .../tome/data/general/objects/egos/shield.lua | 22 +++---
 .../tome/data/general/objects/egos/staves.lua | 24 +++----
 .../tome/data/general/objects/egos/weapon.lua | 26 +++----
 .../modules/tome/data/maps/towns/angolwen.lua |  2 +-
 game/modules/tome/resolvers.lua               | 23 +++++--
 10 files changed, 128 insertions(+), 102 deletions(-)

diff --git a/game/modules/tome/class/Object.lua b/game/modules/tome/class/Object.lua
index 97fde01e15..6510766d40 100644
--- a/game/modules/tome/class/Object.lua
+++ b/game/modules/tome/class/Object.lua
@@ -91,11 +91,19 @@ function _M:descAttribute(attr)
 	elseif attr == "DAMBONUS" then
 		local stat, i = next(self.wielder.inc_damage)
 		return (i > 0 and "+"..i or tostring(i)).."%"
+	elseif attr == "RESIST" then
+		local stat, i = next(self.wielder.resists)
+		return (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
+		return ("%s%0.2f/turn"):format(i > 0 and "+" or "-", math.abs(i))
 	elseif attr == "COMBAT" then
 		local c = self.combat
 		return c.dam.."-"..(c.dam*(c.damrange or 1.1)).." dam, "..(c.apr or 0).." apr"
 	elseif attr == "ARMOR" then
 		return (self.wielder and self.wielder.combat_def or 0).." def, "..(self.wielder and self.wielder.combat_armor or 0).." armor"
+	elseif attr == "ATTACK" then
+		return (self.wielder and self.wielder.combat_atk or 0).." attack, "..(self.wielder and self.wielder.combat_apr or 0).." apr"..(self.wielder and self.wielder.combat_dam or 0).." dam"
 	elseif attr == "MONEY" then
 		return ("worth %0.2f"):format(self.money_value / 10)
 	end
@@ -262,8 +270,8 @@ function _M:getDesc()
 	if w.knockback_immune then desc[#desc+1] = ("Increases knockback immunity: %d%%."):format(w.knockback_immune * 100) end
 	if w.instakill_immune then desc[#desc+1] = ("Increases instant-death immunity: %d%%."):format(w.instakill_immune * 100) end
 
-	if w.life_regen then desc[#desc+1] = ("Regenerates %d hitpoints each turn."):format(w.life_regen) end
-	if w.mana_regen then desc[#desc+1] = ("Regenerates %d mana each turn."):format(w.mana_regen) end
+	if w.life_regen then desc[#desc+1] = ("Regenerates %0.2f hitpoints each turn."):format(w.life_regen) end
+	if w.mana_regen then desc[#desc+1] = ("Regenerates %0.2f mana each turn."):format(w.mana_regen) end
 
 	if w.max_life then desc[#desc+1] = ("Maximum life %d"):format(w.max_life) end
 	if w.max_mana then desc[#desc+1] = ("Maximum mana %d"):format(w.max_mana) end
diff --git a/game/modules/tome/data/general/objects/egos/amulets.lua b/game/modules/tome/data/general/objects/egos/amulets.lua
index 4243c83ace..802d1c9205 100644
--- a/game/modules/tome/data/general/objects/egos/amulets.lua
+++ b/game/modules/tome/data/general/objects/egos/amulets.lua
@@ -26,7 +26,7 @@ newEntity{
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_CUN] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_CUN] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 newEntity{
@@ -35,7 +35,7 @@ newEntity{
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_WIL] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_WIL] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 newEntity{
@@ -87,14 +87,16 @@ newEntity{
 		local tt = tts[rng.range(1, #tts)]
 
 		e.wielder.talents_types_mastery = {}
-		e.wielder.talents_types_mastery[tt] = (10 + rng.mbonus(math.ceil(30 * e.material_level / 5), resolvers.current_level, 50)) / 100
+		local v = (10 + rng.mbonus(math.ceil(30 * e.material_level / 5), resolvers.current_level, 50)) / 100
+		e.wielder.talents_types_mastery[tt] = v
+		e.cost = e.cost + v * 60
 	end),
 }
 newEntity{
 	name = " of greater telepathy", suffix=true,
 	level_range = {40, 50},
 	rarity = 15,
-	cost = 15,
+	cost = 25,
 	wielder = {
 		esp = {all=1},
 	},
diff --git a/game/modules/tome/data/general/objects/egos/armor.lua b/game/modules/tome/data/general/objects/egos/armor.lua
index f85588a371..744cc0e2ab 100644
--- a/game/modules/tome/data/general/objects/egos/armor.lua
+++ b/game/modules/tome/data/general/objects/egos/armor.lua
@@ -23,7 +23,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.FIRE] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.FIRE] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -32,7 +32,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.COLD] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.COLD] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -41,7 +41,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.ACID] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.ACID] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -50,7 +50,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -59,7 +59,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.NATURE] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.NATURE] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 
diff --git a/game/modules/tome/data/general/objects/egos/rings.lua b/game/modules/tome/data/general/objects/egos/rings.lua
index dd7caaaecd..5dde6f40d0 100644
--- a/game/modules/tome/data/general/objects/egos/rings.lua
+++ b/game/modules/tome/data/general/objects/egos/rings.lua
@@ -26,8 +26,9 @@ newEntity{
 	rarity = 4,
 	cost = 2,
 	wielder = {
-		see_invisible = resolvers.mbonus_material(20, 5),
+		see_invisible = resolvers.mbonus_material(20, 5, function(e, v) return v * 0.2 end),
 	},
+
 }
 
 newEntity{
@@ -38,97 +39,97 @@ Beware, you should take off your light, otherwise you will still be easily spott
 	rarity = 4,
 	cost = 16,
 	wielder = {
-		invisible = resolvers.mbonus_material(10, 5),
+		invisible = resolvers.mbonus_material(10, 5, function(e, v) return v * 1 end),
 	},
 }
 
 newEntity{
-	name = " of regeneration", suffix=true,
+	name = " of regeneration (#REGEN#)", suffix=true,
 	level_range = {10, 20},
 	rarity = 10,
 	cost = 8,
 	wielder = {
-		life_regen = resolvers.mbonus_material(3, 1),
+		life_regen = resolvers.mbonus_material(30, 5, function(e, v) v=v/10 return v * 10, v end),
 	},
 }
 
 newEntity{
-	name = "energizing ", prefix=true,
+	name = " of mana (#REGEN#)", suffix=true,
 	level_range = {10, 20},
 	rarity = 8,
 	cost = 3,
 	wielder = {
-		mana_regen = resolvers.mbonus_material(3, 1),
+		mana_regen = resolvers.mbonus_material(3, 1, function(e, v) v=v/10 return v * 8, v end),
 	},
 }
 
 newEntity{
-	name = " of accuracy", suffix=true,
+	name = " of accuracy (#ATTACK#)", suffix=true,
 	level_range = {1, 30},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		combat_atk = resolvers.mbonus_material(15, 5),
+		combat_atk = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.3 end),
 	},
 }
 
 newEntity{
-	name = " of defense", suffix=true,
+	name = " of defense (#ARMOR#)", suffix=true,
 	level_range = {1, 30},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		combat_def = resolvers.mbonus_material(15, 5),
+		combat_def = resolvers.mbonus_material(15, 5, function(e, v) return v * 1 end),
 	},
 }
 
 newEntity{
-	name = " of fire resistance", suffix=true,
+	name = " of fire resistance (#RESIST#)", suffix=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		resists = { [DamageType.FIRE] = resolvers.mbonus_material(15, 20), }
+		resists = { [DamageType.FIRE] = resolvers.mbonus_material(15, 20, function(e, v) return v * 0.15 end), }
 	},
 }
 
 newEntity{
-	name = " of cold resistance", suffix=true,
+	name = " of cold resistance (#RESIST#)", suffix=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		resists = { [DamageType.COLD] = resolvers.mbonus_material(15, 20), }
+		resists = { [DamageType.COLD] = resolvers.mbonus_material(15, 20, function(e, v) return v * 0.15 end), }
 	},
 }
 
 newEntity{
-	name = " of nature resistance", suffix=true,
+	name = " of nature resistance (#RESIST#)", suffix=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		resists = { [DamageType.NATURE] = resolvers.mbonus_material(15, 20), }
+		resists = { [DamageType.NATURE] = resolvers.mbonus_material(15, 20, function(e, v) return v * 0.15 end), }
 	},
 }
 
 newEntity{
-	name = " of lightning resistance", suffix=true,
+	name = " of lightning resistance (#RESIST#)", suffix=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		resists = { [DamageType.LIGHTNING] = resolvers.mbonus_material(15, 20), }
+		resists = { [DamageType.LIGHTNING] = resolvers.mbonus_material(15, 20, function(e, v) return v * 0.15 end), }
 	},
 }
 
 newEntity{
-	name = " of acid resistance", suffix=true,
+	name = " of acid resistance (#RESIST#)", suffix=true,
 	level_range = {10, 40},
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		resists = { [DamageType.ACID] = resolvers.mbonus_material(15, 20), }
+		resists = { [DamageType.ACID] = resolvers.mbonus_material(15, 20, function(e, v) return v * 0.15 end), }
 	},
 }
 
@@ -138,7 +139,7 @@ newEntity{
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		combat_spellresist = resolvers.mbonus_material(15, 5),
+		combat_spellresist = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.15 end),
 	},
 }
 
@@ -148,7 +149,7 @@ newEntity{
 	rarity = 6,
 	cost = 2,
 	wielder = {
-		combat_physresist = resolvers.mbonus_material(15, 5),
+		combat_physresist = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.15 end),
 	},
 }
 
@@ -158,7 +159,7 @@ newEntity{
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_STR] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_STR] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 newEntity{
@@ -167,7 +168,7 @@ newEntity{
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_DEX] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_DEX] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 newEntity{ define_as = "RING_MAGIC",
@@ -176,7 +177,7 @@ newEntity{ define_as = "RING_MAGIC",
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 newEntity{
@@ -185,7 +186,7 @@ newEntity{
 	rarity = 6,
 	cost = 4,
 	wielder = {
-		inc_stats = { [Stats.STAT_CON] = resolvers.mbonus_material(8, 2) },
+		inc_stats = { [Stats.STAT_CON] = resolvers.mbonus_material(8, 2, function(e, v) return v * 3 end) },
 	},
 }
 
@@ -196,7 +197,7 @@ newEntity{
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_ARCANE_POWER",
@@ -205,7 +206,7 @@ newEntity{ define_as = "RING_ARCANE_POWER",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.ARCANE] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.ARCANE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_BURNING",
@@ -214,7 +215,7 @@ newEntity{ define_as = "RING_BURNING",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.FIRE] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.FIRE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_FREEZING",
@@ -223,7 +224,7 @@ newEntity{ define_as = "RING_FREEZING",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.COLD] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.COLD] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_NATURE_BLESSING",
@@ -232,7 +233,7 @@ newEntity{ define_as = "RING_NATURE_BLESSING",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.NATURE] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.NATURE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_BLIGHT",
@@ -241,7 +242,7 @@ newEntity{ define_as = "RING_BLIGHT",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.BLIGHT] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.BLIGHT] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_SHOCK",
@@ -250,7 +251,7 @@ newEntity{ define_as = "RING_SHOCK",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.LIGHTNING] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.LIGHTNING] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
 newEntity{ define_as = "RING_CORROSION",
@@ -259,6 +260,6 @@ newEntity{ define_as = "RING_CORROSION",
 	rarity = 4,
 	cost = 4,
 	wielder = {
-		inc_damage = { [DamageType.ACID] = resolvers.mbonus_material(15, 5) },
+		inc_damage = { [DamageType.ACID] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.8 end) },
 	},
 }
diff --git a/game/modules/tome/data/general/objects/egos/robe.lua b/game/modules/tome/data/general/objects/egos/robe.lua
index b1d2941ed6..1c33658094 100644
--- a/game/modules/tome/data/general/objects/egos/robe.lua
+++ b/game/modules/tome/data/general/objects/egos/robe.lua
@@ -23,7 +23,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.FIRE] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.FIRE] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -32,7 +32,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.COLD] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.COLD] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -41,7 +41,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.ACID] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.ACID] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -50,7 +50,7 @@ newEntity{
 	rarity = 5,
 	cost = 6,
 	wielder = {
-		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(30, 10)},
+		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(30, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -60,7 +60,7 @@ newEntity{
 	cost = 6,
 	wielder = {
 		resists={[DamageType.NATURE] = resolvers.mbonus_material(30, 10)},
-	},
+	},                                                                     , function(e, v) return v * 0.15 end
 }
 
 newEntity{
@@ -69,7 +69,7 @@ newEntity{
 	rarity = 7,
 	cost = 6,
 	wielder = {
-		max_mana = resolvers.mbonus_material(100, 10),
+		max_mana = resolvers.mbonus_material(100, 10, function(e, v) return v * 0.1 end),
 	},
 }
 
@@ -79,25 +79,25 @@ newEntity{
 	rarity = 7,
 	cost = 6,
 	wielder = {
-		on_melee_hit={[DamageType.SLIME] = resolvers.mbonus_material(7, 3)},
+		on_melee_hit={[DamageType.SLIME] = resolvers.mbonus_material(7, 3, function(e, v) return v * 1 end)},
 	},
 }
 
 newEntity{
 	name = " of power", suffix=true,
 	level_range = {20, 50},
-	rarity = 9,
+	rarity = 15,
 	cost = 15,
 	wielder = {
 		inc_damage = {
-			[DamageType.ARCANE] = resolvers.mbonus_material(15, 5),
-			[DamageType.FIRE] = resolvers.mbonus_material(15, 5),
-			[DamageType.COLD] = resolvers.mbonus_material(15, 5),
-			[DamageType.ACID] = resolvers.mbonus_material(15, 5),
-			[DamageType.LIGHTNING] = resolvers.mbonus_material(15, 5),
-			[DamageType.NATURE] = resolvers.mbonus_material(15, 5),
-			[DamageType.BLIGHT] = resolvers.mbonus_material(15, 5),
-			[DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5),
+			[DamageType.ARCANE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.FIRE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.COLD] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.ACID] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.LIGHTNING] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.NATURE] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.BLIGHT] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
+			[DamageType.PHYSICAL] = resolvers.mbonus_material(15, 5, function(e, v) return v * 0.25 end),
 		},
 		combat_spellpower = 4,
 	},
diff --git a/game/modules/tome/data/general/objects/egos/shield.lua b/game/modules/tome/data/general/objects/egos/shield.lua
index f5976d3578..1f0f6e74c0 100644
--- a/game/modules/tome/data/general/objects/egos/shield.lua
+++ b/game/modules/tome/data/general/objects/egos/shield.lua
@@ -23,7 +23,7 @@ newEntity{
 	rarity = 5,
 	cost = 4,
 	wielder = {
-		resists={[DamageType.FIRE] = resolvers.mbonus_material(20, 10)},
+		resists={[DamageType.FIRE] = resolvers.mbonus_material(20, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -32,7 +32,7 @@ newEntity{
 	rarity = 5,
 	cost = 4,
 	wielder = {
-		resists={[DamageType.COLD] = resolvers.mbonus_material(20, 10)},
+		resists={[DamageType.COLD] = resolvers.mbonus_material(20, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -41,7 +41,7 @@ newEntity{
 	rarity = 5,
 	cost = 4,
 	wielder = {
-		resists={[DamageType.ACID] = resolvers.mbonus_material(20, 10)},
+		resists={[DamageType.ACID] = resolvers.mbonus_material(20, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -50,7 +50,7 @@ newEntity{
 	rarity = 5,
 	cost = 4,
 	wielder = {
-		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(20, 10)},
+		resists={[DamageType.LIGHTNING] = resolvers.mbonus_material(20, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 newEntity{
@@ -59,7 +59,7 @@ newEntity{
 	rarity = 5,
 	cost = 4,
 	wielder = {
-		resists={[DamageType.NATURE] = resolvers.mbonus_material(20, 10)},
+		resists={[DamageType.NATURE] = resolvers.mbonus_material(20, 10, function(e, v) return v * 0.15 end)},
 	},
 }
 
@@ -70,7 +70,7 @@ newEntity{
 	rarity = 8,
 	cost = 8,
 	wielder = {
-		on_melee_hit={[DamageType.FIRE] = resolvers.mbonus_material(7, 3)},
+		on_melee_hit={[DamageType.FIRE] = resolvers.mbonus_material(7, 3, function(e, v) return v * 0.6 end)},
 	},
 }
 newEntity{
@@ -79,7 +79,7 @@ newEntity{
 	rarity = 8,
 	cost = 10,
 	wielder = {
-		on_melee_hit={[DamageType.ICE] = resolvers.mbonus_material(4, 3)},
+		on_melee_hit={[DamageType.ICE] = resolvers.mbonus_material(4, 3, function(e, v) return v * 0.7 end)},
 	},
 }
 newEntity{
@@ -88,7 +88,7 @@ newEntity{
 	rarity = 8,
 	cost = 8,
 	wielder = {
-		on_melee_hit={[DamageType.ACID] = resolvers.mbonus_material(7, 3)},
+		on_melee_hit={[DamageType.ACID] = resolvers.mbonus_material(7, 3, function(e, v) return v * 0.7 end)},
 	},
 }
 newEntity{
@@ -97,7 +97,7 @@ newEntity{
 	rarity = 8,
 	cost = 8,
 	wielder = {
-		on_melee_hit={[DamageType.LIGHTNING] = resolvers.mbonus_material(7, 3)},
+		on_melee_hit={[DamageType.LIGHTNING] = resolvers.mbonus_material(7, 3, function(e, v) return v * 0.7 end)},
 	},
 }
 
@@ -107,7 +107,7 @@ newEntity{
 	rarity = 15,
 	cost = 20,
 	wielder = {
-		combat_def=resolvers.mbonus_material(15, 4),
+		combat_def=resolvers.mbonus_material(15, 4, function(e, v) return v * 1 end),
 	},
 }
 
@@ -117,6 +117,6 @@ newEntity{
 	rarity = 15,
 	cost = 20,
 	wielder = {
-		max_life=resolvers.mbonus_material(100, 10),
+		max_life=resolvers.mbonus_material(100, 10, function(e, v) return v * 0.1 end),
 	},
 }
diff --git a/game/modules/tome/data/general/objects/egos/staves.lua b/game/modules/tome/data/general/objects/egos/staves.lua
index e055ca49c0..4b3b3f0537 100644
--- a/game/modules/tome/data/general/objects/egos/staves.lua
+++ b/game/modules/tome/data/general/objects/egos/staves.lua
@@ -25,7 +25,7 @@ newEntity{
 	rarity = 4,
 	cost = 8,
 	wielder = {
-		combat_spellpower = resolvers.mbonus_material(30, 3),
+		combat_spellpower = resolvers.mbonus_material(30, 3, function(e, v) return v * 0.8 end),
 	},
 }
 
@@ -35,7 +35,7 @@ newEntity{
 	rarity = 3,
 	cost = 8,
 	wielder = {
-		max_mana = resolvers.mbonus_material(100, 10),
+		max_mana = resolvers.mbonus_material(100, 10, function(e, v) return v * 0.2 end),
 	},
 }
 
@@ -45,7 +45,7 @@ newEntity{
 	rarity = 3,
 	cost = 8,
 	wielder = {
-		combat_spellcrit = resolvers.mbonus_material(15, 4),
+		combat_spellcrit = resolvers.mbonus_material(15, 4, function(e, v) return v * 0.4 end),
 	},
 }
 
@@ -55,9 +55,9 @@ newEntity{
 	rarity = 12,
 	cost = 45,
 	wielder = {
-		combat_spellpower = resolvers.mbonus_material(30, 3),
-		max_mana = resolvers.mbonus_material(100, 10),
-		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(5, 1), [Stats.STAT_WIL] = resolvers.mbonus_material(5, 1) },
+		combat_spellpower = resolvers.mbonus_material(30, 3, function(e, v) return v * 0.6 end),
+		max_mana = resolvers.mbonus_material(100, 10, function(e, v) return v * 0.2 end),
+		inc_stats = { [Stats.STAT_MAG] = resolvers.mbonus_material(5, 1, function(e, v) return v * 3 end), [Stats.STAT_WIL] = resolvers.mbonus_material(5, 1, function(e, v) return v * 3 end) },
 	},
 }
 
@@ -67,7 +67,7 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.FIRE] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.FIRE] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
 
@@ -77,7 +77,7 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.COLD] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.COLD] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
 
@@ -87,7 +87,7 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.ACID] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.ACID] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
 
@@ -97,7 +97,7 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.LIGHTNING] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.LIGHTNING] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
 
@@ -107,7 +107,7 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.NATURE] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.NATURE] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
 
@@ -117,6 +117,6 @@ newEntity{
 	rarity = 3,
 	cost = 5,
 	wielder = {
-		inc_damage={ [DamageType.BLIGHT] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.BLIGHT] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
diff --git a/game/modules/tome/data/general/objects/egos/weapon.lua b/game/modules/tome/data/general/objects/egos/weapon.lua
index e0e6d2ea6b..86657291d0 100644
--- a/game/modules/tome/data/general/objects/egos/weapon.lua
+++ b/game/modules/tome/data/general/objects/egos/weapon.lua
@@ -22,7 +22,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.FIRE] = resolvers.mbonus_material(25, 4)},
+		melee_project={[DamageType.FIRE] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.64 end)},
 	},
 }
 newEntity{
@@ -30,7 +30,7 @@ newEntity{
 	level_range = {15, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.ICE] = resolvers.mbonus_material(15, 4)},
+		melee_project={[DamageType.ICE] = resolvers.mbonus_material(15, 4, function(e, v) return v * 0.7 end)},
 	},
 }
 newEntity{
@@ -38,7 +38,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.ACID] = resolvers.mbonus_material(25, 4)},
+		melee_project={[DamageType.ACID] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.7 end)},
 	},
 }
 newEntity{
@@ -46,7 +46,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.LIGHTNING] = resolvers.mbonus_material(25, 4)},
+		melee_project={[DamageType.LIGHTNING] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.7 end)},
 	},
 }
 newEntity{
@@ -54,7 +54,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.POISON] = resolvers.mbonus_material(45, 6)},
+		melee_project={[DamageType.POISON] = resolvers.mbonus_material(45, 6, function(e, v) return v * 0.5 end)},
 	},
 }
 
@@ -63,7 +63,7 @@ newEntity{
 	level_range = {10, 50},
 	rarity = 5,
 	wielder = {
-		melee_project={[DamageType.SLIME] = resolvers.mbonus_material(45, 6)},
+		melee_project={[DamageType.SLIME] = resolvers.mbonus_material(45, 6, function(e, v) return v * 0.9 end)},
 	},
 }
 
@@ -72,7 +72,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 3,
 	cost = 4,
-	combat={atk = resolvers.mbonus_material(20, 2)},
+	combat={atk = resolvers.mbonus_material(20, 2, function(e, v) return v * 0.3 end)},
 }
 
 newEntity{
@@ -80,7 +80,7 @@ newEntity{
 	level_range = {1, 50},
 	rarity = 3,
 	cost = 6,
-	combat={apr = resolvers.mbonus_material(15, 1)},
+	combat={apr = resolvers.mbonus_material(15, 1, function(e, v) return v * 0.3 end)},
 }
 
 newEntity{
@@ -90,10 +90,10 @@ newEntity{
 	cost = 35,
 	wielder = {
 		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),
+			[DamageType.FIRE] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.7 end),
+			[DamageType.ICE] = resolvers.mbonus_material(15, 4, function(e, v) return v * 0.7 end),
+			[DamageType.ACID] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.7 end),
+			[DamageType.LIGHTNING] = resolvers.mbonus_material(25, 4, function(e, v) return v * 0.7 end),
 		},
 	},
 }
@@ -104,6 +104,6 @@ newEntity{
 	rarity = 3,
 	cost = 4,
 	wielder = {
-		inc_damage={ [DamageType.PHYSICAL] = resolvers.mbonus_material(25, 8), },
+		inc_damage={ [DamageType.PHYSICAL] = resolvers.mbonus_material(25, 8, function(e, v) return v * 0.8 end), },
 	},
 }
diff --git a/game/modules/tome/data/maps/towns/angolwen.lua b/game/modules/tome/data/maps/towns/angolwen.lua
index 5f88ba8b0b..19ffe0f90c 100644
--- a/game/modules/tome/data/maps/towns/angolwen.lua
+++ b/game/modules/tome/data/maps/towns/angolwen.lua
@@ -23,7 +23,7 @@ quickEntity('T', {name='tree', display='#', color=colors.LIGHT_GREEN, block_move
 quickEntity('o', {name='fountain', display='~', color=colors.BLUE, block_move=true, image="terrain/river.png"})
 quickEntity(' ', {name='grass', display='.', color=colors.LIGHT_GREEN, image="terrain/grass.png"})
 
-quickEntity('2', {show_tooltip=true, name="Jewelry", display='2', color=colors.BLUE, resolvers.store("ANGOLWEN_JEWELRY"), image="terrain/terrain/wood_store_gem.png"})
+quickEntity('2', {show_tooltip=true, name="Jewelry", display='2', color=colors.BLUE, resolvers.store("ANGOLWEN_JEWELRY"), image="terrain/wood_store_gem.png"})
 quickEntity('4', {show_tooltip=true, name="Alchemist", display='4', color=colors.LIGHT_BLUE, resolvers.store("POTION"), image="terrain/wood_store_potion.png"})
 quickEntity('5', {show_tooltip=true, name="Scribe", display='5', color=colors.WHITE, resolvers.store("SCROLL"), image="terrain/wood_store_book.png"})
 quickEntity('6', {show_tooltip=true, name="Staves & Wands", display='6', color=colors.RED, resolvers.store("ANGOLWEN_STAFF_WAND"), image="terrain/wood_store_closed.png"})
diff --git a/game/modules/tome/resolvers.lua b/game/modules/tome/resolvers.lua
index 6cd61e1621..f4d0921184 100644
--- a/game/modules/tome/resolvers.lua
+++ b/game/modules/tome/resolvers.lua
@@ -164,11 +164,26 @@ resolvers.mbonus_max_level = 60
 
 --- Random bonus based on level and material quality
 resolvers.current_level = 1
-function resolvers.mbonus_material(max, add)
-	return {__resolver="mbonus_material", max, add}
+function resolvers.mbonus_material(max, add, pricefct)
+	return {__resolver="mbonus_material", max, add, pricefct}
 end
 function resolvers.calc.mbonus_material(t, e)
 	local ml = e.material_level or 1
-	print("RESOLVER MBONUS MATERIAL", ml, math.ceil(t[1] * ml / 5))
-	return math.ceil(rng.mbonus(t[1], resolvers.current_level, resolvers.mbonus_max_level) * ml / 5) + (t[2] or 0)
+	local v = math.ceil(rng.mbonus(t[1], resolvers.current_level, resolvers.mbonus_max_level) * ml / 5) + (t[2] or 0)
+
+	if e.cost and t[3] then
+		local ap, nv = t[3](e, v)
+		e.cost = e.cost + ap
+		v = nv or v
+	end
+
+	return v
+end
+
+--- Generic resolver, takes a function, executes at the end
+function resolvers.genericlast(fct)
+	return {__resolver="genericlast", __resolve_last=true, fct}
+end
+function resolvers.calc.genericlast(t, e)
+	return t[1](e)
 end
-- 
GitLab