From 81fdf4360d501e70f555fb781c05ecde5a104601 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 15 Jul 2012 01:07:53 +0000
Subject: [PATCH] Many new artifacts and a new unique horror

git-svn-id: http://svn.net-core.org/repos/t-engine4@5367 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/Actor.lua             |  46 +-
 .../tome/data/general/npcs/bone-giant.lua     |   4 +-
 game/modules/tome/data/general/npcs/ghoul.lua |   5 +-
 .../modules/tome/data/general/npcs/horror.lua | 175 ++++
 .../tome/data/general/npcs/major-demon.lua    |   4 +-
 game/modules/tome/data/general/npcs/troll.lua |  32 +
 .../data/general/objects/boss-artifacts.lua   | 155 ++-
 .../data/general/objects/world-artifacts.lua  | 889 +++++++++++++++++-
 .../tome/data/talents/misc/horrors.lua        |  49 +
 .../tome/data/talents/misc/inscriptions.lua   |  32 +-
 .../tome/data/talents/misc/objects.lua        |  64 ++
 .../tome/data/timed_effects/magical.lua       |   2 +
 12 files changed, 1369 insertions(+), 88 deletions(-)

diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 7ddf358eab..5696dd9b71 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1561,29 +1561,33 @@ function _M:onTakeHit(value, src)
 
 	if self:attr("damage_shield") then
 		-- Phased attack?
-		if src and src:attr("damage_shield_penetrate") then
-			local adjusted_value = value * (1 - (util.bound(src.damage_shield_penetrate, 0, 100) / 100))
-			self.damage_shield_absorb = self.damage_shield_absorb or 0
-			if adjusted_value <= self.damage_shield_absorb then
-				self.damage_shield_absorb = self.damage_shield_absorb - adjusted_value
-				value = value - adjusted_value
-			else
-				adjusted_value = adjusted_value - self.damage_shield_absorb
-				value = value + adjusted_value
-				self.damage_shield_absorb = 0
-			end
+		local adjusted_value = value
+		if src and src.attr and src:attr("damage_shield_penetrate") then
+			adjusted_value = value * (1 - (util.bound(src.damage_shield_penetrate, 0, 100) / 100))
+		end
+
+		-- Shield Reflect?
+		local reflection, reflect_damage = false, 0
+		if self:attr("damage_shield_reflect") then
+			reflection = true
+		end
+		-- Absorb damage into the shield
+		self.damage_shield_absorb = self.damage_shield_absorb or 0
+		if adjusted_value <= self.damage_shield_absorb then
+			self.damage_shield_absorb = self.damage_shield_absorb - adjusted_value
+			if reflection then reflect_damage = adjusted_value end
+			value = value - adjusted_value
 		else
-			-- Absorb damage into the shield
-			self.damage_shield_absorb = self.damage_shield_absorb or 0
-			if value <= self.damage_shield_absorb then
-				self.damage_shield_absorb = self.damage_shield_absorb - value
-				value = 0
-			else
-				value = value - self.damage_shield_absorb
-				self.damage_shield_absorb = 0
-			end
+			if reflection then reflect_damage = self.damage_shield_absorb end
+			value = adjusted_value - self.damage_shield_absorb
+			self.damage_shield_absorb = 0
 		end
-
+	
+		if reflection and reflect_damage > 0 then 
+			src:takeHit(math.ceil(reflect_damage * (self:attr("damage_shield_reflect")/100)), self)
+			game.logSeen(self, "The damage shield reflects %d damage back to %s!", math.ceil(reflect_damage * (self:attr("damage_shield_reflect")/100)),src.name:capitalize())
+		end
+		
 		-- If we are at the end of the capacity, release the time shield damage
 		if self.damage_shield_absorb <= 0 then
 			game.logPlayer(self, "Your shield crumbles under the damage!")
diff --git a/game/modules/tome/data/general/npcs/bone-giant.lua b/game/modules/tome/data/general/npcs/bone-giant.lua
index ca53f983cd..42cd6f1bdf 100644
--- a/game/modules/tome/data/general/npcs/bone-giant.lua
+++ b/game/modules/tome/data/general/npcs/bone-giant.lua
@@ -137,10 +137,11 @@ newEntity{ base = "BASE_NPC_BONE_GIANT", define_as = "HEAVY_SENTINEL",
 	life_rating = 28,
 	
 	combat_atk=30,
+	combat_spellpower=15,
 	
 	stats = { str=28, dex=60, mag=20, con=20 },
 	
-		equipment = resolvers.equip{ {type="weapon", subtype="staff", defined="STAFF_MOLTEN", random_art_replace={chance=75}, autoreq=true, force_drop=true}, {type="armor", subtype="light", autoreq=true}, },
+	combat = { dam=resolvers.levelup(60, 1, 2), atk=resolvers.levelup(70, 1, 1), apr=20, dammod={str=1.2}, damtype=engine.DamageType.FIRE, convert_damage={[engine.DamageType.PHYSICAL]=50}},
 	
 	melee_project = {[DamageType.FIRE]=resolvers.mbonus(15, 25)},
 	on_melee_hit = {[DamageType.FIRE]=resolvers.mbonus(15, 5)},
@@ -165,4 +166,5 @@ newEntity{ base = "BASE_NPC_BONE_GIANT", define_as = "HEAVY_SENTINEL",
 	},
 	resolvers.sustains_at_birth(),
 	resolvers.drops{chance=100, nb=3, {tome_drops="boss"} },
+	resolvers.drops{chance=100, nb=1, {defined="ARMOR_MOLTEN"} },
 }
diff --git a/game/modules/tome/data/general/npcs/ghoul.lua b/game/modules/tome/data/general/npcs/ghoul.lua
index 3ef2d68e2c..0da250aa18 100644
--- a/game/modules/tome/data/general/npcs/ghoul.lua
+++ b/game/modules/tome/data/general/npcs/ghoul.lua
@@ -165,9 +165,10 @@ newEntity{ base = "BASE_NPC_GHOUL", define_as = "ROTTING_TITAN",
 
 	combat_atk=40,
 	combat_spellpower=25,
+	
+	disarm_immune=1, --Since disarming him would be, well, DISARMING him.
 
 	on_move = function(self)
-		self:project({type="ball", range=0, selffire=false, radius=1}, self.x, self.y, engine.DamageType.DIG, 1)
 			if rng.percent(20) then
 				game.logSeen(self, "The ground shakes as %s steps!", self.name:capitalize())
 				local tg = {type="ball", range=0, selffire=false, radius=3, no_restrict=true}
@@ -175,8 +176,8 @@ newEntity{ base = "BASE_NPC_GHOUL", define_as = "ROTTING_TITAN",
 				self:project(tg, self.x, self.y, DamageType.PHYSKNOCKBACK, {dam=24, dist=1})
 				self:doQuake(tg, self.x, self.y)
 		end
+		self:project({type="ball", range=0, selffire=false, radius=1}, self.x, self.y, engine.DamageType.DIG, 1)
 	end,
-
 	knockback_immune=1,
 
 	resolvers.talents{
diff --git a/game/modules/tome/data/general/npcs/horror.lua b/game/modules/tome/data/general/npcs/horror.lua
index bb79d34e25..940879cd25 100644
--- a/game/modules/tome/data/general/npcs/horror.lua
+++ b/game/modules/tome/data/general/npcs/horror.lua
@@ -735,3 +735,178 @@ newEntity{ base="BASE_NPC_HORROR", define_as = "GRGGLCK_TENTACLE",
 		end
 	end,
 }
+
+
+--MUHUHAHAHAHAHAHA
+newEntity{ base = "BASE_NPC_HORROR",
+	name = "Ak'Gishil", color=colors.GREY, unique = true,
+	desc = "This blade horror has grown in power dramatically, and become a nexus of temporal energy. Rifts in space open around it constantly, summoning and banishing blades before vanishing as quickly as they appear.",
+	level_range = {30, nil}, exp_worth = 1,
+	rarity = 55,
+	rank = 3.5,
+	levitate=1,
+	max_psi= 300,
+	psi_regen= 4,
+	size_category = 4,
+	autolevel = "wildcaster",
+	max_life = resolvers.rngavg(130, 160),
+	life_rating = 30,
+	life_regen = 0.25,
+	combat_armor = 25, combat_def = 15,
+	is_akgishil = true,
+	
+	resolvers.drops{chance=100, nb=1, {defined="BLADE_RIFT"} },
+	
+		ai = "tactical", ai_state = { ai_move="move_dmap", talent_in=2, ally_compassion=0 },
+		
+	on_melee_hit = {[DamageType.PHYSICALBLEED]=resolvers.mbonus(30, 4)},
+	combat = { dam=resolvers.levelup(resolvers.rngavg(20,28), 1, 1.5), physspeed = 0.25,atk=resolvers.levelup(24, 1.2, 1.2), apr=4, dammod={wil=0.3, cun=0.15}, damtype=engine.DamageType.PHYSICALBLEED, },
+	--combat_physspeed = 4, --Crazy fast attack rate
+	
+	resists = {[DamageType.PHYSICAL] = 15, [DamageType.MIND] = 50, [DamageType.TEMPORAL] = 30, [DamageType.ARCANE] = -20},
+	
+	on_added_to_level = function(self)
+		self.blades = 0
+	end,
+
+	on_act = function(self)
+		if self.blades > 2 or not rng.percent(20) then return end
+		self.blades = self.blades + 1
+			self:forceUseTalent(Talents.T_ANIMATE_BLADE, {ignore_cd=true, force_level=1})
+	end,
+	
+	resolvers.talents{
+		--Original Blade Horror talents, beefed up
+		[Talents.T_KNIFE_STORM]={base=5, every=5, max=8},
+		[Talents.T_BIND]={base=2, every=6, max=5},
+		[Talents.T_RAZOR_KNIFE]={base=3, every=4, max=7},
+		[Talents.T_PSIONIC_PULL]={base=5, every=3, max=7},
+		[Talents.T_KINETIC_AURA]={base=3, every=3, max=8},
+		[Talents.T_KINETIC_SHIELD]={base=3, every=2, max=9},
+		[Talents.T_KINETIC_LEECH]={base=2, every=3, max=5},
+		--TEMPORAL
+		[Talents.T_STATIC_HISTORY]={base=1, every=4, max=5},
+		[Talents.T_QUANTUM_SPIKE]={base=1, every=4, max=5},
+		[Talents.T_WEAPON_FOLDING]={base=1, every=4, max=5},
+		[Talents.T_RETHREAD]={base=2, every=4, max=5},
+		[Talents.T_DIMENSIONAL_STEP]={base=3, every=4, max=5},
+	},
+	resolvers.sustains_at_birth(),
+}
+
+newEntity{ base="BASE_NPC_HORROR", define_as = "ANIMATED_BLADE",
+	type = "construct", subtype = "weapon", image="object/sword_dsteel.png",
+	name = "Animated Sword",
+	color = colors.GREY,
+	desc = [[Time seems to warp and bend around this floating weapon.]],
+	level_range = {30, nil}, exp_worth = 0,
+	max_life = 80, life_rating = 3,
+	rank = 2,
+	no_breath = 1,
+	size_category = 2,
+
+	negative_status_immune = 1,
+	
+	resolvers.equip{
+		{type="weapon", subtype="longsword", ego_chance = 100, autoreq=true},
+	},
+	
+	resists = {[DamageType.MIND] = 75, [DamageType.TEMPORAL] = 30,},
+
+	autolevel = "warrior",
+	ai = "dumb_talented_simple", ai_state = { talent_in=3, ai_move="move_astar" },
+	
+	resolvers.talents{
+		[Talents.T_SWAP]={base=1, every=4, max=4},
+		[Talents.T_WEAPONS_MASTERY]={base=4, every=4, max=6},
+		[Talents.T_DIMENSIONAL_STEP]={base=1, every=4, max=4},
+	},
+	
+	on_added_to_level = function(self)
+		self:teleportRandom(self.x, self.y, 3)
+		game.logSeen(self, "A rift opens, spawning a free floating blade!")
+		game.level.map:addEffect(self,
+			self.x, self.y, 3,
+			DamageType.TEMPORAL, 25,
+			0,
+			5, nil,
+			{type="time_prison"},
+			nil, false
+		)
+	end,
+	
+	on_die = function(self, who)
+		if self.summoner and not self.summoner:attr("dead") then
+			if self.summoner.is_akgishil then
+				self.summoner.blades=self.summoner.blades - 1
+			end
+		end
+	end,
+
+	on_act = function(self)
+		if self.summoner:attr("dead") then
+			self:die()
+			game.logSeen(self, "#AQUAMARINE#With the horror's death the blade clatters to the ground!")
+		end
+	end,
+}
+
+newEntity{ base="BASE_NPC_HORROR", define_as = "DISTORTED_BLADE",
+	type = "construct", subtype = "weapon", --image="object/artifact/distorted_blade.png",
+	name = "Distorted Animated Sword", unique=true,
+	color = colors.GREY,
+	desc = [[Time seems to collapse around this floating weapon.]],
+	level_range = {30, nil}, exp_worth = 0,
+	max_life = 80, life_rating = 5,
+	rank = 3.5,
+	no_breath = 1,
+	size_category = 2,
+
+	negative_status_immune = 1,
+	
+	resolvers.equip{
+		{type="weapon", subtype="longsword", define_as="RIFT_SWORD", autoreq=true},
+	},
+	
+	resolvers.drops{chance=100, nb=1, {defined="RIFT_SWORD"} },
+	
+	resists = {[DamageType.MIND] = 75, [DamageType.TEMPORAL] = 40,},
+
+	autolevel = "warrior",
+	ai = "dumb_talented_simple", ai_state = { talent_in=3, ai_move="move_astar" },
+	
+	resolvers.talents{
+		[Talents.T_SWAP]={base=1, every=4, max=4},
+		[Talents.T_WEAPONS_MASTERY]={base=4, every=4, max=6},
+		[Talents.T_DIMENSIONAL_STEP]={base=2, every=4, max=5},
+	},
+	
+	on_added_to_level = function(self)
+		self:teleportRandom(self.x, self.y, 3)
+		game.logSeen(self, "When the rift opens, you see a blade quickly emerge. It does not look like the others.")
+		game.level.map:addEffect(self,
+			self.x, self.y, 5,
+			DamageType.TEMPORAL, 50,
+			0,
+			5, nil,
+			{type="time_prison"},
+			nil, false
+		)
+	end,
+	
+	on_die = function(self, who)
+		if self.summoner and not self.summoner:attr("dead") then
+			if self.summoner.is_akgishil then
+				self.summoner.blades=self.summoner.blades - 1
+			end
+		end
+	end,
+
+	on_act = function(self)
+		if self.summoner:attr("dead") then
+			self:die()
+			game.logSeen(self, "#AQUAMARINE#With the horror's death the chaotic blade clatters to the ground!")
+		end
+	end,
+}
+
diff --git a/game/modules/tome/data/general/npcs/major-demon.lua b/game/modules/tome/data/general/npcs/major-demon.lua
index b4d476301c..984f40bede 100644
--- a/game/modules/tome/data/general/npcs/major-demon.lua
+++ b/game/modules/tome/data/general/npcs/major-demon.lua
@@ -280,7 +280,7 @@ newEntity{ base = "BASE_NPC_MAJOR_DEMON",
 }
 
 newEntity{ base = "BASE_NPC_MAJOR_DEMON",
-	name = "General of Urh'Rok", --Give actual name?
+	name = "Khulmanar, General of Urh'Rok",
 	color=colors.DARK_RED, unique=true,
 	resolvers.nice_tile{image="invis.png", add_mos = {{image="npc/demon_major_general_of_urh_rok.png", display_h=2, display_y=-1}}},
 	desc = [[This massive form, sheathed in dark flames, stands tall above a legion of lesser demons. In his hands he holds a massive blacked battleaxe, flames dancing around the blades.]],
@@ -296,7 +296,7 @@ newEntity{ base = "BASE_NPC_MAJOR_DEMON",
 
 	ai = "tactical",
 
-	resolvers.equip{ {type="weapon", subtype="battleaxe", defined="HELLFIRE", random_art_replace={chance=30}, autoreq=true, force_drop=true}, },
+	resolvers.equip{ {type="weapon", subtype="battleaxe", defined="KHULMANAR_WRATH", random_art_replace={chance=30}, autoreq=true, force_drop=true}, },
 
 	resists={[DamageType.PHYSICAL] = resolvers.mbonus(8, 8), [DamageType.FIRE] = 100},
 	on_melee_hit = {[DamageType.FIRE]=resolvers.mbonus(25, 25)},
diff --git a/game/modules/tome/data/general/npcs/troll.lua b/game/modules/tome/data/general/npcs/troll.lua
index 7ae8d4ad2b..6aa84d1097 100644
--- a/game/modules/tome/data/general/npcs/troll.lua
+++ b/game/modules/tome/data/general/npcs/troll.lua
@@ -144,3 +144,35 @@ newEntity{ base = "BASE_NPC_TROLL",
 	},
 	resolvers.sustains_at_birth(),
 }
+
+newEntity{ base = "BASE_NPC_TROLL", unique=true,
+	name = "Forest Troll Hedge-Wizard", color=colors.YELLOW_GREEN, image="npc/troll_f.png",
+	desc = [[This old looking troll glares at you with malice. His muscles appear atrophied, but a certain power surrounds him nonetheless.]],
+	level_range = {3, nil}, exp_worth = 2,
+	rank=3.5,
+	rarity = 40,
+	max_life = resolvers.rngavg(50,70),
+	life_rating=18,
+	combat_armor = 4, combat_def = 0,
+	
+	resolvers.tmasteries{ ["spell/arcane"]=-0.8, ["spell/aegis"]=0.4,["spell/fire"]=-0.8, },
+	autolevel = "caster",
+	stats = { str=8, dex=8, mag=20, con=12, cun=12, },
+	ai = "tactical",
+	
+	on_added_to_level = function(self)
+		self.inc_damage={[DamageType.FIRE]=math.min(self.level*2,50),}
+	end,
+	
+	resolvers.talents{
+		[Talents.T_SHIELDING]={base=1, every=5, max=5},
+		[Talents.T_MANATHRUST]={base=1, every=1, max=50},
+		[Talents.T_FLAME]={base=1, every=2, max=15},
+	},
+	
+	resolvers.sustains_at_birth(),
+	
+	resolvers.inscription("RUNE:_REFLECTION_SHIELD", {cooldown=14,}),
+	resolvers.drops{chance=100, nb=1, {defined="RUNE_REFLECT"} },
+	resolvers.drops{chance=100, nb=1, {tome_drops="boss"} },
+}
diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua
index 609395cb97..dbd7b36cf7 100644
--- a/game/modules/tome/data/general/objects/boss-artifacts.lua
+++ b/game/modules/tome/data/general/objects/boss-artifacts.lua
@@ -1267,7 +1267,7 @@ It has been kept somewhat intact with layers of salt and clay, but in spite of t
 newEntity{ base = "BASE_LONGBOW",
 	power_source = {arcane=true},
 	define_as = "STORM_FURY",
-	name = "Storm Fury", unique=true,
+	name = "Storm Fury", unique=true, --THESE
 	unided_name = "crackling longbow", color=colors.BLUE,
 	desc = [[This dragonbone longbow is enhanced with bands of steel, which arc with intense lightning. Bolts travel up and down the string, ignorant of you.]],
 	require = { stat = { dex=60 }, },
@@ -1337,7 +1337,7 @@ newEntity{ base = "BASE_LONGBOW",
 newEntity{ base = "BASE_CLOAK", define_as="GLACIAL_CLOAK",
 	power_source = {arcane=true},
 	unique = true,
-	name = "Frozen Shroud", image="object/artifact/cloak_winds_whisper.png",
+	name = "Frozen Shroud", --ARTIFACTS
 	unided_name = "chilling cloak",
 	desc = [[All that remains of the Glacial Legion. This cloak seems to exude an icy cold vapor that freezes all it touches.]],
 	level_range = {40, 50},
@@ -1382,7 +1382,7 @@ newEntity{ base = "BASE_CLOAK", define_as="GLACIAL_CLOAK",
 newEntity{ base = "BASE_GREATMAUL", define_as="ROTTING_MAUL",
 	power_source = {arcane=true},
 	unique = true,
-	name = "Blighted Maul", color = colors.LIGHT_RED, image = "object/artifact/voratun_hammer_of_the_deep_bellow.png",
+	name = "Blighted Maul", color = colors.LIGHT_RED, --NEED
 	unided_name = "rotten stone limb",
 	desc = [[The massive stone limb of the Rotting Titan, a mass of stone and rotting flesh. You think you can lift it, but it is very heavy.]],
 	level_range = {40, 50},
@@ -1425,54 +1425,57 @@ newEntity{ base = "BASE_GREATMAUL", define_as="ROTTING_MAUL",
 		end
 	},
 }
---Molten Staff, dropped by Heavy Sentinel.
-newEntity{ base = "BASE_STAFF",
+--Molten Skin, dropped by Heavy Sentinel.
+newEntity{ base = "BASE_LIGHT_ARMOR",
 	power_source = {arcane=true},
-	define_as = "STAFF_MOLTEN", rarity=false,
-	unided_name = "melting bone",
-	name = "Molten Staff", unique=true,
-	desc = [[This staff of fused molten bone from the Heavy Sentinel radiates intense heat. It still glows red with the heat of the Sentinel's core.]],
+	define_as = "ARMOR_MOLTEN", rarity=false,
+	unided_name = "melting bony armour",
+	name = "Molten Skin", unique=true,
+	desc = [[This mass of fused molten bone from the Heavy Sentinel radiates intense power. It still glows red with the heat of the Sentinel's core, and yet seems to do you no harm.]],
 	require = { stat = { mag=60 }, },
 	level_range = {40, 50},
 	rarity = 250,
 	cost = 300,
 	material_level=5,
-	combat = {
-		dam = 60,
-		apr = 6,
-		physcrit = 5,
-		dammod = {mag=1.35},
-		damtype = DamageType.FIREBURN,
-	},
 	wielder = {
-		combat_spellpower = 20,
+		combat_spellpower = 15,
 		combat_spellcrit = 10,
-		inc_damage={
+		combat_physcrit = 8,
+		combat_critical_power = 20,
+		combat_def = 15,
+		combat_armor = 12,
+		inc_stats = { [Stats.STAT_MAG] = 6,[Stats.STAT_CUN] = 6,},
+		melee_project={[DamageType.FIRE] = 30,},
+ 		inc_damage={
+			[DamageType.FIRE] = 25,
+			[DamageType.LIGHT] = 10,
+			all=5,
+ 		},
+ 		resists={
 			[DamageType.FIRE] = 20,
-		},
-		resists={
-			[DamageType.FIRE] = 24,
-			[DamageType.COLD] = -10,
-		},
-		resists_pen={
-			[DamageType.FIRE] = 10,
-		},
-		talents_types_mastery = {
-			["spell/fire"] = 0.1,
-			["spell/wildfire"] = 0.1,
-		},
-	},
-	max_power = 6, power_regen = 1,
-	use_talent = { id = Talents.T_FLAME, level = 5, power = 5 },
-	talent_on_spell = { {chance=20, talent="T_FLAME", level=2} },
+			[DamageType.LIGHT] = 12,
+			[DamageType.COLD] = -5,
+ 		},
+ 		resists_pen={
+			[DamageType.FIRE] = 15,
+			[DamageType.LIGHT] = 10,
+ 		},
+ 		talents_types_mastery = {
+ 			["spell/fire"] = 0.1,
+ 			["spell/wildfire"] = 0.1,
+			["celestial/sun"] = 0.1,
+ 		},
+	},
+	max_power = 16, power_regen = 1,
+	use_talent = { id = Talents.T_BLASTWAVE, level = 4, power = 12 },
 }
 
 newEntity{ base = "BASE_BATTLEAXE",
 	power_source = {arcane=true},
-	define_as = "HELLFIRE",
-	name = "Hellfire", color = colors.DARK_RED, image = "object/artifact/hellfire.png",
+	define_as = "KHULMANAR_WRATH",
+	name = "Khulmanar's Wrath", color = colors.DARK_RED, image = "object/artifact/hellfire.png",
 	unided_name = "firey blackened battleaxe", unique = true,
-	desc = [[Blackened with soot and covered in spikes, this battleaxe roars with the flames of the Fearscape. Given by Urh'Rok himself to his greatest commanders, this powerful weapon can burn even the most resilient of foes.]],
+	desc = [[Blackened with soot and covered in spikes, this battleaxe roars with the flames of the Fearscape. Given by Urh'Rok himself to his general, this powerful weapon can burn even the most resilient of foes.]],
 	level_range = {37, 50},
 	rarity = 300,
 	require = { stat = { str=52 }, },
@@ -1501,3 +1504,81 @@ newEntity{ base = "BASE_BATTLEAXE",
 	max_power = 35, power_regen = 1,
 	use_talent = { id = Talents.T_INFERNAL_BREATH, level = 3, power = 35 },
 }
+
+newEntity{ base = "BASE_TOOL_MISC", image="object/temporal_instability.png",
+	power_source = {arcane=true, psionic=true},
+	define_as = "BLADE_RIFT",
+	unique = true,
+	name = "The Bladed Rift", color = colors.BLUE,
+	unided_name = "hole in space",
+	desc = [[Upon defeat, Ak'Gishil collapsed into this tiny rift. How it remains stable, you are unsure. If you focus, you think you can call forth a sword from it.]],
+	level_range = {30, 50},
+	rarity = 500,
+	cost = 500,
+	material_level = 4,
+	metallic = false,
+	wielder = {
+		combat_spellpower=5,
+		combat_mindpower=5,
+		on_melee_hit = {[DamageType.PHYSICALBLEED]=25},
+		resists={
+			[DamageType.TEMPORAL] 	= 15,
+		},
+		inc_damage={
+			[DamageType.TEMPORAL] 	= 10,
+			[DamageType.PHYSICAL] 	= 5,
+		},
+	},
+	max_power = 40, power_regen = 1,
+	use_talent = { id = Talents.T_ANIMATE_BLADE, level = 1, power = 40 },
+}
+
+newEntity{ base = "BASE_LONGSWORD", define_as = "RIFT_SWORD",
+	power_source = {arcane=true},
+	unique = true,
+	name = "Blade of Distorted Time", image = "object/artifact/sword_of_potential_futures.png",
+	unided_name = "time-warped sword",
+	desc = [[The remnants of a damaged timeline, this blade shifts and fades at random.]],
+	level_range = {30, 50},
+	rarity = nil, --Not random!
+	require = { stat = { str=44 }, },
+	cost = 300,
+	material_level = 4,
+	combat = {
+		dam = 40,
+		apr = 10,
+		physcrit = 8,
+		dammod = {str=0.8,mag=0.2},
+		convert_damage={[DamageType.TEMPORAL] = 20},
+		special_on_hit = {desc="20% to slow target", fct=function(combat, who, target)
+			if not rng.percent(20) then return end
+			local dam = (20 + who:getMag()/2)
+			local slow = (10 + who:getMag()/5)
+			who:project(target.x, target.y, engine.DamageType.CHRONOSLOW, {dam=dam, slow=slow})
+		end},
+	},
+	wielder = {
+		inc_damage={
+			[DamageType.TEMPORAL] = 12,
+			[DamageType.PHYSICAL] = 10,
+		},
+	},
+	max_power = 8, power_regen = 1,
+	use_talent = { id = Talents.T_RETHREAD, level = 2, power = 8 },
+}
+
+newEntity{ base = "BASE_RUNE", define_as = "RUNE_REFLECT",
+	name = "Rune of Reflection", unique=true,
+	desc = [[You can see your own image mirrored in the surface of this silvery rune.]],
+	unided_name = "shiny rune",
+	level_range = {5, 15},
+	rarity = 240,
+	cost = 100,
+	material_level = 3,
+
+	inscription_kind = "protect",
+	inscription_data = {
+		cooldown = 15,
+	},
+	inscription_talent = "RUNE:_REFLECTION_SHIELD",
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index c9dd2eb76a..4d11c0d981 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -1320,7 +1320,6 @@ newEntity{ base = "BASE_GAUNTLETS",
 
 Finally The Scorpion was defeated by the alchemist Nessylia, who went to face the fiendish orc alone.  The captain pulled the elf towards him with a brutish cackle, but before he could batter the life from her flesh she tore off her robes, revealing eighty incendiary bombs strapped to her flesh.  With a spark from her fingers she triggered an explosion that could be seen for miles around.  To this day Nessylia is still remembered in song for the sacrifice of her immortal life to protect her people.]],
 	level_range = {20, 40},
-	disarm_immune = 0.4,
 	rarity = 300,
 	cost = 1000,
 	material_level = 3,
@@ -1329,15 +1328,16 @@ Finally The Scorpion was defeated by the alchemist Nessylia, who went to face th
 		inc_damage = { [DamageType.PHYSICAL] = 8 },
 		combat_armor = 4,
 		combat_def = 8,
+		disarm_immune = 0.4,
 		talents_types_mastery = { ["psionic/grip"] = 0.2, ["technique/grappling"] = 0.2},
 		combat = {
 			dam = 24,
 			apr = 10,
 			physcrit = 10,
-			physspeed = 0.2,
+			physspeed = 0.15,
 			dammod = {dex=0.4, str=-0.6, cun=0.4,},
 			damrange = 0.3,
-			talent_on_hit = { [Talents.T_BITE_POISON] = {level=1, chance=20} },
+			talent_on_hit = { [Talents.T_BITE_POISON] = {level=3, chance=20} },
 		},
 	},
 	max_power = 30, power_regen = 1,
@@ -2914,7 +2914,7 @@ newEntity{ base = "BASE_MINDSTAR",
 	unique = true,
 	name = "Amethyst of Sanctuary",
 	unided_name = "deep purple gem",
-	level_range = {28, 35},
+	level_range = {30, 38},
 	color=colors.AQUAMARINE, image = "object/artifact/amethyst_of_sanctuary.png",
 	rarity = 250,
 	desc = [[This bright violet gem exudes a calming, focusing force. Holding it, you feel protected against outside forces.]],
@@ -2950,16 +2950,16 @@ newEntity{ base = "BASE_STAFF",
 	name = "Sceptre of the Archlich",
 	flavor_name = "vilestaff",
 	unided_name = "bone carved sceptre",
-	level_range = {37, 50},
+	level_range = {30, 38},
 	color=colors.VIOLET, image = "object/artifact/sceptre_of_the_archlich.png",
 	rarity = 320,
 	desc = [[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 = 285,
-	material_level = 5,
+	material_level = 4,
 
-	require = { stat = { mag=52 }, },
+	require = { stat = { mag=40 }, },
 	combat = {
-		dam = 45,
+		dam = 40,
 		apr = 12,
 		dammod = {mag=1.3},
 		damtype = DamageType.DARKNESS,
@@ -2968,11 +2968,12 @@ newEntity{ base = "BASE_STAFF",
 		combat_spellpower = 28,
 		combat_spellcrit = 14,
 		inc_damage={
-			[DamageType.DARKNESS] 	= 18,
+			[DamageType.DARKNESS] = 26,
 		},
 		talents_types_mastery = {
-			["spell/necrosis"] = 0.2,
+			["celestial/star-fury"] = 0.2,
 			["spell/necrotic-minions"] = 0.2,
+			["spell/advanced-necrotic-minions"] = 0.1,
 		}
 	},
 	on_wear = function(self, who)
@@ -3069,27 +3070,29 @@ newEntity{ base = "BASE_STAFF",
 	material_level = 3,
 	require = { stat = { mag=35 }, },
 	combat = {
-		dam = 28,
+		dam = 30,
 		apr = 8,
 		dammod = {mag=1.3},
 		damtype = DamageType.GRAVITYPIN,
 	},
 	wielder = {
-		combat_spellpower = 18,
-		combat_spellcrit = 6,
+		combat_spellpower = 25,
+		combat_spellcrit = 7,
 		inc_damage={
-			[DamageType.PHYSICAL] 	= 14,
-			[DamageType.TEMPORAL] 	= 8,
+			[DamageType.PHYSICAL] 	= 18,
+			[DamageType.TEMPORAL] 	= 10,
 		},
 		resists={
-			[DamageType.PHYSICAL] 	= 10,
+			[DamageType.PHYSICAL] 	= 14,
 		},
 		talents_types_mastery = {
 			["chronomancy/gravity"] = 0.2,
+			["chronomancy/matter"] = 0.1,
+			["spell/earth"] = 0.1,
 		}
 	},
-	max_power = 35, power_regen = 1,
-	use_talent = { id = Talents.T_GRAVITY_SPIKE, level = 3, power = 35 },
+	max_power = 14, power_regen = 1,
+	use_talent = { id = Talents.T_GRAVITY_SPIKE, level = 3, power = 14 },
 }
 
 newEntity{ base = "BASE_MINDSTAR",
@@ -3102,6 +3105,7 @@ newEntity{ base = "BASE_MINDSTAR",
 	rarity = 280,
 	cost = 300,
 	material_level = 4,
+	sentient=true,
 	combat = {
 		dam = 16,
 		apr = 24,
@@ -3136,9 +3140,25 @@ newEntity{ base = "BASE_MINDSTAR",
 			["wild-gift/storm-drake"] = 0.1,
 		}
 	},
+	on_wear = function(self, who)
+		self.worn_by = who
+	end,
+	on_takeoff = function(self)
+		self.worn_by = nil
+	end,
+	act = function(self)
+		self:useEnergy()
+		self.power=self.power + 1
+		if not self.worn_by then return end
+		if game.level and not game.level:hasEntity(self.worn_by) and not self.worn_by.player then self.worn_by = nil return end
+		if self.worn_by:attr("dead") then return end
+		if not rng.percent(25)  then return end
+		self.use_talent.id=rng.table{ "T_FIRE_BREATH", "T_ICE_BREATH", "T_LIGHTNING_BREATH", "T_SAND_BREATH" }
+		game.logSeen(self.worn_by, "#GOLD#The %s shifts colour!", self.name:capitalize())
+	end,
 	max_power = 40, power_regen = 1,
-	use_power = { name = "release a random breath", power = 40,
-	use = function(self, who)
+	--[[use_power = { name = "release a random breath", power = 40,
+	use = function(self, who)	
 			local Talents = require "engine.interface.ActorTalents"
 			local breathe = rng.table{
 				{Talents.T_FIRE_BREATH},
@@ -3146,10 +3166,12 @@ newEntity{ base = "BASE_MINDSTAR",
 				{Talents.T_LIGHTNING_BREATH},
 				{Talents.T_SAND_BREATH},
 			}
+			
 			who:forceUseTalent(breathe[1], {ignore_cd=true, ignore_energy=true, force_level=4, ignore_ressources=true})
 			return {id=true, used=true}
 		end
-	},
+	},]]
+	use_talent = { id = rng.table{ Talents.T_FIRE_BREATH, Talents.T_ICE_BREATH, Talents.T_LIGHTNING_BREATH, Talents.T_SAND_BREATH }, level = 4, power = 40 }
 }
 
 newEntity{ base = "BASE_MINDSTAR",
@@ -3192,6 +3214,831 @@ newEntity{ base = "BASE_MINDSTAR",
 	use_talent = { id = Talents.T_RAGE, level = 4, power = 40 },
 }
 
+newEntity{ base = "BASE_HELM",
+	power_source = {arcane=true},
+	unique = true,
+	name = "Corrupted Gaze", image = "object/artifact/crown_of_command.png",
+	unided_name = "dark visored helm",
+	desc = [[This helmet radiates a dark power. Its visor seems to twist and corrupt the vision of its wearer. You should be careful to never lower it for long, lest the visions affect your mind.]],
+	require = { stat = { mag=16 } },
+	level_range = {28, 40},
+	rarity = 300,
+	cost = 300,
+	material_level = 4,
+	wielder = {
+		inc_stats = { [Stats.STAT_MAG] = 4, [Stats.STAT_WIL] = 3, [Stats.STAT_CUN] = 4,},
+		combat_def = 2,
+		combat_armor = 5,
+		fatigue = 3,
+		resists = { [DamageType.BLIGHT] = 8},
+		inc_damage = { [DamageType.BLIGHT] = 8},
+		resists_pen = { [DamageType.BLIGHT] = 10},
+		disease_immune=0.3,
+		talents_types_mastery = { ["corruption/vim"] = 0.1, },
+		combat_atk = 8,
+		see_invisible = 12,
+		see_stealth = 12,
+	},
+	max_power = 45, power_regen = 1,
+	use_talent = { id = Talents.T_VIMSENSE, level = 2, power = 45 },
+}
+
+newEntity{ base = "BASE_KNIFE",
+	power_source = {arcane=true},
+	unique = true,
+	name = "Umbral Razor", image = "object/artifact/dagger_silent_blade.png",
+	unided_name = "shadowy dagger",
+	desc = [[This dagger seems to be formed of pure shadows, with a strange miasma surrounding it.]],
+	level_range = {12, 25},
+	rarity = 200,
+	require = { stat = { dex=32 }, },
+	cost = 250,
+	material_level = 2,
+	combat = {
+		dam = 20,
+		apr = 10,
+		physcrit = 8,
+		dammod = {dex=0.45,str=0.35, mag=0.1},
+		convert_damage = {
+			[DamageType.DARKNESS] = 50,
+		},
+	},
+	wielder = {
+		inc_stealth=8,
+		resists = {[DamageType.DARKNESS] = 10,}
+	},
+}
+
+
+newEntity{ base = "BASE_LEATHER_BELT",
+	power_source = {technique=true},
+	unique = true,
+	name = "Emblem of Evasion", color = colors.GOLD,
+	unided_name = "gold coated emblem",
+	desc = [[Said to have belonged to a master of avoiding attacks, this gilded steel emblem symbolizes his talent.]],
+	level_range = {8, 18},
+	rarity = 200,
+	cost = 50,
+	material_level = 2,
+	wielder = {
+		inc_stats = { [Stats.STAT_LCK] = 2, [Stats.STAT_DEX] = 5, [Stats.STAT_CUN] = 3,},
+		slow_projectiles = 15,
+		combat_ranged_def = 5,
+	},
+}
+
+newEntity{ base = "BASE_LONGBOW",
+	power_source = {technique=true},
+	name = "Surefire", unided_name = "high-quality bow", unique=true, image = "object/artifact/thaloren_tree_longbow.png",
+	desc = [[This tightly strung bow appears to have been crafted by someone of considerable talent. When you pull the string, you feel incredible power behind it.]],
+	level_range = {5, 15},
+	rarity = 200,
+	require = { stat = { dex=18 }, },
+	cost = 20,
+	use_no_energy = true,
+	material_level = 1,
+	combat = {
+		range = 9,
+		physspeed = 0.75,
+		travel_speed = 2,
+	},
+	wielder = {
+		inc_damage={ [DamageType.PHYSICAL] = 6, },
+		inc_stats = { [Stats.STAT_DEX] = 3},
+		combat_atk=12,
+		combat_physcrit=5,
+		apr = 10,
+	},
+	max_power = 8, power_regen = 1,
+	use_talent = { id = Talents.T_STEADY_SHOT, level = 2, power = 8 },
+}
+
+newEntity{ base = "BASE_SHOT",
+	power_source = {arcane=true},
+	unique = true,
+	name = "Frozen Shards",
+	unided_name = "pouch of crystallized ice",
+	desc = [[In this dark blue pouch lay several small orbs of ice. A strange vapour surrounds them, and touching them chills you to the bone.]],
+	color = colors.BLUE,
+	level_range = {25, 40},
+	rarity = 300,
+	cost = 110,
+	material_level = 4,
+	require = { stat = { dex=28 }, },
+	combat = {
+		capacity = 6,
+		dam = 32,
+		apr = 15,
+		physcrit = 10,
+		dammod = {dex=0.7, cun=0.5},
+		damtype = DamageType.ICE,
+		special_on_hit = {desc="bursts into an icy cloud",on_kill=1, fct=function(combat, who, target)
+			local duration = 4
+			local radius = 1
+			local dam = (10 + who:getMag()/5 + who:getDex()/3)
+			game.level.map:particleEmitter(target.x, target.y, radius, "iceflash", {radius=radius})
+			-- Add a lasting map effect
+			game.level.map:addEffect(who,
+				target.x, target.y, duration,
+				engine.DamageType.ICE, dam,
+				radius,
+				5, nil,
+				{type="ice_vapour"},
+				function(e)
+					e.radius = e.radius
+					return true
+				end,
+				false
+			)
+		end},
+	},
+}
+
+newEntity{ base = "BASE_WHIP",
+	power_source = {arcane=true},
+	unided_name = "electrified whip",
+	name = "Stormlash", color=colors.BLUE, unique = true, image = "object/artifact/whip_scorpions_tail.png",
+	desc = [[This steel plated whip arcs with intense electricity. The force feels uncontrollable, explosive, powerful.]],
+	require = { stat = { dex=15 }, },
+	cost = 90,
+	rarity = 250,
+	level_range = {6, 15},
+	material_level = 1,
+	combat = {
+		dam = 13,
+		apr = 7,
+		physcrit = 5,
+		dammod = {dex=1},
+		convert_damage = {[DamageType.LIGHTNING] = 50,},
+	},
+	wielder = {
+		combat_atk = 6,
+	},
+	max_power = 10, power_regen = 1,
+	use_power = { name = "strike an enemy in range 3, releasing a burst of lightning", power = 10,
+		use = function(self, who)
+			local dam = 20 + who:getMag()/2 + who:getDex()/3
+			local tg = {type="bolt", range=3}
+			local blast = {type="ball", range=0, radius=1, selffire=false}
+			local x, y = who:getTarget(tg)
+			if not x or not y then return nil end
+			local target = game.level.map(x, y, engine.Map.ACTOR)
+			if not target then return end
+			who:attackTarget(target, engine.DamageType.LIGHTNING, 1, true)
+			local _ _, x, y = who:canProject(tg, x, y)
+			game.level.map:particleEmitter(who.x, who.y, math.max(math.abs(x-who.x), math.abs(y-who.y)), "lightning", {tx=x-who.x, ty=y-who.y})
+			who:project(blast, x, y, engine.DamageType.LIGHTNING, rng.avg(dam / 3, dam, 3))
+			game.level.map:particleEmitter(x, y, radius, "ball_lightning", {radius=blast.radius})
+			game:playSoundNear(self, "talents/lightning")
+			game.logSeen(who, "%s strikes %s, sending out an arc of lightning!", who.name:capitalize(), target.name)
+			return {id=true, used=true}
+		end
+	},
+}
+
+newEntity{ base = "BASE_WHIP",
+	power_source = {psionic=true},
+	unided_name = "gemmed whip handle",
+	name = "Focus Whip", color=colors.YELLOW, unique = true,
+	desc = [[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 = 90,
+	rarity = 250,
+	level_range = {8, 18},
+	material_level = 2,
+	combat = {
+		dam = 13,
+		apr = 7,
+		physcrit = 5,
+		dammod = {dex=0.7, wil=0.2, cun=0.1},
+		wil_attack = true,
+		damtype=DamageType.MIND,
+	},
+	wielder = {
+		combat_mindpower = 10,
+		combat_mindcrit = 3,
+	},
+	max_power = 10, power_regen = 1,
+	use_power = { name = "strike all targets in a line", power = 10,
+		use = function(self, who)
+			local tg = {type="beam", range=4}
+			local x, y = who:getTarget(tg)
+			if not x or not y then return nil end
+			who:project(tg, x, y, function(px, py)
+				local target = game.level.map(px, py, engine.Map.ACTOR)
+				if not target then return end
+				who:attackTarget(target, engine.DamageType.MIND, 1, true)
+			end)
+			game.level.map:particleEmitter(who.x, who.y, tg.radius, "matter_beam", {tx=x-who.x, ty=y-who.y})
+			game:playSoundNear(self, "talents/lightning")
+			return {id=true, used=true}
+		end
+	},
+}
+
+newEntity{ base = "BASE_GREATSWORD",
+	power_source = {arcane=true, technique=true},
+	unique = true,
+	name = "Latafayn",
+	unided_name = "flame covered greatsword", image = "object/artifact/weapon_sword_genocide.png",
+	level_range = {32, 40},
+	color=colors.DARKRED,
+	rarity = 300,
+	desc = [[This massive, flame coated greatsword was stolen from a mighty demon countless years ago, by the hero Kestin Highfin. It constantly seeks to drain and incinerate.]],
+	cost = 400,
+	require = { stat = { str=40 }, },
+	material_level = 4,
+	combat = {
+		dam = 44,
+		apr = 5,
+		physcrit = 10,
+		dammod = {str=1.2},
+		convert_damage={[DamageType.FIREBURN] = 50,},
+		melee_project={[DamageType.DRAINLIFE] = 25},
+	},
+	wielder = {
+		resists = {
+			[DamageType.FIRE] = 15,
+		},
+		inc_damage = {
+			[DamageType.FIRE] = 15,
+			[DamageType.DARKNESS] = 10,
+		},
+		inc_stats = { [Stats.STAT_STR] = 5, [Stats.STAT_CUN] = 3 },
+	},
+	max_power = 25, power_regen = 1,
+	use_power = {name="accelerate burns, instantly inflicting 125% of all burn damage", power = 25, --wherein Pure copies Catalepsy
+	use=function(combat, who, target)
+		local tg = {type="ball", range=5, radius=1, selffire=false}
+		local x, y = who:getTarget(tg)
+		if not x or not y then return nil end
+
+		local source = nil
+		who:project(tg, x, y, function(px, py)
+			local target = game.level.map(px, py, engine.Map.ACTOR)
+			if not target then return end
+
+			-- List all diseases, I mean, burns
+			local burns = {}
+			for eff_id, p in pairs(target.tmp) do
+				local e = target.tempeffect_def[eff_id]
+				if e.subtype.fire and p.power and e.status == "detrimental" then
+					burns[#burns+1] = {id=eff_id, params=p}
+				end
+			end
+			-- Make them EXPLODE !!!
+			for i, d in ipairs(burns) do
+				target:removeEffect(d.id)
+				engine.DamageType:get(engine.DamageType.FIRE).projector(who, px, py, engine.DamageType.FIRE, d.params.power * d.params.dur * 1.25)
+			end
+			game.level.map:particleEmitter(target.x, target.y, 1, "ball_fire", {radius=1})
+		end)
+		game:playSoundNear(who, "talents/fireflash")
+		return {id=true, used=true}
+	end},
+}
+
+newEntity{ base = "BASE_CLOTH_ARMOR",
+	power_source = {psionic=true},
+	unique = true,
+	name = "Robe of Force", color = colors.YELLOW, image = "object/artifact/robe_spider_silk_robe_spydre.png",
+	unided_name = "rippling cloth robe",
+	desc = [[This thin cloth robe is surrounded by a think shroud of telekinetic forces.]],
+	level_range = {20, 28},
+	rarity = 190,
+	cost = 250,
+	material_level = 2,
+	wielder = {
+		combat_def = 12,
+		combat_armor = 8,
+		inc_stats = { [Stats.STAT_CUN] = 3, [Stats.STAT_WIL] = 4, },
+		combat_mindpower = 8,
+		combat_mindcrit = 4,
+		combat_physresist = 10,
+		inc_damage={[DamageType.PHYSICAL] = 5, [DamageType.MIND] = 5,},
+		resists_pen={[DamageType.PHYSICAL] = 10, [DamageType.MIND] = 10,},
+		resists={[DamageType.PHYSICAL] = 12, [DamageType.ACID] = 15,},
+	},
+	max_power = 10, power_regen = 1,
+	use_power = { name = "send out a beam of kinetic energy", power = 10,
+		use = function(self, who)
+			local dam = 15 + who:getWil()/3 + who:getCun()/3
+			local tg = {type="beam", range=5}
+			local x, y = who:getTarget(tg)	
+			if not x or not y then return nil end
+			who:project(tg, x, y, engine.DamageType.MINDKNOCKBACK, who:mindCrit(rng.avg(0.8*dam, dam)))
+			game.level.map:particleEmitter(who.x, who.y, tg.radius, "matter_beam", {tx=x-who.x, ty=y-who.y})
+			return {id=true, used=true}
+		end
+	},
+}
+
+newEntity{ base = "BASE_MINDSTAR",
+	power_source = {nature=true},
+	unique = true,
+	name = "Serpent's Glare",
+	unided_name = "venomous gemstone",
+	level_range = {1, 10},
+	color=colors.GREEN,
+	rarity = 180,
+	desc = [[A thick venom drips from this mindstar.]],
+	cost = 40,
+	require = { stat = { wil=12 }, },
+	material_level = 1,
+	combat = {
+		dam = 7,
+		apr = 15,
+		physcrit = 7,
+		dammod = {wil=0.30, cun=0.1},
+		damtype = DamageType.NATURE,
+		convert_damage={[DamageType.POISON] = 30,}
+	},
+	wielder = {
+		combat_mindpower = 10,
+		combat_mindcrit = 5,
+		poison_immune = 0.5,
+		resists = {
+			[DamageType.NATURE] = 10,
+		}
+	},
+}
+
+newEntity{ base = "BASE_LEATHER_CAP",
+	power_source = {psionic=true},
+	unique = true,
+	name = "The Inner Eye",
+	unided_name = "engraved marble eye",
+	level_range = {24, 32},
+	color=colors.WHITE,
+	encumber = 1,
+	rarity = 140,
+	sentient=true,
+	desc = [[This thick blindfold, with an embedded marble eye, is said to allow the wearer to sense beings around them, at the cost of physical sight. 
+You suspect the effects will require a moment to recover from.]],
+	cost = 200,
+	material_level=3,
+	wielder = {
+		combat_def=3,
+		esp_range=-3,
+		esp_all=1,
+		blind=1,
+		combat_mindpower=6,
+		combat_mindcrit=4,
+		blind_immune=1,
+		combat_mentalresist = 12,
+		resists = {[DamageType.LIGHT] = 10,},
+		resists_cap = {[DamageType.LIGHT] = 10,},
+		resists_pen = {all=5, [DamageType.MIND] = 10,}
+	},
+	act = function(self)
+		self:useEnergy()
+		if not self.worn_by then return end
+		if game.level and not game.level:hasEntity(self.worn_by) and not self.worn_by.player then self.worn_by=nil return end
+		if self.worn_by:attr("dead") then return end
+		self.worn_by:magicMap(1)
+	end,
+	on_wear = function(self, who)
+		self.worn_by = who
+		game.logPlayer(who, "#CRIMSON#Your eyesight fades!")
+		who:resetCanSeeCache()
+		if who.player then for uid, e in pairs(game.level.entities) do if e.x then game.level.map:updateMap(e.x, e.y) end end game.level.map.changed = true end
+	end,
+	on_takeoff = function(self, who)
+		self.worn_by = nil
+		game.logPlayer(who, "#CRIMSON#As you remove the eye, your mind feels unprotected!")
+	end,
+}
+
+newEntity{ base = "BASE_LONGSWORD", define_as="CORPUS",
+	power_source = {arcane=true, technique=true},
+	unique = true,
+	name = "Corpus", image = "object/artifact/sword_of_potential_futures.png",
+	unided_name = "bound sword",
+	desc = [[Thick straps encircle this blade. Jagged edges like teeth travel down the blade, bisecting it. It fights to overcome the straps, but lacks the strength.]],
+	level_range = {20, 30},
+	rarity = 250,
+	require = { stat = { str=40, }, },
+	cost = 300,
+	material_level = 4,
+	combat = {
+		dam = 40,
+		apr = 12,
+		physcrit = 4,
+		dammod = {str=1,},
+		melee_project={[DamageType.DRAINLIFE] = 18},
+		special_on_kill = {desc="grows dramatically in power", fct=function(combat, who, target)
+			local o, item, inven_id = who:findInAllInventoriesBy("define_as", "CORPUS")
+			if not o or not who:getInven(inven_id).worn then return end
+			who:onTakeoff(o, true)
+			o.combat.physcrit = (o.combat.physcrit or 0) + 2
+			o.wielder.combat_critical_power = (o.wielder.combat_critical_power or 0) + 4
+			who:onWear(o, true)
+			if not rng.percent(o.combat.physcrit*0.8) or o.combat.physcrit < 30 then return end
+			o.summon(o, who)
+		end},
+		special_on_crit = {desc="grows in power", fct=function(combat, who, target)
+			local o, item, inven_id = who:findInAllInventoriesBy("define_as", "CORPUS")
+			if not o or not who:getInven(inven_id).worn then return end
+			who:onTakeoff(o, true)
+			o.combat.physcrit = (o.combat.physcrit or 0) + 1
+			o.wielder.combat_critical_power = (o.wielder.combat_critical_power or 0) + 2
+			who:onWear(o, true)
+			if not rng.percent(o.combat.physcrit*0.8) or o.combat.physcrit < 30 then return end
+			o.summon(o, who)
+		end},
+	},
+	summon=function(o, who)
+		o.cut=nil
+		o.combat.physcrit=6
+		o.wielder.combat_critical_power = 0
+		game.logSeen(who, "Corpus bursts open, unleashing a horrific mass!")
+		local x, y = util.findFreeGrid(who.x, who.y, 5, true, {[engine.Map.ACTOR]=true})
+			local NPC = require "mod.class.NPC"
+			local m = NPC.new{
+				type = "horror", subtype = "eldritch",
+				display = "h",
+				name = "Vilespawn", color=colors.GREEN,
+				image="npc/horror_eldritch_oozing_horror.png",
+				desc = "This mass of putrid slime burst from Corpus, and seems intent to kill you.",
+				body = { INVEN = 10, MAINHAND=1, OFFHAND=1, },
+				rank = 3,
+				life_rating = 10, exp_worth = 0,
+				max_vim=200,
+				max_life = resolvers.rngavg(50,90),
+				infravision = 20,
+				autolevel = "dexmage",
+				ai = "summoned", ai_real = "tactical", ai_state = { talent_in=2, ally_compassion=0},
+				stats = { str=15, dex=18, mag=18, wil=15, con=10, cun=18 },
+				level_range = {10, nil}, exp_worth = 0,
+				silent_levelup = true,
+				combat_armor = 0, combat_def = 24,
+				combat = { dam=resolvers.rngavg(10,13), atk=15, apr=15, dammod={mag=0.5, dex=0.5}, damtype=engine.DamageType.BLIGHT, },
+
+				resists = { [engine.DamageType.BLIGHT] = 100, [engine.DamageType.NATURE] = -100, },
+
+				on_melee_hit = {[engine.DamageType.DRAINLIFE]=resolvers.mbonus(10, 30)},
+				melee_project = {[engine.DamageType.DRAINLIFE]=resolvers.mbonus(10, 30)},
+
+				resolvers.talents{
+					[who.T_DRAIN]={base=1, every=7, max = 10},
+					[who.T_SPIT_BLIGHT]={base=1, every=6, max = 9},
+					[who.T_VIRULENT_DISEASE]={base=1, every=9, max = 7},
+					[who.T_BLOOD_FURY]={base=1, every=8, max = 6},
+				},
+				resolvers.sustains_at_birth(),
+				faction = "enemies",
+			}
+
+			m:resolve()
+			
+			game.zone:addEntity(game.level, m, "actor", x, y)
+	end,
+	wielder = {
+		inc_damage={[DamageType.BLIGHT] = 5,},
+		combat_critical_power = 0,
+		cut_immune=-0.25,
+	},
+
+}
+
+newEntity{ base = "BASE_LONGSWORD",
+	power_source = {arcane=true, psionic=true},
+	unique = true,
+	name = "Anima", image = "object/artifact/sword_of_potential_futures.png", define_as = "ANIMA",
+	unided_name = "twisted blade",
+	desc = [[The eye on the hilt of this blade seems to glare at you, piercing your soul and mind. Tentacles surround the hilt, latching onto your hand.]],
+	level_range = {30, 40},
+	rarity = 250,
+	require = { stat = { str=32, wil=20, }, },
+	cost = 300,
+	material_level = 4,
+	combat = {
+		dam = 38,
+		apr = 20,
+		physcrit = 7,
+		dammod = {str=0.8,wil=0.2},
+		damage_convert = {[DamageType.MIND]=20,},
+		special_on_hit = {desc="torments the target with many mental effects", fct=function(combat, who, target)
+			if not who:checkHit(who:combatMindpower(), target:combatMentalResist()*0.9) then return end
+			target:setEffect(target.EFF_WEAKENED_MIND, 2, {power=18})
+			if not rng.percent(40) then return end
+			local eff = rng.table{"stun", "malign", "agony", "confusion", "silence",}
+			if not target:canBe(eff) then return end
+			if not who:checkHit(who:combatMindpower(), target:combatMentalResist()) then return end
+			if eff == "stun" then target:setEffect(target.EFF_MADNESS_STUNNED, 3, {})
+			elseif eff == "malign" then target:setEffect(target.EFF_MALIGNED, 3, {resistAllChange=10})
+			elseif eff == "agony" then target:setEffect(target.EFF_AGONY, 5, { source=who, damage=40, mindpower=40, range=10, minPercent=10, duration=5})
+			elseif eff == "confusion" then target:setEffect(target.EFF_CONFUSED, 3, {power=60})
+			elseif eff == "silence" then target:setEffect(target.EFF_SILENCED, 3, {})
+			end
+		end},
+		special_on_kill = {desc="reduces loss of mental save", fct=function(combat, who, target)
+			local o, item, inven_id = who:findInAllInventoriesBy("define_as", "ANIMA")
+			if not o or not who:getInven(inven_id).worn then return end
+			if o.wielder.combat_mentalresist >= 0 then return end
+			o.skipfunct=1
+			who:onTakeoff(o, true)
+			o.wielder.combat_mentalresist = (o.wielder.combat_mentalresist or 0) + 2
+			who:onWear(o, true)
+			o.skipfunct=nil
+		end},
+	},
+	wielder = {
+		combat_mindpower=8,
+		combat_mentalresist=-30,
+		inc_damage={
+			[DamageType.MIND] = 8,
+		},
+	},
+	sentient=true,
+	act = function(self)
+		self:useEnergy()
+		if not self.worn_by then return end
+		if game.level and not game.level:hasEntity(self.worn_by) and not self.worn_by.player then self.worn_by=nil return end
+		if self.worn_by:attr("dead") then return end
+		local who = self.worn_by
+			local blast = {type="ball", range=0, radius=2, selffire=false}
+			who:project(blast, who.x, who.y, function(px, py)
+				local target = game.level.map(px, py, engine.Map.ACTOR)
+				if not target then return end
+				if not rng.percent(20) then return end
+				if not who:checkHit(who:combatMindpower(), target:combatMentalResist()) then return end
+				target:setEffect(target.EFF_WEAKENED_MIND, 2, {power=5})
+				game.logSeen(who, "Anima's eye glares at %s, piercing their mind!", target.name:capitalize())
+			end)
+	end,
+	on_takeoff = function(self, who)
+		if self.skipfunct then return end
+		self.worn_by=nil
+		who:removeParticles(self.particle)
+		if self.wielder.combat_mentalresist == 0 then
+			game.logPlayer(who, "#CRIMSON#The tentacles release your arm, sated.")
+		else
+			game.logPlayer(who, "#CRIMSON#As you tear the tentacles from your arm, horrible images enter your mind!")
+			who:setEffect(who.EFF_WEAKENED_MIND, 15, {power=25})
+			who:setEffect(who.EFF_AGONY, 5, { source=who, damage=15, mindpower=40, range=10, minPercent=10, duration=5})
+		end
+		self.wielder.combat_mentalresist = -30
+	end,
+	on_wear = function(self, who)
+		if self.skipfunct then return end
+		self.particle = who:addParticles(engine.Particles.new("gloom", 1))
+		self.worn_by = who
+		game.logPlayer(who, "#CRIMSON#As you wield the sword, the tentacles on its hilt wrap around your arm. You feel the sword's will invading your mind!")
+	end,
+}
+
+newEntity{ base = "BASE_WHIP", define_as = "HYDRA_BITE",
+	slot_forbid = "OFFHAND",
+	twohanded=true,
+	power_source = {technique=true, nature=true},
+	unique = true,
+	name = "Hydra's Bite", color = colors.LIGHT_RED,
+	unided_name = "triple headed flail",
+	desc = [[This three headed stralite flail strikes with the power of a hydra. With each attack it lashes out, hitting everyone around you.]],
+	level_range = {32, 40},
+	rarity = 250,
+	require = { stat = { str=40 }, },
+	cost = 650,
+	material_level = 4,
+	running = 0, --For the on hit
+	combat = {
+		dam = 38,
+		apr = 7,
+		physcrit = 4,
+		dammod = {str=1.1},
+		convert_damage = {[DamageType.NATURE]=25,[DamageType.ACID]=25,[DamageType.LIGHTNING]=25},
+		special_on_hit = {desc="hit up to two adjacent enemies",on_kill=1, fct=function(combat, who, target)
+				local o, item, inven_id = who:findInAllInventoriesBy("define_as", "HYDRA_BITE")
+				if not o or not who:getInven(inven_id).worn then return end
+				local tgts = {}
+				local twohits=1
+				for _, c in pairs(util.adjacentCoords(who.x, who.y)) do
+				local targ = game.level.map(c[1], c[2], engine.Map.ACTOR)
+				if targ and targ ~= target and who:reactionToward(target) < 0 then tgts[#tgts+1] = targ end
+				end
+				if #tgts == 0 then return end
+					local target1 = rng.table(tgts)
+					local target2 = rng.table(tgts)
+					local tries = 0
+				while target1 == target2 and tries < 100 do
+					local target2 = rng.table(tgts)
+					tries = tries + 1
+				end
+				if o.running == 1 then return end
+				o.running = 1
+				if tries >= 100 or #tgts==1 then twohits=nil end
+				if twohits then
+					game.logSeen(who, "%s's three headed flail lashes at %s and %s!",who.name:capitalize(), target1.name:capitalize(),target2.name:capitalize())
+				else
+					game.logSeen(who, "%s's three headed flail lashes at %s!",who.name:capitalize(), target1.name:capitalize())
+				end
+				who:attackTarget(target1, engine.DamageType.PHYSICAL, 0.4,  true) 
+				if twohits then who:attackTarget(target2, engine.DamageType.PHYSICAL, 0.4,  true) end
+				o.running=0
+		end},
+	},
+	wielder = {
+		inc_damage={[DamageType.NATURE]=8,[DamageType.ACID]=8,[DamageType.LIGHTNING]=8,},
+		
+	},
+}
+
+newEntity{ base = "BASE_GAUNTLETS",
+	power_source = {technique=true, antimagic=true},
+	define_as = "GAUNTLETS_SPELLHUNT",
+	unique = true,
+	name = "Spellhunt Remnants", color = colors.GREY,
+	unided_name = "rusted voratun gauntlets",
+	desc = [[These once brilliant voratun gauntlets have fallen into a deep decay. Originally used in the spellhunt, it was often used to destroy arcane artifacts, curing the world of their influence.]],
+	level_range = {20, 40},
+	rarity = 300,
+	cost = 1000,
+	material_level = 1,
+	wielder = {
+		combat_mindpower=4,
+		combat_mindcrit=1,
+		combat_spellresist=4,
+		combat_def=1,
+		combat_armor=2,
+		learn_talent = {[Talents.T_WARD] = 1},
+		wards = {
+			[DamageType.ARCANE] = 1,
+			[DamageType.BLIGHT] = 1,
+		},
+		combat = {
+			dam = 12,
+			apr = 4,
+			physcrit = 3,
+			physspeed = 0.2,
+			dammod = {dex=0.4, str=-0.6, cun=0.4,},
+			damrange = 0.3,
+			melee_project={[DamageType.RANDOM_SILENCE] = 10},
+			talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=1, chance=100} },
+		},
+	},
+	power_up= function(self, who, level)
+		local Stats = require "engine.interface.ActorStats"
+		local Talents = require "engine.interface.ActorTalents"
+		local DamageType = require "engine.DamageType"
+		who:onTakeoff(self, true)
+		self.wielder=nil
+		if level==2 then -- LEVEL 2
+		self.wielder={
+			combat_mindpower=6,
+			combat_mindcrit=2,
+			combat_spellresist=6,
+			combat_def=2,
+			combat_armor=3,
+			learn_talent = {[Talents.T_WARD] = 1},
+			wards = {
+				[DamageType.ARCANE] = 2,
+				[DamageType.BLIGHT] = 2,
+			},
+			combat = {
+				dam = 17,
+				apr = 8,
+				physcrit = 6,
+				physspeed = 0.2,
+				dammod = {dex=0.4, str=-0.6, cun=0.4,},
+				damrange = 0.3,
+				melee_project={[DamageType.RANDOM_SILENCE] = 12},
+				talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=2, chance=100} },
+			},
+		}
+		elseif  level==3 then -- LEVEL 3
+		self.wielder={
+			combat_mindpower=8,
+			combat_mindcrit=3,
+			combat_spellresist=8,
+			combat_def=3,
+			combat_armor=4,
+			learn_talent = {[Talents.T_WARD] = 1},
+			wards = {
+				[DamageType.ARCANE] = 3,
+				[DamageType.BLIGHT] = 3,
+			},
+			combat = {
+				dam = 22,
+				apr = 12,
+				physcrit = 8,
+				physspeed = 0.2,
+				dammod = {dex=0.4, str=-0.6, cun=0.4,},
+				damrange = 0.3,
+				melee_project={[DamageType.RANDOM_SILENCE] = 15, [DamageType.MANABURN] = 20,},
+				talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=3, chance=100} },
+			},
+		}
+		elseif  level==4 then -- LEVEL 4
+		self.wielder={
+			combat_mindpower=10,
+			combat_mindcrit=4,
+			combat_spellresist=10,
+			combat_def=4,
+			combat_armor=5,
+			learn_talent = {[Talents.T_WARD] = 1},
+			wards = {
+				[DamageType.ARCANE] = 4,
+				[DamageType.BLIGHT] = 4,
+			},
+			combat = {
+				dam = 27,
+				apr = 15,
+				physcrit = 10,
+				physspeed = 0.2,
+				dammod = {dex=0.4, str=-0.6, cun=0.4,},
+				damrange = 0.3,
+				melee_project={[DamageType.RANDOM_SILENCE] = 17, [DamageType.MANABURN] = 35,},
+				talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=4, chance=100} },
+			},
+		}
+		elseif  level==5 then -- LEVEL 5
+		self.wielder={
+			combat_mindpower=12,
+			combat_mindcrit=5,
+			combat_spellresist=12,
+			combat_def=5,
+			combat_armor=6,
+			learn_talent = {[Talents.T_WARD] = 1},
+			wards = {
+				[DamageType.ARCANE] = 5,
+				[DamageType.BLIGHT] = 5,
+			},
+			combat = {
+				dam = 32,
+				apr = 18,
+				physcrit = 12,
+				physspeed = 0.2,
+				dammod = {dex=0.4, str=-0.6, cun=0.4,},
+				damrange = 0.3,
+				melee_project={[DamageType.RANDOM_SILENCE] = 20, [DamageType.MANABURN] = 50,},
+				talent_on_hit = { [Talents.T_DESTROY_MAGIC] = {level=5, chance=100} },
+			},
+		}
+		self.use_power.name = "destroy magic in a radius 5 cone"
+		self.use_power.power = 100
+		self.use_power.use= function(self,who)
+			local tg = {type="cone", range=0, radius=5}
+			local x, y = who:getTarget(tg)
+			if not x or not y then return nil end
+			who:project(tg, x, y, function(px, py)
+				local target = game.level.map(px, py, engine.Map.ACTOR)
+				if not target then return end
+				target:setEffect(target.EFF_SPELL_DISRUPTION, 10, {src=who, power = 50, max = 75, apply_power=who:combatMindpower()})
+				for i = 1, 2 do
+					local effs = {}
+					-- Go through all spell effects
+					for eff_id, p in pairs(target.tmp) do
+						local e = target.tempeffect_def[eff_id]
+						if e.type == "magical" then
+							effs[#effs+1] = {"effect", eff_id}
+						end
+					end
+					-- Go through all sustained spells
+					for tid, act in pairs(target.sustain_talents) do
+						if act then
+							local talent = target:getTalentFromId(tid)
+							if talent.is_spell then effs[#effs+1] = {"talent", tid} end
+						end
+					end				
+					local eff = rng.tableRemove(effs)
+					if eff then
+						if eff[1] == "effect" then
+						target:removeEffect(eff[2])
+						else
+							target:forceUseTalent(eff[2], {ignore_energy=true})
+						end
+					end
+				end
+				if target.undead or target.construct then
+					who.project(target.x,target.y,engine.DamageType.ARCANE,100+who:getMindpower())
+					if target:canBe("stun") then target:setEffect(target.EFF_STUNNED, 10, {apply_power=who:combatMindpower()}) end
+					game.logSeen(who, "%s's animating magic is disrupted by the burst of power!", who.name:capitalize())
+				end
+			end, nil, {type="slime"})
+			game:playSoundNear(who, "talents/breath")
+			end
+		end
+		
+		who:onWear(self, true)
+	end,
+	max_power = 150, power_regen = 1,
+	use_power = { name = "destroy an arcane item", power = 1, use = function(self, who, obj_inven, obj_item)
+		local d = who:showInventory("Destroy which item?", who:getInven("INVEN"), function(o) return o.unique and o.power_source.arcane and o.power_source.arcane and o.power_source.arcane == true and o.material_level and o.material_level > self.material_level end, function(o, item, inven)
+			if o.material_level <= self.material_level then return end
+			self.material_level=o.material_level
+			game.logPlayer(who, "You crush the %s, and the gloves take on an illustrious shine!", o:getName{do_color=true})
+
+			if not o then return end
+			who:removeObject(who:getInven("INVEN"), item)
+			who:sortInven(who:getInven("INVEN"))
+			
+			self.power_up(self, who, self.material_level)
+			
+			who.changed=true
+		end)
+	end },
+}
 
 --[=[
 newEntity{
diff --git a/game/modules/tome/data/talents/misc/horrors.lua b/game/modules/tome/data/talents/misc/horrors.lua
index 769a19432f..5b5e202030 100644
--- a/game/modules/tome/data/talents/misc/horrors.lua
+++ b/game/modules/tome/data/talents/misc/horrors.lua
@@ -668,4 +668,53 @@ newTalent{
 		local duration = t.getDuration(self, t)
 		return ([[You extend slimy roots into the ground, follow them, and re-appear somewhere else in a range of %d with error margin of %d.]]):format(range, radius)
 	end,
+}
+
+
+--Ak'Gishil
+newTalent{
+	name = "Animate Blade",
+	type = {"spell/horror", 1},
+	cooldown = 1,
+	range = 10,
+	direct_hit = true,
+	tactical = { ATTACK = 2 },
+	action = function(self, t)
+		-- Find space
+		local x, y = util.findFreeGrid(self.x, self.y, 3, true, {[Map.ACTOR]=true})
+		if not x then
+			game.logPlayer(self, "Not enough space to invoke!")
+			return
+		end
+
+		-- Find an actor with that filter
+		local m = false
+		local list = mod.class.NPC:loadList("/data/general/npcs/horror.lua")
+		if self.is_akgishil and rng.percent(3) and not self.summoned_distort then
+			m = list.DISTORTED_BLADE:clone()
+			self.summoned_distort=1
+		else
+			m = list.ANIMATED_BLADE:clone()
+		end
+		if m then
+			m.exp_worth = 0
+			m:resolve()
+			m:resolve(nil, true)
+
+			m.summoner = self
+			m.summon_time = 1000
+			if not self.is_akgishil then
+				m.summon_time = 10
+				m.ai_real = m.ai
+				m.ai = "summoned"
+			end
+
+			game.zone:addEntity(game.level, m, "actor", x, y)
+		end
+
+		return true
+	end,
+	info = function(self, t)
+		return ([[Open a hole in space, summoning an animate blade for 10 turns.]])
+	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/misc/inscriptions.lua b/game/modules/tome/data/talents/misc/inscriptions.lua
index dddfd414d0..3706209a49 100644
--- a/game/modules/tome/data/talents/misc/inscriptions.lua
+++ b/game/modules/tome/data/talents/misc/inscriptions.lua
@@ -438,6 +438,32 @@ newInscription{
 	end,
 }
 
+newInscription{
+	name = "Rune: Reflection Shield", image = "talents/rune__shielding.png",
+	type = {"inscriptions/runes", 1},
+	points = 1,
+	is_spell = true,
+	allow_autocast = true,
+	no_energy = true,
+	tactical = { DEFEND = 2 },
+	on_pre_use = function(self, t)
+		return not self:hasEffect(self.EFF_DAMAGE_SHIELD)
+	end,
+	action = function(self, t)
+		local data = self:getInscriptionData(t.short_name)
+		self:setEffect(self.EFF_DAMAGE_SHIELD, 5, {power=100, reflect=100})
+		return true
+	end,
+	info = function(self, t)
+		local data = self:getInscriptionData(t.short_name)
+		return ([[Activate the rune to create a protective shield absorbing and reflecting at most %d damage for %d turns.]]):format(100, 5)
+	end,
+	short_info = function(self, t)
+		local data = self:getInscriptionData(t.short_name)
+		return ([[absorb and reflect %d for %d turns]]):format(100, 5)
+	end,
+}
+
 newInscription{
 	name = "Rune: Invisibility",
 	type = {"inscriptions/runes", 1},
@@ -744,9 +770,6 @@ newInscription{
 		local summoner = self
 		-- Store the current terrain
 		local terrain = game.level.map(target.x, target.y, engine.Map.TERRAIN)
-		-- Store target attributes as needed
-		local a = {}
-		a.life = target.life
 		-- Instability
 		local temporal_instability = mod.class.Object.new{
 			old_feat = game.level.map(target.x, target.y, engine.Map.TERRAIN),
@@ -755,6 +778,7 @@ newInscription{
 			temporary = t.getDuration(self, t),
 			canAct = false,
 			target = target,
+			back_life = target.life,
 			act = function(self)
 				self:useEnergy()
 				self.temporary = self.temporary - 1
@@ -764,7 +788,7 @@ newInscription{
 					game.level:removeEntity(self)
 					local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true})
 					game.zone:addEntity(game.level, self.target, "actor", mx, my)
-					self.target.life = a.life
+					self.target.life = self.back_life
 				end
 			end,
 			summoner_gain_exp = true,
diff --git a/game/modules/tome/data/talents/misc/objects.lua b/game/modules/tome/data/talents/misc/objects.lua
index 75ddb99844..33bfa4f3b9 100644
--- a/game/modules/tome/data/talents/misc/objects.lua
+++ b/game/modules/tome/data/talents/misc/objects.lua
@@ -279,3 +279,67 @@ newTalent{
 		The life healed will increase with the Willpower stat.]]):format(7 + self:getWil() * 0.5)
 	end,
 }
+
+newTalent{
+	image = "talents/mana_clash.png",
+	name = "Destroy Magic",
+	type = {"wild-gift/objects", 1},
+	points = 5,
+	no_energy = true,
+	tactical = { ATTACK = { ARCANE = 3 } },
+	cooldown = function(self, t) return 50 end,
+	tactical = { HEAL = 2 },
+	target = function(self, t)
+		return {type="hit", range=1, talent=t}
+	end,
+	action = function(self, t)
+	self:getTalentLevel(t)
+		local tg = self:getTalentTarget(t)
+		local x, y, target = self:getTarget(tg)
+		if not x or not y then return nil end
+		self:project(tg, x, y, function(px, py)
+			target:setEffect(target.EFF_SPELL_DISRUPTION, 8, {src=self, power = 8, max = 45+self:getTalentLevel(t)*5, apply_power=self:combatMindpower()})
+			if rng.percent(30) and self:getTalentLevel(t)>2 then
+			
+			local effs = {}
+			
+			-- Go through all spell effects
+				for eff_id, p in pairs(target.tmp) do
+					local e = target.tempeffect_def[eff_id]
+					if e.type == "magical" then
+						effs[#effs+1] = {"effect", eff_id}
+					end
+				end
+			if self:getTalentLevel(t) > 3 then --only do sustains at level 3+
+				-- Go through all sustained spells
+				for tid, act in pairs(target.sustain_talents) do
+					if act then
+						local talent = target:getTalentFromId(tid)
+						if talent.is_spell then effs[#effs+1] = {"talent", tid} end
+					end
+				end	
+			end
+				local eff = rng.tableRemove(effs)
+				if eff then
+					if eff[1] == "effect" then
+						target:removeEffect(eff[2])
+					else
+						target:forceUseTalent(eff[2], {ignore_energy=true})
+					end
+				end
+			end
+				if self:getTalentLevel(t)>4 then
+					if target.undead or target.construct then
+						self.project(target.x,target.y,engine.DamageType.ARCANE,40+self:getMindpower())
+						if target:canBe("stun") then target:setEffect(target.EFF_STUNNED, 5, {apply_power=self:combatMindpower()}) end
+						game.logSeen(self, "%s's animating magic is disrupted!", target.name:capitalize())
+					end
+				end
+		end, nil, {type="slime"})
+		return true
+	end,
+	info = function(self, t)
+		return ([[Inflict various status effects on the target, depending on the level.]]):format(7 + self:getWil() * 0.5)
+	end,
+}
+
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index ccebc0abb2..43534b24f6 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -439,6 +439,7 @@ newEffect{
 		if self:attr("shield_factor") then eff.power = eff.power * (100 + self:attr("shield_factor")) / 100 end
 		if self:attr("shield_dur") then eff.dur = eff.dur + self:attr("shield_dur") end
 		eff.tmpid = self:addTemporaryValue("damage_shield", eff.power)
+		if eff.reflect then eff.refid = self:addTemporaryValue("damage_shield_reflect", eff.reflect) end
 		--- Warning there can be only one time shield active at once for an actor
 		self.damage_shield_absorb = eff.power
 		self.damage_shield_absorb_max = eff.power
@@ -447,6 +448,7 @@ newEffect{
 	deactivate = function(self, eff)
 		self:removeParticles(eff.particle)
 		self:removeTemporaryValue("damage_shield", eff.tmpid)
+		if eff.refid then self:removeTemporaryValue("damage_shield_reflect", eff.refid) end
 		self.damage_shield_absorb = nil
 		self.damage_shield_absorb_max = nil
 	end,
-- 
GitLab