diff --git a/.gitignore b/.gitignore
index 3931aabd627a7eb51aacf978f65341fdfe482e53..c8d928f684e2816ea99ef0147ee92c4e55825012 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,4 @@ recompile.sh
 *.dll
 te4_log.txt
 debug.log
+/.idea/
diff --git a/game/modules/tome/class/NicerTiles.lua b/game/modules/tome/class/NicerTiles.lua
index c12cb01afde891855bd4ebf30c8cc528f9bf9a92..e699dee4e72244dc8c6d8a455de0b5e1bb49f304 100644
--- a/game/modules/tome/class/NicerTiles.lua
+++ b/game/modules/tome/class/NicerTiles.lua
@@ -1002,6 +1002,22 @@ molten_lava = { method="borders", type="molten_lava", forbid={grass=true, jungle
 	default7i={add_mos_shader="lava", add_mos={{image="terrain/lava/molten_lava_inner_7_%02d.png", display_x=-1, display_y=-1}}, min=1, max=2},
 	default9i={add_mos_shader="lava", add_mos={{image="terrain/lava/molten_lava_inner_9_%02d.png", display_x=1, display_y=-1}}, min=1, max=2},
 },
+dunes = { method="borders", type="dunes", forbid={}, use_type=true,
+	default8={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes8.png", display_y=-1}}, min=1, max=1},
+	default2={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes2.png", display_y=1}}, min=1, max=1},
+	default4={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes4.png", display_x=-1}}, min=1, max=1},
+	default6={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes6.png", display_x=1}}, min=1, max=1},
+
+	default1={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes9i.png", display_x=-1, display_y=1}}, min=1, max=1},
+	default3={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes7i.png", display_x=1, display_y=1}}, min=1, max=1},
+	default7={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes3i.png", display_x=-1, display_y=-1}}, min=1, max=1},
+	default9={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes1i.png", display_x=1, display_y=-1}}, min=1, max=1},
+
+	default1i={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes1.png", display_x=-1, display_y=1}}, min=1, max=1},
+	default3i={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes3.png", display_x=1, display_y=1}}, min=1, max=1},
+	default7i={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes7.png", display_x=-1, display_y=-1}}, min=1, max=1},
+	default9i={z=3, copy_base=true, add_mos={{image="terrain/dunes/dunes9.png", display_x=1, display_y=-1}}, min=1, max=1},
+},
 mountain = { method="borders", type="mountain", forbid={}, use_type=true,
 	default8={z=3, copy_base=true, add_displays={{image="terrain/mountain8.png", display_y=-1, z=16}}, min=1, max=1},
 	default2={z=3, copy_base=true, add_mos={{image="terrain/mountain2.png", display_y=1}}, min=1, max=1},
diff --git a/game/modules/tome/data/general/encounters/maj-eyal.lua b/game/modules/tome/data/general/encounters/maj-eyal.lua
index 14b788ab78b6d2653c69a670df60ce295394a8a6..7934f0b47767ca62e7be4d4191aa16d7c6eb35eb 100644
--- a/game/modules/tome/data/general/encounters/maj-eyal.lua
+++ b/game/modules/tome/data/general/encounters/maj-eyal.lua
@@ -44,9 +44,9 @@ newEntity{
 newEntity{
 	name = "Lost merchant",
 	type = "hostile", subtype = "special", unique = true,
-	level_range = {10, 20},
+	level_range = {14, 28},
 	rarity = 7,
-	min_level = 10,
+	min_level = 18,
 	on_world_encounter = "merchant-quest",
 	on_encounter = function(self, who)
 		who.energy.value = game.energy_to_act
diff --git a/game/modules/tome/data/general/grids/sanddunes.lua b/game/modules/tome/data/general/grids/sanddunes.lua
index 985edb127b72ff7861ada71b4563a4bb25cb3bcc..a142c0acb7e6b1248c993fae45ab130becd9502d 100644
--- a/game/modules/tome/data/general/grids/sanddunes.lua
+++ b/game/modules/tome/data/general/grids/sanddunes.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-local sanddunes_editer = {method="borders_def", def="mountain"}
+local sanddunes_editer = {method="borders_def", def="dunes"}
 
 newEntity{
 	define_as = "SAND_FLOOR",
@@ -30,7 +30,7 @@ newEntity{
 newEntity{
 	define_as = "SAND_DUNE",
 	type = "dune", subtype = "sand",
-	name = "sand dune", image = "terrain/rocky_mountain.png",
+	name = "sand dune", image = "terrain/dunes/dunes5.png",
 	display = '^', color=colors.SANDY_BROWN, back_color=colors.LIGHT_UMBER,
 	always_remember = true,
 	can_pass = {pass_wall=1},
@@ -38,14 +38,14 @@ newEntity{
 	block_sight = true,
 	dig = "SAND_FLOOR",
 	nice_editer = sanddunes_editer,
-	nice_tiler = { method="replace", base={"SAND_DUNE", 70, 1, 6} },
+	nice_tiler = { method="replace", base={"SAND_DUNE", 100, 1, 7} },
 }
-for i = 1, 6 do newEntity{ base="SAND_DUNE", define_as = "SAND_DUNE"..i, image = "terrain/mountain5_"..i..".png"} end
+for i = 1, 7 do newEntity{ base="SAND_DUNE", define_as = "SAND_DUNE"..i, image = "terrain/dunes/dunes5_"..i..".png"} end
 
 newEntity{
 	define_as = "HARDSAND_DUNE",
 	type = "dune", subtype = "sand",
-	name = "solidified sand dune", image = "terrain/rocky_mountain.png",
+	name = "solidified sand dune", image = "terrain/dunes/dunes5.png",
 	display = '#', color=colors.SANDY_BROWN, back_color=colors.LIGHT_UMBER,
 	always_remember = true,
 	does_block_move = true,
@@ -53,9 +53,9 @@ newEntity{
 	block_sense = true,
 	block_esp = true,
 	nice_editer = sanddunes_editer,
-	nice_tiler = { method="replace", base={"HARDSAND_DUNE", 70, 1, 6} },
+	nice_tiler = { method="replace", base={"HARDSAND_DUNE", 100, 1, 7} },
 }
-for i = 1, 6 do newEntity{ base="HARDSAND_DUNE", define_as = "HARDSAND_DUNE"..i, image = "terrain/mountain5_"..i..".png"} end
+for i = 1, 7 do newEntity{ base="HARDSAND_DUNE", define_as = "HARDSAND_DUNE"..i, image = "terrain/dunes/dunes5_"..i..".png"} end
 
 newEntity{
 	define_as = "PALMTREE",
diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua
index 9b080bdcf172c2617e55ff7909e429ddeb776eb1..e09ba56ed14d5194b918933b313dba13f7f456cc 100644
--- a/game/modules/tome/data/general/objects/boss-artifacts.lua
+++ b/game/modules/tome/data/general/objects/boss-artifacts.lua
@@ -31,6 +31,7 @@ newEntity{ define_as = "RUNGOF_FANG",
 	level_range = {20, 35},
 	rarity = false,
 	display = "*", color=colors.DARK_RED,
+	cost = 100,
 	encumber = 1,
 	not_in_stores = true,
 	desc = _t[[A fang from the great warg, Rungof, still covered in blood.]],
diff --git a/game/modules/tome/data/general/objects/egos/cloak.lua b/game/modules/tome/data/general/objects/egos/cloak.lua
index 4a2a42a9735b451d93c31594bd729c30138add0a..cef179298f0dd7f9d86687032b87ed41dcdd4ae0 100644
--- a/game/modules/tome/data/general/objects/egos/cloak.lua
+++ b/game/modules/tome/data/general/objects/egos/cloak.lua
@@ -238,9 +238,8 @@ newEntity{
 			[Stats.STAT_DEX] = resolvers.mbonus_material(5, 1),
 			[Stats.STAT_CON] = resolvers.mbonus_material(5, 1),
 		},
-		combat_spellresist = resolvers.mbonus_material(20, 10, function(e, v) return 0, -v end),
+		combat_spellresist = resolvers.mbonus_material(12, 3, function(e, v) return 0, v end),
 		stamina_regen = resolvers.mbonus_material(12, 3, function(e, v) v=v/10 return 0, v end),
-		mana_regen = resolvers.mbonus_material(50, 10, function(e, v) v=v/100 return 0, -v end),
 		talents_types_mastery = {
 			["technique/combat-training"] = resolvers.mbonus_material(2, 2, function(e, v) v=v/10 return 0, v end),
 		},
diff --git a/game/modules/tome/data/general/objects/egos/helm.lua b/game/modules/tome/data/general/objects/egos/helm.lua
index b5b3aa62eb8cbf1f9317b188e7b36740b2be4f54..1010bd1a6f7394593f54007a26d4f36948222145 100644
--- a/game/modules/tome/data/general/objects/egos/helm.lua
+++ b/game/modules/tome/data/general/objects/egos/helm.lua
@@ -325,9 +325,6 @@ newEntity{
 	rarity = 30,
 	cost = 80,
 	wielder = {
-		resists={
-			[DamageType.LIGHT] = resolvers.mbonus_material(25, 15, function(e, v) return 0, -v end),
-		},
 		inc_stats = {
 			[Stats.STAT_STR] = resolvers.mbonus_material(8, 1),
 			[Stats.STAT_DEX] = resolvers.mbonus_material(8, 1),
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 e5833e263dd96b1fbf34067241e58c6ea05911e4..fe6d7924fbd565474a70a59252fc6ef231fd300b 100644
--- a/game/modules/tome/data/general/objects/egos/wizard-hat.lua
+++ b/game/modules/tome/data/general/objects/egos/wizard-hat.lua
@@ -202,8 +202,6 @@ newEntity{
 		},
 		combat_mindcrit = resolvers.mbonus_material(4, 4),
 		combat_mentalresist = resolvers.mbonus_material(20, 10),
-		confusion_immune = -0.2,
-		fear_immune = -0.2,
 	},
 }
 
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 31ea05c3c796375091546a08267a296a4935352d..56bdc66ab39841d3e4c60f8861cb686b3ce1b566 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -135,7 +135,7 @@ newEntity{ base = "BASE_STAFF",
 	color=colors.VIOLET,
 	rarity = 170,
 	desc = _t[[This unique-looking staff is carved with runes of destruction.]],
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	material_level = 3,
 
 	require = { stat = { mag=24 }, },
@@ -179,22 +179,25 @@ newEntity{ base = "BASE_RING",
 		name = function(self, who)
 			local dam = self.use_power.damage(self, who)
 			return ("summon a radius %d tidal wave that expands slowly over %d turns, dealing %0.2f cold and %0.2f physical damage (based on Willpower) each turn, knocking opponents back, and lowering their stun resistance"):
-			tformat(self.use_power:radius(who), self.use_power.duration(self, who), who:damDesc(engine.DamageType.COLD, dam/2), who:damDesc(engine.DamageType.PHYSICAL, dam/2))
+			tformat(self.use_power.radius(self, who), self.use_power.duration, who:damDesc(engine.DamageType.COLD, dam/2), who:damDesc(engine.DamageType.PHYSICAL, dam/2))
 		end,
 		power = 60,
-		radius = function(self, who) return 1 end,
-		duration = function(self, who) return 7 end,
+		range = 0,
+		radius = function(self, who) return 1 + 0.4 * self.use_power.duration end,
+		duration = 7,
 		damage = function(self, who) return who:combatStatScale("wil", 15, 40) end,
 		tactical = {ESCAPE = 1.5, ATTACKAREA = {COLD = 1.5, PHYSICAL = 1.5}},
+		requires_target = true,
+		target = function(self, who) return {type="ball", range=0, radius=self.use_power.radius(self, who), selffire=false} end,
 		use = function(self, who)
-			local duration = 7
-			local radius = self.use_power.radius(self, who)
+			local duration = self.use_power.duration
+			local initial_radius = 1
 			local dam = self.use_power.damage(self, who)
 			-- Add a lasting map effect
 			local wave = game.level.map:addEffect(who,
 				who.x, who.y, duration,
 				engine.DamageType.WAVE, {dam=dam, x=who.x, y=who.y, apply_wet=1},
-				radius,
+				initial_radius,
 				5, nil,
 				engine.MapEffect.new{color_br=30, color_bg=60, color_bb=200, effect_shader="shader_images/water_effect1.png"},
 				function(e, update_shape_only)
@@ -437,7 +440,7 @@ newEntity{ base = "BASE_LITE",
 	sentient = true,
 	desc = _t[[This dark red heart still beats despite being separated from its owner.  It also snuffs out any light source that comes near it.]],
 	special_desc = function(self) return _t"The heart seems to absorb light when you deal darkness damage. Standing on unlit tiles, you feel stronger." end,
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 
 	wielder = {
 		lite = -1000,
@@ -550,7 +553,7 @@ newEntity{ base = "BASE_SHIELD",
 	level_range = {27, 35},
 	rarity = 300,
 	require = { stat = { str=28 }, },
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	special_combat = {
 		dam = 58,
@@ -748,6 +751,7 @@ newEntity{
 	name = "Mummified Egg-sac of Ungolë", image = "object/artifact/mummified_eggsack.png",
 	level_range = {20, 35},
 	rarity = 190,
+	cost = 200,
 	display = "*", color=colors.DARK_GREY,
 	encumber = 2,
 	not_in_stores = true,
@@ -798,7 +802,7 @@ newEntity{ base = "BASE_HELM",
 	desc = _t[[A Dwarven helm embedded with a single diamond that can banish all underground shadows.]],
 	level_range = {16, 28},
 	rarity = 240,
-	cost = math.random(125,200),
+	cost = resolvers.rngrange(125,200),
 	material_level = 2,
 	wielder = {
 		lite = 6,
@@ -835,7 +839,7 @@ newEntity{ base = "BASE_KNIFE",
 	level_range = {23, 28},
 	rarity = 200,
 	require = { stat = { cun=25 }, },
-	cost = math.random(125,200),
+	cost = resolvers.rngrange(125,200),
 	material_level = 2,
 	combat = {
 		dam = 25,
@@ -1126,7 +1130,7 @@ newEntity{ base = "BASE_HELM",
 	require = { stat = { cun=25 } },
 	level_range = {20, 35},
 	rarity = 280,
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	material_level = 3,
 	wielder = {
 		inc_stats = { [Stats.STAT_CON] = 3, [Stats.STAT_WIL] = 10, },
@@ -1188,7 +1192,7 @@ newEntity{ base = "BASE_GAUNTLETS",
 	desc = _t[[Fashioned by Grand Smith Dakhtun in the Age of Allure, these dwarven-steel gauntlets have been etched with golden arcane runes and are said to grant the wearer unparalleled physical and magical might.]],
 	level_range = {40, 50},
 	rarity = 300,
-	cost = math.random(700,1200),
+	cost = resolvers.rngrange(700,1200),
 	material_level = 5,
 	wielder = {
 		inc_stats = { [Stats.STAT_STR] = 6, [Stats.STAT_MAG] = 6 },
@@ -1317,7 +1321,7 @@ newEntity{ base = "BASE_CLOAK",
 	desc = _t[[Cunning and malice seem to emanate from this cloak.]],
 	level_range = {20, 29},
 	rarity = 240,
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	material_level = 3,
 	wielder = {
 		combat_def = 20,
@@ -1340,7 +1344,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", define_as = "CONCLAVE_ROBE",
 It was made by Humans for Humans; only they can harness the true power of the robes.]],
 	level_range = {12, 22},
 	rarity = 220,
-	cost = math.random(125,200),
+	cost = resolvers.rngrange(125,200),
 	material_level = 2,
 	wielder = {
 		inc_damage = {[DamageType.ARCANE]=15},
@@ -1370,7 +1374,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
 	special_desc = function(self) return _t"Damage all enemies in range 4 for 40 fire damage and yourself for 5 fire damage every turn." end,
 	level_range = {20, 30},
 	rarity = 300,
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	material_level = 3,
 	wielder = {
 		inc_damage = {[DamageType.FIRE]=20},
@@ -1428,7 +1432,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR",
 	desc = _t[[A plain elven-silk robe. It would be unremarkable if not for the sheer power it radiates.]],
 	level_range = {30, 40},
 	rarity = 290,
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	moddable_tile = "special/robe_of_the_archmage",
 	moddable_tile_big = true,
@@ -1553,6 +1557,7 @@ newEntity{ base = "BASE_BATTLEAXE",
 	require = { stat = { str=50 }, },
 	level_range = {39, 46},
 	rarity = 300,
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	combat = {
 		dam = 68,
@@ -1585,7 +1590,7 @@ newEntity{ base = "BASE_WHIP",
 	name = "Scorpion's Tail", color=colors.GREEN, unique = true, image = "object/artifact/whip_scorpions_tail.png",
 	desc = _t[[A long whip of linked metal joints finished with a viciously sharp barb leaking terrible venom.]],
 	require = { stat = { dex=28 }, },
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	rarity = 340,
 	level_range = {20, 30},
 	material_level = 3,
@@ -2017,6 +2022,7 @@ It is said the wielder will slowly grow mad. This, however, has never been prove
 	require = { stat = { str=42 }, },
 	level_range = {40, 50},
 	rarity = 250,
+	cost = resolvers.rngrange(400,650),
 	material_level = 5,
 	combat = {
 		dam = 38,
@@ -2249,7 +2255,7 @@ newEntity{ base = "BASE_ARROW",
 	proj_image = "object/artifact/arrow_s_quiver_of_the_sun.png",
 	level_range = {20, 40},
 	rarity = 300,
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	require = { stat = { dex=24 }, },
 	combat = {
@@ -2422,7 +2428,7 @@ newEntity{ base = "BASE_SHOT",
 	proj_image = "object/artifact/shot_s_star_shot.png",
 	level_range = {25, 40},
 	rarity = 300,
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	require = { stat = { dex=28 }, },
 	combat = {
@@ -2631,7 +2637,7 @@ newEntity{ base = "BASE_STAFF", define_as = "SET_SCEPTRE_LICH",
 	color=colors.VIOLET, image = "object/artifact/sceptre_of_the_archlich.png",
 	rarity = 320,
 	desc = _t[[This sceptre, carved of ancient, blackened bone, holds a single gem of deep obsidian. You feel a dark power from deep within, looking to get out.]],
-	cost = math.random(700,1200),
+	cost = resolvers.rngrange(700,1200),
 	material_level = 5,
 
 	require = { stat = { mag=50 }, },
@@ -2763,7 +2769,7 @@ newEntity{ base = "BASE_STAFF",
 	color=colors.VIOLET, image = "object/artifact/gravitational_staff.png",
 	rarity = 240,
 	desc = _t[[Time and Space seem to warp and bend around the massive tip of this stave.]],
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	material_level = 3,
 	require = { stat = { mag=35 }, },
 	combat = {
@@ -2950,7 +2956,7 @@ newEntity{ base = "BASE_KNIFE",
 	level_range = {12, 25},
 	rarity = 200,
 	require = { stat = { dex=32 }, },
-	cost = math.random(125,200),
+	cost = resolvers.rngrange(125,200),
 	material_level = 2,
 	combat = {
 		dam = 25,
@@ -3006,7 +3012,7 @@ newEntity{ base = "BASE_LONGBOW",
 	level_range = {5, 15},
 	rarity = 200,
 	require = { stat = { dex=18 }, },
-	cost = math.random(50,80),
+	cost = resolvers.rngrange(50,80),
 	material_level = 1,
 	combat = {
 		range = 9,
@@ -3066,7 +3072,7 @@ newEntity{ base = "BASE_WHIP",
 	name = "Stormlash", color=colors.BLUE, unique = true, image = "object/artifact/stormlash.png",
 	desc = _t[[This steel plated whip arcs with intense electricity. The force feels uncontrollable, explosive, powerful.]],
 	require = { stat = { dex=15 }, },
-	cost = math.random(50,80),
+	cost = resolvers.rngrange(50,80),
 	rarity = 250,
 	level_range = {6, 15},
 	material_level = 1,
@@ -3128,7 +3134,7 @@ newEntity{ base = "BASE_WHIP",
 	name = "Focus Whip", color=colors.YELLOW, unique = true, image = "object/artifact/focus_whip.png",
 	desc = _t[[A small mindstar rests at top of this handle. As you touch it, a translucent cord appears, flicking with your will.]],
 	require = { stat = { dex=15 }, },
-	cost = math.random(225,350),
+	cost = resolvers.rngrange(225,350),
 	rarity = 250,
 	metallic = false,
 	level_range = {18, 28},
@@ -4108,7 +4114,7 @@ newEntity{ base = "BASE_CLOTH_ARMOR", --Thanks Grayswandir!
 	desc = _t[[This deep blue robe flows and ripples as if pushed by an invisible tide.]],
 	level_range = {1, 15},
 	rarity = 220,
-	cost = math.random(50,80),
+	cost = resolvers.rngrange(50,80),
 	material_level = 1,
 	wielder = {
 		combat_def = 12,
@@ -4334,7 +4340,7 @@ newEntity{ base = "BASE_ARROW", --Thanks Grayswandir!
 	proj_image = "object/artifact/arrow_s_void_quiver.png",
 	level_range = {35, 50},
 	rarity = 300,
-	cost = math.random(700,1100),
+	cost = resolvers.rngrange(700,1100),
 	material_level = 5,
 	infinite=true,
 	require = { stat = { dex=32 }, },
@@ -6077,7 +6083,7 @@ The heart which wishes that it be unseen.]],
 	level_range = {40, 50},
 	color = colors.BLACK,
 	rarity = 370,
-	cost = math.random(700,1200),
+	cost = resolvers.rngrange(700,1200),
 	material_level = 5,
 	wielder = {
 		combat_def = 14,
@@ -7941,7 +7947,7 @@ Any lightning damage you do that is more than 10% of the victim's maximum life w
 Upon taking lightning damage >10% of your max life, your mind fires back, dealing 30% of the original damage as mind and trying to brainlock the target.
 Upon taking mind damage >10% of your max life, you reflexively trigger the jolt, sending an arc of dazing lightning toward the target (damage based on mindpower).
 This item can have up to 2 charges, with each charge having 4 turn cooldown.]] end,
-	cost = math.random(125,200),
+	cost = resolvers.rngrange(125,200),
 	material_level = 2,
 	wielder = {
 		inc_damage={
@@ -8147,7 +8153,7 @@ newEntity{ base = "BASE_GAUNTLETS",
 	desc = _t[[Crafted for a warlord who wanted to keep his subjects under a stralite grip. Dark thoughts went into the making of these gauntlets, literally.]],
 	level_range = {30, 40},
 	rarity = 300,
-	cost = math.random(400,650),
+	cost = resolvers.rngrange(400,650),
 	material_level = 4,
 	wielder = {
 		combat_armor = 5,
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1.png
new file mode 100644
index 0000000000000000000000000000000000000000..9d14e4be9a4dade395d8a0c9abcc0f85b69cfc19
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1i.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1i.png
new file mode 100644
index 0000000000000000000000000000000000000000..21eee2bccccc07def3e2ef294c296594b3c8bb87
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes1i.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes2.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes2.png
new file mode 100644
index 0000000000000000000000000000000000000000..3de12943e25e790ee0df8491a6e0b50214d77f8e
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes2.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3.png
new file mode 100644
index 0000000000000000000000000000000000000000..e81c4a30360c2c112c4dc09898036826c4bd4186
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3i.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3i.png
new file mode 100644
index 0000000000000000000000000000000000000000..7d83ff4a0cb651cd6fd78e272c8d9f8df409bf1a
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes3i.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes4.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes4.png
new file mode 100644
index 0000000000000000000000000000000000000000..614a775f9e02fb69e3269b023d55ceb1210911ac
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes4.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1f1223ddd4d97f5782668e311f87a3c8f5cc669
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_1.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..022d66e16231b86f6596700f56b1339a9347caf2
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_1.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_2.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8a32372996ca84ba346d09f9de980772160cd08
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_2.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_3.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..98a4d87aace2df14bb7ba2814e8637896eac2dda
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_3.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_4.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9dc5d86c3e57a5cb70c75310e0e6285ce14b94e
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_4.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_5.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..82839a5100e792e07967dee227fa75afaba519e3
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_5.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_6.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..72567393d42656a5a0de212f09424dd204dc7157
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_6.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_7.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_7.png
new file mode 100644
index 0000000000000000000000000000000000000000..19acce1879390e0fe7c87268802f09dffcd48394
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes5_7.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes6.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes6.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3f12089769dd1b8ef530831d48efd51f8970356
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes6.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7.png
new file mode 100644
index 0000000000000000000000000000000000000000..2c5b3789f248f89c7e2e35c86c7bda51e6bba1e2
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7i.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7i.png
new file mode 100644
index 0000000000000000000000000000000000000000..4df2b01c0fde15664e2d46497641ff26a0aa096c
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes7i.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes8.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes8.png
new file mode 100644
index 0000000000000000000000000000000000000000..dc2a68ec9d9c7b0b87180d1db9e336eee9eb7e40
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes8.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c1290f6880667927178f0b607c037c0d42f3c11
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9.png differ
diff --git a/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9i.png b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9i.png
new file mode 100644
index 0000000000000000000000000000000000000000..8f14e8f92118b7d63b01f784ca8d6219bc78082b
Binary files /dev/null and b/game/modules/tome/data/gfx/shockbolt/terrain/dunes/dunes9i.png differ
diff --git a/game/modules/tome/data/maps/vaults/collapsed-tower.lua b/game/modules/tome/data/maps/vaults/collapsed-tower.lua
index 81a5cec0cdab908a3b3e77273667923ca1b6d6a2..74dbd010c2074f438e34f460066567e05f609e02 100644
--- a/game/modules/tome/data/maps/vaults/collapsed-tower.lua
+++ b/game/modules/tome/data/maps/vaults/collapsed-tower.lua
@@ -68,6 +68,7 @@ local stairs = function()
 		__applied_difficulty = true, -- Difficulty already applied to parent zone
 		level_scheme = "player",
 		max_level = 1,
+		actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(0,4) end,
 		width = 20, height = 20,
 		ambient_music = "Swashing the buck.ogg",
 		persistent = "zone",
diff --git a/game/modules/tome/data/maps/vaults/snake-pit.lua b/game/modules/tome/data/maps/vaults/snake-pit.lua
index 2b630d07e2f67a365c2c246e4b128a76fa308c5c..41e4718fc917a16eca5681aa32898a681c3b9b83 100644
--- a/game/modules/tome/data/maps/vaults/snake-pit.lua
+++ b/game/modules/tome/data/maps/vaults/snake-pit.lua
@@ -36,7 +36,7 @@ rotates = {"default", "90", "180", "270", "flipx", "flipy"}
 
 defineTile(',', data.floor or data['.'] or "FLOOR")
 defineTile('#', "HARDWALL")
-defineTile('w', "WALL")
+defineTile('!', "DOOR_VAULT")
 defineTile('d', "FLOOR", {random_filter={type="tool", subtype="digger", name="iron pickaxe", ego_chance=-1000, ego_chance=-1000}})
 
 local mobs = {
@@ -58,7 +58,7 @@ return {
 [[,,,,,,,,]],
 [[,######,]],
 [[,#sss##,]],
-[[,#ssswd,]],
+[[,#sss!d,]],
 [[,#sss##,]],
 [[,######,]],
 [[,,,,,,,,]],
diff --git a/game/modules/tome/data/maps/zones/collapsed-tower.lua b/game/modules/tome/data/maps/zones/collapsed-tower.lua
index 4723b2456bb1fc491feb3bef039a5565a4ec9891..6b316af5dc42cda47bbb7d8309f287ee32c76ca8 100644
--- a/game/modules/tome/data/maps/zones/collapsed-tower.lua
+++ b/game/modules/tome/data/maps/zones/collapsed-tower.lua
@@ -53,7 +53,7 @@ local turret = function()
 	talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, },
 
 	resolvers.talents{
-		[Talents.T_ELEMENTAL_BOLT]={base=3, every=5, max=10},
+		[Talents.T_ELEMENTAL_BOLT]={base=3, every=3, max=8},
 	},
 
 	ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, },
@@ -85,12 +85,13 @@ defineTile('t', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}}, turr
 
 local def = {
 [[##############]],
-[[##############]],
+[[#tjj##########]],
+[[#b$$##########]],
 [[##.##t$..t####]],
 [[#t.+...>..####]],
 [[##.##...$.####]],
 [[#b$$#$...t####]],
-[[#jjj##########]],
+[[#tjj##########]],
 [[##############]],
 }
 
diff --git a/game/modules/tome/data/talents/corruptions/shadowflame.lua b/game/modules/tome/data/talents/corruptions/shadowflame.lua
index 63321c1c78c048fb06df057e4a6ec7240df30f13..967b4cf9ab4c68c11342e3a0e4b5f39fbb002715 100644
--- a/game/modules/tome/data/talents/corruptions/shadowflame.lua
+++ b/game/modules/tome/data/talents/corruptions/shadowflame.lua
@@ -90,7 +90,7 @@ newTalent{
 	sustain_vim = 90,
 	cooldown = 30,
 	tactical = { DEFEND = 1, BUFF = 2 },
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.03, 0.15, 0.75) end,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 0.03, 0.15) end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/flame")
 		self.__old_type = {self.type, self.subtype}
diff --git a/game/modules/tome/data/talents/cunning/lethality.lua b/game/modules/tome/data/talents/cunning/lethality.lua
index 38592e4e3f2635d7b09a2d669638a98271c00e19..27a7521590c837d8ec7b13dbba54da6ecc538d47 100644
--- a/game/modules/tome/data/talents/cunning/lethality.lua
+++ b/game/modules/tome/data/talents/cunning/lethality.lua
@@ -97,7 +97,7 @@ newTalent{
 	no_break_stealth = true,
 	no_energy = true,
 	deactivate_on = {no_combat=true, run=true, rest=true},
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.10, 0.30, 0.75) end,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 0.10, 0.30) end,
 	getDamage = function(self, t) return 1 end,
 	activate = function(self, t)
 		local ret = {
diff --git a/game/modules/tome/data/talents/cunning/shadow-magic.lua b/game/modules/tome/data/talents/cunning/shadow-magic.lua
index f27af759c5b9ce2bfa592cc49d9290f58007862b..5bcc807c4e2750cb866f25783ac620ed246075bb 100644
--- a/game/modules/tome/data/talents/cunning/shadow-magic.lua
+++ b/game/modules/tome/data/talents/cunning/shadow-magic.lua
@@ -82,7 +82,7 @@ newTalent{
 	require = cuns_req3,
 	tactical = { BUFF = 2 },
 	getManaRegen = function(self, t) return self:combatTalentScale(t, 1.5/5, 1, 0.75) / (1 - t.getAtkSpeed(self, t)/100) end,
-	getAtkSpeed = function(self, t) return self:combatTalentScale(t, 2.2, 11, 0.75) end,
+	getAtkSpeed = function(self, t) return self:combatTalentScale(t, 2.2, 15) end,
 	activate = function(self, t)
 		local speed = t.getAtkSpeed(self, t)/100
 		game:playSoundNear(self, "talents/arcane")
diff --git a/game/modules/tome/data/talents/cursed/rampage.lua b/game/modules/tome/data/talents/cursed/rampage.lua
index a6efcf5ddf21bb43c92c8eb602c3bff506d4f576..913ef0ab71013cb7c876cf46d3665dbda366486d 100644
--- a/game/modules/tome/data/talents/cursed/rampage.lua
+++ b/game/modules/tome/data/talents/cursed/rampage.lua
@@ -32,9 +32,9 @@ newTalent{
 	getMaxDuration = function(self, t)
 		return 8
 	end,
-	getMovementSpeedChange = function(self, t) return self:combatTalentScale(t, 1.4, 3.13, 0.75) end, --Nerf this?
-	getCombatPhysSpeedChange = function(self, t) return self:combatTalentScale(t, 0.224, 0.5, 0.75) end,
-	getCombatMindSpeedChange = function(self, t) return self:combatTalentScale(t, 0.224, 0.5, 0.75) end,
+	getMovementSpeedChange = function(self, t) return self:combatTalentScale(t, 0.885, 2.12, 0.75) end,
+	getCombatPhysSpeedChange = function(self, t) return self:combatTalentScale(t, 0.18, 0.395) end,
+	getCombatMindSpeedChange = function(self, t) return self:combatTalentScale(t, 0.18, 0.395) end,
 	on_pre_use = function(self, t, silent)
 		if self:hasEffect(self.EFF_RAMPAGE) then 
 			if not silent then game.logPlayer(self, "You are already rampaging!") end
diff --git a/game/modules/tome/data/talents/cursed/strife.lua b/game/modules/tome/data/talents/cursed/strife.lua
index 73fe8dd63a9d6633d03f500f21233019dd2d88b7..58ac5727740976e308f67a214a0774b4eec42daa 100644
--- a/game/modules/tome/data/talents/cursed/strife.lua
+++ b/game/modules/tome/data/talents/cursed/strife.lua
@@ -44,7 +44,7 @@ newTalent{
 	getDefenseChange = function(self, t)
 		return -self:combatTalentStatDamage(t, "wil", 6, 45)
 	end,
-	getResistPenetration = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "wil", 30, 80), 100, 0, 0, 55, 55) end, -- Limit < 100%
+	getResistPenetration = function(self, t) return math.min(70, self:combatTalentStatDamage(t, "wil", 25, 60)) end, -- Limit < 70%
 	is_melee = true,
 	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
 	action = function(self, t)
diff --git a/game/modules/tome/data/talents/gifts/harmony.lua b/game/modules/tome/data/talents/gifts/harmony.lua
index 0e255628cb9ab614285c71404d2845986ddd60ce..5165c9fd952d54a6053cf0dd8002f75754664467 100644
--- a/game/modules/tome/data/talents/gifts/harmony.lua
+++ b/game/modules/tome/data/talents/gifts/harmony.lua
@@ -70,7 +70,7 @@ newTalent{
 	tactical = { BUFF = 3 },
 	-- The effect "ELEMENTAL_HARMONY" is defined in data\timed_effects\physical.lua and the duration applied in setDefaultProjector function in data\damagetypes.lua	
 	duration = function(self,t) return 5 end, --return math.floor(self:combatTalentScale(t, 6, 10, "log"))  end,
-	fireSpeed = function(self, t) return self:combatTalentScale(t, 0.1, 0.3, 0.75) end,
+	fireSpeed = function(self, t) return self:combatTalentScale(t, 0.1, 0.3) end,
 	coldArmor = function(self, t) return self:combatTalentScale(t, 8, 25, 0.75) end,
 	lightningStats = function(self, t) return self:combatTalentScale(t, 5, 20, 0.75) end,
 	acidRegen = function(self, t) return self:combatTalentScale(t, 10, 40, 0.75) end,
diff --git a/game/modules/tome/data/talents/gifts/summon-advanced.lua b/game/modules/tome/data/talents/gifts/summon-advanced.lua
index 63d111d32c2127d21a33bf8619eca0b25ae602e8..782d6814478adec43695c16f6a1b6acf8f2f1824 100644
--- a/game/modules/tome/data/talents/gifts/summon-advanced.lua
+++ b/game/modules/tome/data/talents/gifts/summon-advanced.lua
@@ -64,9 +64,9 @@ newTalent{
 	mode = "passive",
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.3, 3.7, "log")) end,
 	effectDuration = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
-	poisonDamage = function(self, t) return self:combatTalentMindDamage(t, 10, 60) end,
+	poisonDamage = function(self, t) return self:combatTalentMindDamage(t, 20, 133) end,
 	nbEscorts = function(self, t) return math.max(1,math.floor(self:combatTalentScale(t, 0.3, 2.7, "log"))) end,
-	resReduction = function(self, t) return self:combatTalentMindDamage(t, 15, 70) end,
+	resReduction = function(self, t) return self:combatTalentMindDamage(t, 12, 50) end,
 	amtHealing = function(self, t) return 30 + self:combatTalentMindDamage(t, 10, 350) end,
 	slowStrength = function(self, t) return self:combatLimit(self:combatTalentMindDamage(t, 5, 500), 1, 0.1, 0, 0.47 , 369) end, -- Limit speed loss to <100% 
 	info = function(self, t)
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 4f1d30feebb90aa6ed5f17ff1bc65fc6a2d47839..5ea895a4e82c7f2f3d9b61e0607c09ec44ad9324 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -3340,7 +3340,7 @@ newTalent{
 	require = techs_dex_req4,
 	tactical = { BUFF = 2 },
 	on_pre_use = function(self, t, silent) if self:hasArcheryWeapon() or not self:hasDualWeapon() then if not silent then game.logPlayer(self, "You require two melee weapons to use this talent.") end return false end return true end,
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.11, 0.40, 0.75) end,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 0.11, 0.40) end,
 	activate = function(self, t)
 		local weapon, offweapon = self:hasDualWeapon()
 		if not weapon then
diff --git a/game/modules/tome/data/talents/misc/races.lua b/game/modules/tome/data/talents/misc/races.lua
index ab7fe279c82bedda188989b6879651109277c354..d9db2f9936d81b43871343c4aa22c2b52c6d55de 100644
--- a/game/modules/tome/data/talents/misc/races.lua
+++ b/game/modules/tome/data/talents/misc/races.lua
@@ -170,7 +170,7 @@ newTalent{
 	points = 5,
 	no_energy = true,
 	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 46, 30)) end,  -- Limit to >10 turns
-	getSpeed = function(self, t) return self:combatStatScale(math.max(self:getDex(), self:getMag()), 0.1, 0.476, 0.75) end,
+	getSpeed = function(self, t) return self:combatStatScale(math.max(self:getDex(), self:getMag()), 0.1, 0.476) end,
 	tactical = { DEFEND = 1 },
 	action = function(self, t)
 		self:setEffect(self.EFF_SPEED, 5, {power=t.getSpeed(self, t)})
diff --git a/game/modules/tome/data/talents/psionic/augmented-mobility.lua b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
index b1a445c45816bba749f5714c710b944a21e1f0ff..171afe20a408a0bc9efcfe9f1d24a7927ab892cd 100644
--- a/game/modules/tome/data/talents/psionic/augmented-mobility.lua
+++ b/game/modules/tome/data/talents/psionic/augmented-mobility.lua
@@ -60,7 +60,7 @@ newTalent{
 	no_energy = true,
 	tactical = { BUFF = 2 },
 	getDuration = function(self, t) return math.floor(self:combatLimit(self:combatMindpower(0.1), 10, 4, 0, 6, 6)) end, -- Limit < 10
-	speed = function(self, t) return self:combatTalentScale(t, 0.1, 0.4, 0.75) end,
+	speed = function(self, t) return self:combatTalentScale(t, 0.1, 0.4) end,
 	getBoost = function(self, t)
 		return self:combatScale(self:combatTalentMindDamage(t, 20, 60), 0, 0, 50, 100, 0.75)
 	end,
diff --git a/game/modules/tome/data/talents/spells/ice.lua b/game/modules/tome/data/talents/spells/ice.lua
index 00c91a7b3b08578ee35e296153885869edac5f94..968c68f622c00db5f46a9d42ee9eb2a63b3d2c5f 100644
--- a/game/modules/tome/data/talents/spells/ice.lua
+++ b/game/modules/tome/data/talents/spells/ice.lua
@@ -53,7 +53,7 @@ newTalent{
 
 		local dam = self:spellCrit(t.getDamage(self, t))
 		self:project(tg, x, y, DamageType.COLD, dam, {type="freeze"})
-		self:project(tg, x, y, DamageType.FREEZE, {dur=t.getDuration(self, t), hp=70 + dam * 1.5})
+		self:project(tg, x, y, DamageType.FREEZE, {dur=t.getDuration(self, t), hp=70 + dam * 0.7})
 
 		tg.type = "hit"
 		self:projectApply(tg, x, y, Map.ACTOR, function(target)
diff --git a/game/modules/tome/data/talents/spells/necrosis.lua b/game/modules/tome/data/talents/spells/necrosis.lua
index a268e21741800b9e011aba0c4766ead4aadfe459..c1859dc8515e1dd744c58de2bfbcdd892af37407 100644
--- a/game/modules/tome/data/talents/spells/necrosis.lua
+++ b/game/modules/tome/data/talents/spells/necrosis.lua
@@ -59,8 +59,8 @@ newTalent{
 	mana = 60,
 	cooldown = 25,
 	tactical = { ATTACK = { ARCANE = 3 }, DISABLE = 2 },
-	rnd_boss_restrict = function(self, t)
-		return self.level < 15
+	rnd_boss_restrict = function(self, t, data)
+		return data.level < 15
 	end,
 	range = 7,
 	requires_target = true,
diff --git a/game/modules/tome/data/talents/techniques/combat-techniques.lua b/game/modules/tome/data/talents/techniques/combat-techniques.lua
index 44c75ffadb1751c84565fce2f0a410607bf183d8..34228098e1e3bdef6d5d953c1907873cee2179b7 100644
--- a/game/modules/tome/data/talents/techniques/combat-techniques.lua
+++ b/game/modules/tome/data/talents/techniques/combat-techniques.lua
@@ -158,7 +158,7 @@ newTalent{
 		if target and core.fov.distance(self.x, self.y, target.x, target.y) <= 10 and self:hasLOS(target.x, target.y, "block_move") then return true end
 		return false
 	end,
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.14, 0.45, 0.75) end,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 0.14, 0.45) end,
 	action = function(self, t)
 		self:setEffect(self.EFF_SPEED, 5, {power=t.getSpeed(self, t)})
 		return true
diff --git a/game/modules/tome/data/talents/techniques/thuggery.lua b/game/modules/tome/data/talents/techniques/thuggery.lua
index 2a3e9ee7d3fea71a717439d77ee7ad6917c54830..3597d3165373ac26ff6c4895f32a85e2ec34960e 100644
--- a/game/modules/tome/data/talents/techniques/thuggery.lua
+++ b/game/modules/tome/data/talents/techniques/thuggery.lua
@@ -138,7 +138,7 @@ newTalent{
 	end,
 	getCrit = function(self, t) return self:combatTalentStatDamage(t, "dex", 10, 50) / 1.5 end,
 	getPen = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "str", 10, 50), 100, 0, 0, 35.7, 35.7) end, -- Limit to <100%
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.10, 0.20, 0.75) end,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 0.10, 0.20) end,
 	deactivate_on = {no_combat=true, run=true, rest=true},
 	activate = function(self, t)
 		local ret = {
diff --git a/game/modules/tome/data/talents/techniques/warcries.lua b/game/modules/tome/data/talents/techniques/warcries.lua
index cbf1724ce6c2abd8e350c7c97f2fddc144d64a1e..0296a9f48f9190ea184253eb51814430152c4016 100644
--- a/game/modules/tome/data/talents/techniques/warcries.lua
+++ b/game/modules/tome/data/talents/techniques/warcries.lua
@@ -26,18 +26,18 @@ newTalent{
 	cooldown = 7,
 	stamina = 20,
 	range = 0,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
+	radius = function(self, t) return math.min(13, math.floor(self:combatTalentScale(t, 4, 8))) end,
 	target = function(self, t)
 		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false}
 	end,
 	requires_target = true,
 	tactical = { ATTACKAREA = { PHYSICAL = 2 } },
-	getdamage = function(self,t) return self:combatScale(self:getTalentLevel(t) * self:getStr(), 60, 10, 267, 500)  end,
+	getDamage = function(self,t) return self:combatTalentPhysicalDamage(t, 30, 320) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.PHYSICAL, self:physicalCrit(t.getdamage(self,t)))
+		self:project(tg, x, y, DamageType.PHYSICAL, self:physicalCrit(t.getDamage(self,t)))
 		if self:getTalentLevel(t) >= 5 then
 			self:project(tg, x, y, function(px, py)
 				local proj = game.level.map(px, py, Map.PROJECTILE)
diff --git a/game/modules/tome/data/talents/uber/const.lua b/game/modules/tome/data/talents/uber/const.lua
index d280fc2be840d4e24baedebdf5d37c8698333f2a..3ce4e782f7b595b75b55060c820d095b336048ed 100644
--- a/game/modules/tome/data/talents/uber/const.lua
+++ b/game/modules/tome/data/talents/uber/const.lua
@@ -175,8 +175,8 @@ uberTalent{
 uberTalent{
 	name = "Corrupted Shell",
 	mode = "passive",
-	require = { special={desc=_t"Have received at least 7500 blight damage and destroyed Zigur with the Grand Corruptor.", fct=function(self) return
-		(self.damage_intake_log and self.damage_intake_log[DamageType.BLIGHT] and self.damage_intake_log[DamageType.BLIGHT] >= 7500) and
+	require = { special={desc=_t"Have received at least 3500 blight damage and destroyed Zigur with the Grand Corruptor.", fct=function(self) return
+		(self.damage_intake_log and self.damage_intake_log[DamageType.BLIGHT] and self.damage_intake_log[DamageType.BLIGHT] >= 3500) and
 		(game.state.birth.ignore_prodigies_special_reqs or (
 			self:hasQuest("anti-antimagic") and 
 			self:hasQuest("anti-antimagic"):isStatus(engine.Quest.DONE) and
diff --git a/game/modules/tome/data/talents/uber/mag.lua b/game/modules/tome/data/talents/uber/mag.lua
index 601566cb80df48672035559839146e93e373b4c6..2cc6efef81f2d083460a8966481e9bba78b3a498 100644
--- a/game/modules/tome/data/talents/uber/mag.lua
+++ b/game/modules/tome/data/talents/uber/mag.lua
@@ -319,8 +319,8 @@ uberTalent{
 	name = "Cauterize",
 	mode = "passive",
 	cooldown = 12,
-	require = { special={desc=_t"Have received at least 7500 fire damage and have cast at least 1000 spells", fct=function(self) return
-		self.talent_kind_log and self.talent_kind_log.spell and self.talent_kind_log.spell >= 1000 and self.damage_intake_log and self.damage_intake_log[DamageType.FIRE] and self.damage_intake_log[DamageType.FIRE] >= 7500
+	require = { special={desc=_t"Have received at least 3500 fire damage and have cast at least 1000 spells", fct=function(self) return
+		self.talent_kind_log and self.talent_kind_log.spell and self.talent_kind_log.spell >= 1000 and self.damage_intake_log and self.damage_intake_log[DamageType.FIRE] and self.damage_intake_log[DamageType.FIRE] >= 3500
 	end} },
 	trigger = function(self, t, value)
 		self:startTalentCooldown(t)
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index 430f8ad765084544119581cd41b3a5d69729cb28..48df28488ce703350ad0348785665673eba401b0 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -3789,6 +3789,7 @@ newEffect{
 	charges = function(self, eff) return math.round(eff.power) end,
 	type = "other",
 	subtype = { },
+	no_stop_enter_worlmap = true, cancel_on_level_change = true,
 	status = "detrimental",
 	on_gain = function(self, err) return _t"#Target#'s morale has been lowered.", _t"+Intimidated" end,
 	on_lose = function(self, err) return _t"#Target# has regained its confidence.", _t"-Intimidated" end,
diff --git a/game/modules/tome/data/zones/gorbat-pride/events.lua b/game/modules/tome/data/zones/gorbat-pride/events.lua
index 0d70322e180868fe20497b5f09e04552da9d54c2..bdfde40132679309536f9424b861cc9babd3b28d 100644
--- a/game/modules/tome/data/zones/gorbat-pride/events.lua
+++ b/game/modules/tome/data/zones/gorbat-pride/events.lua
@@ -23,5 +23,5 @@ return { one_per_level=true,
 	{name="whistling-vortex", minor=true, percent=50},
 	{name="glowing-chest", minor=true, percent=30},
 	{name="glowing-chest", minor=true, percent=30},
-	{name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
+	{name="sub-vault", minor=true, percent=100}, -- one per floor
 }
diff --git a/game/modules/tome/data/zones/gorbat-pride/npcs.lua b/game/modules/tome/data/zones/gorbat-pride/npcs.lua
index 426b4705ac7ed450a8737bebe5e7afbe3404a645..06c16638b0c7b2df13d48ae7acc205bc58d4c219 100644
--- a/game/modules/tome/data/zones/gorbat-pride/npcs.lua
+++ b/game/modules/tome/data/zones/gorbat-pride/npcs.lua
@@ -80,9 +80,12 @@ newEntity{ base="BASE_NPC_ORC_GORBAT", define_as = "GORBAT",
 
 		[Talents.T_RIMEBARK]={base=7, every=6, max=10},
 		[Talents.T_RITCH_FLAMESPITTER]={base=10, every=6, max=12},
+		[Talents.T_RAGE]={base=5, every=6, max=7},
 		[Talents.T_RESILIENCE]={base=5, every=6, max=7},
 		[Talents.T_MASTER_SUMMONER]={base=5, every=6, max=7},
 		[Talents.T_WILD_SUMMON]={base=5, every=6, max=7},
+		[Talents.T_GRAND_ARRIVAL]={base=2, every=18, max=4},
+		
 
 		[Talents.T_HOWL]=3,
 
@@ -94,7 +97,6 @@ newEntity{ base="BASE_NPC_ORC_GORBAT", define_as = "GORBAT",
 
 		[Talents.T_SPELL_FEEDBACK]=1,
 		[Talents.T_MASSIVE_BLOW]=1,
-		[Talents.T_BLIGHTED_SUMMONING]=1,
 	},
 
 	auto_classes={
diff --git a/game/modules/tome/data/zones/grushnak-pride/events.lua b/game/modules/tome/data/zones/grushnak-pride/events.lua
index b8abb46b69fbc34347fbf769ba67369ea5dae98f..dae439030840e5b1817389ecdceb2e3c03a25c18 100644
--- a/game/modules/tome/data/zones/grushnak-pride/events.lua
+++ b/game/modules/tome/data/zones/grushnak-pride/events.lua
@@ -21,5 +21,5 @@ return { one_per_level=true,
 	{group="fareast-generic", percent_factor=1.5},
 	{name="antimagic-bush", minor=true, percent=80, max_repeat=3, forbid={1,3,5}},
 	{name="glowing-chest", minor=true, percent=30},
-	{name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
+	{name="sub-vault", minor=true, percent=100}, -- one per floor
 }
diff --git a/game/modules/tome/data/zones/rak-shor-pride/events.lua b/game/modules/tome/data/zones/rak-shor-pride/events.lua
index 280733813f160cd096e3a23e4330af8a768915f4..e4565d824466f226a02401e5174d82f711b711b3 100644
--- a/game/modules/tome/data/zones/rak-shor-pride/events.lua
+++ b/game/modules/tome/data/zones/rak-shor-pride/events.lua
@@ -22,5 +22,5 @@ return { one_per_level=true,
 	{name="whistling-vortex", minor=true, percent=50},
 	{name="necrotic-air", minor=true, percent=100, max_repeat=3},
 	{name="glowing-chest", minor=true, percent=30},
-	{name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
+	{name="sub-vault", minor=true, percent=100}, -- one per floor
 }
diff --git a/game/modules/tome/data/zones/rak-shor-pride/mapscripts/main.lua b/game/modules/tome/data/zones/rak-shor-pride/mapscripts/main.lua
index e47839957ffe905dd17b13473f331d99968989df..e1969b38acbae7e54001f1e8f4912057d55a747e 100644
--- a/game/modules/tome/data/zones/rak-shor-pride/mapscripts/main.lua
+++ b/game/modules/tome/data/zones/rak-shor-pride/mapscripts/main.lua
@@ -21,7 +21,7 @@ self:defineTile("-", "BONEFLOOR", nil, nil, nil, {no_teleport=true})
 self:defineTile("o", "BONEFLOOR", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end}})
 self:defineTile(">", "BONE_LADDER_DOWN", nil, nil, nil, {no_teleport=true})
 self:defineTile("O", "BONEFLOOR", nil, {random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=3, ai_move="move_complex", rank=4,}}})
-self:defineTile("X", "BONEFLOOR", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3}}}, nil, {no_teleport=true})
+self:defineTile("X", "BONEFLOOR", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3.2}}}, nil, {no_teleport=true})
 self:defineTile('&', "BONE_GENERIC_LEVER", nil, nil, nil, {lever=1, lever_kind="pride-doors", lever_spot={type="lever", subtype="door", check_connectivity="entrance"}}, {type="lever", subtype="lever", check_connectivity="entrance"})
 self:defineTile('*', "BONE_GENERIC_LEVER_DOOR", nil, nil, nil, {lever_action=2, lever_action_value=0, lever_action_kind="pride-doors"}, {type="lever", subtype="door", check_connectivity="entrance"})
 
diff --git a/game/modules/tome/data/zones/thieves-tunnels/zone.lua b/game/modules/tome/data/zones/thieves-tunnels/zone.lua
index b2fba15c940389afa5d627d0c02c493807cfd1c2..489c0675de182c2463ae04f1787333c32013f72d 100644
--- a/game/modules/tome/data/zones/thieves-tunnels/zone.lua
+++ b/game/modules/tome/data/zones/thieves-tunnels/zone.lua
@@ -19,14 +19,14 @@
 
 return {
 	name = _t"Unknown tunnels",
-	level_range = {8, 18},
+	level_range = {14, 28},
 	level_scheme = "player",
 	max_level = 2,
 	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
 	width = 30, height = 30,
 	ambient_music = "Zangarang.ogg",
-	min_material_level = 1,
-	max_material_level = 2,
+	min_material_level = 2,
+	max_material_level = 3,
 	generator =  {
 		map = {
 			class = "engine.generator.map.TileSet",
diff --git a/game/modules/tome/data/zones/vor-pride/events.lua b/game/modules/tome/data/zones/vor-pride/events.lua
index f122616e257b854f41b5f86c9bf23f7c6034f5bf..1a8fdd45cc73e28cbfbc46562879e89360b76264 100644
--- a/game/modules/tome/data/zones/vor-pride/events.lua
+++ b/game/modules/tome/data/zones/vor-pride/events.lua
@@ -22,5 +22,5 @@ return { one_per_level=true,
 	{name="fell-aura", minor=true, percent=100, max_repeat=3},
 	{name="spellblaze-scar", minor=true, percent=50},
 	{name="glowing-chest", minor=true, percent=30},
-	{name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
+	{name="sub-vault", minor=true, percent=100}, -- one per floor
 }
diff --git a/game/modules/tome/data/zones/vor-pride/mapscripts/main.lua b/game/modules/tome/data/zones/vor-pride/mapscripts/main.lua
index c7a270898a6796f4b5821f86d3a1700c4c3ffd86..c2a6b02d4814f431053735fce343614c8601aeb7 100644
--- a/game/modules/tome/data/zones/vor-pride/mapscripts/main.lua
+++ b/game/modules/tome/data/zones/vor-pride/mapscripts/main.lua
@@ -21,7 +21,7 @@ self:defineTile("-", "BURNT_GROUND", nil, nil, nil, {no_teleport=true})
 self:defineTile("o", "GOTHIC_FLOOR", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end}})
 if level.level == zone.max_level then self:defineTile(">", 'BURNT_GROUND') else self:defineTile(">", "FLAT_DOWN4", nil, nil, nil, {no_teleport=true}) end
 self:defineTile("O", "GOTHIC_FLOOR", nil, {random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=3, ai_move="move_complex", rank=4,}}})
-self:defineTile("X", "BURNT_GROUND", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3}}}, nil, {no_teleport=true})
+self:defineTile("X", "BURNT_GROUND", nil, {entity_mod=function(e) e.make_escort = nil return e end, random_filter={type='humanoid', subtype='orc', special=function(e) return e.pride == mapdata.pride end, random_boss={nb_classes=1, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3.2}}}, nil, {no_teleport=true})
 self:defineTile('&', "GOTHIC_GENERIC_LEVER", nil, nil, nil, {lever=1, lever_kind="pride-doors", lever_spot={type="lever", subtype="door", check_connectivity="entrance"}}, {type="lever", subtype="lever", check_connectivity="entrance"})
 self:defineTile('*', "GOTHIC_GENERIC_LEVER_DOOR", nil, nil, nil, {lever_action=2, lever_action_value=0, lever_action_kind="pride-doors"}, {type="lever", subtype="door", check_connectivity="entrance"})
 
diff --git a/game/modules/tome/dialogs/debug/PlotTalent.lua b/game/modules/tome/dialogs/debug/PlotTalent.lua
index ebff7269d4c5c56dab117bf122ccb3479730f0cf..44cf2ddd750d13737742c580fab62639357ebccd 100644
--- a/game/modules/tome/dialogs/debug/PlotTalent.lua
+++ b/game/modules/tome/dialogs/debug/PlotTalent.lua
@@ -84,7 +84,7 @@ function _M:generatePlot(actor, t, nb_tl)
 	end
 	table.sort(vars)
 
-	local allcolors = {colors.GREEN, colors.LIGHT_BLUE, colors.LIGHT_RED, colors.ORANGE}
+	local allcolors = {colors.LIGHT_GREEN, colors.LIGHT_BLUE, colors.LIGHT_RED, colors.ORANGE, colors.PURPLE, colors.ANTIQUE_WHITE, colors.DARK_UMBER, colors.GREEN, colors.CYAN, colors.CRIMSON}
 	for _, var in ipairs(vars) do
 		local vo = core.display.newVO()
 		local color = table.remove(allcolors)