From 73d567bf58a9955c0096968ab75edc28e277f634 Mon Sep 17 00:00:00 2001
From: Eric Wykoff <ericwykoff@yahoo.com>
Date: Tue, 15 Jul 2014 18:13:49 -0500
Subject: [PATCH] Paradox Mage revision

---
 game/engines/default/engine/Projectile.lua    |   9 +-
 game/modules/tome/class/Actor.lua             | 182 +++--
 game/modules/tome/class/Player.lua            |   4 +-
 game/modules/tome/class/interface/Archery.lua |  18 +-
 game/modules/tome/class/interface/Combat.lua  |  37 +-
 .../tome/class/interface/TooltipsData.lua     |   2 +-
 .../tome/data/birth/classes/chronomancer.lua  |  41 +-
 game/modules/tome/data/chats/escort-quest.lua |  10 +-
 game/modules/tome/data/damage_types.lua       | 153 ++--
 .../objects/world-artifacts-far-east.lua      |   4 +-
 .../tome/data/gfx/particles/bolt_paradox.lua  |  51 ++
 .../data/gfx/particles/temporal_teleport.lua  |   6 +-
 .../tome/data/gfx/particles/trail_paradox.lua |  56 ++
 .../gfx/particles_images/spatial_fragment.png | Bin 0 -> 11179 bytes
 .../gfx/particles_images/temporal_bolt.png    | Bin 0 -> 9657 bytes
 .../gfx/shockbolt/trap/chronomine_blue_01.png | Bin 0 -> 6684 bytes
 .../gfx/shockbolt/trap/chronomine_blue_02.png | Bin 0 -> 6689 bytes
 .../gfx/shockbolt/trap/chronomine_blue_03.png | Bin 0 -> 6684 bytes
 .../gfx/shockbolt/trap/chronomine_blue_04.png | Bin 0 -> 6558 bytes
 .../gfx/shockbolt/trap/chronomine_red_01.png  | Bin 0 -> 6541 bytes
 .../gfx/shockbolt/trap/chronomine_red_02.png  | Bin 0 -> 6346 bytes
 .../gfx/shockbolt/trap/chronomine_red_03.png  | Bin 0 -> 6515 bytes
 .../gfx/shockbolt/trap/chronomine_red_04.png  | Bin 0 -> 6517 bytes
 .../gfx/shockbolt/trap/trap_warpmine_01.png   | Bin 8547 -> 0 bytes
 .../gfx/shockbolt/trap/trap_warpmine_02.png   | Bin 8493 -> 0 bytes
 game/modules/tome/data/gfx/talents/banish.png | Bin 4402 -> 3838 bytes
 .../tome/data/gfx/talents/braid_lifelines.png | Bin 0 -> 5828 bytes
 .../tome/data/gfx/talents/carbon_spikes.png   | Bin 4905 -> 0 bytes
 .../tome/data/gfx/talents/cease_to_exist.png  | Bin 2521 -> 2671 bytes
 .../tome/data/gfx/talents/damage_smearing.png | Bin 2853 -> 4590 bytes
 .../data/gfx/talents/dimensional_anchor.png   | Bin 1785 -> 2145 bytes
 .../data/gfx/talents/dimensional_shift.png    | Bin 0 -> 3484 bytes
 .../data/gfx/talents/dimensional_step.png     | Bin 4307 -> 4363 bytes
 .../tome/data/gfx/talents/discontinuity.png   | Bin 0 -> 6684 bytes
 .../data/gfx/talents/echoes_from_the_past.png | Bin 4334 -> 4105 bytes
 .../modules/tome/data/gfx/talents/empower.png | Bin 0 -> 5318 bytes
 .../data/gfx/talents/energy_absorption.png    | Bin 5206 -> 4384 bytes
 .../data/gfx/talents/energy_decomposition.png | Bin 3420 -> 6420 bytes
 .../modules/tome/data/gfx/talents/entropy.png | Bin 0 -> 5205 bytes
 .../tome/data/gfx/talents/extension.png       | Bin 0 -> 3820 bytes
 .../tome/data/gfx/talents/fateweaver.png      | Bin 3488 -> 3812 bytes
 .../tome/data/gfx/talents/fractured_space.png | Bin 0 -> 9378 bytes
 .../tome/data/gfx/talents/gravity_locus.png   | Bin 0 -> 4792 bytes
 .../tome/data/gfx/talents/gravity_spike.png   | Bin 2783 -> 3480 bytes
 .../tome/data/gfx/talents/gravity_well.png    | Bin 4557 -> 6773 bytes
 game/modules/tome/data/gfx/talents/matrix.png | Bin 0 -> 6320 bytes
 .../tome/data/gfx/talents/paradox_mastery.png | Bin 3265 -> 0 bytes
 .../tome/data/gfx/talents/phase_pulse.png     | Bin 0 -> 5108 bytes
 .../tome/data/gfx/talents/phase_shift.png     | Bin 3698 -> 4607 bytes
 .../tome/data/gfx/talents/polarity_shift.png  | Bin 0 -> 5542 bytes
 .../modules/tome/data/gfx/talents/quicken.png | Bin 0 -> 4801 bytes
 game/modules/tome/data/gfx/talents/redux.png  | Bin 3965 -> 2705 bytes
 .../tome/data/gfx/talents/repulsion_blast.png | Bin 4538 -> 6429 bytes
 .../tome/data/gfx/talents/rethread.png        | Bin 4262 -> 4398 bytes
 .../tome/data/gfx/talents/seal_fate.png       | Bin 4349 -> 2933 bytes
 .../data/gfx/talents/spatial_fragments.png    | Bin 0 -> 4057 bytes
 .../tome/data/gfx/talents/spatial_tether.png  | Bin 0 -> 6878 bytes
 .../gfx/talents/sphere_of_destruction.png     | Bin 0 -> 5500 bytes
 .../tome/data/gfx/talents/spin_fate.png       | Bin 4155 -> 4593 bytes
 .../tome/data/gfx/talents/spint_fate.png      | Bin 1772 -> 0 bytes
 game/modules/tome/data/gfx/talents/swap.png   | Bin 3373 -> 3392 bytes
 .../tome/data/gfx/talents/temporal_bolt.png   | Bin 0 -> 4998 bytes
 .../tome/data/gfx/talents/temporal_clone.png  | Bin 4482 -> 4599 bytes
 .../tome/data/gfx/talents/temporal_fugue.png  | Bin 4976 -> 6597 bytes
 .../data/gfx/talents/temporal_reprieve.png    | Bin 3584 -> 5663 bytes
 .../tome/data/gfx/talents/temporal_wake.png   | Bin 2916 -> 4378 bytes
 .../tome/data/gfx/talents/time_skip.png       | Bin 5315 -> 4520 bytes
 game/modules/tome/data/gfx/talents/warp.png   | Bin 0 -> 3866 bytes
 .../tome/data/gfx/talents/warp_mastery.png    | Bin 0 -> 4744 bytes
 .../tome/data/gfx/talents/warp_mine.png       | Bin 4103 -> 0 bytes
 .../tome/data/gfx/talents/warp_mine_away.png  | Bin 4910 -> 5227 bytes
 .../data/gfx/talents/warp_mine_toward.png     | Bin 5030 -> 5921 bytes
 .../tome/data/gfx/talents/warp_mines.png      | Bin 3114 -> 4126 bytes
 .../tome/data/gfx/talents/webs_of_fate.png    | Bin 5277 -> 5478 bytes
 .../tome/data/gfx/talents/wormhole.png        | Bin 5568 -> 4506 bytes
 .../talents/chronomancy/age-manipulation.lua  |   9 +-
 .../data/talents/chronomancy/anomalies.lua    | 377 +++++----
 .../talents/chronomancy/blade-threading.lua   | 107 +--
 .../talents/chronomancy/bow-threading.lua     |  73 +-
 .../data/talents/chronomancy/chronomancer.lua |  18 +-
 .../data/talents/chronomancy/chronomancy.lua  |  41 +-
 .../tome/data/talents/chronomancy/energy.lua  | 163 ++--
 .../talents/chronomancy/fate-threading.lua    | 217 +++---
 .../data/talents/chronomancy/fate-weaving.lua |  90 ++-
 .../tome/data/talents/chronomancy/gravity.lua | 201 +++--
 .../data/talents/chronomancy/guardian.lua     |  43 +-
 .../talents/chronomancy/induced-phenomena.lua | 339 +++++++++
 .../tome/data/talents/chronomancy/matter.lua  |  15 +-
 .../tome/data/talents/chronomancy/other.lua   | 719 ++++++++++++++++--
 .../tome/data/talents/chronomancy/paradox.lua | 229 +-----
 .../talents/chronomancy/spacetime-folding.lua | 517 +++++++------
 .../talents/chronomancy/spacetime-weaving.lua | 301 +++-----
 .../talents/chronomancy/spatial-tears.lua     | 311 ++++++++
 .../talents/chronomancy/speed-control.lua     |  76 +-
 .../data/talents/chronomancy/spellbinding.lua | 156 ++++
 .../talents/chronomancy/temporal-archery.lua  |   2 +-
 .../talents/chronomancy/temporal-hounds.lua   |  44 +-
 .../talents/chronomancy/threaded-combat.lua   |  32 +-
 .../chronomancy/timeline-threading.lua        | 518 ++++++++++---
 .../data/talents/chronomancy/timetravel.lua   | 414 +++++-----
 .../tome/data/talents/misc/inscriptions.lua   |   7 +-
 game/modules/tome/data/talents/misc/npcs.lua  |   4 +-
 game/modules/tome/data/talents/uber/mag.lua   |   6 +-
 .../tome/data/timed_effects/magical.lua       | 206 +++--
 .../modules/tome/data/timed_effects/other.lua | 157 ++--
 .../tome/data/timed_effects/physical.lua      |  52 +-
 .../tome/data/zones/town-point-zero/npcs.lua  |   2 +-
 .../data/zones/unhallowed-morass/npcs.lua     |   1 -
 game/modules/tome/dialogs/DeathDialog.lua     |   9 +
 .../talents/ChronomancyContingency.lua        |   4 +-
 .../dialogs/talents/ChronomancyEmpower.lua    | 133 ++++
 .../dialogs/talents/ChronomancyExtension.lua  | 133 ++++
 .../dialogs/talents/ChronomancyMatrix.lua     | 133 ++++
 .../dialogs/talents/ChronomancyQuicken.lua    | 133 ++++
 114 files changed, 4506 insertions(+), 2059 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/particles/bolt_paradox.lua
 create mode 100644 game/modules/tome/data/gfx/particles/trail_paradox.lua
 create mode 100644 game/modules/tome/data/gfx/particles_images/spatial_fragment.png
 create mode 100644 game/modules/tome/data/gfx/particles_images/temporal_bolt.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png
 create mode 100644 game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png
 delete mode 100644 game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png
 delete mode 100644 game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png
 create mode 100644 game/modules/tome/data/gfx/talents/braid_lifelines.png
 delete mode 100644 game/modules/tome/data/gfx/talents/carbon_spikes.png
 create mode 100644 game/modules/tome/data/gfx/talents/dimensional_shift.png
 create mode 100644 game/modules/tome/data/gfx/talents/discontinuity.png
 create mode 100644 game/modules/tome/data/gfx/talents/empower.png
 create mode 100644 game/modules/tome/data/gfx/talents/entropy.png
 create mode 100644 game/modules/tome/data/gfx/talents/extension.png
 create mode 100644 game/modules/tome/data/gfx/talents/fractured_space.png
 create mode 100644 game/modules/tome/data/gfx/talents/gravity_locus.png
 create mode 100644 game/modules/tome/data/gfx/talents/matrix.png
 delete mode 100644 game/modules/tome/data/gfx/talents/paradox_mastery.png
 create mode 100644 game/modules/tome/data/gfx/talents/phase_pulse.png
 create mode 100644 game/modules/tome/data/gfx/talents/polarity_shift.png
 create mode 100644 game/modules/tome/data/gfx/talents/quicken.png
 create mode 100644 game/modules/tome/data/gfx/talents/spatial_fragments.png
 create mode 100644 game/modules/tome/data/gfx/talents/spatial_tether.png
 create mode 100644 game/modules/tome/data/gfx/talents/sphere_of_destruction.png
 delete mode 100644 game/modules/tome/data/gfx/talents/spint_fate.png
 create mode 100644 game/modules/tome/data/gfx/talents/temporal_bolt.png
 create mode 100644 game/modules/tome/data/gfx/talents/warp.png
 create mode 100644 game/modules/tome/data/gfx/talents/warp_mastery.png
 delete mode 100644 game/modules/tome/data/gfx/talents/warp_mine.png
 create mode 100644 game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
 create mode 100644 game/modules/tome/data/talents/chronomancy/spatial-tears.lua
 create mode 100644 game/modules/tome/data/talents/chronomancy/spellbinding.lua
 create mode 100644 game/modules/tome/dialogs/talents/ChronomancyEmpower.lua
 create mode 100644 game/modules/tome/dialogs/talents/ChronomancyExtension.lua
 create mode 100644 game/modules/tome/dialogs/talents/ChronomancyMatrix.lua
 create mode 100644 game/modules/tome/dialogs/talents/ChronomancyQuicken.lua

diff --git a/game/engines/default/engine/Projectile.lua b/game/engines/default/engine/Projectile.lua
index 10d8d32b19..bb4acc084d 100644
--- a/game/engines/default/engine/Projectile.lua
+++ b/game/engines/default/engine/Projectile.lua
@@ -250,8 +250,15 @@ function _M:on_move(x, y, target)
 	self.src.__project_source = self -- intermediate projector source
 	if self.project and self.project.def.typ.line then self.src:projectDoAct(self.project.def.typ, self.project.def.tg, self.project.def.damtype, self.project.def.dam, self.project.def.particles, self.x, self.y, self.tmp_proj) end
 	if self.project and self.project.def.typ.stop_block then
-
 		self.src:projectDoStop(self.project.def.typ, self.project.def.tg, self.project.def.damtype, self.project.def.dam, self.project.def.particles, self.x, self.y, self.tmp_proj, self.x, self.y, self)
+	elseif self.homing then
+		if (self.x == self.homing.target.x and self.y == self.homing.target.y) then
+			game.level:removeEntity(self, true)
+			self.dead = true
+			self.homing.on_hit(self, self.src, self.homing.target)
+		else
+			self.homing.on_move(self, self.src)
+		end
 	end
 	self.src.__project_source = nil
 end
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 40f03a3ce4..f3f8a812a1 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1388,10 +1388,6 @@ function _M:move(x, y, force)
 			local eff = self:hasEffect(self.EFF_CURSE_OF_SHROUDS)
 			if eff then eff.moved = true end
 
-			if self:knowTalent(self.T_CELERITY) then
-				self:callTalent(self.T_CELERITY, "doCelerity")
-			end
-
 			if self:attr("move_stamina_instead_of_energy") and self:getStamina() > self:attr("move_stamina_instead_of_energy") then
 				self:incStamina(-self:attr("move_stamina_instead_of_energy"))
 			else
@@ -1453,11 +1449,15 @@ function _M:move(x, y, force)
 		self:forceUseTalent(self.T_BODY_OF_STONE, {ignore_energy=true})
 	end
 
-	-- Chronomancy auras
-
+	-- Celerity
+	if moved and ox and oy and (ox ~= self.x or oy ~= self.y) and self:knowTalent(self.T_CELERITY) then
+		self:callTalent(self.T_CELERITY, "doCelerity")
+	end
 
+	-- Break channels
 	if moved then
 		self:breakPsionicChannel()
+		self:breakSpacetimeTuning()
 	end
 
 	if not force and moved and ox and oy and (ox ~= self.x or oy ~= self.y) and self:knowTalent(self.T_LIGHT_OF_FOOT) then
@@ -1468,6 +1468,7 @@ function _M:move(x, y, force)
 		local blur = 0
 		if game.level.data.zero_gravity then blur = 2 end
 		if self:attr("lightning_speed") or self:attr("step_up") or self:attr("wild_speed") then blur = 3 end
+		if self:hasEffect(self.EFF_CELERITY) then local eff = self:hasEffect(self.EFF_CELERITY) blur = eff.charges end
 		self:setMoveAnim(ox, oy, config.settings.tome.smooth_move, blur, 8, config.settings.tome.twitch_move and 0.15 or 0)
 	end
 
@@ -1496,6 +1497,16 @@ function _M:waitTurn()
 			self:reloadQS()
 		end
 	end
+	
+	-- Tune paradox up or down
+	if not self:hasEffect(self.EFF_SPACETIME_TUNING) and self.preferred_paradox and (self:getParadox() ~= self:getMinParadox() or self.preferred_paradox > self:getParadox()) then
+		local power = 0
+		if math.abs(self:getParadox() - self.preferred_paradox) > 1 then
+			local duration = self:callTalent(self.T_SPACETIME_TUNING, "getDuration")
+			power = (self.preferred_paradox - self:getParadox())/duration
+			self:setEffect(self.EFF_SPACETIME_TUNING, duration, {power=power})
+		end
+	end
 
 	self:useEnergy()
 end
@@ -1583,23 +1594,44 @@ function _M:teleportRandom(x, y, dist, min_dist)
 	if game.level.data.no_teleport_south and y + dist > self.y then
 		y = self.y - dist
 	end
+	
+	-- Dimensional Anchor, prevent teleports and deal damage
 	if self:hasEffect(self.EFF_DIMENSIONAL_ANCHOR) then
 		local p = self:hasEffect(self.EFF_DIMENSIONAL_ANCHOR)
-		DamageType:get(DamageType.MATTER).projector(p.src or self, self.x, self.y, DamageType.MATTER, p.damage)
+		DamageType:get(DamageType.WARP).projector(p.src or self, self.x, self.y, DamageType.WARP, p.damage)
 		return
 	end
+	
 	local ox, oy = self.x, self.y
 	local ret = engine.Actor.teleportRandom(self, x, y, dist, min_dist)
 	if self.x ~= ox or self.y ~= oy then
+			-- Phase Pulse
+		if self:isTalentActive(self.T_PHASE_PULSE) then
+			self:callTalent(self.T_PHASE_PULSE, "doPulse", ox, oy)
+		end	
+	
 		self.x, self.y, ox, oy = ox, oy, self.x, self.y
 		self:dropNoTeleportObjects()
 		if self:attr("defense_on_teleport") or self:attr("resist_all_on_teleport") or self:attr("effect_reduction_on_teleport") then
 			self:setEffect(self.EFF_OUT_OF_PHASE, 5, {defense=self:attr("defense_on_teleport") or 0, resists=self:attr("resist_all_on_teleport") or 0, effect_reduction=self:attr("effect_reduction_on_teleport") or 0})
 		end
-		if self:knowTalent(self.T_PHASE_SHIFT) then
-			self:callTalent(self.T_PHASE_SHIFT, "doPhaseShift")
+		
+		-- Dimensional shift, chance to clear effects on teleport
+		if self:knowTalent(self.T_DIMENSIONAL_SHIFT) then
+			self:callTalent(self.T_DIMENSIONAL_SHIFT, "doShift")
 		end
+		
+		-- Teleportation does not clear Time Dilation
+		if self:isTalentActive(self.T_TIME_DILATION) then
+			self:callTalent(self.T_TIME_DILATION, "updateOnTeleport", ox, oy)
+		end			
+		
 		self.x, self.y, ox, oy = ox, oy, self.x, self.y
+	else
+		-- Phase Blast failure
+		if self:isTalentActive(self.T_PHASE_PULSE) then
+			self:callTalent(self.T_PHASE_PULSE, "doPulse", ox, oy, true)
+		end
 	end
 	return ret
 end
@@ -2131,6 +2163,21 @@ function _M:onTakeHit(value, src, death_note)
 			return 0
 		end
 	end
+	if self:attr("phase_shift_chrono") and not self.turn_procs.phase_shift_chrono and value > self.max_life *0.1 then
+		self.turn_procs.phase_shift_chrono = true
+		local nx, ny = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true})
+		if nx then
+			local ox, oy = self.x, self.y
+			if not self:teleportRandom(nx, ny, 0) then
+				game.logSeen(self, "The spell fizzles!")
+			else
+				game.level.map:particleEmitter(ox, oy, 1, "temporal_teleport")
+				game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+				game:delayedLogDamage(src or {}, self, 0, ("#STEEL_BLUE#(%d shifted)#LAST#"):format(value/2), nil)
+				value = value/2
+			end
+		end
+	end
 
 	if self:attr("retribution") then
 	-- Absorb damage into the retribution
@@ -2261,7 +2308,7 @@ function _M:onTakeHit(value, src, death_note)
 			self:removeEffect(self.EFF_PSI_DAMAGE_SHIELD)
 		end
 	end
-
+	
 	if value > 0 and self:attr("shadow_empathy") then
 		-- Absorb damage into a random shadow
 		local shadow = self:callTalent(self.T_SHADOW_EMPATHY, "getRandomShadow")
@@ -2329,6 +2376,11 @@ function _M:onTakeHit(value, src, death_note)
 			value = 0
 		end
 	end
+	
+	-- Paradox Shield
+	if value > 0 and self:isTalentActive(self.T_PRESERVE_PATTERN) then
+		value = self:callTalent(self.T_PRESERVE_PATTERN, "doPerservePattern", src, value)
+	end
 
 	if value <=0 then return 0 end
 	if self.knowTalent and (self:knowTalent(self.T_SEETHE) or self:knowTalent(self.T_GRIM_RESOLVE)) then
@@ -2989,7 +3041,7 @@ function _M:die(src, death_note)
 	if src and src.attr and src:attr("psi_per_kill") then
 		src:incPsi(src:attr("psi_per_kill"))
 	end
-
+	
 	-- Increases blood frenzy
 	if src and src.knowTalent and src:knowTalent(src.T_BLOOD_FRENZY) and src:isTalentActive(src.T_BLOOD_FRENZY) then
 		src.blood_frenzy = src.blood_frenzy + src:callTalent(src.T_BLOOD_FRENZY,"bonuspower")
@@ -3008,7 +3060,7 @@ function _M:die(src, death_note)
 			rsrc.changed = true
 		end
 	end
-
+	
 	-- handle hate changes on kill
 	if src and src.knowTalent and src:knowTalent(src.T_HATE_POOL) then
 		local t = src:getTalentFromId(src.T_HATE_POOL)
@@ -3077,6 +3129,7 @@ function _M:die(src, death_note)
 		p.src:project({type="ball", radius=4, x=self.x, y=self.y}, self.x, self.y, DamageType.ACID, p.explosion, {type="acid"})
 	end
 
+	-- Chronomancy stuff
 	if self:hasEffect(self.EFF_TEMPORAL_DESTABILIZATION) then
 		local p = self:hasEffect(self.EFF_TEMPORAL_DESTABILIZATION)
 		if self:hasEffect(self.EFF_CONTINUUM_DESTABILIZATION) then
@@ -3105,6 +3158,11 @@ function _M:die(src, death_note)
 			end
 		end)
 	end
+	
+	if self:hasEffect(self.EFF_TRIM_THREADS) then
+		local p = self:hasEffect(self.EFF_TRIM_THREADS)
+		p.src:incParadox(-p.reduction)
+	end	
 
 	if self:hasEffect(self.EFF_GHOUL_ROT) then
 		local p = self:hasEffect(self.EFF_GHOUL_ROT)
@@ -3218,6 +3276,7 @@ function _M:resetToFull()
 	self.air = self.max_air
 	self.psi = self.max_psi
 	self.hate = self.max_hate
+	self.paradox = self.preferred_paradox or 300
 end
 
 -- Level up talents to match actor level
@@ -4341,7 +4400,7 @@ end
 
 --- Paradox checks
 function _M:getModifiedParadox()
-	local will_modifier = 2 + self:callTalent(self.T_PARADOX_MASTERY,"WilMult")
+	local will_modifier = (1 + (self:attr("paradox_will_multi") or 0)) * 2
 	will_modifier = (self:getWil() + (self:attr("paradox_reduce_anomalies") or 0)) * will_modifier
 	local sustain_modifier = self:getMinParadox()
 	local modified_paradox = math.max(0, self:getParadox() - will_modifier + sustain_modifier)
@@ -4375,8 +4434,9 @@ function _M:paradoxDoAnomaly(reduction, anomaly_type, chance, target, silent)
 	end
 
 	-- See if we create an anomaly
-	if not game.zone.no_anomalies and not self:attr("no_paradox_fail") and not self.turn_procs.anomalies_checked then
-		self.turn_procs.anomalies_checked = true -- This is so players can't chain cancel out of targeting to trigger anomalies on purpose, we clear it out in postUse
+	if not game.zone.no_anomalies and not self:attr("no_paradox_fail") then
+		if not forced and self.turn_procs.anomalies_checked then return false end  -- This is so players can't chain cancel out of targeting to trigger anomalies on purpose, we clear it out in postUse
+		if not forced then self.turn_procs.anomalies_checked = true end
 
 		-- return true if we roll an anomly
 		if rng.percent(chance) then
@@ -4385,43 +4445,46 @@ function _M:paradoxDoAnomaly(reduction, anomaly_type, chance, target, silent)
 				anomaly_type = "major"
 			else
 				-- Check for Bias?
-				if self.anomaly_bias and rng.percent(self.anomaly_bias.chance) then
-					anomaly_type = self.anomaly_bias.type
-				end
+				if self.anomaly_bias and rng.percent(self.anomaly_bias.chance) then anomaly_type = self.anomaly_bias.type end
+				-- Revert no-major to random
+				if anomaly_type == "no-major" then anomaly_type = "random" end
 			end
 
 			-- Now pick anomalies filtered by type
 			local ts = {}
 			for id, t in pairs(self.talents_def) do
-				if anomaly_type ~= "random" and anomaly_type ~= "no-major" then
-					if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type == anomaly_type then ts[#ts+1] = id end
+				if anomaly_type ~= "random" then
+					if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type == anomaly_type and not self:isTalentCoolingDown(t) then ts[#ts+1] = id end
 				else
-					if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type ~= "major" then ts[#ts+1] = id end
+					if t.type[1] == "chronomancy/anomalies" and t.anomaly_type and t.anomaly_type ~= "major" and not self:isTalentCoolingDown(t) then ts[#ts+1] = id end
 				end
 			end
 
 			-- Did we find anomalies?
 			if ts[1] then
 				-- Do we have a target?  If not we pass to anomaly targeting
-				-- The ignore energy calls here allow anomalies to be cast even when it's not the players turn (i.e. Preserve Pattern)
+				-- The ignore energy calls here allow anomalies to be cast even when it's not the players turn
 				if target then
-					self:forceUseTalent(rng.table(ts), {ignore_cooldown=true, ignore_energy=true, force_target=target})
+					self:attr("anomaly_forced_target", 1)
+					self:forceUseTalent(rng.table(ts), {ignore_energy=true, force_target=target})
+					self:attr("anomaly_forced_target", -1)
 				else
-					self:forceUseTalent(rng.table(ts), {ignore_cooldown=true, ignore_energy=true})
+					self:forceUseTalent(rng.table(ts), {ignore_energy=true})
 				end
-				-- Drop some game messages
-				if not silent then
-					if forced then
-						game.logPlayer(self, "#STEEL_BLUE#You've moved to another time thread.")
-					else
-						game.logPlayer(self, "#LIGHT_RED#You lose control and unleash an anomaly!")
-					end
-				end
-				-- Reduce Paradox
-				if reduction and reduction > 0 then
-					self:incParadox(-reduction)
+			end
+			
+			-- Drop some game messages; these happen so Paradox gets reduced even if an anomaly isn't found
+			if not silent then
+				if forced then
+					game.logPlayer(self, "#STEEL_BLUE#You've moved to another time thread.")
+				else
+					game.logPlayer(self, "#LIGHT_RED#You lose control and unleash an anomaly!")
 				end
 			end
+			-- Reduce Paradox
+			if reduction and reduction > 0 then
+				self:incParadox(-reduction)
+			end
 
 			return true
 		end
@@ -4443,9 +4506,15 @@ function _M:incParadox(paradox)
 	if self:getModifiedParadox() < 600 and self:getModifiedParadox() + paradox >= 600 then
 		game.logPlayer(self, "#LIGHT_RED#Spacetime fights against your control!")
 	end
-	if self:getParadox() > 600 and self:getParadox() + paradox <= 600 then
+	if self:getModifiedParadox() > 600 and self:getModifiedParadox() + paradox <= 600 then
 		game.logPlayer(self, "#LIGHT_BLUE#Spacetime has calmed...  somewhat.")
 	end
+	
+	-- Cosmic Cycle
+	if self:isTalentActive(self.T_COSMIC_CYCLE) then
+		self:callTalent(self.T_COSMIC_CYCLE, "doCosmicCycle")
+	end
+	
 	return previous_incParadox(self, paradox)
 end
 
@@ -4839,7 +4908,11 @@ function _M:getTalentSpeed(t)
 	local speed_type = self:getTalentSpeedType(t)
 	local speed = self:getSpeed(speed_type)
 
-	-- EDGE: Put Quicken Here?
+	-- Quicken
+	local p = self:isTalentActive(self.T_QUICKEN)
+	if p and p.talent == t.id then
+		speed = math.max(0.1, speed - self:callTalent(self.T_QUICKEN, "getPower"))
+	end
 
 	local hd = {"Actor:getTalentSpeed", talent = t, speed_type = speed_type, speed = speed,}
 	if self:triggerHook(hd) then speed = hd.speed end
@@ -5038,6 +5111,7 @@ function _M:postUseTalent(ab, ret, silent)
 	if ab.id ~= self.T_GATHER_THE_THREADS and ab.is_spell then self:breakChronoSpells() end
 	if not ab.no_reload_break then self:breakReloading() end
 	self:breakStepUp()
+	self:breakSpacetimeTuning()
 	--if not (util.getval(ab.no_energy, self, ab) or ab.no_break_channel) and not (ab.mode == "sustained" and self:isTalentActive(ab.id)) then self:breakPsionicChannel(ab.id) end
 
 	for tid, _ in pairs(self.sustain_talents) do
@@ -5047,12 +5121,6 @@ function _M:postUseTalent(ab, ret, silent)
 		end
 	end
 
-	if ab.id ~= self.T_REDUX and self:hasEffect(self.EFF_REDUX) and ab.type[1]:find("^chronomancy/") and ab.mode == "activated" and self:getTalentLevel(self.T_REDUX) >= self:getTalentLevel(ab.id) then
-		self:removeEffect(self.EFF_REDUX)
-		-- this still consumes energy but works as the talent suggests it does
-		self:forceUseTalent(ab.id, {ignore_energy=true, ignore_cd = true})
-	end
-
 	if not ab.innate and self:hasEffect(self.EFF_RAMPAGE) and ab.id ~= self.T_RAMPAGE and ab.id ~= self.T_SLAM then
 		local eff = self:hasEffect(self.EFF_RAMPAGE)
 		value = self.tempeffect_def[self.EFF_RAMPAGE].do_postUseTalent(self, eff, value)
@@ -5141,9 +5209,6 @@ function _M:breakStepUp()
 	if self:hasEffect(self.EFF_SKIRMISHER_DIRECTED_SPEED) then
 		self:removeEffect(self.EFF_SKIRMISHER_DIRECTED_SPEED)
 	end
-	if self:hasEffect(self.EFF_CELERITY) then
-		self:removeEffect(self.EFF_CELERITY)
-	end
 end
 
 --- Breaks lightning speed if active
@@ -5160,6 +5225,12 @@ function _M:breakChronoSpells()
 	end
 end
 
+function _M:breakSpacetimeTuning()
+	if self:hasEffect(self.EFF_SPACETIME_TUNING) then
+		self:removeEffect(self.EFF_SPACETIME_TUNING)
+	end
+end
+
 --- Break Psionic Channels
 function _M:breakPsionicChannel(talent)
 	if self:isTalentActive(self.T_MIND_STORM) and talent ~= self.T_MIND_STORM then
@@ -5212,7 +5283,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery)
 		if t.positive then d:add({"color",0x6f,0xff,0x83}, "Positive energy cost: ", {"color",255, 215, 0}, ""..math.round(util.getval(t.positive, self, t) * (100 + self:combatFatigue()) / 100, 0.1), true) end
 		if t.negative then d:add({"color",0x6f,0xff,0x83}, "Negative energy cost: ", {"color", 127, 127, 127}, ""..math.round(util.getval(t.negative, self, t) * (100 + self:combatFatigue()) / 100, 0.1), true) end
 		if t.hate then d:add({"color",0x6f,0xff,0x83}, "Hate cost:  ", {"color", 127, 127, 127}, ""..math.round(util.getval(t.hate, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end
-		if t.paradox then d:add({"color",0x6f,0xff,0x83}, "Paradox cost: ", {"color",  176, 196, 222}, ""..math.round(util.getval(t.paradox, self, t), 0.1), true) end
+		if t.paradox then d:add({"color",0x6f,0xff,0x83}, "Paradox cost: ", {"color",  176, 196, 222}, ""..math.round(util.getval(t.paradox, self, t)), true) end
 		if t.psi then d:add({"color",0x6f,0xff,0x83}, "Psi cost: ", {"color",0x7f,0xff,0xd4}, ""..math.round(util.getval(t.psi, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end
 		if t.feedback then d:add({"color",0x6f,0xff,0x83}, "Feedback cost: ", {"color",0xFF, 0xFF, 0x00}, ""..math.round(util.getval(t.feedback, self, t) * (100 + 2 * self:combatFatigue()) / 100, 0.1), true) end
 		if t.fortress_energy then d:add({"color",0x6f,0xff,0x83}, "Fortress Energy cost: ", {"color",0x00,0xff,0xa0}, ""..math.round(t.fortress_energy, 0.1), true) end
@@ -5236,7 +5307,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery)
 		else d:add({"color",0x6f,0xff,0x83}, "Range: ", {"color",0xFF,0xFF,0xFF}, "melee/personal", true)
 		end
 		if not config.ignore_ressources then
-			if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, "Cooldown: ", {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end
+			if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, ("%sCooldown: "):format(t.fixed_cooldown and "Fixed " or ""), {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end
 		end
 		local speed = self:getTalentProjectileSpeed(t)
 		if speed then d:add({"color",0x6f,0xff,0x83}, "Travel Speed: ", {"color",0xFF,0xFF,0xFF}, ""..(speed * 100).."% of base", true)
@@ -5273,7 +5344,7 @@ function _M:getTalentFullDescription(t, addlevel, config, fake_mastery)
 		end
 	else
 		if not config.ignore_ressources then
-			if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, "Cooldown: ", {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end
+			if self:getTalentCooldown(t) then d:add({"color",0x6f,0xff,0x83}, ("%sCooldown: "):format(t.fixed_cooldown and "Fixed " or ""), {"color",0xFF,0xFF,0xFF}, ""..self:getTalentCooldown(t), true) end
 		end
 	end
 
@@ -5320,7 +5391,12 @@ function _M:getTalentCooldown(t)
 	if eff and not self:attr("talent_reuse") then
 		cd = 1 + cd * eff.power
 	end
-
+	
+	local p = self:isTalentActive(self.T_MATRIX)
+	if p and p.talent == t.id then
+		cd = math.floor(cd * (1 - self:callTalent(self.T_MATRIX, "getPower")))
+	end
+	
 	if t.is_spell then
 		return math.ceil(cd * (1 - (self.spell_cooldown_reduction or 0)))
 	elseif t.is_summon then
@@ -5340,6 +5416,12 @@ function _M:startTalentCooldown(t, v)
 		self.talents_cd[t.id] = math.max(v, self.talents_cd[t.id] or 0)
 	else
 		if not t.cooldown then return end
+		if t.id ~= self.T_REDUX and self:hasEffect(self.EFF_REDUX) then
+			local eff = self:hasEffect(self.EFF_REDUX) 
+			if t.type[1]:find("^chronomancy/") and self:getTalentCooldown(t) <= eff.max_cd and t.mode == "activated" and not t.fixed_cooldown then
+				return
+			end
+		end
 		self.talents_cd[t.id] = self:getTalentCooldown(t)
 	end
 	if self.talents_cd[t.id] <= 0 then self.talents_cd[t.id] = nil end
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index 9eb86b3b9a..f694ff0e1a 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -1216,7 +1216,7 @@ function _M:playerUseItem(object, item, inven)
 				self:breakStepUp()
 				self:breakStealth()
 				self:breakLightningSpeed()
-				--	self:breakPsionicChannel()
+				self:breakSpacetimeTuning()
 				return true
 			end
 
@@ -1224,7 +1224,7 @@ function _M:playerUseItem(object, item, inven)
 			self:breakStealth()
 			self:breakLightningSpeed()
 			self:breakReloading()
-			--	self:breakPsionicChannel()
+			self:breakSpacetimeTuning()
 			self.changed = true
 		end)
 		local ok, ret = coroutine.resume(co)
diff --git a/game/modules/tome/class/interface/Archery.lua b/game/modules/tome/class/interface/Archery.lua
index 832baa330b..ffde75dff3 100644
--- a/game/modules/tome/class/interface/Archery.lua
+++ b/game/modules/tome/class/interface/Archery.lua
@@ -429,12 +429,9 @@ local function archery_projectile(tx, ty, tg, self, tmp)
 	-- Temporal cast
 	if hitted and self:knowTalent(self.T_WEAPON_FOLDING) and self:isTalentActive(self.T_WEAPON_FOLDING) then
 		local dam = self:callTalent(self.T_WEAPON_FOLDING, "getDamage")
-		local burst_damage = 0
-		local burst_radius = 0
 		if self:knowTalent(self.T_FRAYED_THREADS) then
-			burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
-			burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
-			dam = dam - burst_damage
+			local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
+			local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
 			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.TEMPORAL, burst_damage)
 		end
 		if dam > 0 and not target.dead then
@@ -444,13 +441,10 @@ local function archery_projectile(tx, ty, tg, self, tmp)
 	if hitted and self:knowTalent(self.T_IMPACT) and self:isTalentActive(self.T_IMPACT) then
 		local dam = self:callTalent(self.T_IMPACT, "getDamage")
 		local power = self:callTalent(self.T_IMPACT, "getApplyPower")
-		local burst_damage = 0
-		local burst_radius = 0
 		if self:knowTalent(self.T_FRAYED_THREADS) then
-			burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
-			burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
-			dam = dam - burst_damage
-			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=dam/2, power_check=power})
+			local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
+			local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
+			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=burst_damage/2, power_check=power})
 		end
 		if dam > 0 and not target.dead then
 			DamageType:get(DamageType.IMPACT).projector(self, target.x, target.y, DamageType.IMPACT, {dam=dam, daze=dam/2, power_check=power}, tmp)
@@ -492,7 +486,7 @@ local function archery_projectile(tx, ty, tg, self, tmp)
 	-- Resource regen on hit
 	if hitted and self:attr("stamina_regen_on_hit") then self:incStamina(self.stamina_regen_on_hit) end
 	if hitted and self:attr("mana_regen_on_hit") then self:incMana(self.mana_regen_on_hit) end
-
+	
 	-- Ablative armor
 	if hitted and not target.dead and target:attr("carbon_spikes") then
 		if target.carbon_armor >= 1 then
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 59a621c71d..a62b7e6026 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -89,6 +89,7 @@ function _M:attackTarget(target, damtype, mult, noenergy, force_unharmed)
 
 	-- Break before we do the blow, because it might start step up, we dont want to insta-cancel it
 	self:breakStepUp()
+	self:breakSpacetimeTuning()
 
 	if self:attr("feared") then
 		if not noenergy then
@@ -625,9 +626,8 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 		local burst_damage = 0
 		local burst_radius = 0
 		if self:knowTalent(self.T_FRAYED_THREADS) then
-			burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
-			burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
-			dam = dam - burst_damage
+			local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
+			local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
 			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.TEMPORAL, burst_damage)
 		end
 		if dam > 0 and not target.dead then
@@ -637,13 +637,10 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 	if hitted and self:knowTalent(self.T_IMPACT) and self:isTalentActive(self.T_IMPACT) then
 		local dam = self:callTalent(self.T_IMPACT, "getDamage")
 		local power = self:callTalent(self.T_IMPACT, "getApplyPower")
-		local burst_damage = 0
-		local burst_radius = 0
 		if self:knowTalent(self.T_FRAYED_THREADS) then
-			burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
-			burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
-			dam = dam - burst_damage
-			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=dam/2, power_check=power})
+			local burst_damage = dam * self:callTalent(self.T_FRAYED_THREADS, "getPercent")
+			local burst_radius = self:callTalent(self.T_FRAYED_THREADS, "getRadius")
+			self:project({type="ball", radius=burst_radius, friendlyfire=false}, target.x, target.y, DamageType.IMPACT, {dam=burst_damage, daze=burst_damage/2, power_check=power})
 		end
 		if dam > 0 and not target.dead then
 			DamageType:get(DamageType.IMPACT).projector(self, target.x, target.y, DamageType.IMPACT, {dam=dam, daze=dam/2, power_check=power}, tmp)
@@ -886,6 +883,16 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 	if hitted and self:attr("mana_regen_on_hit") then self:incMana(self.mana_regen_on_hit) end
 	if hitted and self:attr("psi_regen_on_hit") then self:incPsi(self.psi_regen_on_hit) end
 
+	-- Ablative armor
+	if hitted and not target.dead and target:attr("carbon_spikes") then
+		if target.carbon_armor >= 1 then
+			target.carbon_armor = target.carbon_armor - 1
+		else
+			-- Deactivate without loosing energy
+			target:forceUseTalent(target.T_CARBON_SPIKES, {ignore_energy=true})
+		end
+	end
+	
 	if hitted and not target.dead and target:knowTalent(target.T_STONESHIELD) then
 		local t = target:getTalentFromId(target.T_STONESHIELD)
 		local m, mm, e, em = t.getValues(self, t)
@@ -893,12 +900,6 @@ function _M:attackTargetWith(target, weapon, damtype, mult, force_dam)
 		target:incEquilibrium(-math.min(dam * e, em))
 	end
 
-	-- Ablative Armor
-	if hitted and not target.dead and target:attr("carbon_spikes") then
-		local t = target:getTalentFromId(target.T_CARBON_SPIKES)
-		t.do_carbonLoss(target, t)
-	end
-
 	-- Set Up
 	if not hitted and not target.dead and not evaded and not target:attr("stunned") and not target:attr("dazed") and not target:attr("stoned") and target:hasEffect(target.EFF_DEFENSIVE_MANEUVER) then
 		local t = target:getTalentFromId(target.T_SET_UP)
@@ -1190,12 +1191,12 @@ function _M:combatArmor()
 			add = add + ga.getArmor(self, ga)
 		end
 	end
-	if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then
-		add = add + self.carbon_armor
-	end
 	if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then
 		add = add + self:callTalent(self.T_ARMOUR_OF_SHADOWS,"ArmourBonus")
 	end
+	if self:knowTalent(self.T_CARBON_SPIKES) and self:isTalentActive(self.T_CARBON_SPIKES) then
+		add = add + self.carbon_armor
+	end
 	return self.combat_armor + add
 end
 
diff --git a/game/modules/tome/class/interface/TooltipsData.lua b/game/modules/tome/class/interface/TooltipsData.lua
index 00265d6f6c..6171a93766 100644
--- a/game/modules/tome/class/interface/TooltipsData.lua
+++ b/game/modules/tome/class/interface/TooltipsData.lua
@@ -112,7 +112,7 @@ All afflicted talents are based on Hate, and many are more effective at higher l
 TOOLTIP_PARADOX = [[#GOLD#Paradox#LAST#
 Paradox represents how stable the current timeline is. 
 As your Paradox grows so does your Spellpower, but you may be shifted to a more stable timeline when you attempt to use your magic.
-When your Paradox is above 600 the shifts will become more violent.
+When your modified Paradox is above 600 the shifts will become more violent.
 Your control over chronomancy spells increases with your Willpower.
 ]]
 
diff --git a/game/modules/tome/data/birth/classes/chronomancer.lua b/game/modules/tome/data/birth/classes/chronomancer.lua
index 149154ecf1..c3feec1c45 100644
--- a/game/modules/tome/data/birth/classes/chronomancer.lua
+++ b/game/modules/tome/data/birth/classes/chronomancer.lua
@@ -69,25 +69,32 @@ newBirthDescriptor{
 	random_rarity = 2,
 	stats = { mag=5, wil=2, con=2, },
 	talents_types = {
-		["chronomancy/age-manipulation"]={true, 0.3},
-	--	["chronomancy/anomalies"]={true, 0},
-		["chronomancy/chronomancy"]={true, 0.3},
-		["chronomancy/energy"]={true, 0.3},
+		-- class
 		["chronomancy/fate-threading"]={true, 0.3},
 		["chronomancy/gravity"]={true, 0.3},
-		["chronomancy/matter"]={true, 0.3},
-		["chronomancy/paradox"]={false, 0.3},
+		["chronomancy/spacetime-folding"]={true, 0.3},
 		["chronomancy/speed-control"]={true, 0.3},
-		["chronomancy/timeline-threading"]={false, 0.3},
+		["chronomancy/timeline-threading"]={true, 0.3},
 		["chronomancy/timetravel"]={true, 0.3},
+		
+		-- locked class
+		["chronomancy/spellbinding"]={false, 0.3},
+		["chronomancy/spatial-tears"]={false, 0.3},
+
+		-- generic
+		["chronomancy/chronomancy"]={true, 0.3},
+		["chronomancy/fate-weaving"]={true, 0.3},
 		["chronomancy/spacetime-weaving"]={true, 0.3},
-		["cunning/survival"]={false, 0},
+
+		-- locked generic
+		["chronomancy/energy"]={false, 0.3},
+		["cunning/survival"]={false, 0},	
 	},
 	talents = {
-		[ActorTalents.T_DISENTANGLE] = 1,
+		[ActorTalents.T_TEMPORAL_BOLT] = 1,
 		[ActorTalents.T_DIMENSIONAL_STEP] = 1,
-		[ActorTalents.T_DUST_TO_DUST] = 1,
-		[ActorTalents.T_TURN_BACK_THE_CLOCK] = 1,
+		[ActorTalents.T_RETHREAD] = 1,
+		[ActorTalents.T_DISENTANGLE] = 1,
 	},
 	copy = {
 		max_life = 90,
@@ -119,21 +126,25 @@ newBirthDescriptor{
 		-- class
 		["chronomancy/blade-threading"]={true, 0.3},
 		["chronomancy/bow-threading"]={true, 0.3},
-		["chronomancy/fate-threading"]={true, 0.3},
+		["chronomancy/fate-threading"]={true, 0.1},
 		["chronomancy/spacetime-folding"]={true, 0.3},
-		["chronomancy/speed-control"]={true, 0.1},
+		["chronomancy/speed-control"]={true, 0.3},
 		["chronomancy/guardian"]={true, 0.3},
 		
+		-- class locked
 		["chronomancy/threaded-combat"]={false, 0.3},
 		["chronomancy/temporal-hounds"]={false, 0.3},
 		["chronomancy/timetravel"]={false, 0.1},
 		
 		-- generic
-		["cunning/survival"]={false, 0},
 		["technique/combat-training"]={true, 0.3},
+		
 		["chronomancy/chronomancy"]={true, 0.3},
-		["chronomancy/fate-weaving"]={false, 0.1},
 		["chronomancy/spacetime-weaving"]={true, 0.3},
+		
+		-- generic locked
+		["chronomancy/fate-weaving"]={false, 0.1},
+		["cunning/survival"]={false, 0},
 	},
 	birth_example_particles = "temporal_focus",
 	talents = {
diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua
index e0ebbba00f..2d956450b5 100644
--- a/game/modules/tome/data/chats/escort-quest.lua
+++ b/game/modules/tome/data/chats/escort-quest.lua
@@ -164,11 +164,11 @@ local reward_types = {
 		types = {
 			["chronomancy/chronomancy"] = 0.8,
 		},
-		talents = {								--- Note to Darkgod; burn this comment after reading
-			[Talents.T_CONTINGENCY] = 1,		--- Quick explanation; Precognition is really similar to track now so there's the overlap argument
-			[Talents.T_SEE_THE_THREADS] = 1,	--- The other thought is that these are both some pretty cool effects and may help to hook players that otherwise
-		--	[Talents.T_PRECOGNITION] = 1,		--- wouldn't stick around long enough to unlock Chronomancers.  Anyway that's my thoughts on it, if it doesn't feel right
-		},										--- feel free to change it.
+		talents = {
+			[Talents.T_CONTINGENCY] = 1,
+		--	[Talents.T_SEE_THE_THREADS] = 1,
+			[Talents.T_PRECOGNITION] = 1,
+		},										
 		stats = {
 			[Stats.STAT_MAG] = 2,
 			[Stats.STAT_CUN] = 1,
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index cb1c8cf1e5..7fd060785c 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -246,17 +246,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 
 		--target.T_STONE_FORTRESS could be checked/applied here (ReduceDamage function in Dwarven Fortress talent)
 
-		-- Damage Smearing
-		if dam > 0 and type ~= DamageType.TEMPORAL and target.isTalentActive and target:isTalentActive(target.T_DAMAGE_SMEARING) then
-			local percent = target:callTalent(target.T_DAMAGE_SMEARING, "getPercent")
-			local duration = target:callTalent(target.T_DAMAGE_SMEARING, "getDuration")
-			local smear = dam * percent
-			local type = DamageType.TEMPORAL
-			target:setEffect(target.EFF_SMEARED, duration, {src=src, power=smear/duration, no_ct_effect=true})
-			game:delayedLogDamage(src, target, 0, ("%s(%d smeared)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", smear), false)
-			dam = dam - smear
-		end
-
 		-- affinity healing, we store it to apply it after damage is resolved
 		local affinity_heal = 0
 		if target.damage_affinity then
@@ -328,13 +317,6 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			if lastdam - dam  > 0 then game:delayedLogDamage(src, target, 0, ("%s(%d antimagic)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false) end
 		end
 
-		if dam > 0 and target.isTalentActive and target:isTalentActive(target.T_ENERGY_DECOMPOSITION) then
-			local t = target:getTalentFromId(target.T_ENERGY_DECOMPOSITION)
-			lastdam = dam
-			dam = t.on_damage(target, t, type, dam)
-			if lastdam - dam  > 0 then game:delayedLogDamage(src, target, 0, ("%s(%d dissipated)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false) end
-		end
-
 		-- Flat damage reduction ("armour")
 		if dam > 0 and target.flat_damage_armor then
 			local dec = math.min(dam, (target.flat_damage_armor.all or 0) + (target.flat_damage_armor[type] or 0))
@@ -362,7 +344,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			print("[PROJECTOR] numbed dam", dam)
 		end
 		if src:attr("generic_damage_penalty") then
-			dam = dam - dam * src:attr("generic_damage_penalty") / 100
+			dam = dam - dam * math.min(100, src:attr("generic_damage_penalty")) / 100
 			print("[PROJECTOR] generic dam", dam)
 		end
 
@@ -372,6 +354,11 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			local def = src.tempeffect_def[src.EFF_CURSE_OF_MISFORTUNE]
 			dam = def.doUnfortunateEnd(src, eff, target, dam)
 		end
+		
+		if src and src.hasEffect and src:hasEffect(src.EFF_SEAL_FATE) then
+			src:callEffect(src.EFF_SEAL_FATE, "doDamage", target)
+		end
+
 
 		if src:attr("crushing_blow") and (dam * (1.25 + (src.combat_critical_power or 0)/200)) > target.life then
 			dam = dam * (1.25 + (src.combat_critical_power or 0)/200)
@@ -467,31 +454,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 		end
 		-- Braided damage
 		if dam > 0 and target:hasEffect(target.EFF_BRAIDED) then
-			local p = target:hasEffect(target.EFF_BRAIDED)
-			local braid_damage = dam * p.power/ 100
-			if p.braid_one and not p.braid_one.dead and p.braid_one:hasEffect(p.braid_one.EFF_BRAIDED) then
-				game:delayedLogMessage(p.src, p.braid_one, "braided", "#CRIMSON##Source# damages #Target# through the Braid!")
-				game:delayedLogDamage(p.src, p.braid_one, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false)
-				p.braid_one:takeHit(braid_damage, p.src)
-			end
-			if p.braid_two and not p.braid_two.dead and p.braid_two:hasEffect(p.braid_two.EFF_BRAIDED) then
-				game:delayedLogMessage(p.src, p.braid_two, "braided", "#CRIMSON##Source# damages #Target# through the Braid!")
-				game:delayedLogDamage(p.src, p.braid_two, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false)
-				p.braid_two:takeHit(braid_damage, p.src)
-			end
-		end
-
-		if dam > 0 and src ~= target and target.knowTalent and target:knowTalent(target.T_SPIN_FATE) then
-			if target.turn_procs and not target.turn_procs.spin_fate then
-				target:callTalent(target.T_SPIN_FATE, "doSpinFate")
-				if target.hasEffect and target:hasEffect(target.EFF_WEBS_OF_FATE) and not target.turn_procs.webs_of_fate then
-					target.turn_procs.webs_of_fate = true
-				elseif target.hasEffect and target:hasEffect(target.EFF_SEAL_FATE) and not target.turn_procs.seal_fate then
-					target.turn_procs.seal_fate = true
-				else
-					target.turn_procs.spin_fate = true
-				end
-			end
+			game:onTickEnd(function()target:callEffect(target.EFF_BRAIDED, "doBraid", dam)end)
 		end
 
 		if target.knowTalent and target:knowTalent(target.T_RESOLVE) then local t = target:getTalentFromId(target.T_RESOLVE) t.on_absorb(target, t, type, dam) end
@@ -608,7 +571,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 				end
 			end
 		end
-
+		
 		if src.turn_procs and src.turn_procs.is_crit then
 			if src.knowTalent and src:knowTalent(src.T_ELEMENTAL_SURGE) then
 				src:triggerTalent(src.T_ELEMENTAL_SURGE, nil, target, type, dam)
@@ -616,7 +579,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 
 			src.turn_procs.is_crit = nil
 		end
-
+		
 		if src.turn_procs and not src.turn_procs.dazing_damage and src.hasEffect and src:hasEffect(src.EFF_DAZING_DAMAGE) then
 			if target:canBe("stun") then
 				local power = math.max(src:combatSpellpower(), src:combatMindpower(), src:combatPhysicalpower())
@@ -2500,22 +2463,28 @@ newDamageType{
 newDamageType{
 	name = "gravity", type = "GRAVITY",
 	projector = function(src, x, y, type, dam)
+		if _G.type(dam) == "number" then dam = {dam=dam} end
 		local target = game.level.map(x, y, Map.ACTOR)
 		if not target then return end
-		if target and target:attr("never_move") then
-			dam = dam * 1.5
+		if target then
+			if target:isTalentActive(target.T_GRAVITY_LOCUS) then return end
+			if dam.slow then
+				target:setEffect(target.EFF_GRAVITY_SLOW, dam.dur, {dam.slow, apply_power=apply, no_ct_effect=true})
+			end
+			if dam.anti then
+				target:setEffect(target.EFF_ANTI_GRAVITY, dam.dur, {apply_power=apply, no_ct_effect=true})
+			end
 		end
-		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam)
+		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam)
 	end,
 }
 
 newDamageType{
 	name = "gravity pin", type = "GRAVITYPIN",
 	projector = function(src, x, y, type, dam)
-		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
 		local reapplied = false
-		if target then
+		if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then
 			-- silence the apply message if the target already has the effect
 			for eff_id, p in pairs(target.tmp) do
 				local e = target.tempeffect_def[eff_id]
@@ -2528,6 +2497,7 @@ newDamageType{
 			else
 				game.logSeen(target, "%s resists the pin!", target.name:capitalize())
 			end
+			DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam)
 		end
 	end,
 }
@@ -2825,17 +2795,6 @@ newDamageType{
 	end,
 }
 
-newDamageType{
-	name = "temporal echo", type = "TEMPORAL_ECHO",
-	projector = function(src, x, y, type, dam)
-		local target = game.level.map(x, y, Map.ACTOR)
-		if target then
-			dam = (target.max_life - target.life) * dam
-			DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam)
-		end
-	end,
-}
-
 newDamageType{
 	name = "draining physical", type = "DEVOUR_LIFE",
 	projector = function(src, x, y, type, dam)
@@ -3385,7 +3344,17 @@ newDamageType{
 	end,
 }
 
+-- Prevents Teleportation
 newDamageType{
+	name = "dimensional anchor", type = "DIMENSIONAL_ANCHOR",
+	projector = function(src, x, y, type, dam)
+		if _G.type(dam) == "number" then dam = {dam=dam, apply_power=apply_power or src:combatSpellpower()} end
+		local target = game.level.map(x, y, Map.ACTOR)
+		if target then
+			target:setEffect(target.EFF_DIMENSIONAL_ANCHOR, 1, {damage=dam.dam, src=src, apply_power=dam.apply_power, no_ct_effect=true})
+		end
+	end,
+}newDamageType{
 	name = "brain storm", type = "BRAINSTORM",
 	projector = function(src, x, y, type, dam)
 		local target = game.level.map(x, y, Map.ACTOR)
@@ -3437,3 +3406,63 @@ newDamageType{
 		end
 	end,
 }
+
+-- Temporal/Physical damage with possible chance to debalitate
+newDamageType{
+	name = "warp", type = "WARP",
+	projector = function(src, x, y, type, dam)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if not target then return end
+		if _G.type(dam) == "number" then dam = {dam=dam, chance=chance or 0, dur=dur or 3, apply_power=apply_power or src:combatSpellpower()} end
+		
+		-- Factor in fractured space bonuses
+		local fracture = false
+		if src.isTalentActive and src:isTalentActive(src.T_FRACTURED_SPACE) then
+			fracture = src:isTalentActive(src.T_FRACTURED_SPACE)
+		end
+		if fracture then
+			dam.chance = math.min(100, dam.chance + (src:callTalent(src.T_FRACTURED_SPACE, "getChance")*fracture.charges))
+			dam.dam = dam.dam * (1 + (src:callTalent(src.T_FRACTURED_SPACE, "getDamage")*fracture.charges)/100)
+		end
+
+		-- Deal Damage
+		DamageType:get(DamageType.PHYSICAL).projector(src, x, y, DamageType.PHYSICAL, dam.dam / 2)
+		DamageType:get(DamageType.TEMPORAL).projector(src, x, y, DamageType.TEMPORAL, dam.dam / 2)
+
+		 -- Increase fracture charges and refresh decay rate
+		 if fracture then
+			fracture.charges = math.min(6, fracture.charges + 1)
+			fracture.decay = 0
+		end
+		
+		-- Pull random effect
+		if rng.percent(dam.chance) then
+			local effect = rng.range(1, 4)
+			if effect == 1 then
+				if target:canBe("stun") then
+					target:setEffect(target.EFF_STUNNED, dam.dur, {apply_power=dam.apply_power})
+				else
+					game.logSeen(target, "%s resists the stun!", target.name:capitalize())
+				end
+			elseif effect == 2 then
+				if target:canBe("blind") then
+					target:setEffect(target.EFF_BLINDED, dam.dur, {apply_power=dam.apply_power})
+				else
+					game.logSeen(target, "%s resists the blindness!", target.name:capitalize())
+				end
+			elseif effect == 3 then
+				if target:canBe("pin") then
+					target:setEffect(target.EFF_PINNED, dam.dur, {apply_power=dam.apply_power})
+				else
+					game.logSeen(target, "%s resists the pin!", target.name:capitalize())
+				end
+			elseif effect == 4 then
+				if target:canBe("confusion") then
+					target:setEffect(target.EFF_CONFUSED, dam.dur, {power=50, apply_power=dam.apply_power})
+				else
+					game.logSeen(target, "%s resists the confusion!", target.name:capitalize())
+				end
+			end
+		end
+	end,
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/general/objects/world-artifacts-far-east.lua b/game/modules/tome/data/general/objects/world-artifacts-far-east.lua
index b894dd7ac9..ea54c24a28 100644
--- a/game/modules/tome/data/general/objects/world-artifacts-far-east.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts-far-east.lua
@@ -554,13 +554,11 @@ newEntity{ base = "BASE_STAFF",
 			[Talents.T_PARADOX_CLONE] = 7,
 			[Talents.T_TEMPORAL_CLONE] = 5,
 			[Talents.T_TIME_STOP] = 5,
-		--	[Talents.T_GRAVITY_WELL] = 6,  -- thematically wrong
 			[Talents.T_BODY_REVERSION] = 2,
 		},
 		talents_types_mastery = {
-			["chronomancy/timeline-threading"] = 0.2,
+			["chronomancy/fate-threading"] = 0.2,
 			["chronomancy/timetravel"] = 0.2,
-			["chronomancy/paradox"] = 0.2,
 			["spell/temporal"] = 0.2,
 		},
 	},
diff --git a/game/modules/tome/data/gfx/particles/bolt_paradox.lua b/game/modules/tome/data/gfx/particles/bolt_paradox.lua
new file mode 100644
index 0000000000..ff1885d362
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/bolt_paradox.lua
@@ -0,0 +1,51 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+return { generator = function()
+	local radius = 0
+	local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
+	local ad = rng.float(0, 360)
+	local a = math.rad(ad)
+	local r = rng.float(0, sradius / 6)
+	local x = r * math.cos(a)
+	local y = r * math.sin(a)
+	local bx = math.floor(x / engine.Map.tile_w)
+	local by = math.floor(y / engine.Map.tile_h)
+	local static = rng.percent(40)
+
+	return {
+		trail = 1,
+		life = 6,
+		size = 3, sizev = 0, sizea = 0,
+
+		x = x, xv = 0, xa = 0,
+		y = y, yv = 0, ya = 0,
+		dir = a, dirv = 0, dira = 0,
+		vel = sradius / 2 / 6, velv = 0, vela = 0,
+
+		r = rng.range(250, 255)/255,  rv = 0, ra = 0,
+		g = rng.range(120, 128)/255,  gv = 0, ga = 0,
+		b = rng.range(114, 147)/255,      bv = 0, ba = 0,
+		a = rng.range(80, 220)/255,   av = 0, aa = 0,
+	}
+end, },
+function(self)
+	self.ps:emit(30)
+end,
+30*6
\ No newline at end of file
diff --git a/game/modules/tome/data/gfx/particles/temporal_teleport.lua b/game/modules/tome/data/gfx/particles/temporal_teleport.lua
index 5de134fdd7..65395be791 100644
--- a/game/modules/tome/data/gfx/particles/temporal_teleport.lua
+++ b/game/modules/tome/data/gfx/particles/temporal_teleport.lua
@@ -27,9 +27,9 @@ return {
 	life = { 20, 30 },
 	size = { 3, 7 }, sizev = {0, 0}, sizea = {0, 0},
 
-	r = {70, 250}, rv = {0, 10}, ra = {0, 0},
-	g = {130, 250}, gv = {0, 0}, ga = {0, 0},
-	b = {180, 0}, bv = {0, 10}, ba = {0, 0},
+	r = {0, 176}, rv = {0, 10}, ra = {0, 0},
+	g = {196, 255}, gv = {0, 0}, ga = {0, 0},
+	b = {222, 255}, bv = {0, 10}, ba = {0, 0},
 	a = {25, 255}, av = {0, 0}, aa = {0, 0},
 
 }, function(self)
diff --git a/game/modules/tome/data/gfx/particles/trail_paradox.lua b/game/modules/tome/data/gfx/particles/trail_paradox.lua
new file mode 100644
index 0000000000..c443c25846
--- /dev/null
+++ b/game/modules/tome/data/gfx/particles/trail_paradox.lua
@@ -0,0 +1,56 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+local nb = 0
+
+return { generator = function()
+	local radius = 0
+	local sradius = (radius + 0.5) * (engine.Map.tile_w + engine.Map.tile_h) / 2
+	local ad = rng.float(0, 360)
+	local a = math.rad(ad)
+	local r = rng.float(0.1, sradius / 2)
+	local x = r * math.cos(a)
+	local y = r * math.sin(a)
+	local bx = math.floor(x / engine.Map.tile_w)
+	local by = math.floor(y / engine.Map.tile_h)
+	local static = rng.percent(40)
+
+	return {
+		trail = 1,
+		life = 3 + 9 * (sradius - r) / sradius,
+		size = 3, sizev = 0, sizea = 0,
+
+		x = x, xv = 0, xa = 0,
+		y = y, yv = 0, ya = 0,
+		dir = 0, dirv = 0, dira = 0,
+		vel = 0, velv = 0, vela = 0,
+
+		r = rng.range(250, 255)/255,  rv = 0, ra = 0,
+		g = rng.range(120, 128)/255,  gv = 0.005, ga = 0.0005,
+		b = rng.range(114, 147)/255,      bv = 0, ba = 0,
+		a = rng.range(80, 220)/255,   av = static and -0.034 or 0, aa = 0.005,
+	}
+end, },
+function(self)
+	if nb < 1 then
+		self.ps:emit(30)
+	end
+	nb = nb + 1
+end,
+30
diff --git a/game/modules/tome/data/gfx/particles_images/spatial_fragment.png b/game/modules/tome/data/gfx/particles_images/spatial_fragment.png
new file mode 100644
index 0000000000000000000000000000000000000000..a666db2d2dd99c08b079780a253eb9be573cd9a8
GIT binary patch
literal 11179
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
JPDHLkV1h3vljHyZ

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/particles_images/temporal_bolt.png b/game/modules/tome/data/gfx/particles_images/temporal_bolt.png
new file mode 100644
index 0000000000000000000000000000000000000000..0ffab2efe3eab1d2ee2ebe373a28a36ec5a54d66
GIT binary patch
literal 9657
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_01.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7faecde70ab285d38b2767d9f35642dff19582a
GIT binary patch
literal 6684
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
O08mlXgjLF02L2ahbUzsY

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_02.png
new file mode 100644
index 0000000000000000000000000000000000000000..a8407740aef3247a22dd19681f7798cd0dc78551
GIT binary patch
literal 6689
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
acLH|28*!eRLKJ^~+Q2mKLo3znp8gL=3pq^y

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_03.png
new file mode 100644
index 0000000000000000000000000000000000000000..37d51af69fb3b9b8270090de89481dcc0658a30c
GIT binary patch
literal 6684
zcmbVRXEa=GyPgoecSA5rbYsS-!{{}74WbQ3pBY9MElTw0QKLi`Q6j<+B1B8kdypUr
z5+y{5e&qY!_dVywx6WDX?6vp(lzm^<U7!7DCm0!MQIWHe0{{Rj9c^`!t5NySLrQ!l
zYu$a8t_Gl=hNYh=*2OOni9-QYoUx85kPaH@iZVeVor8UbPznG5p^LkjrJtp~9^46w
z1|$FIfP>K9S7-o0K`F=^>Ewy>1398x-7yHBosL&LAa`d3&uuAvh`zTP%FSIn1cx#W
zF)(uq@pO`N=221vDFnf<2+$}$Bq#{&h4F<4A$b193%{EG*%s#k{Y%Bq6T$Our!4i2
zKx$YV3M2)Fi8(=_P>{4V7%C|xEe#a~NkE_y;*hIbS_~=)my(7{$bkO3c&@DBoL%51
z>Y9Jqx>_N4-2D8!;o{<ffq~#a7#NFl6^F{n$^GGwkPy4l5c3Vj_#uPDFuuHhGpM6{
zopA2ne(qQd=no^(5$o@V;JNbj-yxvA_4WTD#`yk~sH>ET2O+)1p<swO8vQ4(e`)*r
znV|mLjsK|aYZmN{5;sBlV*PPWSM_k={TqChyZ_zLAH^$g;D$K&tD+#i)Ui(fXcWdz
zM;*a)^#<(h?hJ=P)FJ9Hn2L-hL`_2y3YCS(Lgdt7va%XdQgRyVkiR+p6INOkDyOL;
zr2<ity{d$Uq^g9ZgsQrn=9N^FR8jp0tAp|NLt>mzf7^AxvilcS?tjI?)o>`J9~NhZ
z#d`hS0Y+|EKdi4C)*GZ|Dh(36?T&HA2Koy9DbK&7RY&3615nPII4m0Uul&N@|AT#)
z#Qzodzp>8$pPY$bIV1k3IsQkp{JnM6fq$m|wEorNpTmQ~T%8!))zL7PC?x{`nDunj
zRm_6sH}AOn+6?$3&R+yKk2nx_1Nf9lWAxH_ZqAvkJTp)KIt$LpX`{crH)Owev*s-2
zjH+r6T5QH72bTA#*tE=^1?w`mXe<OelDLGyuuB*4DiT7U>-VzMRZWEHo>;>ODeaCB
zVLSM>B@CI+%?qVVhGN2>a)2wbd!Za}h_a14+Z+t=82=VW;BbNE3>Ra+1gX1hYj9{<
zXl;_MKYYN)D3KDQ7fR(`U14mmTB&;ffnF~LE^U{x-_3fS{Ns3*!uoP|>B+7;-uj2D
z{cT_1^yV*q$;FJZZhF-bZ~5PI5D-K7b24pBH$MQ7#*`IrHj!+$H8E&eS|i@qBRtSE
zsF81#Oy)2dvAV-shT|UsUz(rzAiic2D+kHgk4H^KNVRPGY4YDoadY^!7R**qreZ~%
z+5baQyJ{+w{nmxST>4KXsN;dKiO_1NElWtx&Tf)VR)4)#>+Z^uxss0z0Wje40z*VW
za_1_H$icZS;>XQLJ7U1o7s-nXs{)2I;N6+;VfT0iVqEC1*Q>di)OM1j=$n*Vzv0pt
zeSh6ulHlIRt@1CYliF$5OCy=JgU;XB`bs^Kpq!4_xZ4`BLh|I287ewHLJ4Ru=L`hr
z*0dIsLanx4(&cYg`dTmo2sDkY1Ju|o5HjXgb>_7LwH37p%CmZz8~e{RA5S$8X8Gou
zi_HgTsLy-J%y>-<+TerN9wqJA;d|CbWkT(>c?~bTGa8jZNXm8D`$YvugHmIPw-w@f
zAKU;K)a4zxnuogLyG5Pa-`m!Y7gUj|X1{vMH#MJ^mp3O)@g(0}PuyH2JMR|v9Z1w5
z1szSVD!<CmeoEq_^}a$3o3-fL$s?E#J!`^b63gW&F0Q}7u-DZMlC>{7E-Qe_S7Vdq
z1p!idzr?pyTJ}vMm07jCUP5k(@Kd$QO%!#!D_5m;X&Z!-p@pC7Av)R`e?L-1$z8^-
zeu~nuPSc5L{Lpe3?In$MWnp%Km~VCWfc4r0U8LG#7jf(O+#<z80i=m|=SBTOz{fT5
zlV0{83(kE4a)JQHCi2DcXU$+VCq1h;)qEGh3c~>a^)iH0;2kON6K0byYZ7E=ww_!m
zi7C0}wzKz}<NHZ1a}&q-lbKQc^IBCPMd}Rln<QAXclxP5WdVo6Wv44hlwK*ATaQ2%
zbKP{^sAz9L)BbLN=YaO(jcn7IrSpNDGPjP3-!Z>@?07}|(z&sIS__X|rFdbnv-qM1
z+6UcATcjMyh<D}7a?iqw?2LF$r21VKhi}-|Pj#I}_k9(xS7_O*Sg9GfWQ_JKfS?)H
zx-J=sg~}8P`Z7Z=-yaQ^;^%t%Jy^oMx~WXP=xAL(m+cUd@+N3Ljlp(0eE$^G)pWL{
zbh>O`Vs<CZ{VhbdYQvy;KgPXsnr$%otguR8HsqqMrso&KZshsm8fcGOhlWTvPXhR|
zM^-E@uUfi!*2>Z{_;IdCapVW7gFA$U$G_G-Gm)<!TF|*j%yMei*`i;A)313l$zH(K
z8I_6YOt!no9cGTwpfkpgq>x51QE;JLaNTYhSJ%n(@e}OJgF~XR9n6@+0Sf(md6J56
zB{xz~F&;mC<n!7%HnMWgKZ)Uqtf=>luH%~%$9DMb%R>tBv$2Wew<~7i<6~AyKBwCn
zl%(Aq4K`{AvA%<^eoA_Y^~sCBy0`t+e>R&y8rup9jG7zOrH!K_2jYn2J|yu3y#{<8
zr@URP!pAFGEW21ev&JrvV^Gu{aIlziClF)j^CIA)Wc-`9Ww}qJq_F~Ra=0}2!v_R_
zl<{f3g()w#L-LrH+QOo~4>Gb_M+)WeXZr6XHrn~xWmSAzqq~=%x3HbmB)Hs(_KU2O
zkC`J&lUs@$S16Fdlo^$dxpO_N<SrKJ^$!F&Qq6hMZ51Vjj`jPYImbrdlzi;ZGd-9S
zuo!;dbvzxRcwF%5vU2pJ$AuYPX{2|>sF?-p16Xf*Y$UT+*W<Cy!IzqLxfS&E4R0jP
z_*RY`@#EfMT!9u?q>G|qjsczChMR@!Sf&VRiq)HryI+h)$#dbS=4SiUiH=lwKbDVM
zQuM`16?r!&g(>0*SUR>i%z&C-aZCl0?XB(6FUPvSwh|IJI)2^f*~=4n+P{B-UwZJ1
z{l0UKpi6>>X0FDqpItJCQCh^xeVy_7*!)E2++gy;a*%()EyKM|LGTTwaA|u%r>ZsO
zFZtCn!%+RT&o?#J`CgPa%b6VOOlvC0#PV(P(CRA&u^2SQ&VG7rHmnJ?t1PAdt{W_Q
z3U<+sF)RvW8vw4nidfUPS!|EV6R4eS-&{Rm;tFU=JU%`?`8K?Wa=m*u^8}<ORXgp@
z$#<be0P-lBS=mM<L5tak?ks{6`2-<?<i{I%Yq;3Gl>`RElE77XeS=*zq9rQttq$W0
z4_4w1QUio0T9>3Vm;v`LE;#w~8-2+RnG%78<2hpDUXIPf*3r)8<?;$-?)vO^>Ys=5
z9gUXEg<)q&KYOkRPB(C0=BB)S#6vAjcT+9=j!X8gUP8M>5z)i&EI{|GQ`p-@v4RbQ
ziu|Yyl}cMI=?A-9_jvJvEQuPc?xs~khhBWljCkQdj)6Ex>)!8*ow`xWYsGtfh%joF
z@L;m@7IQBvPqQO^QG=0{H%+FNpN1XKN762ag&H$Dp9|o&pL)-pKd|o%r4tyYY}}s|
z`W+tCvgP@6W0(Jc2B~k7_qH?tmT>RUz!(7X^2`Y{et+oMw99*u<xH7mT#NPjiLW&n
zA#`wA^y0~YvEYre61v<XGVk4Cs!fP)*pa7w+-KE@Q^U1%bs^5nZ!E@$BUX%UTe1a~
z>LC*PE%o)|`}yv(ZJiwn5AgTq&KR``wTZ!@IIH0LC>eXaWJrXUdr@{v>eCeF3BExF
zre5g-J;Q1q5xIG5<*(-pEEm>>_t}%5A|LEl)VAC7=NFq=E5Gxa;#r&&o?>8qvDVZ%
zrNw{ercQQsz#TU^wJ&W#!2VVl($Nh{S_A*Fl)Rp}_rDI{n`bvn`9J$fRdzFZy#T9L
zHR>{`i~t?bzo_>g$Da8yvs|vix2MtX#n+&=hy+mEdtrDsqG|vK*XEow9_P$Bd)^k9
zQiJ7H%lII)t9FpnQkREU*L89JuE+AucQA)NeuXk@VWoa{(3(*h!w}eNA1yeWYgMEc
zToKdQmel3TbZ=%Q)7>nbIqBDa;t6BO9lx~>BD1F`dJtJgU7jX*Islv&(rRp_GbE;`
zE?Uy_Muj%8yOwStfIIUICqwZ`+0gJfZ(QWVlMas~^T)%ROrZS5oeN}DP^in>VV1hN
z8e$fcp81DyUP5t$;Igcz5MD1w&n*HMT~lvsF#WRe=6>U%O~rdBx}1XERo@Y$d(nbM
zaK!Ek^Vt+Pxg7^_Ctu<TB!#u>U894A;UoID0*EiV(7>hA<gREvxcVd(n6=8(t|TKk
zhs_8rvD#|{tc!-23AlPGND2K|=w8<s&t^-iU4i(s%h>yt#?)k2bja)pe%t$L^ICT4
zu{S<yV_<`hkfftm`u-x-v?pKd34KPA{O_&%(F@~FtaYYm)i*M!jHF<Ec;=Pa3IRUG
zTXN1n_*T<S9I6r)r)}4>h9^)-b7fp_YTATKwzNy%BGYd$0m^7gc17<JW(G6^Zs~Q{
zSk+D^**~X5u4lE>>-K4_CZ^^IW})jI<utOJ3ZmL3+(|HNa2}B)L4CTzyJ_Jpu!Bt5
zr2<XapN&6);&&vkRZ1DN^GLry#sgr-l<nu#^NSpez-|d#V^_=2h}bl7#__9r^htH{
ztqpcM=fCMS^2N>I4xN2QDXDJ>DS>y1TVIzGv$iy|nO3k+Xq*D4TjPc9#tp-thj0}c
zFY_@?T2y{+q12ngtyAT*9^zN$=p9{Zmm~WjogDAPdiNyXE4)g+v(_*Xl+gAK66ilz
zH%S%}AB9eqt>}QgIhkkDPVuLqs30b5b^B13hIQK7o*JG%IlLKyDzQO*x#mNk`fizb
z88FpjVP{ycV{UKy<LD9EV6yoc(kg+eZ<>ePik2F$3r-}8t4W9%T;QU%`qEf32CIc}
zn(R~h)P)leiNq9QRs%d4ddZ1WIFfr*d7I>PSTN&ST1Fc_Rqx~&IHn27{NLnF7&cQP
zVxM-fweMNu?xMp?gT~NcQH!TA@NNHer+OG_oil+X*(fW~Dwf_VVPSDGEc+lNXuGEB
z6<VM@8-hBpZI`|lZ<Ty=m-cJuLvDwX{N}+xj;N9pHqMC(0@Lz7>t(pLJhZ)(xVT1s
zL-P!g#8=znVNp^@H)sh5Dzc)YL;F>`Z>2LB#bm%L2MIX@s9)APp?H)i12t33r<`y1
zFtu}X#Zsp+B-g(E5Hwk9@VIDaAKdbBYap>=-s+%lW1bRNuzf4wb|Hu~D!p~1Qtp1j
zJ920w#=0>@lweP}m8*x0=ziUAdhmxA64lL{wvJydxs{_N<Tg#&cItSG&9%sdbXNge
z0W_U$nndG#jTUB&2C;+_Iq~^*XM7|>Y7@L=jakDNZs*#nAdaKiZK|&r)gYPrrL)Cd
zrpYZ;ys_wv(bMU?@9W<sr$+@HEjc`5hWW~9dbl%UxE<El@zlhVq7S7~f(dRr_RW@L
z)O|^+{zm0-oqll`ob706O#QZkd|HO%nNRJl@cTi<`>^tA>(1rF8GD-Z4-ZX#)R}C6
z>ze#T;B_|-1vzO`*eNfTXg#j0_IC_}+SI3(BAW<J3%*vXHj@lW6yJOny`7c~vJD&!
zbg*W|5j~{G-!QmQ^*YwH@jbDy>BMy%HP(=};0mJF9a!NBYZ^@Wtez#qK1Rn;QVSK%
z|0?m(qD5n8*y#~Z@-$gS?*V13OHgvEGK?bq;UmRo_1+T1-2zQ%6_cX~W;L5^B+dNN
zl-`AiVT=4nsdD|SWG3M_iThw%r5V*hqn{jcOWmQEFGlpty^rtD&9AO6x;t#WNbPAt
zQ#$8RNYbGp+xm$$H2`;E+H{$dUcf-AxFh<Unkdci0oj-b=9NaQpDB6Shz;U%ukHOI
zWrp^Kw(gE&6YKN-F+kb_d6CJQvdl+{_XeNb7gT`|jlYP$B|}lsY|6e^oD?Jf@Yf|P
z@*6)fM)%Qaior|ATcmmXv)d-G51hQH?EC!o%vmkSt|bg}LGGe*34ZVkxhVUrmSjkM
z9;L|rzMM*#3OpjTi0<m>!k>GVT5C_nEqF|;2*qua^ZtP8t&}OS%+g#_lx20(TzcGL
zOqH>l1#zTXn7<fmcye;YuJH>WYkMT+5nOz)O%1$W?S!B&G5pq0W`X|P-_K^-kyNzi
zG~<@>fdyK8$3f3@zwIOGbMziD!m6E74gP*G3VzGx(~?Wmr1@53+mwGeKS4yM!erIw
z4Q~zvxMsvgo-yPh*>d*p>O}73^yC4%&&Fglvh9AC(w!x|6@G(yy@&H7mvg|EV-G?l
zLeHef+w@ln+c*&*<jE6JXpx~)Wl(^+S29)k*|x(ka*S;#p(8BG;|Ti3?<m&>q*G29
zlK3-c`AFZ(3+vdrXds>c)IO&Eh^=?D^biX}JjpDppT7Y-eChBj`)Bxo6U`!xQC#Zk
zFBxG@Thr*6vK_0(iBMt@)s5DMi#Onp5x|aT&a=Ue&M9o=R+XwB<n@^>H6I+9^;SP-
z>a2y!)sBDWe=#;`$Ge-yCx0J?P<~5F%v2`QP>Bgti&1OlqROy$Pd}8mNJpR)I5GtV
zIDphZ;^AttlalChEjTMsNp|vCbJxQ>w(7+-H@fJDv{6Y&%8Zb+rO)>2^z!LS4$v=x
zz@dGX*G^kpCu7<l%o}@NDs|*oTJ8vx>`g3b@PWHa$R$lvw+$UEH~d4kO5DO)o!<3b
z^2ELDXRUhj(RSQ8&Zaz|OG%NPQgO5TOmKe11eU~o^V@n9VW3Lp_iu6Edm2GG-$g$i
ziBoIvCB|;jm~O01(&ab|FVVhIp0-iebbZ!XKaS2HoJb&0iX2)THU$~)KqNvHc^u#0
z^d=ay%01~YVgX_Wf;JRvYe(94+<Mk=7%jes1t(9>qsPAVVp0_(03HPQRUM~`snT&G
zQ^#s-I#Ua-H#8|jThff$#tLeLzE>iP4pv5GM4<)59kGzDq`~J_Lu6loI{8m)RuPGn
zS@o%Or>Sh=>6~(%hqf@GSBjFKKAc{Bf5hh#h+jq1+ZHU(@Sh+st@2C9zsnYw<uWo$
zp`>MGK<cs|Vs%-hfDOALN#+hpirVFEL;PrjfSM}<0)DSB%z7k|!G&$g)HY{)bPuRj
z<}5&aUD-VQJfLBSe)WM2CAO)qGuv&s5&vs14ccIWjqBf$plD)tAzh~=G7MU!ys7kd
zv6NSyW9cYn@*}k-OVi=#?Gkkxw>AM?tGP{%Vw6Tc+&lV-nt0LG2hj}0^zD6S&C_D&
zZw^fwn~0zfJ`1gb$!4l6;CmDx|5Pg%<;c5!m(<OMNshI;pX2gve`#!OR9{4Y3X{I=
ze5jHuoAjw;IzzLT@j#1Q+e3~Z{p*Nm=}@xv-~ySNU4K4{#|+BiRYuFc6+v1E;Tm(x
zPySL-)zPU5zBE0OWJ(R3txF+i!pPX>i88R*>dY=J?=JLMPh3YorZ>D#cAP>o*Tl*f
z$XuI{&y93(&bQuYs=pWAkf_`V>DsDD@IWPX-U;R-(f?%8Dp)>h=~=CylSct{kUfYs
zKXf}w>(`RJh!_xS^4YxkT`=Ss#vz19#ds+NY!JK;uuv_N8XRMS*HA;ogD!unvP;>K
z-b>5pV@x!%nggnB-h=SvcDZB|`hF9kL7i0v7~?`Cl-Z9M4#qSRJCVr)7pKtzvMZ7M
zMb(O0J5%V!-$>~V(@sJB4&7?%_Y758WO+dM&(mv-pC&%;sD##?MrwV(R{W;3=g7Zs
z2Pn=TLc7<^G#A&^aH<^`d)aV)dLuIKn)1YZl1DNt(XESLmu%7q%7k~r>J>M(<1Uu(
z%^WQ<7L$@3Ly$jp2qEru1^`Kd5-!<>87@Hg7rxVe{v%*!NoXa2R3m%G^(g(d@CbX^
zkKMaUFls<aSd6Au2#9ynHTJin!;NnmTGZWlDHU-()jS59>@IIR%{;fhhOoUNiG(f_
z#Wh_Zxj{77K=3p+8bTffpV^l(0!Wk5aZ$m$yP8`R9G(giWg{k?IsGvw6Exnh2M!|F
zyW?qs_4(~4$N*n>Nx7lOm#l=KBOAL1R4lw@u(P`Qcdko>%S9)r5CR3tn4{ubVYKlM
z3#4QMMM7Nrp{wazmjIf<-CaCuM;Gpx=E`05GMZudkQk2Ox>J-cweSGRu<yRfZ-kyn
za0ySLP00oAh9T!5sjT;p)ltjKMn-pq$4$61Hy<p|6iwQxn6F-&r|fI0IQMX$_$CtH
z@Q~t90u1PrAv!L=I$@;34YKcf3Fn-y1T{AH=^)RUbGFN(cU*NB$%Fv6qiY~J_5Jd=
zPysv*)W9Y72zcRU^_dfJRD>t#cGEtHP}<5|K{%zT0Y<4wOHYHlk^NOi+<oUW`;cBG
z9l%n7ZWjqL_2D&6v%_#!KpZfFm6c0}Gh!TYL%LPAd|^uQI^Y<9>ov}LbIIEcSS4$#
VyiONdaP_+eprc`+Ua#s9^<O>#Im-Y5

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_blue_04.png
new file mode 100644
index 0000000000000000000000000000000000000000..34effaa41d50f87ec8e879e5dad28f19b8691a9a
GIT binary patch
literal 6558
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_01.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbf85a7f483427aaf0faba4c89f70acae01f845a
GIT binary patch
literal 6541
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
Z<dai~y#5(n^5+MMG15%GPS-W&zW{?;d4>Q0

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_02.png
new file mode 100644
index 0000000000000000000000000000000000000000..6d087dc041682fbed1bc6407b97232707f7da60f
GIT binary patch
literal 6346
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
Z;QhB)NTy4D{GY!IT55Wzw<^}*{{{I@Oj-Z{

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_03.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ec3e0c40fa9c7c255c4a537865998b5976aeb71
GIT binary patch
literal 6515
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
AEdT%j

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png b/game/modules/tome/data/gfx/shockbolt/trap/chronomine_red_04.png
new file mode 100644
index 0000000000000000000000000000000000000000..3d9a404462c3010db185d61c206ac82924616f34
GIT binary patch
literal 6517
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
Dw4|AD

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png b/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_01.png
deleted file mode 100644
index c6964845c5d5e5cee71c8ce6c7bf5e935b478ce3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8547
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

diff --git a/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png b/game/modules/tome/data/gfx/shockbolt/trap/trap_warpmine_02.png
deleted file mode 100644
index 88f787802024f201258a852ea35241e2d2c338b8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 8493
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
b|GxnM2&VCkoC;4p00000NkvXXu0mjf@hfC(

diff --git a/game/modules/tome/data/gfx/talents/banish.png b/game/modules/tome/data/gfx/talents/banish.png
index 8dcf8a09e7ecc1af4a57fdc5ece5e499dbea88c1..4be985d8817006a5ea8d64776125fde7e5915eae 100644
GIT binary patch
literal 3838
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
ArT_o{

literal 4402
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

diff --git a/game/modules/tome/data/gfx/talents/braid_lifelines.png b/game/modules/tome/data/gfx/talents/braid_lifelines.png
new file mode 100644
index 0000000000000000000000000000000000000000..f486ca16e3e626d84e44e72a91418e20e1c496e6
GIT binary patch
literal 5828
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
O0000<MNUMnLSTX)4_rn7

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/carbon_spikes.png b/game/modules/tome/data/gfx/talents/carbon_spikes.png
deleted file mode 100644
index 4684f1c67b77be09d8954151faca0b02894ed3fd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4905
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
bh1Y)rWz689?A-rr00000NkvXXu0mjf)T>b2

diff --git a/game/modules/tome/data/gfx/talents/cease_to_exist.png b/game/modules/tome/data/gfx/talents/cease_to_exist.png
index d06442d3522a6067e20689f1efa2fbae86f06834..1b1fab471aaafecaf1e1c8117ddcaae88b13046f 100644
GIT binary patch
literal 2671
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

literal 2521
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

diff --git a/game/modules/tome/data/gfx/talents/damage_smearing.png b/game/modules/tome/data/gfx/talents/damage_smearing.png
index 0795f2634ad83c14d74ca0241718d03b6f07424f..2824e199284aca281eeeb3f1a8ab0a097243dc4c 100644
GIT binary patch
literal 4590
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
Y0qh^L@xcQb>Hq)$07*qoM6N<$f*{@TZ2$lO

delta 2840
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

diff --git a/game/modules/tome/data/gfx/talents/dimensional_anchor.png b/game/modules/tome/data/gfx/talents/dimensional_anchor.png
index 13631e942c011c64603118117696e48d42b86001..b83df653229172b6faf094aa019d953bf785e9df 100644
GIT binary patch
delta 2132
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
KMNUMnLSTX!vhKeC

delta 1769
zcmV<F1{V3@5cv&|B!3BTNLh0L028kO028kPW9E*-00007bV*G`2i^w;6(1^pr}E$c
z00x*zL_t(|+U;A-j@(2TtZIA4_P_xU5)y%gNW1}&xNsz(NFlro7q~${BJd7KT#z`y
zLm)0(5eLWxaS7o867AS74tBf0ZuiVC#ITk!Bki``9`Cxlzki>q>dyoqJjEaPq<?_m
zr9C|P<o}yXSirBJe2$`N;F=m`-N5Z?6m<>f`^MHa4T@&CRx}M*SJ=0}zU{H!_erbq
zxSNj8#_Mg{<80sK&bwDH-vazB+7rq4nyXUiWA0}Ey>VTr=?n6=aAht405YQy05X_W
zWMUi~M%2Y-RDWT#(=9qYZ~x{~F7Ze1Kl~Gq2)L?(tF|brE!?((t1GaohVyDW9#_M)
zY71^RXnUY-g|_R_wL;tWXuGj(H68EAwi~Z+HVu}t-cuGhO~6z9StJI0aPt=S1h^@|
zvV<!);HHEt%UK^yAIlPb4|KiI_d?eVtv^ot?Rimb@PGAJ_f~=f?%o@6eO<#fb-)B;
zTQoJ?h!4uzV}cs4s)yh<=Kiz2ux~rGd*RIDf*D2_e%@OX4p26&E4si;rlZMjoPO&F
z&{!o781l3j9+n;-(Bgy~b_gKH!=4$uR^~r)MH4_j2!(+uU1f94T7#hRz9Zx1Y`WK+
z1@g{-WPg=4^;zE_q`?Ue^Bk_x1sHI;fv=janIf2+TT_nsU%KEtufqZqFA)7e(jXZI
z#^_FZst}Ef#}<DfLwMpe$XwL^AN2r9mpcI`D13s#z#G?ILk|GXf#VOH8zie@Jg4b*
zoQ@?x5_%1Si3IdxpRz5`OK`5hFF*gZ4k-NFr+;4rxZBhyNBPUuHOgHB)-fzDng(oY
z6jg<NryzNaa#v3NYHi=X!@d=6zjJjxE+9<_U;;c*R3Ec~qO|9~pa>fthB{h2Xe}B8
z#1zpHl%EJrStAdc41%<9Izqi(D_k2A)Htw=UMHjN%|Q@nYwZVZCnMGum$iXqCV&aF
zjel~rfxpTPS(*H9?iDhwu|h83A6gSrvnH*us!X69V^)~M&>Eo@p=ELKqCwCbG?4?j
z0V1c5KVf5m8JHXBvB#UMWP>!m%P5fPfIc$I#Ns)V%Mo^S(e1d!$dDa01V}V#(R&50
z>S5AjViyUcCQ@Rh^;tlc`!h~_w1HBGV}C(R6_un~tuF>}@=hi;5e9Qi<>66H#Rm^f
z&c?_lPIUN0hfj3)vgz=RYuC{MfT6iL>KkbC&~NFmZ37(+6gWNRn&|NT&%PXXdg=zn
zZfyOI&{!4X>L$=+f32#}w&O0)xa(tSZ*Dipp09=uD}&EGaj_|I*f=q{LOBFEr+-OI
z^J}`zboprz(c|XKY8t4RRen9`QIs~7q)?r!7+fA1n$WBwu%{VW%Ckrdeo|rOpxLcu
z0t8dUbUsd;3nR*`>$y8aT9*sZAlJO`5$_G=#zYfOJi_GcFRXZP&=VdZ6fqu3Gs-AH
z5sy$%e`rJp#q?@jWN20z$JjNd0DrESBjn9q^Ee;{7C^0O0(6kn*sX6%0CUf8iE%2d
zU|}h2c?)1NfGNr|DSj}KKgA9Tl_F9=63U7rYsvydQnbND(+g2Q_1@HNe30{jR5V^s
zF02SHTq_*3f6aUuRM;X<r;0{AHR{3?M3U8CQWIJ{3q=0TSP$Y+ToBX+n}0vzO%)xg
zKe=QVFff)0IJS9RN#VqK`jRb~v2c+K?hGwdEd2nFNVx45MIDNwZK1TQDsb!1$71Qt
z23;2lqKCGNilp1ANO~x!-nTuv4k*id9g^5d5jsu4QznVszWzF1dG2|*&1NWq_QlZS
z`BWUeDZw)Ixia&;q6kIMwtqO<oDau9-}l3Lrf}M~4<G!2AAk7%zli~_?w-ZBH*ceU
zW{0vFt3Gz2K)M{OKI}_Vz7ix<hm37q!|fWl%?52JBX#)~q=pKRSQhjBeW)gximXE=
z$)m@QardM5@z=xOmvw<}-g+Bb=McRYq&beaSXVQQueqX?eFum*#D5f&E2}jyyeunx
z`0;nk#(-NdT|wpC9J?RD^b-qY!0i!Tva*;_k!Bz{Llc=XT`E?P%Cf?ZH}5Pr0WUYZ
zj4H>hx}${HSW0ZEES2*_&GB(kVJu{{gN#!2!i!gyn}FQ=0QucHMvF!(cQJmw&RPy9
z&X|#g<MQgPT1+Nd!D2rE%NLq}{C+<JPho7z*%BBXqp&>ZT|yo3wHRhAvAo45U_0*M
z#Lu9J3*??oMh@mo;tt=EAwu&2d0Yf#q7is^D~s(33ZIbR1wMZR6#lsTUBc>O00000
LNkvXXu0mjfbGt-w

diff --git a/game/modules/tome/data/gfx/talents/dimensional_shift.png b/game/modules/tome/data/gfx/talents/dimensional_shift.png
new file mode 100644
index 0000000000000000000000000000000000000000..a3a3f2e3c7c839615c3f9f7f1d0b0dfae7ba0972
GIT binary patch
literal 3484
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
KMNUMnLSTZV6{Da4

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/dimensional_step.png b/game/modules/tome/data/gfx/talents/dimensional_step.png
index 1a5ec6cfcaa24e3ef8d423a4e8e6213091ec2a96..203657d98d94d531379bd4934b481341099833db 100644
GIT binary patch
literal 4363
zcmV+m5%lhfP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-Uk;57c{XdMN$9&5SU3s
zK~#9!<(qqqTvvU^KX+z!-goYE)?V-XX?xcuCKL#HKvSAplpv8(+7d(>sVazwkV*wa
zO7jPhHU*?ANEFnHimI=FD2dV+Nt+<01n1!<q-pa~-XzAc6YoxKuXpF(x#!nE&bfDH
z?6tG&)RCQB>FVCOvyVBybI$Mk`2EHLgtzdK<1Ky^&V>)zsMc|-Ha~lHfA(y4aDvZX
zay7d)&6Ae_?tAWG{^ZAh#=+%RH}toyH*yQqYBiccK;Zi{J)h9?2_28naS0nPLERy!
zyM#3dzv9p+){sacF?{5vYq{%x?gQY<ANnlUT>J?nw)7e0kWLPXEUvr#2EPB~ZD)1`
zlu9L<%_d<O(rh-fGYmrp2M14h9s~grcaSJTq8N!Iq}_q2gNkFMtsqKJaiXu0f><Gu
zAOg4S`S)z_U%BEsuDRsnNMxo?S^Apj`<pNQV-Bw#<&GEb+Sm$kU6=X!dFJQm*|u#P
zgM)(vL4fc3eb>`HBx)n=SO*}AO+aF#ogi@sq6CQ)DpE+CAdx^UNTith<YgQ>(&D_a
zZQS+ye+@B6oI^!GoI}Mqh;pddf;f+K@=Shj2eFFRzXDpV7JK&WVb7jD0Oa%e6K1k^
zrq{a9=ksg-7o|W6h=3?Wr2m-$QKFxl*C;`haPJcjbLdD5fIt1%^&pmcA9HVEDGMd$
zwRv{^+rPk99{i)z-vUXJaNxiJ4jeeJ;q7rk;DUg_^9Ws!rt1<q9znf9U^@i$h7N}4
zL3anIueaWNCjgt>Cc8$qBe5W2AxbZK5xq@N7MA2tVj*Jj+q0ioR{-A7BzVdMS*{SI
z3DNclY>!QifbZXPJNp*(Bs6WGom;lDuz8LhgIie$w=vV0MB*G0=aD#PwnPDm3taL~
z@8gA|FPs|zcs)m@Q0DTP-Tdb4N4TJQfeuEL=act*n%npN@Z8}6PTeMKcm%dfXuE82
z2l?)u|Iqg{o9vJsLvt()&an_~V<FhiRDIH{fIJfGts`O)6oWGZgRgbe>-BDu3<8?I
z#{9tSe~tSo<~Oj56;!OCt&kM{4F0D9`05qE$EOYaY3#Sm(%1N}6JVMbav%_G1O?VQ
z%H{H!*?uh~7#tkL_x&~CFGAWW{>KIi69a=CgZqg=0!(t#iA_WZ>Mn<lwpfkZJ;||~
z?K3nu?s+1x@7TWe2cVY+Y~Q|}xw*L$ct9?<G3g*F)G4LmEfM`eMY4=9*`QLGq<bpZ
zF*?iLkMCvgvyUL}B^$J4Kc}<4BsqPrbO1!bLyP};`aIyI>M567lOL?PLOh?qX;3h@
zFQO1-xPZAL8t=QDKy*+N9e_)>zni-s-^;%}_7g~BWM)~@3Jc2wLn#YOEEE=xEj`9+
zvU>Kw;K0BDq3`Q_;QE9O!v`9!PI@(mpyuFLJ;I8ES8}mB&^{Kk`Pz#B_{N97$W`b6
zIz(pg$5sY`#CeoSgeuDOse3=g9Y6o!xx)iac2tWM+MPCuQd9=YeB<)#*%r*P!`t3X
zf}MQE15{k#kyjq$LwEh^*{25o-(_;C&Q^bx3pZcD$7g<v&BalY2<C6u!Af%M?DYfO
zhC|cU)HtwRjs10(u<jC6UHqy`P;vR)Kfi&e5A-v+&32P_Y<U}R-?WpR!2&zIoj8`O
zmw(6N#)ofQ_uyam3b1Yaq)9MvU7B7O^F!OAUM!*7Ne>LB%1<G&K%`I+NG!bLbHB#3
z2VVqW=kQj(blEjrI(1Rc{?DPJoK}Bk`Ab|N=~zUuaR0%*{M9qx<wpnaSic-zSXf|q
zco^UJPmsYu5D<nTVHmE7_x<oE5Vei;)!JX8j^+XB;M>aFD<o2S@UcK7T>Z`Kx%B}p
zg8uOGYq;*cR~wFR<gW<=nFcV)FV546EaHw3#X>t4?tk?@KJ#B!u73sO^ZCAkp9<>I
zXO&8&KLDK$L=h^AA&OB^8h}n_gh*_(f0RJ1P?12axbM+N*!|_-0pPmJuHuFdTnjO%
zjQRCAKyeO<@<=BKQ32J-6Gsqb0Z>FS{N&Xi^To%nKC?;CvaCM(+Y5Pt<Ir?m0^7s4
z8#HSULCvM0EE9+XVnId1MW4TtM_+u3$>s=qZ@2|wt4n_k?bS1G_04{|0-{)mVx<Gn
z5!w;7JHpqV{yaZAbnDrN0t1BtVZ+0>UA$U@dmejG`w9a^rovI?1}E7XPBG_CG3QM)
z<IZ4Zdp@u8K&ODD%RiRx;A0^&*CSDzk3PKP%>jdXE61ce&V)VAdp2Fb2Zuk%mf{#u
zOt$}{Sg{&I6bq{+Am4ocdhTxh;Ov#dmZcq@6X>^<W3D;LoIlN+Kh2CY&1_?qx%wP*
z1`Gkx;z=n`N=TH2N?(h9_RHRtZ)^a3*Cq4=V}Wbh8#X*b+a<IeyqZH;^9afgbcFfO
zTn@lh7k`)wr_N_<FvYAl$$*q0O@bW@73Vb^c5;2<M@tFOvO?*>Cv=~Umv@l23MA6m
zSO6N0#=68$7z8vOhgz}Jb${Ej!TOGdJ%a!e8Tc~@aN9jy8~f&u{egizqx&O_=}C_X
znuDY(hm}BL)Me5$@GKB!6`WUnKMyV6@!E1Yy&oGJTfhA6B-;LtI$Hf1vr|$ztW;_Y
z_c_0a@Zi&r0x;}t%HB_BRRpY5{fU)HVKGt|$!S+vi4KBU`Xc&uDm;~fnew~V4#0Zk
zu<N=f<pU}E3mtt1c7tl6h$w|6f=ZNeZ+oOKm?aF4?|T-2^TxKBpEGA-mN?q!u~IiU
zNnM~^Hb`Ym6df2rDGP-n5kZNNAWW8aoqi5zwOX`VEuMPnsSV|V!1HLjzUKZ7?e_(?
zM_709s}94?AdkQF3;@p_e36^)_#Wf#2xHC&6OA#Pypshao%J+GqO7c@ASMurK%zts
zJlz(?ml-N-J2zp_ueeM&qm0{QOxP2QR>zpAPBB`Zz|S{n8^}vJKokqBh6A+C{c0?%
z#KIR|+C@jAbEi5Cu(;A<aizsWFaI}V_6Q@j5r(TH43|e3Dvxr$`)<O*7M&AK!b>4h
znOu+<l<@K+ywZ90jSE03e*?$OZ114%64YFRnn$Bp<;t5sr<q~Cz_>rmq(91pH^R6x
z%0zvPaeIvM>IC_u*i#58ki=HT{iDcad}Vfw5`zvFN>qjhPHu=-IE?`G+TF)jf19TC
zr7JrPf`)@#tn|QN(x?7X2`rIt;Lu|BKOXqf4;Znx82+Er_}@vTZ_Z?NE2{&h*}Yq8
zOwqtXA=#`aJ$ay(3)c^W!^6WTFM6g&CqYG#QGi+rN|d0YID@$~>u2}UtpOfeT{*6p
zn&LgEo&u;C(=#<i=^;MZRf*XKs%IOdsH@*ATkghS(D(gQlAyqKX*wQ(>ku{^O5_dv
zY1mU~<yUp>@H7x2LKH<^4=`WO{QcB2@A3gFn|%=rm5{MM$@aTNqEsI=CP>eAfRa_)
z7z{2hF0#0|$dgY#xglO3dZrV^NolaLy=-lJg%uaS;&R|nx2@%?|N3oqZraAIKgFCk
zMKI9pDS}ugAo^a>yZklxPcr^*nH3-zG^Po$XjRX=77!6$Sv<rmi-$J!dw+ZXZ9spE
z%jWtZbKW$w&J5G`472q)W~y6h<N{51d$NA7CP<L1E~68m4pPagpPg#(WXH=#5AyQS
zgZ#&f_x5kiQo#E+?dBJoyE(scAquO@`^`#8L?^-|ONfxCc=iOqvMlU!jl(NP*L;82
z9%9CuWX_#o#-3rOKFf4<D^4yTPE8MUrpsMr0;ns8#XzB!*ZDIO0N-^9(tU4eZ`1Mc
zZAb6@x=UDf@hc8N*`Z{Wkyv>6=_mN5uU(}}<Yk+wV2oLRiV0_wI8ONJ+!c&f#(Ny#
zJaKIBz6S#JRrE>_oe2MN@mm~AR_G|9V*+$2dG6E!@H`LS_fOgjl)d(SLdT(2Dr@LV
z-QOtgv%Xc7KqN?<80S}+1}BXOD^a(G_rI%0`02h!`RTq#vu9KG6l0SUJ;^X<M2~d$
zyOM6rRjF*b|I5<1(crhv>hR>`<eIj4Z$NC@)`>2TOu0Kkl5Q0^`*23`YCP9qY$ZBT
zSv|72QYbSKj8M!EWChS1Ii5cB9Em7etA~vO)KI97qq<_6q|!jB-X5$|4F0sL!+k5o
z^=O8HUiQ9refl8Jb_weae$BzJI#jHZ35?ap2i`WkoxRuJsv8|5jKgd33*Y$w`;P2q
zX{DuuMGjQX@QNOs7rp<Jj1=i$w3C%HTN+zxEwR*E+VJm%4G+I=?68_gSoQEKE<xGT
zXE9)Nbu+aAjn{jA{s8mNolI6|n6AvBB-hXWx*d2K*--+m&TD_RbJ7(q<O)pHrWvnJ
zGg6sk)4(XrfpInuOi~hG%ixai<dH}C`u^WIb-%;8SQXw}9%8UO#9(QNW^ssSaSP4j
z5cQnbT^R}vCrf8`3vA@bSvkUni*LJxbyE$ldIVJuuWXio$-^HA@QXgpQj;6*`Z|C4
z$lozmAK@?F_Z`McQ<SM2?AK+lb`KX=jUmZouW&e7JTn0Zf`Dca5(cK@+w*j}yW!zC
zoGkeTH5b2XQ({1Oe#J`5+(?j^o|0GB0akGiVtus-4B8+pI18w_Kpacf8k4r%Nag`_
ziBF>7$VLLtD~IRj=b4(CIspm?1_liL#r>UMQEa-sI+^|_N;K|A8uz8Q1-3^D>ose9
z{j>qfh#jx&>15k(b&bwc?~CU4Nh*Lc#n(lH4FzB=7_8N5Yq!ODo?&~AF*zLq+o4ga
zbQ_)IIO|)3a<>&udagZIcdyamm9%a@8ZUR7qS9uw9wO9>0KJUx=<D4A%gf6wFE8`_
z^UrUrb)|08bh?}%NNI4*C9HV51El2Qmp%NFM}?|c1y=Ve7C|ZK1FUq0d#P`dDLqpV
z=?TP<GnE5g>o|P$2#1dz;hB9u+pzQNS3H8UPf+&hbdv17i~so&X6!j8YqN}1rWq|w
zv86aeURAs5FZKToIa*eWZ%!W2H-lDz_qe-xr@fo`%6m~snRYC!bcCB;{uP#zm(IQ>
zskM$`zDQ7U@hiT8#DIFC!QVXb_W(@W(`;)jFj1XhtUSX=X`0Q&>Av#!YDZW#v!5v8
zs5<n<Z-IO+Z`|Q-*LP6&v;|&u2r3>y#ltH(1SKDTz$cgFvknl_=7&hj-ZTI=?z)Nd
z8t=*)9@?f0M2YkmqFpOo0kOPJEpUPa_I-W29)aT!Iv&l2>F}&KD3Ujo;KWE?G1j-z
z-}8yYV81yd^Q|uhsGO0xmce+7-d2H^R}Qe#?n0dy2vnv;Hig3^wZPRnx6sLK@u8ui
zejecaG%6MI&99CrdmpF$+o>Pbg+R+phf-b0N^S3~3XIinm8ahXQ#s1{GONidOYK%y
z_$c~hZ|3?MGc-Zgg#f25hilcUUJ2&Ae}QAZ2aqj!4S9a0L0ECIi*;jU$Z<rd$K%he
za8n6ZIl#gzdhB1>Pb*sL!+N0$f4$EW;{+ewXaF{HEFU|@^08yQ@X|{g`aQc`(>kE$
z5ma514}83$M_BUliUIyWfL93c3r(uhAS{O_0IlwfAJ_V#G7iv{$IGg<K2P#ofx)rr
zIJ?|;>aw@$DR-%~6i(mkrDQ+P$M?VadBE#dsl3IH{{uBS$57mRyxjl*002ovPDHLk
FV1j_&b!Pwo

literal 4307
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
BNtgft

diff --git a/game/modules/tome/data/gfx/talents/discontinuity.png b/game/modules/tome/data/gfx/talents/discontinuity.png
new file mode 100644
index 0000000000000000000000000000000000000000..9fb4e35106a124e7b35d40018dd7bef4d8d37e0e
GIT binary patch
literal 6684
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/echoes_from_the_past.png b/game/modules/tome/data/gfx/talents/echoes_from_the_past.png
index 9b013bf3c8fc01fd3fd40f6bcb2d1e56fd2273ee..1370f0481a851736ab4e959263113504aee5ca0d 100644
GIT binary patch
delta 4101
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
D{do$6

delta 4332
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
a0RIcXd1=AvGQ~sy0000<MNUMnLSTZN?^|yG

diff --git a/game/modules/tome/data/gfx/talents/empower.png b/game/modules/tome/data/gfx/talents/empower.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa2f4c042119607d0c128f4578a545407a6fd7e0
GIT binary patch
literal 5318
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
Yf8W{8EZL(WK>z>%07*qoM6N<$f=#ebR{#J2

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/energy_absorption.png b/game/modules/tome/data/gfx/talents/energy_absorption.png
index e196a0475a05d6efe9bf247891cab2e862e7f7cd..aaea4e17c21152f433d3f1bffaeedbb38883e14b 100644
GIT binary patch
delta 4373
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
P00000NkvXXu0mjf#^P;)

literal 5206
zcmV-c6shZpP)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp)
z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW2OI?q5=8}$)Bpez=t)FDRA}Dq
zT6uU><<<Y4clIUgWP?apv#=SEAe*R&fCxpZg2t8){m`NyMbuJ60jafUQPKxRKv^mp
z1uYNQ0zp8f6bw=byM$~c$dWyiW%fJwe1F_KGnpi~wD|e;dA|G1Gta#<ckZ0u+1}rK
z&H?_z54v6t(r7e72xj*C{mlFy0KjUs_Uviv-J3HqkerN|80fU@mtnW#>Q$US&*#oj
zX{n>3q2Wix^Me6swc6gjJ5QX*<Fcp^Ar=5JKoA^y7z5yDMhWowdEUOAjvcG^dc8j}
z03pPH0m+X&hRN}WCx8GVfI)%Bs3#o601z?T8F?*Ow~h}Ts`2@JKMjDmxVXn3H$E`{
zi3EUDS&2cUJc9@fCIS<Kp}YYMRz5%z@NOA$a&YnDmFoyV^L=g_FyMx_Ue)|}C$cJX
z3xGhX+yr7GFi8C{U=39_0fYv^kQlyoJe5>g%gbB-_W+C@oxI^03=T>rC}=q%un2gL
zPz<679Xtv77%>2JB8(Y|8g0bcv##qB+}{CU?AYXY9_Q{9P^4((>!Ot@C=e0E5JVKz
zJ_ltF7>6T3qx$e=t@ZS2$BzqO@Ziqx%tiOs0ZJ6qG*K`TR2ZzDC=xS>DBx*oa0hNS
z5^m{(^DUO5BFB#fpi`$#YhT8Ikmvv?%mN``3KAyKO3*-9BVZ0S7D#m)Gmtq5UmUmA
z);g{~0F6fT!V8uMV$fR05J6c3S`S(Sq2PvS1rJ2TYC=-7DgrhE;t95)yn8qQJGr%E
z03$~xF1rgRB?JZBptFL%^q`;_SIy7?Q6eZbDM*M|ahTvMXbQy$6j~^hHwGcqfHMyL
zxpR)|xegc%hIikMxnBnm7}za%)fzf-#A~<PWm(qgbjita6DRVM6R1}(G?f5QvS+|a
zJiym7j+Uahm>U{EgqRra+7*3zA%l?!kjxAmWZXO5UteE;-2jXjk@VMj97QAv&MCwz
zueci<8?{=k&1N$i$!>QwH8nAF|NfocSk5Df6zPdr$u&eQ1N;40wTcfM@U`bcX0tgZ
z#d`bg$ezT*fO;ACE#pInYOfoB*I!SZ+Z`aRtHQi_O)i%!D=Tr<EDTM6h3G2ylY>~d
zPOhn`>DMo5%L-0c@{wQ$5wVM~;vbxo<85eY&}cNBJI9$!xO}<A;b`k8F)=aY#%Zgo
zIX~awa=ES#fcW_MJ!`2yp$s%(K8lO0?z}VM?YWfVWGK`C0O%7fX3auXRn@P4m9%Oq
z1egT@kO)h5W5tR(Ns<N*Oqe;7N2kIJoMX<*!{7c!#l^L<EVubny<Xp~TV!S?x_5_8
z#|;fADZ%N}sI092&c&`RfZJ|M*fEz)L~mB$si&$F5)!tr!_BVtzv7p^#?qzL$;k=(
zHc@JTR;(}PxpSLbE>~)5;-W=7Bn3UILK0kx!{&eT+i#<+tTrh6$dM5<X5iK+Br$<m
z34Sl5jIr$uHf}^|Y26RVLgU7nC#M30mAi4~jC0Hw^Slg2@vYw(pxAV5%`?^1)ZIG4
z(%TFo6cgq=hpH+&fR+~Do;`SPo92TPIMNJH55y;;Q!NjVLBj3WwM&*HsdH!BAO2wc
z{m*cd5mo?zk01dWh6Wr*bV~w{8ADe*rlKOxwM?OHb8WLR054EoO#r%g576VVcK}Et
zj*AnuwQ_YeC>|i*v<F2+)ylVCuh;AKHZ`HT8YfR8H&@%YZ}f~AxVs-V=fLfDcj{zY
zy_zSQ0ES)g-Uj;YGcGTO-;d;Ej2wx(6FG^HA^4r?uvnsVbL+ns07(J}8iK*V0343i
zLbvue_7FTC24FDAAi7N0w(XjRmL%!q$=YY0(Y@I{vb?<6U@$CM!V@gSjKknX%W&{u
zQ|sj{H&@(vW7OisG)ZtQX!(6?x5w<<+0el*rOoxFOALaRI6a*K96c)6M+A3SVXqU-
zeC0}$#bW8z3n1iIqNJqZ+XK$$^A#1<dA;7TV=cc(B@iDVo;H)e_@Z8`)s7q)GiOfB
zym>Kq-4zoV8F}JF!=sPNxs43s1c5)!K%YJ_-wojGS=50U7&97Xv-#vn`=8IWHiCLm
zACFb5;PH6+_c!$y0LlCIeP2eP*XyTGhgtAd;spzF;X*^#uCZ&^8oziFIk#Z>Q0#aF
zALi1)fid;<_C<?uoEYGA;>C;EVzGQj5H~jRuqnDUK{p6|?bMw)<2ZWMU>HDIDJ<OT
zJ;m{uzXm&Y)EkY)B}?=}W9cH%?^kkNowG}q`0?Y-Q>U8mz1KWylsPrkL}YGgpw`%W
z^@@7_K}0ZbIDrit8ls}2R;{8bA}qjqdNJrO?EBJCQPC)(jT2G<MyeJ?vgY(@_qPF%
zB+2D6O&SCf;l_bDQe-MEZP>rxzo*DhNPMJ)-aE=Kuf(B4^;)fV_Uwqc!=WL(^Ch-y
zsf~?|-Ly$O+a0&YVXzg$qA|W3rccCxdvvw6riu!$l1YXRHO{yNKEm%ea%ri1@?_KV
z8E9i+0G+*5pF{@^xSN{|_l|*;pkdt58=rh;ays4LM&`=P<xa!&SuwB?MvmgEPIGCg
zR9@bkpYPhg-*w`I%WiiiCE0%S8{>j;Y$7@;F#kC;HoB%vvCK<pD~E7#nuMv7;EOXJ
zJI0bE-Exa*@<7xO=lmJ<_3l}-j9KQ6*Cn|pKH3VGOEdXC>a37_;H(d)PI<1Gg#dUw
zp5Oh>)Oig}G$4cU?&G{~nkg^ObpAZKT(H?NcrZ^M&6xxu6bn54TU1okb?auE`vh>2
zgDYKYB>KyE`6fPbo9WX}-OPYsuMDr30YpZ2nBW<p2*Em?&gb*FNf#jOH03`0<u69J
z+ubn$BGTz}m6i4<o`|kqieGdkGhtE$?s*VyVhJ!1bO8qX4;k~H<s(PxBO@bUe33IR
zhIH2+1Avqi22fos`$1MhR1^WYZ~;i~7(+!PoKC0BW{n}W_(b3#jI=cUsZ;Kbvrt-E
zR8Ee$PoL<kSM77>dZw-AJrdiA0X70wVlChz6cGPrJEl(MBS-3^qoZGXN&8C^h5K<^
z=>bkl1AvkeR1@2XGcy^$u3e~2>^NU-+Xh*dQ&W)wuwaGW#}Nh(z6KZ4>2xbsntzo-
zyTMbZN(z58o6Q*+x_<r8xie|CsI5g|Ax@u0U7a03@7^&>m*QTgYq&uehJ%SbaiZVr
z^?vYy>F1qzXB}l{OHQYA-n@uE4r%+_Rh3w<Kytg?D^^&4od#x*tdz@W?IoT)ySW1w
z8a>*aodOVdAsCHXh5tI8&Vm9I6m%e9uU;{m*Q4(@2+*YV(uaLAya@vaXbv9qzW=^y
z{CteD@k0-3-g$@LeA9jTvf<H3k)ef#Q6b~~ZP>I4E|+WU*ocQR)V-amCFay*HX7A1
z2mvseOfzS41c3<_BD0z60xWRgz^EQQxU7s$ooey>{lTB4rgGnJIv}dof+1Y^<u8$+
zule*-@5hsM)6%f?VKg^Ke*Cdx%a-OHJ1j{_q|u<N3XP2|0B*a@n)3|X<UmjpF*87k
z1gll6gmEYaZoXM}yI$F<avV50IrPWl$Mcq{SeXN>HEba?8o$k9Itm8<#ULIv%Hndl
zmM+C1i4%!e&*A0E&HejZB}pnRZ7C{haXLLcds?1*&hq~A$N&>DlVSm-TEkYrWNMd2
zCrv`6%Ew_P&dQ?0ht;oKE&x2J9y(o^wws$<(`;PBg~HO2sSFb*V&6VoxX?6vcEr1D
zITM(BGqMNcq(fIxq4WDWIhk&Z;4Z9gnw2d#2*jjp7qoy@8_tDdV<T?OkU<Pm5#M<y
z8w>{J+uB+Np!c=S*%vROvRfN9b2}rnwai6zt-$Hi%}*`BWdev32xH9rXa;8X!GuUo
z36yFAH5gW8QxqjBthqISj0{c-mJ<LFkFauPrmFCY3N^c@q#zuC=U63o<nHZJsh8el
zK6EH_-+==yujaz9lpiTnWnu;b?!d%q)k7^&vI`to#{vM-)7b(!U@Zm^!<arD8jS|P
zg$t?>Sy^EK+-`SnF0QTn_B59Nb{Qv6hLP6y-{<`f4(S*S!K5NlK37Ciq?bXc7H~K?
z3_w~MQR^x!K*SGZ;Ep>?0IptjZ*nNL-nN8x=T84e{`Nl8@%HaZ8dj{}APWfaU&n?G
zECtsj(b{1c#00fu#>5OTxU7<$PG<-J5hW$5=vB~=L5L=PX(9LQX^|vp$r9eshztu4
z8x|I?4u@m$V*WgaFQ%a=jmtCO=pB?LO#R+uJimg!`YNn55E*G9q5}s|8mP;2Am6j%
z(ZQ0La!Me=@#EoJN+E>B!m8SdgLQBMvVb?<pgD8QrKOHJa|}a=YTMOBP*T#IogHB|
zv)4;H9mmE}dOF{62amfIDQDDsO8fE)OR;sUGhBM}Gtcnq)uzfy_o<7<^c1BQEQ1Ne
zB!fvs!Ag;n0dNy=^eBY^AR@h<Iixoxgc?WVEd1d{EPd6yZ=e6~fA6@6Sy$IwUr#~^
zS(Yzd;!~%vb*t#n!}7=@G<GcS-;ec6P*~WuD>HQ}9=)5lZ9`?HTwc!T%1T9BtzZj~
ztacX^B+6=V0{HrC4g(;|vcmx~ss&dH_UK5>;e&t=o};~wXtr%L7ZjkT1|AQH$ZV$g
zcw}TCGZQ^}ki`P0lgi4FpO3?bQBu;hc(G>ra&uFYqkS=J$Pm->Paulb)zIZ)mBv!A
zOQ@nz@;?)lb@;EJqPf}A7J%Ij*i?z3tbA&pg_Xjg75I54zUN7*BUBR{GK4^+hT{aH
zK|+AQ5MToOlW#IkwqVVgh>t#!?e^yO7VF#BymBSFlrX?mRRkb9I?zO5MRF!3l+_?o
z6GJi4_U#>&RW4r!_iWW11)$Il5%_=@1Obi*#Vb3xz*jCp3HY0DNRp74h}1~75oJYU
z^=~n9BrRMRQCS&=LE2(2=#HB%uoR0Kf5wFiF1=o_ls1Bb2E9KRzr<jHO`mglxwiuV
zg@rQTMr!mcUZ<{t6l(ppCg7wN(sq>b+i#<w0Cu}umSu~@lA4O_Y<~D>h$T!P0aFgo
znq_ThXi=gzI~!Me<EC>g#bWMXc=Ki-fUaHX#spTogB<uf3hj*)s~ll$+<1-BBD41X
z@vthJHVRe!16>&o_GTz>=^*;u$5^-!g@sO!M~;p*TCIAg(|75T^Rv&Svt|0B<2aV6
zZzs6TeBgjYM2i;bmSrKLmcPlsuiwCX@A(vNJ8hbF%8dx*nIL~sjG#JoJ@9l69Y5~v
zxGq#)j^jQ>{pw=Tc2x>2E3Bjm!k>2W>#uvAPS=PL=Jo51pMQ@1pYhhMy6kML!C=_A
zvw7aLs3!*TV-F!S)6C4}<qUA1nWoIZhab8W>AQ3>JUmUMYav1rh(~}KED>JYi`~1W
zYZiAU$#1i1?#c-COj|XynMjR<Rt>TvK6?6TG&g&vOfj#26~h~mP)oKN^zzZY8PN6@
zhYpFtLU&Sk-H>!d0Ch6H_`+9Jr9a$=*IvVg3$Ebg#lnT+=iLKbK?!0-Y*K?4z*{G=
zY#DjI{%@<y<>jFQtUif?wO|esl2-jm{`h0Au6CuRnO<JViG^*6^!%PQX_8Ks<;|P9
zk%)j%qc}3seEG6->sD7|W2jpHzyq3@qdCMN6vCr!z|>9fx<b78BAm{S%YGpMrKP^D
z$2l+<ptQPz1`U8=0B`_beWh-6dK9(iKLp@`2cXqz&!49<JA=?I9tjC;|9kv+!z<6i
z8t|FG&LW^YVkhv&gFJse+wIadM^Hj~W8ScV%0fbO7?~jsB4`Qh5Yp4z7YEcI_UM7g
zNTbu~t*HS6W`flk*2bMO#jxfTB&#YX)#qEKxMJY(HN12wnwtFIHvZH4qOj2S=3lkT
z?_muG+Pxf{0-|6OTLWmd6xgYCe0V%8Nf1KlbRc3k!|7C;fL*&9X3fH5cOjBFxY)N&
zpmo4U$9d&S6czcudkCn_^~R0-NgXp-%|>A@0R{-nk%VsD7{KAf9PU3Mi~aMTXliP)
z*)%uYzyPWosH=kzV$K}H-ko@MJV%leU7_hB87Kwb{E8>e<)@zdUeb3^nQLnDzwm<S
zwuWwMRpL`k5df<P?!1$B?ZV!@$onshcT(t1Wd}EaHaw^h9(2<Ym`|NTLxaa+F^n3;
zu>?Djj@b`*fF_{44rkADem>>r<I*K=Pn>@6z|*i{V#6||ioisNGGZe_YuP1%$&XP%
zfhRT9_}XhU!5vzn&t_o30_5d6qNA-Je#m3fSY|xD1i86RA%xAQkBfuZ%mxD_iCbFG
z*ogXicDeq=X@hG{Yz-eSR=<LN!6_Scs6!bnAP_#SrWrGE<%%aN$~bBi-F!0)2An%5
z_UysMiw=Xquz0a<{)4Omj@I#{NnBa^FLr|e^`l=uk(Vd@2Q~gLHU4~!|FG77MC(7I
z^B>jukLmpd`rW$?g9aIdXd6h$$(BF;$>J)p$fXv0ndQFw%s<)GVthP3`6N9thHN2I
zP;hXFh^_$J57OSfsHh;n9|;LGd^qmEU-UCE333sZuH_XgJdz~+WMh{ajTkZnvuBID
zdvc_rY(W&7;UXqTL@fd`!9v17Ohinm6nJ?BtzYl+csxJ-+^Es0&C0_4_hZZm>OrIr
z8$u&x%!~yS37JqOu;&oH^%jmDbN--|@}m#F3Lz2_Gy?`;;6Uor2g%746GJ)ynb6!U
zYHCniOeap@*fErrdawJ4=yd?l28_X=HyWYQfSJ5rxLm#;&)5I|_`iDm53KJ+rL@QK
QtN;K207*qoM6N<$f=4*S{r~^~

diff --git a/game/modules/tome/data/gfx/talents/energy_decomposition.png b/game/modules/tome/data/gfx/talents/energy_decomposition.png
index ac7fd54da287366c2a144d54059a701e643dab03..b480066e721148758d7c336b47f363da2662ed94 100644
GIT binary patch
literal 6420
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

literal 3420
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

diff --git a/game/modules/tome/data/gfx/talents/entropy.png b/game/modules/tome/data/gfx/talents/entropy.png
new file mode 100644
index 0000000000000000000000000000000000000000..af9afe0b78ff555944d648432ed5ab1a3aa50c1d
GIT binary patch
literal 5205
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
P00000NkvXXu0mjfm?Y}h

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/extension.png b/game/modules/tome/data/gfx/talents/extension.png
new file mode 100644
index 0000000000000000000000000000000000000000..050833e330fb249bebe115b491733f6a21e882b0
GIT binary patch
literal 3820
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/fateweaver.png b/game/modules/tome/data/gfx/talents/fateweaver.png
index 3a0ae723fc5b3a8af99faf4c50b4cb6c4d1c471a..c1cfbed29aecde24d08b39080affdf321e8a7151 100644
GIT binary patch
delta 3787
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
BRB`|S

delta 3460
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

diff --git a/game/modules/tome/data/gfx/talents/fractured_space.png b/game/modules/tome/data/gfx/talents/fractured_space.png
new file mode 100644
index 0000000000000000000000000000000000000000..7b5338e75a13c3d1109b716f62c2035d221781c7
GIT binary patch
literal 9378
zcmV;TBwgEyP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U$O11vSVj^~3-GAOJ~3
zK~#9!?VD$`Wo4P?e{b61q<ikY6)A#HWJwmeNGc#fvIvS169%MFL<DsVpzUab1OcTL
z8X8a#P!J>(AW#HB5Cs$g0imGs4d<S)(;Mc)?Ji`hoN0Sz&6>4l_P4XnyWjo(|NF_$
zvjq_NfB2IBHy%m|@qg}F|1JSDhUReO$3KIcDM_b1t>*(`EFuq@-f)52V2osg6~v8<
zv`A==&mitK@l!(-D`udDXL$W(yx4n+GynNt0oY~713C17Pg5p+)bIpz(*bjIATokN
z8nRHslnKU4!a%b4!G}5fCualj%L~5^!x1m6pD;EQk!CTo2Tg|SDJnJC0^GPD?L?%d
zBGno7);Jelbr~05brZuwZ63XTF#}tHa%e2V)u}|n15ZB8$3OQz0QA2zvAVOI8!tPT
z4}JA4YQ(f>DNN90Jwu-o8>d7qh+2J8s~CzR;(mmW8dOz_G%lF6f#TC&ycU2)qrv+>
zdKz9N#8I1(bOtj`MQXqrg%g6B4UCk5#09dUz?>uYTSLH8FD>K1ZQg>NWk^Of5Ya3J
zBXLF|9aYxEC9`P7GZ-GkBvk0u82jwDl#8#riHXi6>o>MQMUtQjg3j?O!ReI0j4fHW
z3anhYjPIX*D#?nH)CRN$<rPs8kqlBAlWm&g!=!^4OrNSYj!P%eLn|=t<$U$(%jstY
z0H^(zQz>VUlg}H2kuD7l4Hu#E27YRkXndH_al?$BXQ;5$utbSqtIf6o;Fbp-C79W?
zdqd0^)M<tor6pArlXpg_CTBv{M7Rj$HQL2EKf?A4-nItM15Z9o5d^u_417XaGlU_5
ztgXWaY`(!P046)*eD#78DSKlGKfuV0SXR`$re4-)hL~Dx2tyHrQA0kXM2?K}`0_`%
z`_U%>IOrYwGP31dMBFD*6V$^PHQT}X0u?;UYT{f|&mbx-%6k-&7{h^k9SFd^4=ko?
zHj!zadZ^JZ>eRCt(BFhA+ZgBOAfh@nK(s8f<uOgo+>O^KiXs3W`s0HPaP+-rAOuw`
z2q}nY9R%#L%Vxa)m|X$L@{G@1@mU6AuhI$=jOZ!a%F~D?&5@GUtem7R3H1b96O?hu
znLoM;fEjZ}Iq;-+LM#~S=geExVf_^=X?2!knV?_mlh>zkX$O}~;-d+i?xBRBB@D;x
z^VT(o`^{6oAq+<(I%T-uq}3Tl4@L;Sj*K<Y2qbeY(fTE3{gP;wBW}W0TTM&RBTp?R
z);(lW66z45e>1Lb9Rw8l2;0rylTRM`P6C0_Rs6%PU!*_wG9zL@Gc8H#j-+XcYYrt9
zRo0~J4fD;5ufll`z)2T<kw_~>%8K<mCG#d6Gp7Q&sF>6RuQW<l3}tkNI`oGoC~K2=
zl_9;L=3(oRCbNcz0l53-Taa2}ydljEwOo-_j@TDyU83WPC!Si&1($t?cYg9{*4t(t
zX*1>bzyCb|zy95?NoI``&&`NtfJg<wLnvM&V2u$h^EO2`i%r&R^Tqu}`No~!ClEN{
z!Ef;8^aJd^+YW?wMG%H6Z&ME1*j2N5?2ZR{`nf*=@Q#mujG060Gt%oZuTwBQkR(MD
z?F`*W&~Xi3&F3OyN}?vI;)>uKNLxpe;zdA*l6UR(7S6xv2JZO9ZG7>|XW|Qo8f5(O
z>HB%?smJ)u?|;wZPd?7rs+E7!y$v;6ym5<75zQPGrD!FlonGY$!LCh!FH*{~MxHv-
zE#~pH=qr5f)-&<JbLL%_Q+x0l-gV4=9C`SG6uyNm8^}(@71vz=z^0pQ%DWCb65THu
z&OEJB5lfAsjtDWqOKj03AIv0)46T}_VM=5g@Lo|O7zBYWVvg8tKhD4D20Bwyoc`ex
z`Q0;5vTXJ8zX>);Qg+*QcNXlr2RrP%CkuC2$Xo+yV;nCn(rQ%jph{Ha(P_3e0g@E&
zn`9<1NJ?gG+T@~l{(#T^{3Hft#vseN^zxgz^zxh8ckj3H?qiPQoO8djW~1xQ`6`hq
zDSAL<Kq#_Ak;w>I#AGJM(ZU2nLps{plO&R099DR$5Rq3cDyi6dv(}n@Z+&3V>%eNI
z*!fM{vHdPPvEyF5u-9%2nU&6>3=xxYN}&t^a9Bb#iu4|n2c*sswSY9Bqhf6WhK4kw
zwI-8!O6fh3)65-7ICY;-@U=zfyzUTp-FF9f-FL^D-~aOUlX%0hp|BMb5p)UUXsSq3
zG(lH_G8kNJ7*+){<bae6?*q9t_>kae66;Y!BjToeezIoo1zYaO_FM1BP74;W+g>{|
zXU<Hd^2mBglqw=3f-NX;R9aJMg_8oW6o?d2c$DiSWe*=59*vXhP=TZl&D2m$#>i5l
zG-xB)e%{t=7Ju)wQ(64GXSx2)o3ZXSQ+nEYSFm)v$I(ac$LiEFQ3=HACfW;RBgd-%
zHl}U^qrPA!J<{MQT})NgsH!2PY!KJ$m`HKs{Wk-!*`}Lw@l`)YqiE=uIBw!)j4%bp
zbV!BA1Vtesgn;oC(n2f+D*RiRTRFVTag<c0qq0y|er*DRb|_<sBS|R*{X{XQJo6f(
zYZgEE>dPE+)FB*l^ie$a$Q@ks^Ix)T)dVZXCOPBWOF84*OL_bI_vh^&K8)F_MO-Sh
zw1`BYZA?;WYQAJB66m-Ex{h}-m5UHUqi{%Nx#g~30C31V_NF;^DaO@FLyJI-AOzAV
zq)rfcf>Q`9Nu5MV52}Zeo=6E0;GLtip0Z4-0(dmNF~7DOtfC5;6x5r2l17(aGw0=Y
z!7C$O=5Me80DpYpIi$}i`<ext9?T^toy!kC@@@8>zi`clw_LG^Pww++7XR`g%v2MK
zA$%A@n;MOlqBcXK+X*6VB1{t_Q<7kaN)ScC!;jy&X0LZ0vl}B(MMG#}B~iwqBTJe<
zY9bUV-qr}Afsu9UBBJgEX|O0&LR8@mR4Snm4a(5u>~p@yyWjhPwI#p`KzpLtlBj^F
z2f8)EgmP@Q`9?gyWC?$K?k}{a9AOZVQzI9O&1P-Jr3W2L)vGw`>2Gn>!#_j_!MT@w
ziw!@u3EPbBMzDss8I#O}q^=M)#%2Nvhb|?xzCmUhXLD}3^(Fw??Iv4qydhQDpel!u
zKBev>lu<;HLrR5Ll2RIi*Jue!2to)1=|NjC0)hdZux#Z@j(o=fy!iZ|*PRX*-jHbx
zi6U)in#~B^tTAZT*?8+s0eE%QIO(b;%}$C+5{elqy-~wd+oET;`0Nqi;JVBIOugPh
z2*GDB{20$JUqT^b$|Mk)4$&0Y24u;AO!u&q2n5a;ia6%R+or|;9Y^dBA;E?wm22Vh
z7P?;}?rSI%MNss$pdUdcKp>DpA*BYXAV@@|Q8wa&@14&MJIr4Le%o!|xHbVj4C7IP
zYoyeN5=K)^BT?w4Vw0UVUvtABUs;U^nvh6rO_4WX)$9SUZro*Z-hjAXaq;;#Af*D}
z)1N++vF<W5Q!-TvIz2<Ts~Ge=Hg{O>=r%0NHt;+qmoYZJ8i2zNJBUF@>CvJTDON^Q
zN|H-K*D5+r(f11L1fc?71)O&v3$)CU&a(Wa3AWj3H@@`sF9KkU;pUrv#`nK>-a4{D
zS&~N%pGZussms8yDw$Q!n7?Uz&9X<Po?$RjV&f8731pFAi6~QxtoLb{oSE$r&OQI8
ze>bmu^4)J^YN}x6s)UuVHpy4EiKa$~%Q`^`x~+=I5zozwu37V(UEcIoilT|HQjE~(
zRN&e$XbT3Z#G#0DO(R!CR$yHq3k6Q}ks{-~3ol{rmRs`lv(r)P0s9}w<f;h{-v3~-
zUb!{_4b?#;J#uZSyhl`lnyqMylDgDv^~Px_cw+Ul4CeO{BV)v(N39GDWrCT#l6n0e
z8}<jRHwbLm-kfiI;|4+qWP?5@9(E8_FGgn(qoTp=bcCU_iHH>#h#V~b`L$~fcG8Kb
zkz_-(O3e_^YzWd3K{^6yLy$^IT1gTs&;e`+<iYdm*b27a{V+cBg|nssO3Bq%{gCUf
zyb9wqAy+u3*Crq_2A$N&Rmz~$l!d^T5?>iy-eRly)0yJ4&pksj>}idT)0(l8c5{OD
zWS0&58FN<$W-X1FyG*m*cwqj>dMGum3aeKv;|m{r3$r87tW?mhY0^X!8Aa+e?a7j7
z{_yykgZ=cD>$v2H7g5(0sdB^-B&nbt2^w0EAkZ!#tS3|soaeI3E@A%s1w8rG^jm++
zetYxM*mLZ2$bn>1kp)E`#X!on2{7?I+R1!sYA(_@2;SqU$ekp&30rJD?drxSRw3jp
zRMa3IDyWT2&`P>ALq$4Jn5l%M8&NMEA3OB`++PJu&p-PlCx7-RYH@|uj#vqrN-=CC
z_uX;LS~32YzI7&dF1{TpEn?cOBL(OH#s!q~1Z!C_wvsm=x(la&;d5*5z5JR>x%TFp
zK#WrO1_K#0B_v}Cx_TX6AQf#IVuYG#5TS_V02NJvaM%#B%?^97x#@S$Wc2OkAnU}9
zF1pb{stN))1%rm<u#1jms@GWy)SdU<$;VIsIOq}+NgB13R$KD3JFi)1qI3BB-p4a9
zJoj4h+Jme>R{<$2et7-GY`oigJn_`;0N7`rJ?Kom$`OYjjSUf%NvU*=GAOFj<8lj?
zT?YY`BdvNE-$kp8NLv!2P_EAXzj~CfefzcG;he91l<Tj&p1fy?k`4@wQzaFZ5@a>_
z%pG6niRXX+H?y}(e|#mUob_L@LZBjpNhG)3z36YQf79C*GTHAE2oM~?SM>U;S$No<
zeCqU**Q~qjl8d<emS0fwEkZA%a)!!itdiK^k$Fkn%ZbW$WP_^gQR^-zIFJ^ee`O^%
z-hVT9-*fj`2kK0$;3t=z%}*|aUANnUj~s9?ht1y%l9(Sqc`H}ndFB7K9R1ykzDuHF
z&N}7G{OXZ=|A%XfvS6E?x8qMQ|Cv~1T=|nL`Ot??T=W0JU3TP#tFNS08zFQI!bb=x
zagoOgN6-P0I2?}P9FBD)L)v=$ii}_0eH+&;{xM_S)vr6mrkicUQ3oE!X3g1LcgHo{
z{^)cz`0x|Y@bDAQ@KL_Y(R;s(>+bu>f4C<9j~9H4hLJ2;vGjks_SILGaKOI%qi`(#
z)dR1+^^3p9amT!yESHppM*0YaA{dWzB{o!esZg;3CDD1nRc7tJz})s+mQ5~u-9sC-
zI)@*47zZDGETio<P0?dG&q=Zr@|j%s;O$&?-_<<*%G3W#%?Yg)*1Eszo}G8zkwrhh
zg;t|Y>7Z8xd<7;bKu|hMSLgIvmZF{zWQ4JSTEFD6Tkqw)?>Y4K67bjH4|wBYyl<a_
z*nUBS)#(U5F$#Ks8Xm)&4%Ji>xiaCMZ#jgc4>*RGvmTe-{x4j6>yOCt!QV~5-wXa9
zFS>wFe&B;7UQCNM0Tp?I3=B}@QX+GY$_090$RmS|G$L4h@OZI~bodRUn{ed9kMY)>
z-$SB%j5MD{MoS4|l!}y~JcCApN^(>XsI0&=GNPto^K_WcZS#4KKjl=Oefn42aNQN$
zcKcob+uK-MZMOqg+<H61Gg5kF1TQc_BBUdh6<P*di1AU3PXsd8Xf$!9Q7&MtB`F-n
zuOl7)@Bt^V=UWb^Gn_LyW5Cqxg8ocT)hY>5L1i>kYA$`Z32`xpkr300AsK>XI1shK
zriM)y?#I_Jzlz`V#yI2rbJ%ptE&sQG|MIua=C*qtW0r0rssUDJRI0?viXbYCC`iPB
zRP>2d2}wXSAl07XykxkO)0`}5bt@YAI*eczRk)@@BogX^Y<5aDl2R3Y^w>%;DWz;u
zx(2E$NP@$uh+dqKCkdrh7!OtnvZ#iMQjYoXC-}(G?_=^WFYu$w{)G$w`QpDD_^f$z
zxpL7WwtmBwL`8sLDMLn}z!8!An5YnFAJE>SLO@E53XTM*OM#S-`#_!tOks&ix3&ai
zBN}E((iwu<P=bs{a7l|K^^DYd466aP%Ht4p6GbP9n2b_ZM|D<5b&A-KCKZwN=ps-X
zc<N}PMxBi|--Pdc<*Ss>^f~(r-({%P{tpw-o$T=VL-&zJmPXA}Z&ai*M}&-=jBe%V
zb`;r|!HrAgxW}x@NLEkL=y$039;q5&Opl<)DZ?Z#E7p+?&yJ`zk+6X$j7Y4k<FYnG
ztJ}<7-DK{{I<v<Vsf6B4&8nFxog_gQhM~S>*p;-CJ~ce`3D3~#lC%ntM)+EU5FX_!
z{^7kJXXT?yIO|Ja{tpq5^#`2x;ZL&nf}L2gVhNFUM6N`*92@%hs!!-T+-gl&VKB=z
ztyf@Zg(Dv12sgmd!$vD98!yo{uh7eT>!=7N8aF&`RjWKu77ACjm_1cd>wt8cNNHNJ
zf)RmF6?ROL7La<6td$g|z}XntbwrWC4S6aQUMRE@gtS6LmW!_V0be@n%)d(&{_w<8
zY`o!oPCeyQeC>?)k<gj04wpG`;fb6=Q6a5FR1t*~^eRWF26#$(W}Mt~uu(!sRqIHH
zyMfp_L|j2!fe?hULE(leL=7K<t~*+(pq&V6aUfC-8646(@B!@t^~#ah=~!!ECH)fm
zPSG`*F*D%JM;*v1r+@K3Z4AG2_Jz!w|27`F_YdfSAnJn&8K$`kF}fT#JV6#)R!hwb
zLGwZ;c(tP#?<C|?b*ij}!>mof>{l%9L4k>L5>qjnX+|bTvDF-=k~Y~$pqg1?BZu<=
zWI#m@bOoY9dVwh;8f75HQE7#*B&H{jnc}WrEoP$)H|F7oAN{*QC$*GCul|vvKX@zv
z6O&UMa_A|%_qcB}wW3K?#`vhh*K>+`$wV4hX%x#{gJpv`ET7tt$(8ddUYd`8buQ$!
zwFzi;JxNuel*I@~vr;tk1VWus*YPGL1cMz&vdoiHVbcm9SI7hslTr^uBsxK+f}kad
zl{7NJ87Cai@kbwt|11CdAH9@PJn*Oc*>(<G^25`3@Hbbo-n`iW+`i~nY_#W_xa=1<
zQdUjMtj)lsbkdSuoZ}0P8?-3PHnu;CpByFhnz*ozf{2VWqOu_FI-<f6$(%;qp_NWj
zHx)_QBAFOLji<Pr=_JFHgj$JjOXP4J(;h|*w-9MU;v_d+^&>W(Z@B)3tNzm>fA5pO
zWrI2E)3kyF$L0$*=fS`HoKw&I#F{mq`PP@%>4@Wa=1Ie#JCn><FnwA*&u}-;u5#M4
zPqUt3>JDqxQ4erKJ(7M-d#Pi1tfIvfvztp;f9QE;Hdc^|fGHwWDG=U*ED$C`CK;jb
zp`{T+3944-55N5bd+fgzCx7{)SZDv!;BS9uF&l2W1;I9O`7oJn(-m#{s?PDJ9>-HJ
z-p0b+cLd;>7oTInF}rc*+26&KZR)PZkQL0%25eNUW+PTGBkG{zg5s|R<K$~zK#_RC
zP!C4Cg3;VEEV{I#32M4akOf85hiC$=CNa88qza4&T}Xr%tehO<?Z+L$o8Pl1FE9Jc
z|5D_4;~m$q`GW1B6sUp5<#qaYh=Fh5T}osXvziTldBgX)^5X9iM==0D`ss!2wdb37
z;-TLXtBRVMV2E*se3!b*P*q7)tfL^Jj3jA6+VaG4Ah8OSMfgF29Yo~bGN?^p8_Q8<
zjM(Kgx{BtC2Fa^2r=5HnbLP(E_B(Hzj^Jj^<%)~`l`nkeWVYRU+rJC^)z_WRf_-;k
z$~i=@BI%XL%waPqvViCc8eL7T02Mq39lSTsJ^p8oKJr7;F-^bAM^1PTpZeVUDZ~o|
zvl`q0o#n*60V>PaCO{+s(elWKCm0At1d}b?_%Oa#M-?D^MP)2j2t*ZO%9yKexRLg*
zGdb^)@4gndpL+qne)eVdJ@Oz<{=&)pa?!oK^umD4e(+<CeaE|LG#Y;s{8zs7WfmUw
zcBY)d=N^^ih`f(0rzrAC`q>mkFGFP>>A}X5atO+iiqD^Q4%b}yFze5rZspzc>j&84
zz{B~$&#t2!^l`lc1|_OmM_Ifuid+jaB$+d~yaxR`+G-N%XsC*&mBdAzxIfI3zh2IE
z`yb86zj+Gfzis%Q<3GlqGRucPbs|lrXqq~a7{!rNMX>J?`*Yq!=dt9^ukfeG{=|3w
z@!RaN#~!a6j@)VQ16W}-c_C<YA?{16BGB~%CZh>@$ryRuq4Xuz3MwISMu4(tH(=x0
z8*tM(cXH}6r>p^a`uF~o9Y1*zPc2!(xYZ1TTAP55NSQ2ZOcW`TE@ePUWor1O2DKEO
zCZw{3U0&n(4}P74kNglXFL?!k-S$|>Gk<=X?|uIq+EJhZ)DhHVOrla!qtJ=P8;1`P
zO2r#yZOmsrdNOz4`YRs2?+HSfHcazcBQ(kZ%`&5zJ9IVO;jP4g+zhZL$6_hF5!K2X
ztVmF+B=LAjt22Sl#~D{SZ$0!lZoTMscHMG^>5BBS<?MOtr}+9+KOm>Jb|~C0>lEWd
z#L`h{LvKcm3k`@BN(CYr_{#ZT;k?T)Sab8d4L9POKl(n0?YkQdDx4^%+h#!_03iaA
zb~KX`O-WICOps_F5I90Es60Hk<i$06&TP)2C_0D&oOhIQj*BO8NeAN`>69TJYrxWB
zd^bfUplSn@7!b+~Ap%n)k|`x<_J=tCbLa7gM;3G9znsOO%(><6Yq{m_Yu6^ARs?1j
zo~Q=>QAs~i6fQ=Fgqwc)ubgql2~>ZjI{@{e7Q5~DW?Yye_zdYK+6KJ!fF$UE(w0P5
z=-^4bM;ePlfUr0j@LI5P{I$u=(l_a65w7&)3`kll5%n>g^Q4mvYMnaq*f3^%7+EC9
zqQbh8L8Bm38HH1naYUX7bWl{%@a8S{;!oecjnjX20ax97{kpruGkuR)A)~21st)<E
z;IS7TXWxA`=hRb=UjzR5_k4u&F1}>COZ4QEeEEbE$*Y_y?;yM5nDGv}n?We>sw6m%
zC=@1-s8uORNKjhhBa2N+TvD)de7Yz)bLMOcr^u@sS(T7^MHvLn8z>s+ev@djj_D?d
zpuuQD6fsBz%ZIzHXiPE49dtBNSEB}o%0>)=U?2itefKFmblMGUHscNJ7?DW}LaZr7
zjg{jCr+wgqJbc@0wfY@)TFAxUy^Q(m&B6{z?tkb3etN~_TzkonIB1XEIePyE_#7xC
zzGVo;5D>^*uqOEuo*)7ho+5z9<Fse_^63e%Su<zj1_J^fDKk_k(A_q=KZLiEG80r*
z;DyJSoCt-~5*H-42)G_FripxviY1A2xZE*;2N6ht*>l(DzaD!UM_u@d|1KSl72|1}
zZ=QD^mtArG8sNh-XYsWQFK59%`%y0{s<J?5j&r|#K9AhHn3rC9f#W~$5%zrO9!5rI
z<7Em-gfIqEf%YIB1mUp~oQ2#=vJf!dq6V<)<y8R89hylzu?jB+h}J411G=1ttcFmf
zMD{E4sv?&KT4d9sx6UAY1BNCg#bk}L6H!X=Nk!}nq$}tNPbL%w!IUX^*^I3%0gE2|
zHJ>~Eo0R2idVch`zRic<_i1WM6O=$0fph}x9kTM=dBdG-w&NxUA=vw<cX8*Vk79K~
z97Ae7wNerXK~MoJ1DSW&LQqx$8$enKR^j{8F7VEW?qY1o@0qi44aIT@f=U@&B?-Mc
zdR(BKpo%P6s1QC!Q35^UypPFJN*h3ARHBb@eO$2g5=Boma9+?21zkV2whj2j^|!47
zf5<WK<%*@Nc>BjrL<vLW1x;@mRymC%Cov^T6tw0Vesb;Agb-M^Y&oAj=_K-+p@XNB
zS@O(MdP}J)Dp^6WXdFp!q}CA}^oaSVZ~lbHOoy^>|M&-)F>{i3JxA*vS+bO_UPd|S
zA-aKRph)us<!U&flszgrKq*0z25L!3(-$-cIceEP(?y9XjO(F#6`=!u@Y)9%3i#^3
z|JZ()1zdg2<s5V9zSM)lP@@q9ZILr12ef5QqAbE&T*$FW&YU-{M|Udc@kf5k^G`p`
z<{Qmti!HY$ae>qagtk;s2?C;^iKRvZ!C49deG^kA32%MV+qm||ACeUXe|Y9a-gWdI
zWTHl2*RfTKpG>Ko!77PDp}j&13%XChVJeOB5_~{ZmRMvY(Ex1*NZljK9MOs<W_69F
z<14xM={sLfz)4>_gRh_aPmCrhNpM6q!H60SQ!$c`(~5gU${_&jJh><-mBYJ;x9)Q=
zx8Hmlt5&UK(aksV-eZqvy>^Sbc1UffjaFrdeT<e0Av_jKUkC<5QF)lxnnRjrJow~8
zJoEfAHkiE$TW+@(Ud_W-ZL-qPsllKzt+%zplh~3#LFqgUB%$=!P$JcUR<lc^l_670
zAp)+~z$~4MSv|_~-WYei@blNJzy@<RM^__MVh(*ZkD!K`={0kLXUGKN2r%Gepp=S!
z5;Kr>Y_E-<Xz<IQJ%BOOiT0uU?MkF2MnWVVk+A6C5Z;6L2vH#-hf|)?=7f9_@-C;o
z<4bJ6$#mj$!spN7FH1Zs%tVJK)+l-n$JCG|tCb|apxyVRotSbWVQS1UwOY`fw3KCm
z(j{@~p_VXJpGha0&C;nZXFv8u&RF!pwQYd*hD4=ANfVMbB2B3`q1jNxs)=$#;8RLv
z$f6oH9wnqR@o9rfDWo#oaNV?6O^lE6&UYM!FFh($#3n~4U4rc5Y#;A)g0qAi=ojd0
zHL6^J^;6vNts7Bl+BP40_~BFoOVur~S&qwdilU$@OH@%2=N{8D_)f~87n6;}*ca=#
z7l!CBZ80|0WVLN@_mj`^*^5r%xEtQWEw8-3dAmjh4mtcNc3!X@jYMFiL<&e!Pn?1j
z3MxhABpt1oGAZ7qXswBiCsH{{=&}BKGYHD?;Dh(`;)~BS(rB{#u3Mqv5}_+99Jz&}
zgtD(FCL?_AKu&_1qKdl=*2~#$pWV6T`WqPx20VvEi(~)*1S3gAK~($nA6fXug_Kj1
z<i&t~?opG1b{9-8$STEZAJIi2OOKh9gz<#lAmxHbZsz3gpUI+oZ)3bOJzB4&X5kxl
z<K@XEuP5NpBMxJy9kwMg5(zl((Z&+#3W<XX%0kf#ipqG5a>T;XkQq%gATlLhT6Wld
zSMIy}K9((8#vS+E&C!P(!tBx61gj}3%~TQ7Eh6$vVRK1v6(R0mYdy+(pURXB&zsF4
zFZjc6pXB)$o@2fCEH;_h#@m8Hk>Un5%s>({K~X9OD6+^S;sImXa?XG3Vots9^E~?E
zqiZtNIj!}0&(<gKk%gx*G*5H?9~b|3v%<mQY=sU1lt-i%t1GO`kimg7m~Ne6;b@8u
z$P%O>71P7XF47<azVuvu!!<0}aytgufQ1Jf!Nl*EB2j23FhS6l6;<6LahQG|WQkK1
z!FtScO|TUwyz4j~x#I!;^72cZb@A8P{-6GtMr#gD*MM?}EO@#;M_Y@O6;Hl&AJ^RT
zeV%&ZiPuk;Y`%aGZM7fUvk{Yah?i36{MC@u8UiZk8T2ecIcz=PB9E7WEJ%W%{(4M0
zMH&KBmSCrF+Mz;>w?hbOBta3p!wSn?*WAwThwVjg(C5wXJc#=)y$>A%QDo6Ii&X{M
z<wW@;LiBOYW4i{wGRF6Sq~zRF&*#XKjv$1<C%$nym;Bcsqg;Xr35B*yCONnK_HwRR
z`~xO?6R#OIDcN_Q1K9U%2Qq9Wo4=INUe!YwNvCEo__b}oes4RJEjQYVNK~LK4oQKg
z^f94K5H==+h@d5c0KSKitMM))<TZqEqC`w&6>%n*+nU30W0X4{Sj3X$OOW2O+Z%Tx
zlLe*eA!HBj`lxaWCkmVmxT$HoP;?svS0_s9Y`f)_EPC*E2Kj&$6HD1)=Y3h8b-3)7
zGdc6p5A*P!?<X&(OI$N%&gQ7YKFIrz{V1DnI|tn?Q8<zTgxp}YAsT|IVmWs|{^08+
zz_@_HqI8aO9x+wJDUH(_?={v-d?b)wpsE_Os1t<28Ap&MAynuxLR0~Xr&5-Wz3+H_
zdCx7}_3%A>^`F1VF57I&X4`FxE(Rnj$6HHjE3BTL^AlKX1h&y28j6XABzwML58nBw
zL;2}1e!)HW-^D8{kLAzLzJ4NQiygP)fP)WZlhLgZd4=+mND3StmuQx@6JG7MiEPXa
zRT0~D3`qQH@gi1EzKWI>=^Y}Mc&iCYf|NL+sH8-QK<q0_7!Xu}6%rRBM2L`1A$%ZE
z;cz$)3wGX#yB@x0dI0+K$MX;G{wOjliEudS$u(5Q5%2`-DN0R2i>RhBu}22S8`htV
z__s;$zXorTgdGmun|9ss;%|S;%h^*PJwiAF;1xI#u%)K#)=*Z`N=rJ~^0jA#{{PqG
c|Bqh(4aRb546PxdWB>pF07*qoM6N<$f{Q)WS^xk5

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/gravity_locus.png b/game/modules/tome/data/gfx/talents/gravity_locus.png
new file mode 100644
index 0000000000000000000000000000000000000000..1ed4b10b269de270ef08a98e8f763a868ec5e4a1
GIT binary patch
literal 4792
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
S?(^0F0000<MNUMnLSTZWLPJCV

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/gravity_spike.png b/game/modules/tome/data/gfx/talents/gravity_spike.png
index a986352e653a5b88e1058e71e471bde61867d3d4..8a6e7b09c4f6775e3db14ebe6477b48eef8bd418 100644
GIT binary patch
delta 3462
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

literal 2783
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

diff --git a/game/modules/tome/data/gfx/talents/gravity_well.png b/game/modules/tome/data/gfx/talents/gravity_well.png
index b374335def95a3798280179a3c9a5770a829f215..4dd85288e0ef465cb65692269174294077a3f634 100644
GIT binary patch
literal 6773
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
X4hLCi2{$_S00000NkvXXu0mjft|G-J

literal 4557
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

diff --git a/game/modules/tome/data/gfx/talents/matrix.png b/game/modules/tome/data/gfx/talents/matrix.png
new file mode 100644
index 0000000000000000000000000000000000000000..91200083eace7401c16943a80b30b9afaac7efaf
GIT binary patch
literal 6320
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/paradox_mastery.png b/game/modules/tome/data/gfx/talents/paradox_mastery.png
deleted file mode 100644
index b2da719851cfd4f744979047dd045ede6b8d2748..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 3265
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

diff --git a/game/modules/tome/data/gfx/talents/phase_pulse.png b/game/modules/tome/data/gfx/talents/phase_pulse.png
new file mode 100644
index 0000000000000000000000000000000000000000..0085e5161bdfadff2a626634e166e143b39aec69
GIT binary patch
literal 5108
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
W-{?hle3_X50000<MNUMnLSTXnHuBp5

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/phase_shift.png b/game/modules/tome/data/gfx/talents/phase_shift.png
index 8e5480bdf4cc6faffcc6ba34dadbeaec3efccf70..2cc474bb2d431d825ea80898644f06efc95d11d0 100644
GIT binary patch
literal 4607
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

delta 3691
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
JPDHLkV1gcZ;{*Tz

diff --git a/game/modules/tome/data/gfx/talents/polarity_shift.png b/game/modules/tome/data/gfx/talents/polarity_shift.png
new file mode 100644
index 0000000000000000000000000000000000000000..51a9c0583c651c8b97bbc9b9175c3c67ae32dcc7
GIT binary patch
literal 5542
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/quicken.png b/game/modules/tome/data/gfx/talents/quicken.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ac9df4f244bee41c6a7785f21734b1f648084f3
GIT binary patch
literal 4801
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
bFUS7@amXOT#EnCC00000NkvXXu0mjf+4C<B

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/redux.png b/game/modules/tome/data/gfx/talents/redux.png
index 34a7bb4dbcab6b6595f3adf70dafff9b6294e9cc..7ae45948d9b28d77854f9e485bf68e56b17f120f 100644
GIT binary patch
delta 2681
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

literal 3965
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
XjOV`NLp_C100000NkvXXu0mjflpdB0

diff --git a/game/modules/tome/data/gfx/talents/repulsion_blast.png b/game/modules/tome/data/gfx/talents/repulsion_blast.png
index 4ed66410bf53ce914cb41f85a661132b459085a1..5556b8f7fbeaa5e3c44dda9e95bac04897aa22f9 100644
GIT binary patch
literal 6429
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

literal 4538
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
YZw0WotbE4Yi~s-t07*qoM6N<$f~+v8X8-^I

diff --git a/game/modules/tome/data/gfx/talents/rethread.png b/game/modules/tome/data/gfx/talents/rethread.png
index 3f53a62d6595abf1755a058f030806d61a8dafea..41fdca00a7bd57c5503239ff36ed4ca17a3a6142 100644
GIT binary patch
literal 4398
zcmV+}5z+36P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-Uk*CBnZH#$w&YI5W7i4
zK~#9!<(qkQRYkVOf4j~N2}42##w3i9F#*CXG{_`~qM$rcz!`0v`YG5vb)ll7jiUWP
z6r`Jm7Fumk5qu1a$~=f72t)$}2{VK-5>U)^PxT*F=iEy}V}j@l%UUbzp4{BC@2Oqi
z{`R+bRRqxdhKJ%eJ^}z0%f(P5x;CIu%3<G$9po3Crcz`KiLrIjXhg)^As_%E{<VmJ
z2wV4Uyfht9C$13#TRntw1f}5hm7~~yVkehXOXHRf!%&VO3Y1bPC5R)42+C22BPao-
z1T8Rk?F>Fz|K6n)0vc^6DTq=OyF~yvPQXl9iT~>TC`VbRU>xEIPC#)}m%EuVY#!~K
zbiH&OU=SQONio#mYS*l=ov?DmqQoFYIR+6*jN?3nL`6pNhwGo<*}EnZRj$G%K!Spg
z0Hp-SaR4ZG3(X2E1Nm?S;3)GqQHXaPh8E=r4Qn-J`p5;O)o)eC5rB<pr4S`V2Fe=;
z1dHveaz+T4Rre<EAtHp3P{@Edil>K+<J#X1xC9X3n2A=5tOP)Q@egLwmh2oqOf2+0
zr#NTwgy+c6dx{}_A7Vg{JIXKz_^~WRmyZSD)Q@>*yf2QjlQ+bN<An!^16ov=LsZBi
z)<L&kGnB4vt}2T{D72EwQ6yBV2Eg%Chy977?5luQAsv7MErN@H(rCf{XtW53wqn89
z_~UI)Q=>{!*+YPG1SJX-RE<r<OOM4mXg=mm%+Vl%R^W;<I@%*f5wsXRfbu>gxPpCO
z<0@gy!;{Jy2Z;Z`2qaah=YL>-?oPD7vVx1kRc4|naFyUH2nuGRN~0aYRT|f`>zL1K
zrO+Z&NvKJ;_E(p&TEMQV79k<Jn*a8UCF5DNaW;8B=AuP|XajHMp7A?M+Yk_3t<eZt
zX<X5`o^$*kVd%g=mI((qz%$ijlW1A*cZgDmjrVN_H*w<o<NT0+itYP1vt;83Y})Y|
z6)VP2vszt5SsAD#6aq@X2@#)p-$99>En#XUC<h{=%9F8mJx6m7l?5qmpd22v&FZud
zfy0zP95}X{sq<gt(TM~3dgnT`@_6wrzN&D2F0d$2E?U49jaU+OfvdXSP&N=yt#UHy
z4LX_X&aPs7OjTBFo(I5_xBrDkb<#POmqXt7xfB)^ur6~MJN9SNwt07y;~~NFrGKsb
z6pPgZA;dt<>Pft}U^)PI4|<sNv~~o8#T+@7^Xm&C9UiA>D#ui%O68gWe6(&BX${-+
zKetWbu{$SHJ)sr=+jeba_)Gmcns>y;yIFNtJQNt#4{?CUGX@2bQ5A@Zjsu{esDMHJ
zf6pt=&0y)=Ova6##?@EeU^3G$j)1si(o;J5x!!Pr5K%6Y%$@7VIkub5E&CD?6-7*R
zJYCxMrF>Kcw(i_OFj&me&*#v#d3P#Rim^2T=rCUJ`9awpf~_BL6yI$5lAOc)h>EH}
z*Une_9Fmk&iz_-@$vwCKH;o&naqQS(4jno8%Vhy=$xnN!3{CsAUN}wwfGKmIvCIyL
zrhA9}JbvF~-_WR6?&Rd@JX}#epP2NituDawfe=)hAR5plCz+Ic=*WI6oG>X=8^UxE
zI(58~zq~q&`LkBit9zech6FvKVqhx%YyTei1F+{{79T8~VnRh3h$q!d;hAC6Z59=t
ze|4yVy|w3xvf<#phgF6KX+aUHRZFrCICy5LI5wr)GzvnEq*}cA+$0vxT}`vp^oz>@
zhz`Xkq3iZ7dQmMt8Gz;M=JNi>lZ{5Se34K!iHGif8Lc%Z@{Te4!zsQRbi?w#RyNys
zJfY1>SFRinKw)9N|DD)-UC}mmg6p_eXbDM)wV63%K4V5txOgGpd*3l%;)+L(!hN^C
z=-;sF%Xz#o`96;49mcf}+~Bg7bZBdo-6zXtl6&$9u7sTADq}lnYlNV(tEz>HF_nGW
z8o>o0F^HzvEC(887Rfr_73kOZM%J#{LQ-O_i;xAZu+jEGOuU*2RH_)u-2<QVZ#r~z
z52MH5&eXS_CVSr&w1UAmjlc;+05EILtA0Tg1hmFqJr}W)5P}LK%0>Eii*(S2p8}gn
zP(n}y7j5~)*zt<7*tj^BEm=?7Hkbe0TEI$L@dz=*4Xy}{Q(ALVzemov`I~KPnK1cb
zhCgvN)Bib!1}QB7*qpJ76Q{m2aCabRapoe1KdghbfY|PnX}|>0f^nLJP-A#QdEHAN
ztw9Ne%saE@(XCt03nW2p9xjxpH7?4A1E4gn1Fh40a_h}con<6gT*QWrOW2mR-hXfL
z(plDy;S&%3hF{F80*K8r07Y(*MG7_qy{x1ND%TWT$_-PQVi9Ye|Bb)TBt5;=g&;uN
z$}Uu~X=NOv(LNz*fo5qP88K`s6)HrZ*YNV?bL{G2oM5>?d*v|@6paKz2>9gF_t~;_
zGePaz71kCxR%H38w9?u`s0|BO!TbeFh>eRY-M)Yp<4LjbQ}zM9{=e9VRu&mmswOk)
zsoBh#`wHvUeRNL4#l?l}-IGP_`i)Uy$W7Ulro8N6izUDEocgkV9UE7LmTfxF{_?JL
z>E4H^Ksj5nD*qWBJ9#Av7meWHiZFlSQaX2RSqdeXkW5<R&c2S<UYjedo);0n6Xewk
zO;bD4vULv*?B7n_iKAy3FIT=IP14%?wSh+YN>AI@Qzvs-^6}XlDf#)Q*}Zc+t5<%)
z+cPHe#plaW0f&Z-)4)+U&cF8^Z7<Rh65``2DlB5%7i&w-0bV7j@ic+)uB&W%QkEAa
zlrmk64!Hl}S9y5E6dE;Ydxr7Mj5Ri`g{n+M+e~2Yca@ZArM6{mX6)!k>D0P56JC0n
z{KEXOPLr5tw5GHOBS$?;rApByb3kEnzF(lYj>p#8et{0DJLR#nB_HKELa0$Ig}WXc
z%QG*{qfLk20312Ik08OYLdc{=SKN@ZFQC?W_w8wPZdIR&<HuO(?E31Juwv`kF)x(N
z0ol7Zv24vupHa1VyP(?lto8(o3a!3tIl+}sV>Bu{ntlU^`(Lm<YZI;rLGh|Z+k3zz
zs6bTUf<?^qDX(!wn}&S7X)~@Z#a;1g2)OmmAw-ogUos`QV$CdO|KH1g5o2JhEE23J
z@<o#C=X0}~_-F|Nfv70T+boftwK3#av=KFy47C!R$cUdMWl!eiamx+8m^AJsE8{t%
zDf@?E!%KcXAam;~CcJhxxhJfYCA>JoPfe~UziM>-4sn>yS5U8^DOPr8XA+dKrl~Jw
zO+8R9>f-DjP98s&dj<~(3ti)kA@|-_x&sn<c}JP}+C3~>Fo{C9*sijjpch}-wfaE(
z_Exyo*IJX5(gc9LJ2S(oL(d7~+lz{cy=bNF>Sc?$zDE~tw-*;7zG_t(HEB}%6CxWo
zEMn~F>sj!@D;z(*-)CAQV2qA;32}kOq68tRgyj0>OACHHO+m2WjMjOOGxrO;aqq~N
zxp(AP8n<YB!A{tcv6-9uTxGsPYg`SzukCw&9dJH_hjX%7zji(u8y1tF|2^fSW2q1m
z8`=c%a=i7rSEy919LK7KZvl{!+LpNLiKbH|W(NwZGsF>AE_{c=f_&;WOr=}@L3Fw1
zzvwgQE+WfEu`BBvii?U$<%EO#_OUB_2fh3DLqw=pu>${`G5x|E;EjU(AK1I|Yrgty
z0c$>an?2ud=DXZOxH?Gr=vbU`<$Mu^0u@n?&lb(X4HlD7qZW0VrdtuE&S;+_!lpG#
z$vb|8`09zY?9>CLAR;P~)K=}e{;mh8lhT0QSzG!3<cShHAuBVJ<T`a}+N?Q=Ny&^G
z^QZqTg-biM*6hvBU~hH?eC+M3C~DMhK=nEesFqxx#CnaXS*Ia;w{K?8w;8r5GF7MP
zjr)g<NKR?Uo~*Cgv;7-Cq_7QD2k6l28anm9j!mB}=k?JeIeMsMy}=Rp4W)Cp?j$BA
zQX?^uLkACD90#1+DK0sCvdGz!b=KeZWM!BdK!dA=P(l@g0<{{Y!H4g&f9H0?6?P}W
z#Yl5kOkL8dYd5BMUB}|Nvl#!xh!Q>5t^KZL@s}HD(W>=19q_9hlPmb~2lDgtadB-*
z6u(`rMbjWXv<b6oONQT0KSO!i?KW3IubT(6=-d5t?D^AM?cZ+O##_^-QKx?W(q(~*
zJ$7%~NKhoC1C;F*h!B^UL`0<N41KxuqfpP#KAtCY!{xX{1bBYhKX_`=Uw`tuM~!%d
zq*}Fq9tr;3Q9h<JDXlvi60~F}j#qgqa&z``V8=FgWo~B02eT;1|B<?>sRSY;aqK-#
zz!0Y+_Rxi+xU5MN`rUR13unGXVL`#U!_#%yvuhV8a&yo6n-`G3_=u~X!~>Jxx91Cm
zfKuj^nJ5Ag!hx(zCOk0stoxe(t_uT)JxWT`RGfe!;5Y;VLO>iGdwL}x;0BAhquUki
z&E9c=+vC6R`0nrle)#@mNGy5HQDrL4<fhGtj!QV}zKk_17&)L1kKNdZ9hqMn`qV-Y
zO;BsJc5wkGP>z|aKc`_@v$E*`fNxeVvT9KK2PnL9Iw)}M{g3=-4%wQ?<Nf>a<SjRH
z?8qTQirVxRjN&t@Z^q&k)VZud*>u2$g|p41ZJ#e_C+}5@t**I&sEU=&Ya{cEwcORd
zCDZ;i+SDU<;;z@f)S8(qRufagzTmIwfbVkla%}(ZP?yQ;7Ae~x5tl(vk1dg{xqq9?
z;MUFAowd#1Ix&vWh!bGu^3^5p3I3W+IF);p##i(**}zf$2~_1MqbBRsXXjVz$j$j_
zwU>YTGz;FGjtWH3ynP41fh!1=Dn(PjK|_`-n0H<qzgiXuA4A_<Ky1|-ILg6sz_Crv
zfa4J1D0Hxh$2+Iv27@KGncAiu6Xwh#!ZFz)AcCWW;e&5x_2N&<mID%-HfQj-H*f-i
z<0vAO!g0*CqZEOF;!xHW{yeyJM`$X?$1`L3XCzdq;yb}DF68p08fAk6{Bm_m23uAv
z^4nKIf7cjuq)vq7)MniA;`mb8&CAW@h89i8-nzx6ONfYwWaP{LTecA3jR$5gA-YNe
z0cFIE;|LLsL%>luVie!1ng3w+i=#_z`>*pC(V}fz9|=8E8*}W);j)1MZ@h8Ojks<w
zbc)3G8eMJM@IaTrw=-ze^QE?Z?{&TTa@8udHfi?BKaVSW2mpwwR)hQB{g85zkpu#Y
zfLM8}42cCW*IQSw;I;dQl-mB^Kl+pwt=kY#!j-9wIePd|*+Brn$s>oDa9tNp9LcdO
zuR|NEF8&TuYUi%J@bOA2M8}lM{*bGClAW~;4LtPZQ)LeU;p3XeM$vx2AOd33m?#2@
ze|r^Pd+_&cT>5Fr<*rgJ+qQ%Fgan!;R4!Wx2p=Dg9nHi6*OIe6%W{AYdli3kW!URe
z8UFfI{{-7l4cB$KzC$}SF!-LKWfuYAqh71F^nP#{4O+J|d>~>pf-QdoN}&Y)_Qazs
zdv8{WY^Jqr#e^Ae(xZ9m|DO~t={S*dkoEKCu;!h&DJ;k*J}HSxF)=8-|5q|jY1i{A
zy7wPIcE%=-<(&VB?U6${#Ky(5Z`UqPojh5#5pb?iv2rXed-Ni;V<%GET~3vnH3*3E
zIbz4AubA}2W9;0Ld4AcPo=)bbO_!bn&NXT`YE110jYz7WLe1K>soS6-2eNnY?&OK=
o`F8tH-hatE;OCCt{C|)C3nxtyzgGwq#Q*>R07*qoM6N<$f?P9w5dZ)H

literal 4262
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
IM6N<$f~SEas{jB1

diff --git a/game/modules/tome/data/gfx/talents/seal_fate.png b/game/modules/tome/data/gfx/talents/seal_fate.png
index 629d3fdcddce8916d5b12e32405c9b799cccf6a5..3258ceabba00e268e241d538d6401b89051b000e 100644
GIT binary patch
delta 2901
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

delta 4328
zcmV<E5Et+D7X2ZRJ%1Cg000xO0b}Nl!vFvP2XskIMF-vo2L~1*o~eLZ000n*Nkl<Z
zc-rlocXSs;yT?B>`%6Md2u10jp$no^1r%NzS6^vjFDON?90h429i;}1g%=e?5KxNs
zz9^zZMU)GA5kYBEgb<J*CO`_El%1XX$957FHF$H6?m53RyMMDYv(NLLr_D3-6M*I~
zd`bS|*WUpA)d7h7k<R54Do{4IET&mV?%`ZaW&UY|yWcJ-Ea33rT$H8GJpffJSL6Dt
zJ8@ZyHq@?l0a8kgh{P}?(lAiUWW(n5EMK{d6|0t)D8n_Y*P`<c-DuOQEj6mu!m>0<
zDJ)Z=Op8-_r+?V+{dat|W+mTjSbf&xinH+oHLBL+p<V-NRR1Dm#K4deX-EwBJ|dku
z!vRBLDaEVvUg3>*7yKc{6ECR4uz{m!)UYwy(tt)=8f982OQ8y#(zL-aEsKKuLf-vg
zAs?^!@Q(w~<CflZ?$`|(k@k#xO!~|geKrsh1cL0GY=8O=>_bLo#&2eRNdKYS)a5qN
z8m%?j0<A49r5&a%TLPSWWh#`iP)ebcB0DFW$<xM?b2$6=0Wfh`GIbN{V?-oU8cu05
zY#7EFnRn~$F9-kzJo*sp)~`J~u@r*&v)-gmVm+UEjRS(lG!<5WQRS$CvK&B6g|Zw#
zOvO_#O@AbH&kx0Z%K*j~_hQPZ=SZww2Wc2S)3PYjF5|_5ASF@?q?B~Iu`BD=uO;)q
zuS>!^3*MtnVtu3lAtXWwq>u>V&z1{HpaL{#0$@4SSGMlJmK~ePJ(6>FZt&q=gQ!*G
zLWGnEDI6w*cP|{qgj**hQrL{zrLapw`XEIlbAM;dqhf`MzsUSEQ~pKW#JWV>z7a_z
zVgu@q@6lv9Gze!BynAsP-I9_0#}gMD_v-*$+PFFGTDA8&OKE>t1WR$+JHz>q1A=gv
zw<RZH8%x7LMhxc8oOed%ul~oiTz5@J-_Aq~Tk53!EQCZD5<@tQx}Y2Ow?*LIpA3f{
zDSsI9;HY0$f$@($NlZ*k$f_4>^c<q3bVNN8FpjR5kcKxihBOd{;Jixbv3pM%yLRs?
zM)VgE6CLG9md&t~Af&KmS=chIaZBw=zM~G>x$)a+tr5a*S3bTx`+nX_=An$@C7?~q
zD~O9L=gg|Fzal7lLWWf!D4HVN&Xpp2_J3`ljEKRop(Bbg-@WV2#K)JlZH@zC!~xW$
zLCEloO4r6X&n_)O2u~_KwQ%0w+Uf2ytHAYFb@p}LH9SH6cb|pxG2w`#^g#&{=82*!
zDUk?<G^kyxHcc8g3EQ2%{cOe^Nirf48#F@(?2oTr-lP~ZV2hm6q0OHl;kB<;rGFY#
z&Z|~@B-pTCBVVsv-F9bIN?v$%DqpQxg(&K`Jf9kJuoP48TzUC<q31j9z1<hzBEDIN
zDqIyftp#W(Gz*wF{cWP6qLEsnEsd5EsWn;(ge7Tx>E)!XSP}-HL7hgP?)hRIL{QN0
z{sDZleCauf?T;KeTq5J#ecOGMEq@z_G8I~An;*+&UQ3BKG!5%DDGET%>a~2)El&5P
zq)coq58T(6ISXb1(5+K<>Lk|nbTX(WLJA^=!Pf0tS-j-^5RuKBHK%o}%a}d)RRCJH
zXhrSXwfXpy6bcFoyml2UR$@^9!JNuFg=J~9(sm?hX)Mb^TNcq#F}yf)8h`l(`NWoq
zrRN>JQOZIa0!s^|CD4XIAQ3_%g`j5jT18bLK0YBN{xanAeS_HJ&R)Fp-kTghah%Ot
zHZf-S6TZcF*91<vdhKeGk|%o~>vdmmMvodxe0&_rv^)ShwC}*MM~4HD@<|FKM-L|_
zH;3HZ96m}}!ot_ycEVgI)PFS<mZdOFi!W9#C%+&cfMJ71+4e|lge8$eqYaHjVkwO@
z1X@eV#g!{+1dU)|<K6oP#P_>`u_Gn`@MHQOmVNQ5ZSf6f_MI|y*G}$#uoprIVq;@j
z@!3kAOiHFgLU{}sArdisU+gTbWW=Czr!IWIVJqFb+yub4>%ZmUfq#8{I@|!ru}f2)
zod`g^#QI!y#Wj9B;Ixx&BxwZu8$|&)e)2>h(vqP-LOO26Wv)ZJ4m56LTk*-s<9&h*
z-~HX*<5mD-%fzz&n~gMV*vNB5M#SLQ@uR-}A3f^D8<B{Ckdl{Pm_g4Ty#QFT@(UJy
zu*h?HE`zh@&E(|ClYanA7@Op&s%^M!nu<iLLUJnqL{R{K&iE<h&fM_Q_qncJu-_$(
zPX-`AKc5$8JRfj-f+<fYk(Xy%`K2FxOu2-FPzY@plC<4v9ucXjskV!Be7^gw$&;qg
zyjcqX#*QBa0*}FyCr>i_^_c+N(D6ntsCA(eDf%|cquZ@_CVwg8z|Tbi*q*x8iQk1U
zG9jNUeZMXRwQAI&dzYI5m^*(qM~@#vN{I&MEqo1t-aY$Jzd?f#^V0FtYra|I5%Kk!
z)&2@o2Bk?bZ;qc&m^J$qkHIG<kM-)uJofl$L6Otnp*tv<LI`%IZ7)6$+LNB<#M7t6
z(S{$}2Myzx5r5;nz9YvzhLD0qi~sG_jT%12Cqe|oR|u9Y`M_&eSXju8ojW`|bqN(x
zQn6x1ZtB_{fQ4_(M+(8t)E%r?^*I0o`wbx`ri?#%0SR^^!k{V$DOtC1P4NJvEdMY}
zXdwFXU7hbLqoSf1F?2KlU;fW3e%P^{&%gK#fXiB6PJdi{oM%5g;)Eb8CyR}nHilf|
ztl2aDrLPeN|DHR00Fa%NO@3ZJkB%4&K!pkw>2*&ZFXHn;ULlJZa_Oja?%{0q{hVGr
z0H3c~hG`ah*3#A`9AZuji=8(2-P4oG=T`>cv5}9mGj)gO+T0kzX3USr$Bi3TB!HPS
zXAY(^1Akt}7vXm8uJGCo8#9#jeR~0TYSPor_#&k5K^nbC)={Z9-<$u-%i-r<PA+yC
z?CI2Lix43sQ<I+uU{_iy`+wdKK;1fZ?I_Za7y%=ip1zj_3+ERb#r5m|aM%+C3|dS~
z3;>^fz6^jC&02D0+xCG4j|dq-A%Zr?exGqLgMTmA{P!;d@a5Ml`F7*Fq6-iaT%wA=
znqSbSO&i*_X%`yD)k_g@t3nDob-wY8VeH#)zs0IAR|Sl)^ky$QIy%&L>eJ7AZdn?B
zeBin|c^VKxN*<pw;_Na)qbCmI;Gu&>jbJFj5LlTB$qQ4bhsMas%?Y_9Aq98ceJAPZ
z>3_c%%XjJ4nT!LOe$vI6y<^9Y`H9-Q?xjZc>S6chtyF_n-?s_lo*G4VZr0iF4BgxJ
z4t~zqA5aB%%`F1Yew<LHaupuv^Pty%^Y@!WDXgBod$Kg;*B4S+YnnB`gr9!;$<yzH
zS%-XrrDVbrlLMKlVA{@A0qOM>hGatWSbx6TxbC-YjhUv&U43rlvlXBENy*b9#bAz5
zNWp|BCJ+^g0^p;iOOR4<;?zkx{G&aK7r%ejE4uvre3~}9n8l0VM@mUb%17S2NfVO%
z9Dxz`PQo*~c3ob69uM@tkJW3x`ePd-%`R!q_|cO{OiaX(5)pCs2i%w;kO}_xqJRJ5
z(P6fmy6eundHbEWLSt2^P=SseJJR&xrc|j~m6+%#jvP5k>aJAQtXac`4I4u3+qP}T
zzJ2@HzyBwySF6s~U#+zlLvC8!w6K(gsZ1<Wqf8TJS<HX)b!N<-UNSpF?sdt<mvZ|p
zcX0JTuH(G(Dmhsm7YKWiv2FWSI)8QhC;GI6MW5b%7&u@c7d38-l=8GxhE0anV3~?J
zugxVXX)>7yGDBnB-}?au_8&}qd^u+)$ln!G%3}S-?@0M{DT|jZ!qQgBZH*PHJJKNW
z!bHl&$5T*PNLJP%4h3}8+fS@ol`WgL5)~coB~gVqGdb>thGkkj{cJK%J%9aV(M+yk
ze>*NNo`U>*va++t%Fg;-36$Rrz;C&R4IR#?k)tspww{KQWI9BO)?g_`Mn)!=wQa?T
z6DQ93PP0B2zxi_)gr2Xx=31S(KU3#s9oD&7hjmWY5uKZL#CZ;vGhUt<>iggWeRYfG
zE%iB~wd4m~F!v3ezUwDF=zo#HMc(!9)kiO1_Jux_nH~D2?nu*9pZ%AvUHgJi`<R#*
z{o~GkI_-xab<LW!N<RR7dfl(nw(r$H?%b!-)AsAKWy_wiZG{RIb(P9hv=HKqZKgf<
zg5JGjuimw7k6yECU5NuwqDN#B63R33u`yVd<@^-SCQtR=w`ksyvVUdEde4Us=W_7S
z!H~ze`l@TZ`?_`OaZ}gsSjtX<mQN_p&_TmWRR2rV2u_*s6gPLj)r${=vn%w^F8{#~
zJANP`A%XALZzFx*UN&vsL}q3N1%-u_Pe`CagGRJz-G<q(&tg)No#*@Hqh&Ox*U;JX
zw*j@3MXPqrC@3r_U4H-wA=tcbn-@A85q~9_wtE-Xce)OML5~b(;3I=U3lPqRhp_kl
z^78YzxcNl@+;~GLrcZm>mLz3iDho>~EX!j0j2C$IwV9>slvuaU-LaG{`dVvy#*~FB
zG)b&ohpwHv0r33vX&gIp45ds|p>wdI&_pSVkz<B?<2^Ys*?%8H*?Rys7@F=~Zz+Ap
z<gRSn9?LzxqMT6GRG6m1R3;P0CHZl|=%JW}&O6h@G!;8jck<y<d$(plzd=Mt$6z|Z
zSeE6Lma?dPeidTN#Fj1qE^64=GgdC4?hzGLsEEi2Lk2wNB{jBf-|D|N6@!O9VsFsI
z#nZRXLmqf;+<&i?e>TXnw3n7IH2_qtT+LGfOIgnBhJQWp=}r0a6#y7Ia)?)-@@a~9
zUSRSQQ@nZ)1lI^Us-Trc^=j2i7XZqgdH2AQX@+Ll{Y`p&3IKc4f8@iZAD~RdxXEKY
zDQbVkRmJx6q)KTlOA%Y9?En2q(NH{XStvAG8sMDT^nYE9_TvA`TeYQWlS|mL?R%1*
znMm56G;b3nX<Ra<X$E?_+v^&Q@IbIE&8fV+(j@^|Sy{G@nx;4VrgtBd2$P9plDx#n
zyf@|o(CPXvRI5_0NL%F?NoATL`*JAjVCe#2XWCAbvUhClpG&xV?|X&wD^;djr|zNt
zLkEoTynll7+PY&YZ!Fgy?Ao1Lx&T=B-I~y>DbI-cvuS#gp&0bgqt4P8`u*ns1R~VO
zEM_canpjG4^5jW!a<fYp04bj>4O#BsPZd)trFo?95E9BI(7p3*#kMPMJf$o?S^iOp
z1wtie1dks-#`=xl(X46nv+mQWV`u6m)<>DY?SH8IyYIhM`XWJqm*zZw+ANyINP-zM
zj`b27gxsAOP?eCxIQ3tyUdf^CLnTJ@8P5v;p6lq*BUGw*K6Ngr>zv`iKBeXSEKA#g
zjD>T~$FH}};=Q&sLmwYdqJPXdCpp1c&%I8iij}<+n$BX+`I-pVV;`&6TDz~qL}`I=
zo_{7zeVk2OHk96cKyY7h<}<GmTPDsQKKLa!E$k+wJcQhL+G8GJ-_Ke23d>f0T;d7Q
zbCwm3j*2FE>@=!Yspf2X70;V10WPBi3b*}>bEoq4w_lx;jPN;6i{E{7Pj0-X>+hoK
zz@bc@d3iDivk#mz`u>!Cf%4@laC_GtTw&3=!><wpkZ~x3#UH=R+KpeI^F4t-1%Tky
ztVv6nG-yhVYPCp+FHa;A#i>&#IgpjX?(|)3*z)Z!{>SJ4JpiTc`unf5e*^Frzy24O
Warh&Y)Q8Ie0000<MNUMnLSTZMC2L~<

diff --git a/game/modules/tome/data/gfx/talents/spatial_fragments.png b/game/modules/tome/data/gfx/talents/spatial_fragments.png
new file mode 100644
index 0000000000000000000000000000000000000000..b44f8480cee0d961924105c21a8bb204e2fe519e
GIT binary patch
literal 4057
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
LNkvXXu0mjf4*b5U

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/spatial_tether.png b/game/modules/tome/data/gfx/talents/spatial_tether.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7144cefc368706fb9e0addedaa8d4f94bff6f99
GIT binary patch
literal 6878
zcmV<48X@J0P)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv0RI60
z0RN!9r;`8x010qNS#tmY4c7nw4c7reD4Tcy000McNliru-U$O01rH2hk}m)N8f!^J
zK~#9!<(qkQRYlhJf9KpJH#3=tBq0My$Os{T%nCB9prT@<qC$%(i2BlEe=03Xx3=8~
ztw@7SBM3GEjR=CuARs7{f`EY}3?V=uA@e{WB)K_5)%VA_T#OkQx?Ssg*LT*sYu%*k
z?ArCz-n*W?tF8h_ex*lIRHPLAzx*h_CIJ5%9=9uBx^=sq@bDPUp35aWYhSA``T7RZ
zzyA|B9JNRZrYYF9YiW~yo}O*E_13XyT0K%ogapITICA8Z7G?YS#Sj&BFQ%zs7&=md
zlnPQpgH}yZ;o4uv0%rg1-wYk{Fs2F9r;lax=H;!v7$4t**I(a)-QEVnfa;6oyfbqc
z1qGRn`uX^TFmmL3bV(b7DHKc-G)-sg)@khDKc`vQs_I63{8-}Se@k$1A50VLV}K!`
zxM&mS&Ml>+Wc_~(fDQN~Kzf&6bnV&~fPn)apr+;`+1V{yLRD1}>({?SP*50gaow@o
zeHb`!5}uxI$j;vC>Zj{<WM!>m-wz8242q;(yHr$FB{p^#efqpieSI~>#RnS6mQqkz
znL%#uQjQ*-g~L&Vmscp>-r<%7`g9~Ld^8>7-@wPG6NXVsUEQhwJO->>v4_rSeGw)Y
zCM;h3HVYQK?&|F2<x742<z}p*Cx4jsH6Hdhm;x?Tl`w18Fp7$fHtFl{AI`n^%_A{!
zq-#~{>o4=oH^1k|k;Sbl>+bGHhYr6bI_4>Syi=W)Au&zMvWkjUQdIOY)z#nLd=T8S
z<rLxJv6#YAZq1qx`RiXN0Wki_Khm|^5T;MRpNkhOnh2XXaS{FdkH>TZxM}0NtXcDN
zvjYbNM03x*^NEYS+XX~zT{YXknaa^)%dV-o-5x@8)RVN2dJ0c_+*LO*K{pIaia(*W
zbSX78Kin7q9v*gf?=HsMJHVQVA^FSOllgqzLfW>CV9lC*G)?g0iv!8d-qS>2LP8&2
zet8q_?tYjiR8|)A?z=-NDLK)s0>Qx@88PAmqM`<27$5{(zFfifZ>ErQ^3&^DMNiKN
zA|uBW9zGs7_x1><RTu^sx`UF^rBqZbrLHdH`nJKKptkJVU5peerXgAU(M;yge+@ss
zKsIl#z%VSN*RA^p^XI?NtWpyvE}>uFaTrcB-Lz>I>(>3D#Ywbno5Jwn3kVPEhaoKa
zmo66Z?YC1neR|z>o3yugEMehK(XQQiR5b))fGH$~p`hs(DKA?>Rn=k|8cw#(17c&7
zm@{WJm6a7tnshgs)_}LSA1hX5(>A0%hN&P-NpZ<}rcCKaMaB6hG7=N}F?H%D+}wRJ
zO-W@%A@9u@LU~zkixX(qt}A!mwSZgN-im2T3=^uW^ZD+(7dUrr(+veUAD>j(-SQ+M
zp-%#Sn1+IBN-kf{AUC(y%@d(z%QEQDA<gM?RseeY?MK<U^V1frVHv%8J%(X|Fk$1y
zzwp&pueUlzcz7>{4P8KRa2kfwq^qh<v2*8h6c%p3;b`yc+l{tu#}gFvTP|PDCMTzN
z%K(fX{UqzxuSC-toRn5U%EsO1&HIM*^g*sjY?um9Pv}H`{;_5iNJ<*O?|%0cs?7(}
zgo^Tf=FS~LMaAh>6_1SU&yc|%;NK?61$cSIG4|}5OiAgUo7(z3Jri*_a#{vp!h|Wz
zcw-Lv=L@i@9^8F*XD(c58ujnE<3Ym0Vi`U9_xSsVa`^C0UV3R@tAkIRxRUPOA4Zs#
zZ*JK57MnNy>6%JMM-OG-!1?(4##w+HP*#3~y?dUeqT;}R&IH}v-O+X3)o|ua9qw+P
z7$y`K7tyzG`&I?bocR?!dJJdqVB0kZO->%j3omRyQ9Tg`l$M=g{`{d-Rh_-&yB#`=
zV8DR+czH#-fG90J!1v!j%Y_R^ZVChm$a(V?$}8Ui85frz3k#*p&lfW9jF8KhZ*SBN
z$Uc4Uls222R1`%5a{Bb;vR%6lP5L$WQ4~c^ob;*u=K@pCpKr*yb4@vH*!1gq*V6An
zId<H6`OMRX96w%{<Hi|s*syP<zkkwo%eb=m5|E#*`9jW`^?swq$&>$&EG!f<KVQnc
zJRx6xd8Vsv`t%QEMuw2Pc3qOe!R=iCS5?~$DUgyfM9!aAE9cKQ<=nZ3eC@Ry84wV8
z-S2no_^5nhY>6B{UYEZer_0A5*X6*0o29RB-1RNQ6%^L4UC)T&Bk9pIovf^@rnK#w
zL!=~kb+N1t9aI3`fB!QE4IYJQfUXNhkM6|TvnOu4Zt%>+)pYK3ziXTg8((L~_P<`Y
zjD&=7^z8K>Hr3y`GfB>$-^8IqFHl#Pf9)9X#TQ?4_ucnWURFUw`?fzzPyNZwt#)m9
z!-jR?#EDGY-96Z|rxb6mHcqkw6DADc@ZsG}1_=yoht1|rMMXiYlSoayi)Wr$57G_8
zR46IUVc|cAa_Lgxbpw%<^fcYO{|!a)b~0HgC|Jkg!&7iLidzPtXV0GO+qWOnfDb<S
zfZx6NysOi__ddj;4_9NF3a8KH(!YNKilPu28qT*n3S0n~rsS1Z9%1|T&z$V8J*!sb
zV;Iu4vLz+?Y}>Y!HEZ5R2(y_~*v8XOuO%h<9!vp-p|D}YtL)k}`-ZG4Ir(|g(`SOT
zTVo42cXkz-Sudh#6-|R6Aph~f2huc5scEL{n%=FEuZ$i0j4UaUvanFdk3Zhv`hVB1
zedW=kLS|+PnUNvn!GorJ^wAex?V+KOa^uEY`SsU^+_cG*UwviD_3KT!cC9IU_a4=v
zZ+7l<kDN2dA>Vt~l(T0Wa_Wm&($6pKMgyEoPI*Z_{D?#TX0$FxJ*dn3@7HBw;+sul
zz?G-6sEB}oAj&E(5Ed2I2q`ZwZzfFmANuth#Pa2f*|1@?lQ=!ij2R1Et8AE(l`G~l
zXU<d<MZwF<k7dhF;^)`)Dtk06n)~^>S*%<!t;NE~gbC|NOdRgaP9+;RzRaFI@7-{m
zNlAH?)YP{y1(cWl!0z4sn<qkD)6zJ!cMk%Eg^QN(+|()8HNfj{%;S-VpZggI@XfY0
zOq(_uMNv>y8y|g?MOauOrXgMFwkhDunJi|^7(iX!#b#x9?mUul<JKUhf?+5W7a!%L
zkA_fNTXw@hq^8awBxEo<clK|Y3C??G7L%WT3Q*`dXfTHkXIx*7uyh;UyAN<qPQerk
zKmD|qXC@7B_4)ksGQ534tU`tXLRe|5DJ1XCeuy6rG@tp|Y#u!I)E9J&AL;^l!-lEs
z+xPeXPEF9m-5u>`OtAFWF+zfZxp3(cAqgF?Ti~~wj}sCai7-`6p<oEe%gg2A$I<{8
zG;lP3_`?cJXZsa4cg1qP|9&lV=Z<bsep=cn9(!yR!dYJ|D$L^Je+{LsuHvQuP_KM>
zb@Jp!4MRtb0$n4(+lz&>T93fJZ|#Gdn>zp_9=sLdxQr?_6ro`=bz&nsFloXJ0KVI~
zhPsPos8U0fIyQ7{iiu4%vDpND`aH;@MHNIuq%=ELX69O6d(Dr$ydBtV5FXK)S6(Th
zM~}(>8329K(zv}xkE;V6KhEDj{18RcnDCp2=#`${qL9J24d#n~Z2+LIzLt@X^u=as
zxJeB+G*qb(5)cG{5P}CDj;6FI2UTdOrjAYO*o1~n=(tG@e{UaV&-{r8M!weUc!uHN
z!w-kCYSkEQHc)LaV#MEh=IMiYc?I1Z0QI$(`N#C>jT&Ek>n%!(i;<ef=A}zo6cQ59
zhV-N)=Ds->fU^Z>m^k%eYhqHvCN(}@d9?&?ng)+QmCotheU=3{C$9<}73&>UXgqZP
zt2{FLFD;IH<j88?c*BqUb2}|-XrIpSe_uwoZWC`D0I3@!MMg5Dckf0WhK(DC)HVFw
zJy`tbKQ}8xchq7tbw&*v!Nf671F(DFw+y(i3$MQQ9Jh@~;CxZjOz+vLLpku{MpQIZ
zblh-Y6B?>CEMU;Mcj&Vu#P?}&0=iz$qD6yQyXG;MD~%XFk0+nphut1<{pSLs2M;DG
zGLpWXJ2QXvYFCHysw({Kp7iP5iS)!ow*9b=^Q9$?Q`GPX2KVX*!r-<ZeK}Wnp5v!;
zsH?Bz<e3v_y4Ios+jp-cG$@pg(a9i%RTY(2KT?{cr3_@#H~(yPA|<6q*}HcRG10wf
z;}?#<Z##PTdWlOlMU<8vzBT|CE?#8JkRb&6`f?~IhungzynWlgeN4FTK78$-{ATD7
z-ud|BMncLe%6axTkAjpS1b6lu#O*z9!!#u&m1WdB>RVO*hlATtq#!-9rv-p8T^~hC
zyzJf_&G~_fs`IVNF-@I}!^^pJF^{B<ccVx_eB9l{#0=v^&N@u9q4lb8=8`2O#l%oh
zUPj!*k2Fp)Vxq}hu>w$7v1JQSzWHXO_T5WXkQAGM6ktdd(*z-HRMlLf`{+9m;`&aB
z+xP`BV$fqedfyaG38txH2!(HUuVT^4Y1i%Bb`M`3AHABeupS80;v^flJWuxVe>ZOd
z0NJNcGj{MG+IV@Bb@nVL@~@_m71bB<a&x0^N(yPQv3!@2L4IketNmbhCKK)%i4Z1=
z5J=MmDX_b{F`)ZxtlDyY=XecTJy|(F^7VHsxwG#Bc-Y)ggo&HGCtG)|xNZPUQzIjD
z1vNDVB*YB?DTwcI7g3RSkb8QA%Nm+6!5`m$pDuB6lw7DHdhEC+g7a3aB%*Byb-G5t
zh<h5fy*%a#ri~qMS%6RxQlbk5A#5z)vYyu$%xYFye;<D){^kXO+Jx}kfgNo5{wowk
z!OiB*f<JyqaA14t9S+94bnDF(LG6Bwd2l76ZM$HaDn+GPtXOk*Qwsn%a{4q+4jhP|
z-A-;%5l8bI7ZWz^-^b(;!*N#>5+fp6w|B3rZEsd4-Q(klZx`nDWq~3D2!qZY5-2Du
z;rQ9chnQ`A{MokPYm%c9h`J?;e(C*5>5#^@eVY-&<jWn)>7Ck_K;J+<+q(Fs05D9A
zjO>3?S6f0t%mAt{<&$+{b@KoeR#kClS{mU2ZRnqp!h2tS+4xkrrUtvJ(l0TQl&DB{
zA3e&sva3nSnw{VAyO9szrl=@VAe}%UBtviQ$Ce-WP;v2stN*korjQ&N2SOlCi6R7H
zZ6mm?%K*OIZMn^s?>{HlFMxx`zyFVTe{oqh2Q&XgP@5?73U;@g40VZ)X5XLxjDo_1
z4;Qk0chf4*=>-dD9}+^nt`jh3Ory45iHU4^dp4$!m_o(G3PPq(XfO=API{QS1_x3~
z{xxk5UE(@f#Sf_>1Q=352!)cWO2)qR7@DCqIhXivJuV^?;^%kO4bGioZ+13P*Le5Q
zN1A<c=pX-x)HFPS<x?7`%=>e4ShDF0Y^H%~=%|K<YHHX-19nA_`Hxku2^~6~fof`~
z;wmGwSfNI!zaMMf{ERj}ZGN>YGA;m~=+(1P!wbunfu`YSv+-2_+nc<2rnHp5tX%`T
z#zWn@F(@^)QTx;-A5mIXf=y_+nL0L8!)6$$hK5ZT+}rau0RFyy85LC}7C?rEVp?EX
zIf8+oha0QkSWZMp#B~%`6@0zgV0ZVt@pO3Ovy&LLXfY1Ma5Zjt{y7FGCQ+;FgiM{<
ztbh|UXA&I}LW5}#IO*9&rWzd*LguXZ5E4wOTBa=(OsP;+TSu3vPg&=7o?h&kxfB!|
z0?Ygjr^}d9v0TVhnDWn8IC}25OMX;n41H4jlNQ^9=vz7>P_1KerwdiqRFZS<2pPFM
z$vnNMbtd>gY6`w~J3pPj%C`2O$>Z66{qRtrs=khc=bDz6H)Le++<^YLp^zF8&e}tV
zTx}QY>Zq%$Wl&PG7372o(&7nrn~na-UHJ5e@6Zf`tr_3*Siiwmz%(UD(*jeND8l;t
z&TfOrD?Lwsxy4e$0^9LF_e~+tH^5?{SLm~_-nF}X5)m9l*N%5Etj7~5iW{d24>u3M
zL#e6U-XVr12M)R#FVxl1JuHm4pg``3i{qW`JDLDcU0)BT;P%*9l0!rJ@mxM<%FBNS
z;%RP+?LbUWkVTM$KryWg0PXzS5E0y#tyvjdsIB2x!5QvJ>uKFBbkSi6rjuMr!GM(B
z)Hv!maXy!dOBL)myp6lM4z_&R^`1nLCW<sIFq}J4Tv#fDx;{*P*-0ud75@T&<YWd!
zMKN#Rel+uHx%!8*XL-I?FKmkBvZk{?zo`}MK6Q#Q>FES`dNQg@7iMqY-pCbJ?%$8M
zn~h#E(I^(bMIumyNlLp2svQmv=jU;@yadzK>D?j01r|~`CvSm(6!eJcjHjnJht6bC
zuhp~Zz$S*K4Zv=5N0Fw}5}cMJ1d0@vr%MAB@beDjQ0}+C03b1egn$4l>+ATju;{88
zI~;Th2_`8pm^)%(n7M0Lv%a(;JDcZv_r``KEj*mhjx;`~{5B_tRX^^hLqGuWA;Dk@
zCr^;v5ue1Nf^(d!Eay;OE(syG5F2ufwVI|gDZ0WZoTi=<7Dr@Adv=}p5kr`Kbzmd6
zC-%h8?rph&=>*T2VJes|7pbT&=HRJajR6?mA(oWDK*D`|So90!_vYs_<<{;fLZS=7
z_XSN)crH2|7`o0K(a|IX2lG==5vM9E8~3TNXYJt(W^LO-M*dlHN{TpESiqiBC#cgJ
z$SJkVa?8=57@E+DwqD*>Q)3~1#x6~y6hsBxLYJsiwr1}^BH4U+8|jgWg!l$neX*>_
z<x<kJf{II}95}V7@h)&*Y%D8A3<pIaX3=6Q>l>%AACDNpL&-@<MZs_O-&(HHOrA`9
za4?1x1pno)7~<yc3fokb-BV`Z<K>I#jOwOTtzAKaiM3M*sc^2UjET$MLL!k;^3q+C
z=n>l;Q{sG2u?QAcAvXK`Q9jr@yD<;=^2`~~G-%Kmmz2~*p_g`S2TeoKH2(05s?pD%
z;h%hh)HH0S$*NJKZknK&LU7N**{HgP&Cs1hslnnCLc?ZixC@J4M70TI`S>^SboW3}
z6yE*%pKQzAhRw7}YpT>yq_gBEHB^kIL<nHr$z0Giej6X(M4`%h2g|dwk($P|Ze3AY
zP`t3Fh8a6{fTnR*R1_oP<8B&+s=CWOvTU9;VMDVRrD(urSk-3r3K&8s$ist`<7N=-
zWQ`x~S<SJ+V-|3xvjTkuK-mHSpXB5qHH{cgI}zUAO%!@%&t9aagRV2<XBFgMKJOkl
zKyGO%=sGKgkHEubyWz<PdRgNiEiK~J4XaU2rxh3$ZMN8AgNs4hgpRiY%f`Gykhebo
zbGCnso3N_VZceaNsi6v^`GUxqni{4hC4mss7zTUF8XrA1m?mMKcG3d^=o1>s?941g
z3rWhCr%&@jr&Mf0&^0uaPfzCF5C9(zABn1{9Iq(jWMvsXZZ^7xhJ%zy(+X@-NE9KF
z!gK{jMF`Tu;@F&X0L{?({K$6v-0j2%hg<DZP+n8P_jx}xwE%!mPoF{RI^!ZEn^o-9
z0|%{Gp=rF?%2`2iZ5`A1?nP=EL&Mr}Urfvm0WcsUg7@wiLYL5X0Q_z54t~fxiOsN9
z)7{WqK5n^#;r!@y3<$>C-EPGaDOmF3m;8C_hqyU&jGtRT69AT-Jqwyfn9WA4k53cD
z>I{R0$B!d5o#*3X@odGs=VoPdqM{rcbUqo-ANzH>LXf8?c0)%sbiNq*5N*A@QGjPQ
zuc5H2%#~fbnHo0zO7f(+CTJ5HA>MwCWF9Te<E4#%M>QR&vK0V!S5~4oG=QcvHlq0q
z?Dfnn&>E1M##^0ITb;~3Tecx}4Mo#gJz&6f0TAow56%^~85-Z*KN_2AsXB7qax_Ps
z<@bhj!lu(2u2_YkQ_#$1?xIT-Jpa}EG&Iz;3;@8t^9zu=#uK-MHmjgR2<D&6Md}*Q
zv~Q1hD=S;-a4_wl<u(I@gLtq7*J@+|c6V&LhE3N|b&ViZVdLE+0nkj7`@URhnX=&w
zhE8j-nL0M3ft`6rTfF{S?YPXGeQR3>U|CTS=o-ODlACb@fEhVC(4ZqVjlU))v^t>=
za!-+6S%GZOSlYcCUe|C1MaZiws#`0a?CZmVeglv|QSD{MZvDcl9q889raJo<U99BI
zeOp?+6WC%|++`}7#+1-d+@wGklI<6pUR)4>2a-O%ex&>Qu;6?l4Xv=gFN%u!pXg{5
zA?Otp$jb9AUwjI5cV}Ewq?Io?4@#sEboBK{0Q)P-D6Xqz`N?B=DGG`d<X@_0#mOxG
zba3a5G0x@y0BEPGbo2Bi$?nOVpVj|={_Lu*=9P$W5GJ?S?QE>9YH^@C)8s-!149D?
ziSqR1RBau{E?;iGuVL_FY^;^eI&%Tl2|}NsU^FBLDl5>0$=<Re)}1}YhWyhUtG@9&
z0%}VQpHx(WrsHE8boKIT(VS-HorMOCM*{)~c5`cWu!RK$WL~I3Y8s1^lUj@&)w)iD
z!vUI(s%faYhGIBLkfHN(TmoBfAH+cC7WrSP2{yTi;BZjws0Ur+aex071-w&SjMOz~
zXkb?RYuD{Y9?3+}G|(FOEG4DIep`x5KywB{O+(SGJj7;LfF#=OEKcjj?ZIt-9RL89
zS6u*2<592Hi;QobF9J>H0dF5}xrP-~83t2xPa!p(zFuC84he4lzR~&fple9Y84R71
zSDZod%4cCpXWSL#*8$*@%QZ;dz-}1ywtKYLZ%$<;y4C=?#;nk5ugH?}at>d-2%5&i
z$VhzDrfO`vaDfZ8^+-)aYC4M3{I6Jms$0N#Ns}+qyZ<@>oYW1<O)IiL?(Ng6pg)zD
zgQjzjhX?JiVFdsWoIZneg0`kZbhCY4$;$&>bEfH6;(>Gj*PSd-*GTrT^S8K;Hw8e8
zyMT+7*i?Gk?R55VXV#^f7W*A&(0JL;7lfdjhX*Ta>slSyAtl9{#+{yCM5s0{3Bf^!
zqcMH0uV<vMFCnVpsu8NL^G0#C-X~0wJ-um=l7p9PZU}(?+K;DyDd>O8ud@HY|MmF)
Y1yw6MwNW#k0RR9107*qoM6N<$g5b7AV*mgE

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/sphere_of_destruction.png b/game/modules/tome/data/gfx/talents/sphere_of_destruction.png
new file mode 100644
index 0000000000000000000000000000000000000000..237f62b5b78300ee98a39ca59249376a543bde9e
GIT binary patch
literal 5500
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/spin_fate.png b/game/modules/tome/data/gfx/talents/spin_fate.png
index a95fe19d9122b4933f281802dbdd37fec873f1b9..9fb6a19b51833415c41aebf3e5c8d2a2031c309d 100644
GIT binary patch
delta 4574
zcmV<45h3ooAn_xRJ%0_?000fw0YWI7cmMzZ2XskIMF-vo7Y8yTrcr0v000qwNkl<Z
zc-rNgd0bY-`oO<4^RkGF8K{6FxZ#4iTLiA4f=k-1+n!~bUawo;>Sq01Zi`))^j7AU
z`<{ZSXzEoHHB2!xmm)z0)GX6L6b0GdGrvF1;YF?sAZXisn19cC&pGqVndg~je+E(A
z(?_E*n*f0Z0ce2+geZ6km`@6ZLcu#NhzN_I<$cXbN;$!iqu+8k{s>A+oSdA{+8QS`
z=mPk{&w?)a<C-7W-GfG7yPRw81(1`MOJKcvRCTY+z9ZiiEcKSnc0Tnd%A@)F`q8{;
zD_Y#wf=7Elihs~>DE=E_Vt26V^DX4&<#DH5-`>6G)V2*dIXP^K{jx+b3V5?TKJM%5
zhl`U7)v8s;CIKn%@$x44{vi52^)$@_o06WM&W~r$-Z29Fav_~A!4IIMA|WM(w2POD
zg%MoCVCB`ks(TUCCWx^19ck6PB?!Y5C2f#?DV-Vf=YO(k+qOGGgpWqQL1niJ?D%Rw
zi=#LEIs~}3Nhx_Kq6g1D_9V4@d`umq4bm@NV9bOG95{5ST)+2Bubzar3+D2bD-0b!
z;qHmR&6?Jl#N)?^ieAH>{c-r$_QSh|7jAA9=-I6+ZCf^H*Oy<Cn_E6QBHwPOL)$hu
z*=)q@`+tg@+}vAl5O=X1O-y9)%P;Z5@FAQ%e;y?yt(rAw`?@uB?bNY+zLAuSlnSL3
zP3qPC^*P{%$|^0Dm1{obd|DbELxK@P5Zb;S0d?!KZRf5s&)>dHYbsZC<HDs3jwBxY
z?Qp>Vwsjjf658isPNbYdN=3(zU_M>EkP5D@Wq+FY<WD~#l)}HJPw_g6U%6#mzRZ&Y
z2Cyt@HA*RbYu04z>L@%t?!E0fe>nRyQc7xhd;j(cP|!Y@HJjJp9*>j~7Z+!umoBEd
zr{`_Wm71Q8l!|-YtNeZl0I+T6PM#k!45@55IlB<Od<h;^tCo76^o$IoQb?QpeGvd4
zK7S#BC;AUSNr_TUteQU;o6T0LIWn`dkU}A)qN1DItz&_^ft0^r9a`Skf<_G+5m2u_
zKHgqb_pHYLgZmlw>OaV}Y;~WWJs3V{APL8gb0|KZ7EJ@G;_lA!k7x13fPp3cUS7T(
zsU#R0C!4za1dvkFGrTtuVciJ{Zif^CjemhegS4(dNKi0e?~3J#e$R0<F_Gwvn{ak^
zX6!#-#jqO~h8=;Rj-NkcUwwslrc5oV`(+Y9IO5j3BLXd(w_)0(xg6M;!1&RV2?_3m
z5DI}n3W*TXyq5~3KnQ`8lQV0Ue?mx55CBnY*RgC>6jCXak|?Q=O42(boZz-?OMkQu
z7Z(?#G)3U9c!FUay0bBIHw&gm(jhnusT4vAq!361LJG&da1cTwWI<Ofm^G8;_caAz
z@`oRil#+sw3Mr-8mE!$>zk`&;FWJ3PC4`blCApfNedh?!v~f$;uh_$TZ_mQp%hy5*
zun;ZSb*!C7DwGrm3g07?Nf;E7OMjM7sbWO{2E8=Wfw)Ofg|a#E*6X8+U6)7Iswk<<
zZ{7(jpp;_b*x4+Y7EMiWUl2AfU%8CLVsWhia{*E+1d6QeY*H_za`{RY!rE1&%^YuW
zgH$#a&6#bw%c-d>TNQ<n0wvAeR7%mKYghbzeQ&wGT0TAqDM`<`SbRpPw13Dq54@ib
z|Gf+sXJ<5;)U;Gy88?7`3>i(EmO)6NNlQP^#;t4FyDyd_@rTH`eCY;q>Pldv#<U9#
zA);G24eQqhG%cDnC#+K^w(s1@e`d_!xu>7P5OySB08+!7ufImWp~G*w#yYiqkxFsq
z?9U}snI-HmKK+W`wJu5T-hYs+_iReh{hk`80o|~Epgy$wNBy67=jjIZ8tKx^S<pQ_
zJoTHS$LQqmztg+7Z*x4K^6q&3{r-LWySO-gWY2DWX!jTT;1@e}<A8vh&b4~pTphDI
zQV)FQ>0-ZIViA})dI3*A@;9{Bq+U43BmLU3=#%LHJkX{+T_0}6%YUO^<akno1LncD
z?HD<96mzF9rvJ0Iw&SU3sl55_cmkTW;K+CJJYZ@3<*OpC@YWOoWr@#-!GmsUf~!~e
zL@LG6<HyS<BQ$%`2I|%hK-mQQ5AWjj@i#}NQ9vL=2fj*|&<Lb3Gt3{(oW#tzA6_@M
zrcX_rot!y&`eb3|*neuSuC8QT8vNLygBXS#Z8xyn4Gbe6Z5VXu(ThtN8AafNTDNA(
zTmQl^?1Vr5RN1Y-?1`V@=TjezW>xh3n<8J`(~HHkqKRCzjj)d05kjJc<b&x&k*`t1
zi`moWl6>?OyJPkevt<V<N0ZqSy@^g83X>w)*DQR`SNlw5s(&O(6<UTaojP5&j!x}D
zkW!L*;X<*<7fXPtV^&hLMjbRTf5jB$ESq%0agX(Rp3PDFX%^VVkp|O-X6=S3X3Z}|
zzGrxE;&yyPc-J0C6apMRL6gQ!SUP_ZGd{SUQ@%f%VEF^ea*)jH?zp(?#zusNB9&y<
z-hCw!?VDPGmw#WJM18+N(6A)xLn1fKyWzOEU!O*Jmp*8;$;Jj~B{+TNByWr>)YL)u
zw`0cpa~wqxga#o%Y7~Gl0E0fgdy|=!$!q`je-7B=Nl8d)+H}(rXwIJhnRDmQ7g<YS
z<3?1hSP5;|+5GwEC3D+v^ssBlUkPa)fuUhr>>5_CpMQNr;0IcDpi9SxOf6#ISRjUG
zz|bd(jGaGg1r#_%vd}G7ND!v0ETu%Cc;=~RXwtZm12*kKI?}=V5@}P+Te9@J^*sC7
z<0vJ$l9k1=q~zNpK(%{)82IF9v;j#c<C(T_?9F}u`-05Mm7y&TFjZ>Qx@DaC@swj+
z_ilY~tA9`lff)l75J5@-Qi7Cd>nfD#{*D~+k^?>`C&xtI5`*mAJXS<TnSP1oKHF?I
zdUWfGkdhUvKP`FS_P-Ct4V#D7ke8pws7cS>5;(A7OSHz(F-$R-^3mHx#&rk@MQa13
zu-xAQ4iHEwQBs&LvXGAWp>yZXg>q`MnOtLWz<(R##yQ@7vT!~CgZsbWP>xGht|~DB
zis*peq5bi=rv_SU-ktGx?DqUy0@tt8*pz!MOxc&3m@l@FnRTVexEj^GOs_+0bLRyh
zG}`2TKp@ZvsnNnLhE}Omn9izRy_y*h0I_@b^4aG90`St%AvoEb@vc#Wp@Rlu*fr}u
z+kaT9I;4XGT%0TLSj68!!&ir6`0m*LVu9T%R0eIbzhQAf<l4p7t~nJZKCfIhMMVp%
zz-;ckL^>ixErk_C38Yd*!gzl_f0R_DU%JFo&-Vks$J?8cLxv!gWWlVNmW2?!H*H$!
zau)?Z`abk3h6Y1xrY{{`e8hEcbrX4q0)I3qu<t-D0I$7NSZ+9Y=qt2QAR>U)2q6$w
zpd^GuD2vUd4Iw1^4;*m7w{G2vD_L0tckF~PS%&DSNHbhkiUtiDAeCh0>NR9szFc|&
zxK*f3NXuSeXx40<LvCJ9v4B;pcw$%tD7b!m^q}K?x6p?O>lgt*<eH_Xk~EzJQ-5a|
zm_#T@lITL~fK)78w9qk^U+vm7Yu%bFnVD#<S+i;--rnA(MX;(sAb4l;<kDxa03Pl<
z$f3yAY@Jggz>02_t+NZ(0S2u(dhA=r`+M9y82J210Ip_VW%}$XXssQ@DzF*_im)Ij
zAQ2=dC$oBusmUw2y3!#ujI69Iw13vDTE3j%2Oo6g3WPGv=PRQ}V;IKm5ukJ1zoIp4
zj$K}I?Wt@Ivu7CqemIi?Kt2Be0Gc#vMyuxc17<w1EoO6pq!hIt2unFiGBPgGIjqnn
zzM7ql)*2}#yS8s9v~y?6XHb>}QS3YLHS0gyczgNFpl01IO|IFvYf*^-O@9zw1d;TM
zX%78R@NUvuGaWF4NA%@i<40lG?WRt+23`oks@1Eg+prFqS(!z?75w0X{B-&>&6+i{
z9HPRWm!How{rcZ_R?8ODECQ|J#OZIjl69%XfZ5rZCIW^wvlJQ!3o4}?1oEm;lM#bQ
zF>SUPM=V(}k0mSS(LSUzfqzZzqk^j|DW{Uyyk#RfIYon)YM#}YIeiA*yN8?NW4AjJ
z7?%B{=U@IpUKx(x*p4Rer+U>|e0jKZER=EO5?YIEI6*i}Uv^Hm#Z~4m|Luj5?Af=A
zuMZXmFR@?lAoj~0H=Mg;hfa(bHiB*u;Yc(>fW|OU7hs?fz_8&Xh=2e7Xqghawk>;>
zv1QM)QUj)?pLZZWb=Eju9r_N{tC`i<pU<5sD(k?~xzU6_`~auVoV>=q*Cj76ms&M_
zY1Og~ojZjQ-Yp!d1WJM-EF~rEW`fhw7igF~WeSn2SC=`XecOeRtJ#@W5<`=nokhRl
zJ$U+2Ggol-+>a)43V#m6X@NF0TcYFW@kj_Mr;;pP;lZk98>m#t4QUfdB^^Z7m}zu`
zVP%dB&%;fhIg<&KCYK5Es`uPO`o)W7ON;+}{tQ}c>iRb#`BWlPXBPVC3CH72_gEJy
zOo3oabR1p7dH`_X;C|`{dNKB`QDkLi6><$Gn`0GJOcQAmXn*3Q$-Hq*s9f4s&BKFj
z>!Vp|#SmpWA=0E_EBtFU0HOJB%%|k%=N0i2g4(n<U0tD(RwYPEc&Pg$1T<*KrY-9M
z_~zi(eDKi}zWwe9PR>r$@vn=`$!69Mq(CauVd_7iKhtN-xNYPI^?!kdvu9GJauuq$
zyL0mNsj{6C>wgp8mtp<JAZ>!M#{!DHt6a&Q9qZ#!N+500yef%OIPQfMyfa}m3zl4;
zZ}9N&ph5iryu7_}adGDG;X@=OB;3|IJGO7nlnMW)nuiC5VJAN?pFzV%uroHcYy|N2
zsmHvj8&OI!cvK%wq!iW2K3={|e{U)E{2LS{f(^@#3xAX{t4Z@0&0^K+<s40jFSlA{
zx2|0nGwOBf)vbeJ*f9))t=qOUWaLPP=`8a(!Os>S!PV83716U;u;Tq2j_DQtC}aLP
zfy(agC}|;YGm%%8@-vAc$j{GZZ`^M7eI3VpQzw>sJvD3A<oUjR88o0jZf<U9!@#iH
zIgymah<}$~;o#xJw_g~!QUB-PC+Te~6LsXA-NlZ5{E_GM-k3z4c<{VFapV`B5}&3|
zC0@`!oJiL{rd-nJPG{(IKV;}PMvW~+LB&Hq)T@{N&(x_p>DV!yk$yp6Oik74=g;Z1
zpU>*pm>At9H1wwMW#)ipjqhj5xTPqYV8F{gIe+;>@x_SX2RhL2*}oCiIRa(FOm)iw
zT_MS{=a8Iof}egmL)wK@GBdBBF>rQq#@)R#-rnBS_Vc4rKmdj|&~`g^!@L@X#xU$G
zTeh5O)2EY=m{|70NO5i5!h=+Db7R}?bxitbRH<Miy7r=bcyB^Gcfr%c!_pC^c$mI{
zRev14_L(TmmKb&eZP-akNoMor|MKbDwd~qe^0S8JLV)KU9ZuiJhar_D;>jlD<=>uf
z?&?~BHm&ZbapNY`uh#%y-&%NjdQzo|J2qz<hCQFmtC{@r%X!Y6IYVM%B8LwjCN3`S
zy2?^%nl5X%*_`y&PZIR@sAGEY^P_Zm%zt^edbyks$<NPY!?sV*20YRGMO<Af@Ox?H
zc1CE<vPllN_qAaYe>Vgux5LtQdp?GdPs^r3)bk5q-#1^7dg0t}o&e?k4--*y_uzSN
zH8QVWrq{Er{yZX3&_<2#kJe@^Fk#Hce;yGiXz7<yQOZX1z_$4N)+00PGVzIret*+M
zxFhCe*2GWs7tu+2_h-qvO^cA<tQovx|1>3~V(p^6+<T7)$|ia79}n|=;^9BO4sf`r
zhMm4cx{;fgi(zOMOj}QjrfvT`1TZtl7kT`}j^yX(W7zF{{QhdfL;L)(&ESm_kRGg_
z{{@vQS3)U4Wb|StPaFH^Apn50vsVi%KHiF7?K(&)IQ7GE29A7!v<tudaYf+TmYbWy
zUtj3R=FiuH27kW>y!ZC3Kdu?PRS#|7UB|3HqFtO_esweW|0w$a1>Qs*T>t<807*qo
IM6N<$f@F34UjP6A

delta 4133
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

diff --git a/game/modules/tome/data/gfx/talents/spint_fate.png b/game/modules/tome/data/gfx/talents/spint_fate.png
deleted file mode 100644
index 25f7666e887a6e27d523eb2e116324e3f1f9eee1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 1772
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
O0000<MNUMnLSTZc?@wF+

diff --git a/game/modules/tome/data/gfx/talents/swap.png b/game/modules/tome/data/gfx/talents/swap.png
index afb0b6a4a934df7c7d81dde32b03782236e5d54e..9f90da389b4a557bd88d4808cad0630fbedd5967 100644
GIT binary patch
literal 3392
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
WDJ~LTPV}t+0000<MNUMnLSTYGWrxN9

literal 3373
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
D)mnJ=

diff --git a/game/modules/tome/data/gfx/talents/temporal_bolt.png b/game/modules/tome/data/gfx/talents/temporal_bolt.png
new file mode 100644
index 0000000000000000000000000000000000000000..f4bb163da34d6b9213ddd8959484c53f2ab5266b
GIT binary patch
literal 4998
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
Qm;e9(07*qoM6N<$f<JkgF8}}l

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/temporal_clone.png b/game/modules/tome/data/gfx/talents/temporal_clone.png
index 69f316bbdd60df547f97602658c861095d4477b6..27871178fac6951c2276ccf10a5ef098d4ac49df 100644
GIT binary patch
literal 4599
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

literal 4482
zcmV-|5q<87P)<h;3K|Lk000e1NJLTq002M$002M;0ssI2B@5<>00001b5ch_0Itp)
z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RW2OJbB1v9}Cvj6}Q6iGxuRA}Dq
zT6u6(Ro4HV^Ik7m=!EPE2?S6i3kXO+(6A&3j3PB40!oQ6)}W5xjN34dA|j@A9BQmW
z<x@c|5Rd^BsZl|efEZ+7G!kT$kdP3vk`7rqo$h<SKi+%Y(Lr&8alZ0aD)n;v<=*o<
z`_jO#>(}*@7G2_FqUh-8Zr!>?L`1mV?o+2u)z;RE$bScbjvYJRJ@W2r<t{>Zh!gMt
zClAWfrTI(i>+65%0OI1}p3j|6m<S<AyZ1yOD`#$dxVpOfGSQ^#dUkg9(72(oh;878
z{oehbeDX<6P0dAL)-Jkhv)S^-<~ith0D&x+<^zFxU6-nFJ+@UTbvXbq^Bn{3=*F{j
z8W@fndg$YC>ORDiRDSBzsqYJ5(4axrNBxZuB4pAG0#Q(AA=INH^pmo(vdaNLDYft9
zzRYxq<iQ{f%%J3q@DWHodF<G+Z=${E5u>geCDc)fKoEuyK#;FJM~&(_>hfu}$K#o|
zc3vYb66;=2{H-1Hx^?SzX#l#eCs76wzybycU<i{zIvAn>j4qs^Y1-w((9+V9w=oaA
z$z&M=$e1v6!leN)GdR>>wh+POy1?AAq(Py~d|5qAb#?WkV^4$63PXs5aWxHhI-QpQ
z(AL%_TqR7x1QsCzlc_umFqH8?RX(5Za(l@=d-j~Bg%VH)?(A~8E&)J94q`V*Kq3TT
zfh9ymCJbTh;oVmzqAl6HMEDC38A2eUOB?Y=`5y@#5zW*VMIxp#kT5_5I=tcI4Ob>q
zm6eqp;iW<%1faa3q2ba1PM<!#t?4<T3o1Z20Zd>4LD-$&@?2?Y=@kpNYd5VG{t7Io
zw5=^IEtif10FE3v5}jF*toH>)5C9@TKp-mF?)~e^l`F4gM&x$8NB8f^6uxNVljqN$
z|6Tx;QiX+u#h(1mU24Lq6{rIpK1*-E`RS8ewrsgfG59-HonCjUdE5T|`+rzAYAlDt
zVYl18UT<q_>whe1BQhM!|F?QTyE4pkcIe>j(81r<CO^0C(PbrFx7pIOv&ZI6jnT76
z3u~ie3*LSD^sZh19{lYgAtKV&-24jykkYHy{ZpTD>NgREfgmiR0b1GLUiwYV;ll>q
z37MILCQrU0dI+gFz+b6-`R<CBPi@<F<p9`1Li*lv%gDjEMN8z?iY*&oebw941m@fs
zGsa{-C3=DxNkB#xD1@)Ddg0xZbcbWg>#t|fI8kBD1O+jvX?S<%U-m3qcqMEgDI;U{
zti_pEJrbhz5&KoCF*$KL9Shg54~dMNG3_nCqqEpa>?Af42b2S%0U9E;gk8Iq`@P;t
z<NpDUg+`)5bTdN{&5_nE`^&Qh7tWkX=+|%3^Uo*t?b}dW+f-F`@#^PCQ=fjzEe}8P
zkw5e%pWUIH@P)!3qG!0Kbr~|G<^1_mp<hS{lmp5RWrwmsbU-(LM<x#%<ZEuO(N2mE
z(c#zN*P(1sHYgoRi<t6g9smKZc8<^P@zg_46ik>u-yR<RBLT3cb?VnIbNu-5gal(J
zbHaqFcP{gXq==Km32{Q~5C{B@up6gO2e51FI?<Ki2IznWLy`O%lm^9Ga-Ti`N*aol
z@sS2-5FJW~=ujFWX<&3_X63<ye*F}5K#S~`^vC-bFVn-qelP%6a`GQmz5Bqd?RVa}
z`iYmfxVm%!aO333V()0)XM^7cu|sJP4H>Q>tn0<ww=2y9lVX6OG&38AhNw=R0GvN}
zP8iT3nxQ-<3}^s{UX_~*;EVJ7Ea`E)KK8fIJ@>-^M5m=a_R5w7`)`#!R5>&_(nmf1
zIDqYI)+pU?+zo?s28lXEiwjFiYObgNH-VrCilMAjTo}TLh>ix}uC6voX9!z1VEovq
z_weBWj_=tcx)K}22GO}sw|lyd81a1pgeNCI{K8tX^?(g92-R?H@^5sfvvkJ}(V9eu
zXiyAcD2C_;9ggsn6mLU=((4W0i)M0H88w}TU@aP;STj#BE&`*AqZ@$Q;$pC0X=XW2
z95(%-r_rtw{4M}DKKP*M*O<J~&1*!Db9L|DboMOt27@tZcdKX+ot+U806;A!YmK_X
z(hy;^wY34zY_<S4Q@h$pNw_21?Tr-`U?0pH5Q;$DzguqZMF4~+B-}K6_Wkd@*L}<w
zW9Q(iRiOHS30mjc!s6qV&j)q~>9Z&>Y9O}R0Mzk$bDzFOA{Y(z^#IC0`wY|qt5P-0
z!%!+PM02v;?r&)kR?r}1U8Fg3rceJSfQYVLXD;5HedFB34&$!Q&Neoy_U~V}@mV1e
z3j-KnB25FJ%;LthU4uk1l)kMEz(4b5f$9Q8n_-h7gz7VA0G!FsU;Dvd#A2{eu<SMq
zK)_R9uXMMt>75iqY3LlCZ8wA*05JL4XGP0|M#9oiRRy5akRi^vxV`h|dwHMLSuuW;
z_re7L&_YbDV5?l#3=&mKZ7qO`9XpmTngMRLB9uiIOKownDdYtU_8xsrSPTZ6T_Cdo
zr2w?n)xERqNzr@(LkB@|Y+Uc&K>%TKaY?Z`hN>v`R~|nOVA9;Vqvp<4KHuUwGle}t
zK~rmEc{zXvstEMC3?(r!Xl*SuH2`#{^Te7pJBwZwYS$Lf0P<B86|t^oPMc<rjNCAD
zrts&%u17#z+~{j=22iwkaiu38)Xp7i_RiN`7X%Q|wX1N1sli%PRbinX8XB&r_sy6Z
z+pk}FK|yKV20xpAK)9;8vJ$}ZCuV}01C+IszPqWsJfcUBTVHy~?s9FOJzMy=1hj%6
z?5;m?A|yWk_PgihJoS{%<9Th)L!j1nyoWH_s1{c4{m!geN^3$;lc{q?Mi7ARbSjM%
z0faUxx=>mg+qW+$QgP_`xpM)md;WQl$MERK&+buPFMxBqckkHuim(KoHvt3>m-sxM
zn6$J$J*Hm&@WZ~w#uba67V-xay_LT5*4Ia8WC%xJf8Bj?Sy>eY1;w@N0^!2A=tRj;
z0G&sUjLXWZK6tRg{c+G!F{0z+g8*9U>Hr@YihLiuz6e17JMIA4L5PpajUPC$a?hRy
z-)=BK{ynQ!0Z7TswYyx~^76pN?cIwo3P0ZqAf<nQA;+-XKZd8I99y{(e8_5XV(0eF
z0MbT{0y8*d{4>u0cz@0uBk%=0(uuu$0p#3!@7US10p!2_x*}fyWMpJy5P-Y16#98E
zpzS}rVudp<uFrM1SqFs-d*A^88{d2rB;eD<>(_^;q)dP2tpR`fleeK^?XtfsQU=dJ
z0QnDn_#uFS!*UgaDLVU+M*ysOYk|^45tP<;blo}tg9hdp%#L&Aq~zw-6&01&<Ogkl
zT1$8A0MI$HcS6jN(8R>j{Cx1)06f1{95Vo~+g){TH|X4}_ur>{zTC$j2PK%IBwW*D
zv?D62c*6$J>5o<~P+sq~Q>TJD<=p%SXI$K&B}>4EjawB%aaF~xU7?AI4o)+6va%-G
zBO_1z>tCQ+FhD2H?cN>Pv!|jSCb?uE_27d5wk%o%@)_P!QE5$KVPtwbI2r7^X52Vm
zbMx`z+XCSt&>b?}=sUA#FM9CSn!>`=(WCp^Fe4aQ7>c7i=j3>5YL?8o@3S}FaK^+8
zzx7@a6eZsH=%dQ(UA^FWkTTr-p~D~g8XLRcd^0G*^iCY#b>v7-O-*_A4iL7iUjd-s
zU3V!81)vB3l46E-=-Rb((<a5I3}Noy^&yl>8#6|c6HEhcz8S#bk3R+}gIU#;m0tr;
zd*sNu{rkg{lczlM22-e|4~8^3eZ&X=rJFYS8XJetngvQREdKhT(?jFqPrmn_;u1wr
z)cWbdg#gCfbB`i(w4;c#r%VB`d+l0K@#jmHu-!g5cVbXm7>Zq)lO`#jukb)VG=Q6S
zFIog3cfw@jwb+E-Y`34;xl^&nuz?bzDE&q*M9jjWhU*f7(x3pv=xIfbE~7_Zcf-By
zOf9DO)Tus?=hMw^gHhkOz52j`xU4LV`@u>=!AOYD(nCXwH*H#)_diYL<=0G{2<isQ
zY>anq95V*M7ax28_)3b`)gL{YlA8<8G&<pmVmhRzHkFow+`<60l^r;65darTOHUWQ
z9}MX*-HYao1>lT{neyywibH~KhiJsa>0ti+?YBWk*W~2^81?5rgB=LSkN}SEn3mRD
zQE__xdbZndd+@JdZWkE=g2R~}8XsSI@L*Nth7ab<0WkKl#}wI&1Wwoy(WQ&e;{jCx
z5Y$vyExK=JqZ{YV1G$Z?(2xTNARB;)?%hF2uw1oewO1t$9$bI)=qtawy`rEXaq!@j
z?qe;*2q>W~dB6bU{J!_z3rbUDrl<k0uP7q6Z(mPU)zazH>yIA2X3`{A?C?N%A)%<Q
zT>;crRsbmZGT-ZVUmQT~mtXGR_zGABS{6bO)B|w1Ttb@Z&KZ7_dA7{4V*%6^6|vnu
z?S&V>P7@(nfr+V8dOCoJ9z8})drA?5p<oS4%-F=8`t}9jsi_G~OdS8$zXN)^0V#z=
zMFD7OYy>rLefj0@st2~_<+YtJ2#Odux^FLlq&|H>Y@$L?KK*lYjDH+9XAU_B0`0N}
zD>X<;O$CrTY?yGgv`fxm&8z@)@6!i>-Q~J})hbYz0QE!w!5J0?z+GE=_SpLs`}PHU
zXa5es*V6L86DQuka-}1Bm@tECK6&v)05@25LXa^6ArMmRE*I(gz*}Y*LkI&~yQwT<
zVq=Zm*w_kmXoHLZ5;}DPkTQI@J>mwFbb%repsaItEn9Zs>$6?`qP19ab@hv5#-!bT
zdrI%#2UoAIJA61QBf}QeUjz&&fCUIVP<Uu!Vq-}O;5E1<?b~KXzshb0;A?FqQh+7_
za8@@<5%h>i0Bz09&;$ap;2B=A+3f~!cE^ryb}zrJp7gb}99p{cko9L{SsA1h=&1k*
zl%ZS%2o%{uVq)r#9V2S8y17t*C@@)6f&eJLUvWFFHGHTASHTIu+t47Q04;#c_^`3I
z_9r#Ayl(f3haLc3fEeRHlQD__5~BoD!~yd)&JLP#QxgD3csPgxNs0i}zTHoL0Gh*L
ze!n3&4uxW0&GF+uwKG?`b?fE@Gf6x_GcY;S(pXkzce#KLX7rWd3km?C>fAX1k;%!X
z<cu#av`b@&L8=viEi4R723>48D}Yp!`(j^|_`$8k0}B^^{Kia07nGP^oe%=thnmiw
zjZRNjT0{_7yGjj&Gbc^}h)YfVT7WadzgdyCR#yWEjfzr4hLcrd`EhS?Q$@wk(;MBr
zV8QA~$CK}XQeFiGoLfF?7J#IF{Q#S(LROY$@K3S-WI+Ldp1pbn67OKFuueW%R0JR?
zJzc<oX|&<Z4sG82ts{sZ(bg@_&;LhucBg>@BRh94*}1d+<VgUBSFOsKFahzySV$2d
z@N+=LE6R85a7IT<Y#Iqb@LLYRA8@qnKeA;DfL;R!211RPZ#C>)w(MK`wm+^l?Q3Z%
z*|x24=~9Dw0G`^~7srirf4Rn}9>qFXNDi)9;%#W?Ic^*%+87aBMALBQ^wzD;*jPQe
zw^#v!01-5NvA)*IJ%7&j`b9m}8&jt2eCr9JD!}mNLRAF?^X6GDsLjevAYye;1Q1`r
ztMh%0jlCvK5=5IJ91ws}wtDvLD?MWBkdo48^5oQvjN+oAeQ&<mYK*3tQ*(1CJozNW
z4*;AJxL<q~yO#g+_rF(4&D^z1A_iFT8KlbIduaMs`T75`A>TzLuImX|Sy>Y&UOiv{
zTrR4t+_Zf8p%p8X*9+z@Lx&ETG9|uOF9J$-?%cd!!TGPg!msPs_3Qd|{esv30T%*u
Un1Z~-<p2Nx07*qoM6N<$f^j5tk^lez

diff --git a/game/modules/tome/data/gfx/talents/temporal_fugue.png b/game/modules/tome/data/gfx/talents/temporal_fugue.png
index c3a614cc0436d9a57ce1ed054ebc48634109c722..2f0a4d4680122ab2dd6267cc5e1f95fd82b39d80 100644
GIT binary patch
literal 6597
zcmV;$89L^PP)<h;3K|Lk000e1NJLTq002M$002M;1^@s6s%dfF00006VoOIv06qY(
z0KwT6RpS5v010qNS#tmY4c7nw4c7reD4Tcy000McNliru-Uk*CAU6`NA#nfz8B$3^
zK~#9!<(qe$6jj##zqcm#M23MOX9QUmL<u56L=<EZK~O}%z>12AHNETmf~$fqtLWkn
zT?KVjRMbTQ5d;YeilQU~h~y+9nVDgxr>A>*>Ym>p_f}Pp7!dZ4H#DF5G~HcYRp;Du
z&hwn-+*W|_fB2F7Kj~)cHEvAT-hHXls0priIecJ08&-YJmM_<x@;TN2gb1ipzX5-J
z?q!;{X+vow!j4Vf603+)(4aom>(%Gzp+ii$=TEHv^y5=Hzx;RpyWo<3vhusb^3VB8
zrDfZ*PWU_{J4bGsFj3yxu}^OP+Y_g9jsL#Jcj<YNe7@_Dj2v^%uO8d{takFow!L!4
zQ`7!;IG|ef>auF*K^gU@d;Rz7HEJx6y*g7C?bt61w*Mec&0i{A`u6ibZ`QV*ytZYp
z^c*_;q_1;IH6S%Lm0NEZ!=-%&(4u(@L@AVlEn7D+_q|z6ed!rQPOr2)|K?oMGBddD
zvfco6I=?3q|M@x^!9{QtxC*p}W$(=5>HF>k;EFr{gFoDS8#lE*gUWdP-(Li;xoRZi
z|7#-UkuqL<{drb@v5IK4oLU97=z8w?47+j!Nlp?s-T6lreX!t^j6dVd*1Y!a2Mp=c
zjlFwzl3%lcw?F;b7%otWAPQUwobmEsAL9L2UjpE{ueY-Jl^2=w<fMOZ5&YX<o{$}1
z?3dea81swAO&B{-_HH~Rx888aDTV)pC!Ud)XTR^iescQT^5K>rWa;L8^8Tjp<-N_{
z%e+ndWX`6&^7f|hWaj4Y<c&>xL@6bJ47lx1`NtQVPU>3DNw55nkqquXlxuFjl4o9g
z%7l+n4D5FWx85*@OM3P5k9}a`Snhl99`3ty9DREA{ml{3yYB$rn==!D{DNAv?a&$5
z6<jT70THo(fCkZ^wa|OSNB};1>kU%ULeyz?#=nOM<yEWBxVy&l@Z*2s^K~l$7&34e
zkBps!0+gcwg^0`bw-0CK>J_{>dj_prwc)uZU*?SV4TzsaJ_6LM-w>@8YgVoR;F8O(
zG=_>sE3<4`3mP&16o@v?==_KNEPm}JjvqNpBwR}K_8mE}bNeq|@1!E&;rkwA$F7~c
z_V&vF+%SAJ58wBgxv&<rYo3)jyz<N&bm`O$fcqc0kFwG*_un)Aq*uRjlQTes@AvEi
zplyfFX0<gaSHRUEg0@DBtIg*?lh$YX=h^%1MhY4={nhLJsspmKa_HIRVjg?i7}20^
zL+-uhztFBW#%n=qjdr!UDHo<c{U%9H5&#pQoWM0hMxL|-GP84t#VY*QbsIEBT+M4!
zCo^g6pP2lYdl6Sagqc&H<ms_@Gv)5vh=xlM5z;d<0XTl-Fc~?yr|*El{jMTb5#y6p
z9|7>6cRXl~7F<^&u2~%s@!uCw+&=0q0A8Q<Dq4h#dh|Xi2RKR*Ei3b1htkv0z`B(m
zvwXo^K3+K2gujOMD_8L8g1M~z;C<q;I9fw$C<6fPx;RP6r(Xklbne9mD;E2&yLax1
zb_JzCDbNa(76iiu#J)e`%8^WY{s{n9tyxKruD$r+<0Zd(L-BZ=)U<T}b$MBotXyb+
z-ucvS&<Mv#GDQ!UvpRRDpngN*u^3574!D|_b)HfVTDzz3fHp1LF=^_<0Ca5E8MIgm
zB`6e138EAzP)b0VRm{rBrglLc4jw+hny*%IQI9?+6#>VK3#+W$zP-DtUb`+sM~y)%
z3=wiQD8=9##~2;}xEO?pMI$Daa;kCg`#q<h0*;f!jy>A|Xx69&t}8^!BNP=EQ&?0;
zJnkY|h{a+Q78O!dSV%M$L$s!K%QgV)+`WSabsL|Q1NQ9R0U8?E0=D6cRiJI5a|LZ`
zps71z(hV)3Vdpnr`{!xUsx=39?KnLL<YeU_uCV{$4?Y}<7G8M$8F~zAPmjSJ*s$p<
zv=$aDeV6V7&Y|0Yb6Bu+E?NsU^9ukdEILM7YWhhz;OLP<l$V#$zGHU)mM)lWu;0bN
zo)*O90BAvrYdL{t^`iLzRIgo^P*x7x)_i_?DIkEWHSx*{TUfLYef}|GaF_({FWTI&
zQjR@F5LZ_@cm28z>3vau8Z|zHq?8nn9y`qX4eMCGYypcG%;u8IhA?;5D;zz1kPYir
z(fXW@Xzds$2)IgHeqal*QY?GxRRAs+dM)ANA`XAI>+~E@8ZH4B@~hS0SkY06ijSdP
zVdRj}j2Ji)QIMUPgLZ{JJuantrwdUEGBPvKT2okb41nC6YDD8P0BRM~<&kldX?J!f
z3X6+a|Lr=$kqAwjpUJ?%*D!AU6t-;MK;y<OXnIB~c5UCx;}6`)OY>J+yf-<Itp|cJ
z{*{U2{QJJ(%Iny)=F@+VBo>QT(6nI-w(Z`+jy>BESCf{KPI_v{FMy&o$w?{XWapxk
zLMerauw}<4LvHFfrQ~=CJ-c1Z6Aw>g=iVJ$d*c8$Z~f+k>kS+<f?LKsK&+yI-?eGa
zuI-yCE;`BsW3J`FDX-ej&E~!`1$o(=*ZFk*EI<5LFMNlNe;B}HAFbzK6UXt@lJ`!%
z8+>-cE9~9BhexM9XdvyKO`sIYV2uxlD21a;e}DsSrAx<4TLCcb(dl&V*bOZ(bKVRd
zd+MPo*9e6&DK9Vk)zvDfQ=d`yjHh*{E@)Bg-@lu;rcUOI6-$5e_{;CUpK}KdW$nVb
z%$|7vsX1WSWh1$E(2ZPjeHQ@!K5i;q&go%c&l+r>Jx3@7Gw09X@o5G=zgn^b5N0oW
zi$^A#P_3R<gK>YJM8^)@a2=?qjPu5u&-2RkDgL#Sl2bURQ#TZfHJ>f}MdvhZ@jKdd
z?a8*U*RuVqHU9gpx?RACiBI$Kn=i9u>g3<<fb7g17QVQWF%$mCSDV&Szjj03dU~Px
zrc#y*0FM2?BcK#Lt~{IaXgU2a9>n;29^=5_{q(!G2LLUa{f?KOoojJjBPfI82-|jT
z=JwHp4C(6m2kyN8?})&jJ=>Z3_*iys-B=Z=^70vU(_M7xdpWKM8YnG2&OgWA#-5D^
z7SHZ;83V^Y!V9;IVBe+<zs&(%&OV<<@BIf`c5URQzYGK5`oT9d>Z&`8;h4}j4lq&i
z=g02g<5eF5@cFwNNli)RmitGt=F63&r-fMd?$<tXag`xeu3#OaSiEF5Q~quuWy*{1
zQLj-GTyfA!Q&wKazVCP8Y9Y5~EploU*zbW0Xl06|M)B%HceBB=&k>J3OO0mD`F~eb
zrQ}J#LqBDBN^&aG9-6_GeXnEw@>#q(_j!&M9Rc9$&0kPa5u-!v&W8SaaHQb=C+=qX
z=Rr=sHGc-NiYW7z%m!fWU4Nr#<1_G}TnwDsdTyN2q-iUbe>jhDxP)-&aXNMHZAlL}
z$thIJFCe!@ZPGHb3<`Kq2#9F=Ed0J_AHMqFJ<3Z<*tTi~7u;|=hj;JfXaYR`WCWz8
zrt#L~CAhkh(c_16_}IapO^-`297KcKjo5c+FLM^ZNi-JydB{ml=A${^AdaQ3SZZt4
zN!L2l1wQ=nU7nge7J!+HHX8j8`=<m~6k2KXUCeh~z*T}q*+@_v{B8$R{%BI_@^O!n
zTfZUGZyEN>Oz`>fGpUGIFyyX2zVYqO?7*Y<KEvye&*$=shZ>$xR>GU}r!(n=@w_qb
zW#9NwSKZEMv%Y24Gm9BMa3m?oDFF29*4K2A+IEoMvzV3hR2~uNdVUb9yLWE3U8fjf
zL|ZmskJlt9M1rX%RxYa9uqh4OoDIO*xo=YUj5A5g%KmvCaBcsasgqxyEAHw=rCSNW
zgSSqid;4B~g}-C?eGI$w24*gt&bp1OI9^&r&FZx{@9gs#)_)|KnOTSy>K4@F_G|9t
z{g38RSbU7Ot=jv{Q3SMO!(J5Hu?$jaL_tz=8d=%7giDXJYuhFoG-+wR>oEbbp{vAC
zAMaDqHno(X9XNNuQ1*WF75lzjkE?~2JuYIyf_F}IKw4@#!}^V4@~e+fQg+-38h1WT
zht}tzwb*V?AwXVEKDS<duU`n2qfm~`DXpzku22Yt#fA~qsnr0jHLtw=EUUj<Nkv7J
zNq?PAMrJ097rn#c59ScBj5Fr0hpFGN1+{9|CtP}*V@D2}Cdj6N*l~tVGP#Z@1cfLY
z2`Yh^yF#n3y?h&Yt^Jh79lHFq1Fq{onqx&rSoG;!0Q&d1f^%A)Yx;kqRv;KH00D8t
z8Y+l(P$D==Ap*)Vt7BYZ9_h)ch!*zk-^=E0>&^XDx@ZkYj~!&|R`XtYq#V&gN=lkx
zqp_%$Cw66(aYUstRy&w!fq4CiLLBQH6gUpmYS*Rs;C{aU=4;vw82ZyGa9NL`OndtY
zUr-o5<UdT_Swl2}V?C`Lg?0_>iK9?xa1`1Rb2#?>gvO~PT!I#%Yo}h+snvkE8z(tA
z1+6u$TeauvA)|?FO<rD2M1-hihw14VChwJ(GU8V+v8(Kjd9)%J$|zG?0P3}BOYy<|
z9NNBx%<45xbU??}T@hEa=rgnWgL@4({kIq5%EX{C(8ic!(m`pn<e~*fjM(mIb9+iD
z3i4}n_}D@A?At~Av%Ar?Lod$j*we4pTHyDsI?$?h2ZIoz(4yJ@gAp`p)U4yfpeV27
zG>amZM~Igi%GL#K7C@{+YBg!ex62oCZ0~MFLq@ecBE>}k3Uoc|LN@Q-=oh}eT?QGU
z(-lP9%4<bWtrPS=D^h4}MN*N3XLIbCO<M!-<u|MB@vcRHpuN_DJ)h~NOOF>*QDHjB
zrp?=++yEhTmFgeV1U$XK7K-5fkYB%{iNYfX0Zm3;jjAwsPK$F{z3~$Os%2NFMs9%*
zRoY75M)?g+YK)NtbvOau5**j5ZC3!+tY2y0Q})KK!lO;`Qre0;8diMtp5+cH6x42D
zbpWG4`<jCQzB9doXzu5M%g^JX{^#=TiVpxGr=X4>_F5n_FF$ZVa#9MJ>A8Hf{R;p(
zwCZAw(Z2BpzOat4Qh0*#V(;8{kTnhs7kBCJUwqD@Hw;_T;ww46Gt9Dr2y<q=U_{wo
z11;VwYoJwv@UCMdF|pqjJ3TS?<>JQUXn|0IL>?<GAyln;;DBcJS|VE5_Py!fTQzDM
zguiQMPvUAnyc7Sl7iykfmyjaf=gLW<-vxus;Bv+jM4}P2)`k%MC<?TO*I$2%va%AR
z4-CG^P+e`gvl~R3)`AvoKezW{*^suWoEFLe5t1#U0K~#!(lWCG2h^|Gh;XDNn9kH`
zVLfP!_9j1GP8kF79VD8-IX`j|T8NaFk(ZnApZ}Ko22)uPH@T`U3$z9;|L9%j&wIt(
zd|Eoomd>KI_*gIxRF>{|$?xUAg#mAh<d5<*G7*8~v<&~f%4metjI00!YUS1Ahr@e=
z`CN@gXf160ZX<gR?jV#F;)3>lQDQJ(IhK?wYXI7)Kz4R#H4#L?v;TU6xy$}lRroAC
z#E_f2GxF-Y>E5*uq0C%<IIx>HXFbd6wL#w>i$!_o?dN#s?dRxz;Xp>*G!|`<2gG7<
zpb&}U8e~8xI3NoVsUo$<V=+`xQs98R?0gOv9tiHx7L<>_Ucv`!=h3KkGkUbU#8{;W
zAW$hBWpPP~nKf&}5kwTDCtSsM2ZGM)+;%-E$gj=(4`)*8R`SA(NxU%Q#2J30hArrR
z!DZ~;y@{2dECk?_Wpml|%^DthayBX@$-uLSKP&Kh0apoSrN;yE70N_ug-=cZ*L8iW
zm<*7cna{o>yYZZ%wOP@ubkj6c#ACL|h;Ouri3F`I*K;t$$T7ij_v6?5#&<cp2Y((l
z5hpnXlrU`IXr7(%D4(oeTy+YaSCgx*yp=9p`x!o<;Ey*y$V>lxgq0u7=h%_`Jo4wO
z8Ta>@V7o_r{8xtbh@w1P8bm-S6D`{34_K;Rg$QM(XHyz6UdzqQ^P7@P>ws8A)a10K
zz1lKCw4uYwRXCP@I$H78(&=pb&J@%ky|3fifwv$iQ%`{O)DU-$n!uP*6WF_d7twf>
z8a3;Ym6MC>;kg9HT{r4}>eO$_tQk`{w0{rp&74ZVt43RPifyXB{1eK<K|M>$%r@DY
zDCPfH6;4mdAYy4}DAh>X3PmW@6pm;`Ij$=>N({YKz9MGof@82%X(1Ai@Y;gs0BGN;
zGuQUN)xe=gOT}<`<7A<J-6nw+U>hDU(){_qC@$)AHG6h#X5D8?STc7y7Y?|Nlu!sI
zf@@V7kD$g%g9!L+_N%yV9A#T_&#Rt;lL1na(ui5zK0P&LRvRHB%~Z-rtju7q7w(>n
z;@HsFHpLuxZNW7EI``i=$wrQ?8J-H{Sje&kO$%UKV-nkBzs4EkMvi`nb)OlDYsu^v
z={M|lOV!2p04CQXWq|`eeq-v1LZ}MbMaL_8m9E*rk?f@Su$P$@2nRY5`z>U7^SS{3
zVBu$T02tJBI7uqm<X-|cMgkV6Eqv;PtuKD~Cm@~H+K$E)z4{F|MRCcjfEan6vQSxG
z7WVHuzg{EiwrEYA7Qd%Xi`LX^+LGk75ZZNv2+(3SIC#TQu`%nV0D!Aqk{k!o;CL(Q
zS{K@7T)*oJzY`nSW0+li(;P`+KcA3?ez&P@YM2(vLYeZV4y`mIiY`3|@Zo~jiC09~
zzjp_<8a6jPLYXcVAQmwW2xaAP<CAZoQB>N|eWkT!_u5Ya2c$V6KLwJUWWV60Bn1P_
zvPhV$jO<`f0H)$QcB2vwtlnt$_0+A|knD^cf9r~P##yKozh`$r9REE}ST&I9?E_MQ
zdWoh+K|NAZ(}-8Z*t&idwHh?@MH<huQR{$ewdx|Gn0DJBN{$}<`O%m|5+#u$)39v)
zm<_wvpiqR%gKAn9Eh956%T#(#5ka8^oFt=ZuivrOY-()P&4jx$1Vt-PJhALhS;0bk
zDo&sZ6GSt3P@5ouiG~)x@5r}be#-8x>*?NaxF>`m%4il*n*wPeqZ<F5@qP^u5x)(t
zbmN4}ODHWr?uQ>hd9<`@t1H2%THE&y748S1b(3}pIqxU3-@Le9+lm>Cc)5!N-J}Tx
z$JY<Nnt+1F&DxsH6MMEM)B!mm0@AZ`PHs5ry27O$t|lBUF%{BQ%GBgEroR7I0K(;A
z3r{`+Mmd6GyRjdR1iLYs)jcyX#!&$=wKwUDnc85fc07sA<N2n@qJrEuHN?>EdX1W!
z-oEIFtrlJkn7R@3BOsG#0wVlu1Uxx!EG1>d32mgNNkL26H9e1%<W#eDC0y)Re!p$?
zR~5cL6gVI&BinC~Dl1*$6%{^J)xN5m!0ByAr?sc(+JEBsG?#?Ukp;CI29X&F2LWJH
zDH<vDSzwtR(f?uuY(KD(?FXvP+_FQtJbvA4WT)p+7(PNtq^Rn~2(R1GMkGB@xUUM6
zBuN<i>@Dorx0y@24CeaF#sp#|hH2svALXHmtq-2+t4uUZ`^SIs?S_@KKeso-Z+d`g
z)dO+kc+pX6WMui|L<FA+riC(yB=iNpX^TvGtPHIoD`bR((nyI}B@us1ocKbCaJ2Z4
z!QI>fbBrq#<kj}6w5Qsem9?84z4@S6GDJ{Y0<B9ZIeyes_3Gx_I-%c<giEX-Vp?|u
zB4J~6D7zZ5^2n)ekf_v^h}JlEn@c2GYC;~<>5*j7Pir)ac%>my`Pnti2T72gmg!HB
zbOKfNupX@tNBk+Bw*y4HHrIlUrw(UiWS>Chqmi-z0xb_HFR>2DsYd))9Po>qq$=G?
zpADA9!e*6htL&|kSD{PGkK1`+uD_D$sUcH9BgFv&)C2^_c9`A@`gOsBMOzoV%@Y|}
zxhG6AW3h-&zLfpGw?8mFGn?{LO#!oV$H@uh*$4;+lsDlIn-*R-nUR`h93_yJl5ROf
zI6<zm8>qBYf!UxDPziL{uBa_)>1i2O=NCemW?^(?+`_3OOpR<OnDOfl_{BX!;b`E1
zvRK&Pk)?ES&su35aeU)aQ_@U+3%;HZv8&{<I`I@71knmN36xETfEd|maKQESz4QzO
zkB&S3&b34b#-inc140>;mzA7G1eBMMm6l^2Q0mLiiSv9fl1n1R!In6?3fURCmPCbr
zG_{pL#!_aI<bCELfJ)H$gP-c8qoiu&XkQn!DG>>9KRG>vib&b1J0Kh_AuHWFAX*YI
zKuH{Lo8*qgO{GsxO7<&VPG*iplyaN%%JZJp^i2flAN_De5^6w2JlHuN%FOolKEHHI
z)t!y8gw0l=tX!WHoKgyu#Y(A}Q`b76G=Xxegx_4*KHNS&-?SW8Ym|cTkM6Ob>p;Bp
zIzFobVC6b3Dwy{vZ{iEl@}RX{``JQL(nF}^6ykPjgyUF*F?~tm@kvgS&k9e;0g-5!
zteQE&<lWnwYlBeX-Dt23`;P2k-;onHDT^Nf9>i%g#BhS8^k;iwqe4|R=%b}Ge|n#r
zrO!%1EK=rEc|oX1s0qK>0b35NCo?^Vyi7Ak`+VDnBqyhsy#UHgkR8k7^0M;DOv_4`
zhAaR7m2R9BUoIj!H9075Dq(o3g0JX=JqTJsaY-S0`L+EYVED({0qWs>yZC0+hln!C
zarlSbRI6E+<kU2_u31j$FLZ*Z^s~ADZ4Zb4<B$Ij3%n>Z_!jU^00000NkvXXu0mjf
DPs`xd

literal 4976
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

diff --git a/game/modules/tome/data/gfx/talents/temporal_reprieve.png b/game/modules/tome/data/gfx/talents/temporal_reprieve.png
index 95fc78fc24d2b9b472ac985d96034902916914b5..b31b9f88e35c13e70bade128ecaa75aa452405a4 100644
GIT binary patch
literal 5663
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
FV1mQp<5~a!

delta 3576
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

diff --git a/game/modules/tome/data/gfx/talents/temporal_wake.png b/game/modules/tome/data/gfx/talents/temporal_wake.png
index bbfed84cd90360e718a3548016311d26914b29ec..278bb53e28d4e665ef6893fd975fa4f83c37a9e1 100644
GIT binary patch
literal 4378
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
Un%RjcZvX%Q07*qoM6N<$g4|DN$N&HU

literal 2916
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
O0000<MNUMnLSTZO=wvGZ

diff --git a/game/modules/tome/data/gfx/talents/time_skip.png b/game/modules/tome/data/gfx/talents/time_skip.png
index 5ead5acaaf2bc0eca84ee38592af06766a072b8f..5b59b98746d469aa7dcd7d667ea8304ab4b92ac7 100644
GIT binary patch
literal 4520
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
GLSTaMM$P2_

literal 5315
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
V7#$+dqeuV%002ovPDHLkV1i5P4uJpw

diff --git a/game/modules/tome/data/gfx/talents/warp.png b/game/modules/tome/data/gfx/talents/warp.png
new file mode 100644
index 0000000000000000000000000000000000000000..470815ea4e452f4ab4197c0d996929ce2fd7af9c
GIT binary patch
literal 3866
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/warp_mastery.png b/game/modules/tome/data/gfx/talents/warp_mastery.png
new file mode 100644
index 0000000000000000000000000000000000000000..b9a1d90c628701939b6e1930b86e38c86cb37fc7
GIT binary patch
literal 4744
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
W^)QTV_3Zip0000<MNUMnLSTZ687sB`

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/warp_mine.png b/game/modules/tome/data/gfx/talents/warp_mine.png
deleted file mode 100644
index 43b830b5ceee0fd929e580c2e8e8cc4de8cfd27f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 4103
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
FV1ie$*a83m

diff --git a/game/modules/tome/data/gfx/talents/warp_mine_away.png b/game/modules/tome/data/gfx/talents/warp_mine_away.png
index 5268bb01dac6cecce5348f7432881c4c99029e5b..f08f5ff1961ba9331a4847ea400bd1abef670676 100644
GIT binary patch
literal 5227
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

literal 4910
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

diff --git a/game/modules/tome/data/gfx/talents/warp_mine_toward.png b/game/modules/tome/data/gfx/talents/warp_mine_toward.png
index e8ac5358c4b2ecd9e8ca9c5a7ef768d1f3d75c67..5c509a8f16c21423284337f167508b1b2eb16d1e 100644
GIT binary patch
delta 5913
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

delta 5015
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

diff --git a/game/modules/tome/data/gfx/talents/warp_mines.png b/game/modules/tome/data/gfx/talents/warp_mines.png
index 2c5d2d55c7c492f051132af2503cd1457ac848eb..31d9e2210e3a8237a70b26417676a82532f643a6 100644
GIT binary patch
delta 4112
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
O0000<MNUMnLSTaV4;|b9

literal 3114
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
Ef~iHzYXATM

diff --git a/game/modules/tome/data/gfx/talents/webs_of_fate.png b/game/modules/tome/data/gfx/talents/webs_of_fate.png
index aa8e3b51b14f93486ce54eda5d39bbd305b43045..71803764fa6797423c5407f345ebfc34a873f96f 100644
GIT binary patch
delta 5466
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
Qp8x;=07*qoM6N<$f+5?ZJpcdz

delta 5264
zcmV;B6mRS1DxE2iJ%1Cg000xO0b}Nl!vFvP2XskIMF-vo2L}@$BEM<0000y!Nkl<Z
zc-q~YcT`m8)5kw^>5IZ*L+mkv{)`$+>|L>eL5+$f)>tr>nAkOH&=`%qCec`8!(LGo
zL=gc&1T}UOjZwiKQBaU3_x<DI8l){qa&q1|=kD&g_bD^q`+v+lQ=Sz-<zFNbK~?|N
zDRbuM-v;2nMy9WSv~A`}@uJ1?Ikul?aZj^s+^R`iN;{OrL=@uU<FF}g3u+pOkoGE#
zL&v=NE9Nl(=H}*n*2@DGmE8xn8}93L))dlNV`HPowy-TWg>A60(WAG~V{2=Rg}DW3
zY8t32Y3UcLnt#4(R1iV5rDXU<UVjN7i1KE&@wc{;{&C3nAeXLO%m_gJT8$`MsvIpF
zwPDT*PyV=lJ%jMJg>4z&J_HfrP=Ggke74i3S$leS9e|~!C4%7E){WEWPO)ywDxN-z
zp-qc+APOPjCky~2B*c@D5YMB(9%cJhbUJJFHnti_Hh;F*+UU{S>an%eQ@BuJ+O}$s
z&dQ3U<Rp@klhNDi5fMa@H$aG>DBAbyd)jm1`i<W+1F-X;7vqL~4I)hWVkVn*ttBw*
zsDUZBcHPnuRoS|CBLMzEzW4|E(!Nzk`g9+Nxnf3xI*n-fQDcq;`-3Pb0_94V=km3S
zMlZ|PAb;I^a4*v{OG_&{xpn~&7A~KM@6khsXI7S08en=ocKRadZT0B&b`;UuQNH|p
zv}x5A5y8a7Bx@UBXIq4s<L6<mD})FHhaYF%wp9SES?GnOg(bd$2id&qmn<3oxLp_e
zbRU3;i3y4*h9!3*G=L>5=NE|1_Uko}!TmiD5r3Mtt8a9_xw971wsl)X6zVsxLsC*A
z0LtGRJ&lcF^mGrR??)jbG;i1%&vA1oYF7*k3kyUbEHWh9Ne=k!rN`h-c<tIi%Bz(0
z<tMak;>>7|u~_S@-x&bcb{``m91A>RbRSzA+jQZDB`X#hgwF&3Kw8=>rq3Tw_}NfI
zgn#$TJF;ZvPulVq;g4I_bDeOn&rY`Q-K^<lx(+%wZ^!nv`xrH33|5v_`4YZpkz$l`
zD2<44*x$$Kem%PNGVs5C^STVrl<YeFv~ek0_HNJ&h@v1Oq@|@9HKC#?^y@JQNnie3
zc5O5;(81Y--5U=wV(@4zEG+T_K$C_|HGh6Y2#-8vbia>XIw5G*KNGJxb@V-cki*9h
z8s4I*sVS|Sw#{`y_s+cymiNcCOWC&9i;sJ^Wyij)AR3q-x9^Pi7C(j$`T{dEGou8l
zTf06Y3YV`MZ&1z6Eht;29HI#R0e;2<P_}e=7SH?%m)36S0BA;SXx|Zd^c#`mq<>vH
zbOjLtLi|Zg*EdyF*|=>j9eX;n+k3kK)Gi&na(L%4JU$zd!8&I}mELzm1TJ2=U^D<V
zYt&3%eGqyo)Hne8bQ{Q=DT^pktOO!(_x>H0uAa}GySES#S~qLY?5`JOIbjvYs#xiC
zhzNUqc9Pk~q_JkxDqP*2*?VwTx_<{FxOeV_|GpCp9q>7dWc^;smMMpba69Uj(EwC-
zs)8txoSc-w_+<%zh%kHdLfW_NhzP_dBrtoaC*x<1=G2*!Oqls4p^?FefK#O^tXt}Z
zO<|i112(ST6cOR&%lI4_O?{QhPwQ6T>h8?`LwgLm-P^q{$9+yRxSvOsaeo9NJbn7q
zXaLHTDuW>0iMo@uy?Xt_L@{Cctksk&T>%jxG$NRx<N9*xTE^wJWYv5&?O2B(*xKk>
zzkC~&DmodSSFidZB0^Y1s8I|iCnvLf)nZ(_J9EHyzvi)t(EroV2sskYz&?XB03ZUE
zmX<~XU{|CFq6kl7p5zR`gnyCK(ChVxB5c^Ph97=elI@`0etYqpHw8se5JgxxV;OB)
zv<Kk*3XTB$cH?TEEPP^OB8yhc!=;-uK1U9w`}e}&0Un$@8iD&KJ&AiBi-=I6Tm_@Y
z)miEggoKwba|S?Xr2|p;dD9Ax1RlzD;EPw!GjvRUUM9W-5k?Ii!++3z!x05U5gtB%
zkgvTyJ|UjDi)Z2Ti8H=O4<qS5{g_eX4L*O<#?6f$PgPY=1QSJa20&314j$RViLd~p
z2Y>wJ5q&>*C+hAUL<BdNE`}u>pAi2}9^dm9&-r%lH@JM_jDLXN-<&F;YL%*d+Ow~5
zfWC}J0SXl^oHGDsrhjG}^xvOnMqj;3W#q&m1cn@Y6Okd9nwS=d@Bb|J8PjKd&4j6A
z43Qn8t%y^Bk@W1=JIDSpF)<)Q@nR)%1|TUVnYq)J<eSmr#fobHq=%ggzFmsb`;`j>
zg!d{`WWnqu2#}_#1O^2lB3M{hGHKitP6bBN{S)^r`$pf@;(wa=D!iB5E}&4<t|()N
zP0BNa%fDYmjjA;fgs=!LSW-+BR?PpIcCB6BNqC*knk~QV0D&|$4Y%$tjGOWm9lN$C
zBs2&S!AhrN+T<C8orvU<&fPNfzwyU)L;+J16RfOsnZ`E(JOS)WI8dchRmzku$J1vq
z+`RpVQ4D@ReSZ;ED*q2f6n1%UW68<|969cbi*rZJEzD_LzX^K19pRB-`2t|wPa7#w
z+#XScuDv^P@BUqbjW~S72Or-9RIKnm<;s@F!or+ZEn3sBcYhu~`HSCvzs8d%PZ&OQ
z1R_G@*$8gmxt;Y2*s^;Ax1w$$2*U=9qO?PqT$vj&Xn!;{s(pxpu*-WJYd8N4z@x_x
z>Du3osOZ~>B6N2Bgyr*B=2>``wysoh`X8bQ-^`jyRCH!%CMr4#k5Pkh>*hj4<Y`0%
zTU$MIXU*qSPy~${Hs=1L2cQVenl{flDQaqJ%EljdU~XnkVp1agM!07i0XC`Mj45NL
zg9t$<kAL(1(pg!y^PD`3W{q1S0#BdCFkslH#66EQ3V<O0Fm#qWE?&97Ko8@rzGEdP
zJg3g&quL)Cb`8>vb4*MO^%~dCS_NMF>5=EdY2Vrvb8~ZQR;$g?pv)1JrG+KS=dD6S
z;qLutCVGy^mZ89q08&y?_^4K0tgLkOa_>WEcz;N?p4n?^-^PV@tveu!Fzk!L#Ky%M
z1wc&96ZY)eML^(Ds#f`ck|iC|cPFsc>4=Js;_9`lSpxtN8~2R(_;~7kSeN3(N}!l1
zT)c8V!z42%&&Hu-DMW-pqxzAYlAN>Cbman<uU?|PvkQu%(79t5?mxK4jhopgSEfz!
z#DCu2o=cZ6vcc<@Jgd*+zaFz=_jZDU1F2rEI`$<rJJP;Q2Od3s#KlV&vyTRS{P%PA
zd?X^!v&*M^P`TQhkhG!`wQAHsMEGgla$dwgH;SQ%v*Eb+??PhYOGJce6K61H)PyYC
znwgnVt!i}uw(s8ZPP@qYi|29c+L5^DaeoGt_`6zXn-BPQ;WT1npMeP9f3wJt&l~MA
z77-yfE*9^@d-KH1gNOHV>DHFp(YHZ_?p=DYYT4RM?dsL3j|eCt91ZY)XFp=bw3+B_
z^?)$da|-wF-!m>F^wrdnC?bfWuw>4U6fahSN);Uu5mu~ToG)flQj+OCuscB~1Ah^L
znl);1Xpet}u)0>w+K32GW1r=!Ub&Hd348kW9f*jq$!k5EyfzXPe8M;Yo;>}F*^6f&
zKxv0EtXaAN5g|DxnUGUK@5I=o>El?r_D4j7VnvH_^xz4c95v6evg7|igbSC>zw_H)
zIDZKuTK-|0=hVFA1OY-%hu|CFgMSEESXhF<KA+tM;^MB~yq3`uMxrPRiiyJ3^*d?R
z!kH4qOCTcLyC3~d<CiT{mZpuGXg0_5>zrNT99`X?7xVnZ3q#iC+=Vj*R-6nAKZ%>W
z3yDdIhzJYkEWxpo6C&{7!Gm`id*ZmsAVP9-GF!HJ<qrVI_bc<u3NLJIY<~<^bn5sS
z1zMrKcmFP}IyB>U)a~@rm6ka+c8AHb>T7Ds#~rnV?xLj&vQOb>_rT1|jHzQiS@!)(
z92`m^2v@IP)m%**TjtGNRG=UvCnwRRM@M4go*97l7(9Z)Z{-|~rQSXJ7*c4f*RIYR
z0QKuMWdCMgnlx;Vh~^wko_{%((Gx#s{gyR|z(=*}(X(ss0t28<t&a!`j6koqGsOI*
z97=KW_$ewoRmt;sUAt(-+~AYJq^71A55TA)U-8Yv@6t=luzt%LdJOEs+4Gv-d+pfB
z#mnar5r%y>5~oU4-dXrLGv=~x<p!*E)+i!)AM$40q%TnvEwQq1$A1Ajy13<O%-XeT
zYX*CN&b~^9U}(X&%cxqp8X|D-;a$c}9nI5cF<GXk4{Z0NP@zJkzDmWlYa5c1lkzOM
zo!*XZ8+TFCz9b^T!^aO9I${ui-nwb119<N`h?SKN5m>+Z7v{|SF82~zqb6+g+5sX|
ztx<)z9O4MW3ixKiw|{(4xf-Hq0nDJ0eX|t)b)s?TXwA7WH#29|vUPbD-pR2t#}9{S
zKDr3&y?&vMYfFRhTBv)62F>eoCrT^G4D2@uuk~AV9lJq;h9E+0Y;2CgX8@pxT~QF&
z?Y)D!*@U)lTkbiFW+5U}s_4j9BgPpme6_08*|BjqC|WYsV}I0O7A?*C{6JDt5^Xy=
z6L2B`QH1*S8glY@7=^P*ast%+uvU5kBr;cC3;>9t;2-GAnvKRME`0rcI2L#W5$N8f
z2aOsu$+b`Ua^=~)ZYwH~l9EFEPR@jd=Uzk^HgX8df6%<Tk|iBD7k-{9*%-&lPE`;Q
zu3WifJOHL9rhl9=vYL}2;W1|#4<0_yj;zdHs;#7K$kNi1otyV+rbp6n>D(qmV3Hdx
z`(Y_VJ|BdlD43d>;dkgLZXG*iYFD~+DMaAUKW`cjz^k-Z^zAVqUsn9H;e8D!vNo;G
zK73vK;|9#lEf5j9_Uz2#zaHm#u7JQ}v}oJRP<39h^nXXDO_}~y`ApJX>HB$50fF}`
zI#Q}+={z$P8yCwL<A<XtLh<4ym_KV_rZ(L^ap!}o)euFP@!d3T-nvPC>Gthg)T~>b
z+jq2_qsNfX*|}AVPl^;NVmO+UTh{3<0JKiMyZ6l(QxRvv*}P4Q7F#rTrfa7+>1h)a
z6Q)l1Mt?I*XHK)n``v@7#Kc6JwQ9_<fTM^aG;Z9OGvVj3FJX_8o(FvSGQoHNBF||V
z)edbs=9{VIE0=Qh_bVs@QzlI3y$Tfp81u#W^rJQ~di<yYb)g3g>c^rb3lKEV@tA)g
zpt-=WUZoii!1g^`GMw7TFMT$wA4$o{hzMTmwtr)0W=5Z$nvK}JbrUaMJg1;(;o=4K
zAJh*;Q7}=o1nAr60doZ);bj8hk=n_yPkZ#wH#4cJsq`Dt8xcXL(-Cs?ltI0g{kWKa
zijMgE(ZQ{~LH|Vrk0C>i2LNE}F70Sr@uJ14UbRNP7*Q03)RYvC9@qQ>D=RBRguvkA
zB!4C*{v*PB3>ijPNI1Seep+o(Qvy7Oe$L)KITw6Q-%el0JbgmZqQ&Ubvp*B3k2Q*c
zw$ANo-na$z>NcQQ(PD<giJ>SVa3VOczy+T?@oPqp8f`cO{JJpv#~(L%@!~nPYS*Df
z^A=pXaD@hq>ha>mi=2ZYfUa)c89iLf{C~FV+>(TBENQi>)fqIvgQks|W|;i%!oLAP
zo2FrldOSC>DwGqoYT1f)t2bb2X<?Yh?}#6pyf$*g|4kw1>nT$iKW+k`lA4-IlV**%
zcI{f`*yimk*e_fSIdWPZ+}|V9vpTivs(ZE^P$PnVRU<>rt7lGLP|t>5RJU*3rGI`o
za;)08VH4H9guS7C(IQ3F%V&R6ublf`^*eA(&1$~9TuT-$Q}0JTR3Ah?QXk%XtS+3t
zSS?hjP`2$|U0l_;XV2B=u`kpYaq()G&RyPaleyF6vD4I({-@QzLnjUQ?DR#{^(!~4
zr-RO^5y6`9N4x{nUfn-ct##HpGJoB=rL%hV*X!!F^EcGF-_6gL;3g&}>hYsN2H{Vg
zJgt^1SKg?;j*gD%Uyq)sFP<l;2`>^<R~Ofu0VrF#tQvYWLJd6@sWz(LSnciJR}DXL
zP7^-pSJivxA+>(phItaebLvd>w+lDa-!J~5e(dU&r@j^z7V5dk^9JGP&wpKzX8^5r
z*6QU;SJZ^~m+HU)0}b~x*nqNS%2B>-1uQKr82{yDY;A1c{NW(|zdoL`r*Zg*Prh{5
zXP+OAm9)Z2%eGC4zMFg6+tk#Qh_Ex*+uNfk3KJ%cXXEA#`L-WE2YlFnz?+|cUX{@Z
zZdmD+eiZfZ2JDSNi#T(d(SH+0keZsB@5!yKbes#nfT^hov2n4~X;3rQK7q%AsO(f(
z+t-H=Wxw~ncQ&GB%9J5GIy!SS_}Xgomhh41A{a5o<DG;Dc=<Ac9(}ZArJdf6&ADWE
zR<B%R5Pst12?ZiNU=TjTF3_e`JGETdj7DX|&@a@8pkLL9;PdZny?_6H4fhzS{`uP-
z_15oE>gPj;XW6Dt@4g0||L)s41v-DOyTI$qrm&3~8T_jn8FE4G*4e#4C*HbghkEOJ
zw0iqSv|6M3hZ&wZI5-%D_wzaOPYRzi0D!t;(Mt8q$qVYCy#>$6#j{t`J2&sDe_p?>
zT3T8f?w<)ir#^^!q<`MK^FXz*u=qy-$h9=Ke)Bp+1c#EP42Kp9id;K&KoHE#%<<WO
z7=TF=rckO>X+#m+dvzx%DT#lYaz!cNaIpI8smto(dCLm?4Y+l5Q}5oouim@!KwbI6
z&+7f?N9u#<$Lfk@Km5~6KeHc@9rf+ipK)JKKt!n5taiSlI)7{HLO3}(@m_`ZC{?O7
z#fufEh@BmU3m2wU%hs5hnQ56E1yWN}C{w;P{{|TafQ7jQlg3RUB{dblqrRLu8)0;X
zwqb)tG-=d?VnvIQ`sx+0(l4}~Hsjx0)3@FO2fYam3;pi^@c)^V{~ANaq_GN;{tppK
Wrl@UQ<-Py_00{s|MNUMnLSTXiAV`z|

diff --git a/game/modules/tome/data/gfx/talents/wormhole.png b/game/modules/tome/data/gfx/talents/wormhole.png
index 1f85b3fcaee1b4ee5778908cc7fcece7f986d607..f34fe5e73422a3183267fb223ba0587eb145e655 100644
GIT binary patch
literal 4506
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

literal 5568
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
O0000<MNUMnLSTZyR%$f>

diff --git a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
index cb7fe1773c..93bca69176 100644
--- a/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
+++ b/game/modules/tome/data/talents/chronomancy/age-manipulation.lua
@@ -29,12 +29,13 @@ newTalent{
 	reflectable = true,
 	requires_target = true,
 	proj_speed = 5,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end,
 	getDamageStat = function(self, t) return 2 + math.ceil(t.getDamage(self, t) / 15) end,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), talent=t, display={particle="temporal_bolt"}}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
+		
 		self:projectile(tg, x, y, DamageType.CLOCK, self:spellCrit(t.getDamage(self, t)))
 		game:playSoundNear(self, "talents/spell_generic2")
 
@@ -64,7 +65,7 @@ newTalent{
 }
 
 newTalent{
-	name = "Temporal Fugue",
+	name = "Temporal Fugue Old",
 	type = {"chronomancy/age-manipulation", 2},
 	require = chrono_req2,
 	points = 5,
@@ -114,7 +115,7 @@ newTalent{
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 135, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 135, getParadoxSpellpower(self, t)) end,
 	getDuration = function(self, t) return 5 + math.ceil(self:getTalentLevel(t)) end,
 	direct_hit = true,
 	requires_target = true,
@@ -163,7 +164,7 @@ newTalent{
 		return nb
 	end },
 	is_heal = true,
-	getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 440, getParadoxSpellpower(self)) end,
+	getHeal = function(self, t) return self:combatTalentSpellDamage(t, 40, 440, getParadoxSpellpower(self, t)) end,
 	getRemoveCount = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5, "log")) end,
 	action = function(self, t)
 		self:attr("allow_on_heal", 1)
diff --git a/game/modules/tome/data/talents/chronomancy/anomalies.lua b/game/modules/tome/data/talents/chronomancy/anomalies.lua
index 7636f689e2..270b3e9c16 100644
--- a/game/modules/tome/data/talents/chronomancy/anomalies.lua
+++ b/game/modules/tome/data/talents/chronomancy/anomalies.lua
@@ -25,37 +25,37 @@ local Object = require "engine.Object"
 local Trap = require "mod.class.Trap"
 
 -- All anomaly damage functions come from here with a bit of randomness thrown in to mix it up
-getAnomalyDamage = function(self)
-	local dam = self:combatScale(getParadoxSpellpower(self), 20, 10, 220, 100, 0.75)
+getAnomalyDamage = function(self, t)
+	local dam = self:combatScale(getParadoxSpellpower(self, t), 20, 10, 220, 100, 0.75)
 	return rng.avg(dam / 3, dam, 3)
 end
 
-getAnomalyDamageAoE = function(self)
-	local dam = self:combatScale(getParadoxSpellpower(self), 10, 10, 50, 100, 0.75)
+getAnomalyDamageAoE = function(self, t)
+	local dam = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75)
 	return rng.avg(dam / 3, dam, 3)
 end
 
 -- Here we have Effect Power and Anomaly duration, similar to damage but less random
-getAnomalyEffectPower = function(self)
-	local dam = self:combatScale(getParadoxSpellpower(self), 10, 10, 50, 100, 0.75)
+getAnomalyEffectPower = function(self, t)
+	local dam = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75)
 	return math.ceil(rng.avg(dam / 2, dam, 3))
 end
 
-getAnomalyDuration = function(self)
-	local dam = self:combatScale(getParadoxSpellpower(self), 4, 10, 12, 100, 0.75)
+getAnomalyDuration = function(self, t)
+	local dam = self:combatScale(getParadoxSpellpower(self, t), 4, 10, 12, 100, 0.75)
 	return math.ceil(rng.avg(dam / 2, dam, 3))
 end
 
 -- Determines the anomaly range based on current spellpower
 -- Generally we just use range = 10 for anomalies, this is for stuff with much longer range (such as teleports)
-getAnomalyRange = function(self)
-	local range = math.floor(self:combatLimit(getParadoxSpellpower(self), 80, 20, 20, 40, 100))
+getAnomalyRange = function(self, t)
+	local range = math.floor(self:combatLimit(getParadoxSpellpower(self, t), 80, 20, 20, 40, 100))
 	return range
 end
 
 -- Determines the anomaly radius based on current spellpower
-getAnomalyRadius = function(self)
-	local radius = math.floor(self:combatLimit(getParadoxSpellpower(self),8, 2, 20, 6, 100))
+getAnomalyRadius = function(self, t)
+	local radius = math.floor(self:combatLimit(getParadoxSpellpower(self, t), 6, 2, 20, 4, 100))
 	return radius
 end
 
@@ -102,7 +102,7 @@ end
 -- For this to work all anomalies have to have no_energy set to true in the talent table, otherwise it will use two turns
 checkAnomalyTargeting = function(self, t, tg)
 	local x, y = self.x, self.y
-	if self:knowTalent(self.T_BIAS_WEAVE) and rng.percent(self:callTalent(self.T_BIAS_WEAVE, "getTargetChance")) then
+	if self:knowTalent(self.T_BIAS_WEAVE) and rng.percent(self:callTalent(self.T_BIAS_WEAVE, "getTargetChance")) and not self:attr("anomaly_forced_target") then
 		if self == game.player then
 			game.bignews:saySimple(180, "#STEEL_BLUE#Targeting %s", t.name)
 		end
@@ -121,12 +121,6 @@ end
 -- Check for effects when hit by an anomaly
 -- This is called before immunity is checked
 checkAnomalyTriggers = function(self, target)
-	if target:knowTalent(target.T_WEBS_OF_FATE) then
-		target:forceUseTalent(target.T_WEBS_OF_FATE, {ignore_cd=true, ignore_energy=true, ignore_ressources=true})
-	end
-	if target:knowTalent(target.T_SEAL_FATE) then
-		target:forceUseTalent(target.T_SEAL_FATE, {ignore_cd=true, ignore_energy=true, ignore_ressources=true})
-	end
 	if target:hasEffect(target.EFF_TRIM_THREADS) then
 		local eff = target:hasEffect(target.EFF_TRIM_THREADS)
 		eff.src:callTalent(eff.src.T_TRIM_THREADS, "doAnomaly", target, eff)
@@ -142,9 +136,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -186,9 +180,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
-	range = function(self, t) return getAnomalyRange(self) end,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	cooldown =0,
+	range = function(self, t) return getAnomalyRange(self, t) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -231,9 +225,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -244,7 +238,7 @@ newTalent{
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = checkAnomalyTargeting(self, t, tg)
-		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t), true)
+		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRange(t), true)
 
 		-- Randomly take targets
 		if #tgts <= 0 then return nil end
@@ -286,9 +280,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -309,7 +303,7 @@ newTalent{
 		checkAnomalyTriggers(self, self)
 		
 		if a:canBe("anomaly") then
-			self:setEffect(self.EFF_DISPLACEMENT_SHIELD, getAnomalyDuration(self)*2, {power=getAnomalyDamage(self)*4, target=a, chance=50})
+			self:setEffect(self.EFF_DISPLACEMENT_SHIELD, getAnomalyDuration(self, t)*2, {power=getAnomalyDamage(self, t)*4, target=a, chance=50})
 		end
 		
 		game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport")
@@ -319,7 +313,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[50%% chance that damage the caster takes will be warped to a set target.
-		Once the maximum damage (%d) is absorbed, the time runs out, or the target dies, the shield will crumble.]]):format(getAnomalyDamage(self)*2)
+		Once the maximum damage (%d) is absorbed, the time runs out, or the target dies, the shield will crumble.]]):format(getAnomalyDamage(self, t)*2)
 	end,
 }
 
@@ -331,7 +325,7 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
 	direct_hit = true,
 	no_energy = true, 
@@ -356,7 +350,7 @@ newTalent{
 			image = "terrain/wormhole.png",
 			display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE,
 			message = "@Target@ moves onto the wormhole.",
-			temporary = getAnomalyDuration(self),
+			temporary = getAnomalyDuration(self, t),
 			x = start_x, y = start_y,
 			canAct = false,
 			energy = {value=0},
@@ -364,12 +358,12 @@ newTalent{
 			summoned_by = self, -- "summoner" is immune to it's own traps
 			triggered = function(self, x, y, who)
 				if who == self.summoned_by or who:canBe("teleport") then
-					-- since we're using a precise teleport we'll look for a free grid first
-					local tx, ty = util.findFreeGrid(self.dest.x, self.dest.y, 5, true, {[engine.Map.ACTOR]=true})
-					if tx and ty then
-						if not who:teleportRandom(tx, ty, 0) then
-							game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize())
-						end
+					game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+					if not who:teleportRandom(self.dest.x, self.dest.y, 3, 1) then
+						game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize())
+					elseif who ~= self.summoned_by then
+						who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power})
+						game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
 					end
 				else
 					game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize())
@@ -423,9 +417,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -444,7 +438,7 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(a.EFF_PROBABILITY_TRAVEL, getAnomalyDuration(self)*2, {power=getAnomalyDuration(self)})
+			a:setEffect(a.EFF_PROBABILITY_TRAVEL, getAnomalyDuration(self, t)*2, {power=getAnomalyDuration(self, t)})
 			game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport")
 
 			game:playSoundNear(self, "talents/spell_generic")
@@ -454,7 +448,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Allows up to five targets in a radius of %d to travel up to %d tiles through walls.]]):
-		format(getAnomalyDuration(self)*2, getAnomalyDuration(self))
+		format(getAnomalyDuration(self, t)*2, getAnomalyDuration(self, t))
 	end,
 }
 
@@ -466,9 +460,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -487,7 +481,7 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(a.EFF_BLINK, getAnomalyDuration(self)*2, {power=getAnomalyDuration(self)})
+			a:setEffect(a.EFF_BLINK, getAnomalyDuration(self, t)*2, {power=getAnomalyDuration(self, t)})
 			game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport")
 
 			game:playSoundNear(self, "talents/spell_generic")
@@ -497,7 +491,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Up to five targets in a radius of %d are teleporting %d tiles every turn.]]):
-		format(self:getTalentRadius(t), getAnomalyDuration(self))
+		format(self:getTalentRadius(t), getAnomalyDuration(self, t))
 	end,
 }
 
@@ -509,16 +503,16 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	requires_target = true,
 	no_energy = true, 
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
 	end,
-	getSummonTime = function(self, t) return math.ceil(getAnomalyDuration(self)*2) end,
+	getSummonTime = function(self, t) return math.ceil(getAnomalyDuration(self, t)*2) end,
 	message = "Some innocent bystanders have been teleported into the fight.",
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
@@ -618,16 +612,16 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
 	end,
-	getSlow = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end,
+	getSlow = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end,
 	message = "@Source@ creates a bubble of slow time.",
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
@@ -641,7 +635,7 @@ newTalent{
 			checkAnomalyTriggers(self, a)
 			
 			if a:canBe("anomaly") then
-				a:setEffect(a.EFF_SLOW, getAnomalyDuration(self), {power=t.getSlow(self, t), no_ct_effect=true})
+				a:setEffect(a.EFF_SLOW, getAnomalyDuration(self, t), {power=t.getSlow(self, t), no_ct_effect=true})
 			end
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
@@ -662,16 +656,16 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), nowarning=true}
 	end,
-	getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end,
+	getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end,
 	message = "@Source@ creates a bubble of fast time.",
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
@@ -684,7 +678,7 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(a.EFF_SPEED, getAnomalyDuration(self), {power=t.getHaste(self, t)})
+			a:setEffect(a.EFF_SPEED, getAnomalyDuration(self, t), {power=t.getHaste(self, t)})
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
 		end
@@ -705,9 +699,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -727,7 +721,7 @@ newTalent{
 			checkAnomalyTriggers(self, a)
 
 			if a:canBe("anomaly") and a:canBe("stun") then
-				a:setEffect(a.EFF_STUNNED, getAnomalyDuration(self)/2, {no_ct_effect=true, apply_power=getParadoxSpellpower(self)})
+				a:setEffect(a.EFF_STUNNED, getAnomalyDuration(self, t)/2, {no_ct_effect=true, apply_power=getParadoxSpellpower(self, t)})
 			end
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
@@ -749,9 +743,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -771,7 +765,7 @@ newTalent{
 			checkAnomalyTriggers(self, a)
 
 			if a:canBe("anomaly") then
-				a:setEffect(a.EFF_TIME_PRISON, getAnomalyDuration(self), {no_ct_effect=true})
+				a:setEffect(a.EFF_TIME_PRISON, getAnomalyDuration(self, t), {no_ct_effect=true})
 			end
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
@@ -793,9 +787,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -814,7 +808,7 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(a.EFF_TIME_SHIELD, getAnomalyDuration(self), {power=getAnomalyDamage(self)*4, dot_dur=5, time_reducer=40})
+			a:setEffect(a.EFF_TIME_SHIELD, getAnomalyDuration(self, t), {power=getAnomalyDamage(self, t)*4, dot_dur=5, time_reducer=40})
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
 		end
@@ -835,9 +829,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -856,7 +850,7 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(a.EFF_INVIGORATE, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)/10})
+			a:setEffect(a.EFF_INVIGORATE, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)/10})
 			game.level.map:particleEmitter(x, y, tg.radius, "ball_temporal", {radius=self:getTalentRadius(t), tx=x, ty=y})
 			game:playSoundNear(self, "talents/spell_generic")
 		end
@@ -877,9 +871,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -893,20 +887,22 @@ newTalent{
 		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t))
 
 		-- Randomly take targets
-		if #tgts <= 0 then return end
+		if #tgts <= 0 then return true end
 		local a, id = rng.table(tgts)
 		table.remove(tgts, id)
 		checkAnomalyTriggers(self, a)
 		
 		local x, y = util.findFreeGrid(a.x, a.y, 3, true, {[Map.ACTOR]=true})
 		if not x then
-			return
+			return true
 		end
 		if a:attr("summon_time") then return end
-		local m = makeParadoxClone(self, a, getAnomalyDuration(self)*2)
+		local m = makeParadoxClone(self, a, getAnomalyDuration(self, t)*2)
 		m.ai_state = { talent_in=2, ally_compassion=10}
 		game.zone:addEntity(game.level, m, "actor", x, y)
 		game.level.map:particleEmitter(x, y, 1, "generic_teleport", {rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=70, aM=180})
+		
+		return true
 	end,
 	info = function(self, t)
 		return ([[Clones a random creature within range.]]):format()
@@ -921,9 +917,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown = 0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -937,8 +933,8 @@ newTalent{
 		
 		-- Add a lasting map effect
 		game.level.map:addEffect(self,
-			x, y, getAnomalyDuration(self),
-			DamageType.TEMPORAL, getAnomalyDamageAoE(self),
+			x, y, getAnomalyDuration(self, t)/2,
+			DamageType.TEMPORAL, getAnomalyDamageAoE(self, t),
 			tg.radius,
 			5, nil,
 			engine.MapEffect.new{alpha=85, color_br=200, color_bg=200, color_bb=0, effect_shader="shader_images/paradox_effect.png"},
@@ -947,8 +943,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Creates a temporal storm for %d turns that deals %d temporal damage each turn.]])
-		:format(getAnomalyDuration(self), damDesc(self, DamageType.TEMPORAL, getAnomalyDamageAoE(self)))
+		local duration = self:combatScale(getParadoxSpellpower(self, t), 4, 10, 12, 100, 0.75)/2
+		local damage = self:combatScale(getParadoxSpellpower(self, t), 10, 10, 50, 100, 0.75)
+		return ([[Creates a temporal storm for %d to %d turns that deals between %0.2f and %0.2f temporal damage each turn.]])
+		:format(duration/2, duration, damDesc(self, DamageType.TEMPORAL, damage/3),  damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
 
@@ -961,9 +959,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -1005,9 +1003,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -1037,7 +1035,7 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
 	radius = 1,
 	direct_hit = true,
@@ -1070,7 +1068,7 @@ newTalent{
 					show_tooltip = true,
 					block_move = true,
 					block_sight = true,
-					temporary = getAnomalyDuration(self),
+					temporary = getAnomalyDuration(self, t),
 					x = x + i, y = y + j,
 					canAct = false,
 					act = function(self)
@@ -1113,9 +1111,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1146,7 +1144,7 @@ newTalent{
 						if not target.talents_cd[tid] and t.mode == "activated" and not t.innate then tids[#tids+1] = t end
 					end
 					for i = 1, rng.avg(3, 6, 3) do
-						local power = getAnomalyDuration(self)
+						local power = getAnomalyDuration(self, t)
 						local t = rng.tableRemove(tids)
 						if not t then break end
 						target.talents_cd[t.id] = rng.range(2, power)
@@ -1160,7 +1158,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Places between three and six talents of up to 5 targets in a radius %d ball on cooldown for up to %d turns.]]):
-		format(getAnomalyRadius(self), getAnomalyDuration(self))
+		format(getAnomalyRadius(self, t), getAnomalyDuration(self, t))
 	end,
 }
 
@@ -1172,9 +1170,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -1195,7 +1193,7 @@ newTalent{
 			checkAnomalyTriggers(self, a)
 			
 			if a:canBe("anomaly") and a:canBe("pin") then
-				a:setEffect(self.EFF_PINNED, getAnomalyDuration(self), {apply_power=getParadoxSpellpower(self)})
+				a:setEffect(self.EFF_PINNED, getAnomalyDuration(self, t), {apply_power=getParadoxSpellpower(self, t)})
 			end
 		end
 		
@@ -1216,9 +1214,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1231,8 +1229,8 @@ newTalent{
 		local x, y = checkAnomalyTargeting(self, t, tg)
 		
 		-- Don't bury the player
-		if self ~= game.player and not game.player:knowTalent(game.player.T_DIG_OBJECT) then
-			return
+		if not game.player:knowTalent(game.player.T_DIG_OBJECT) then
+			return true
 		end
 
 		self:doQuake(tg, x, y)
@@ -1240,50 +1238,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Causes an earthquake in a radius of %d.]]):
-		format(getAnomalyRadius(self))
-	end,
-}
-
-newTalent{
-	name = "Anomaly Calcify",
-	type = {"chronomancy/anomalies", 1},
-	anomaly_type = "physical",
-	type_no_req = true,
-	no_unlearn_last = true,
-	points = 1,
-	paradox = 0,
-	cooldown = 1,
-	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
-	direct_hit = true,
-	no_energy = true,
-	requires_target = true,
-	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
-	end,
-	message = "@Source@ calcifies several targets.",
-	action = function(self, t)
-		local tg = self:getTalentTarget(t)
-		local x, y = checkAnomalyTargeting(self, t, tg)
-		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t))
-
-		-- Randomly take targets
-		for i = 1, rng.avg(1, 5, 3) do
-			if #tgts <= 0 then break end
-			local a, id = rng.table(tgts)
-			table.remove(tgts, id)
-			checkAnomalyTriggers(self, a)
-			
-			if a:canBe("anomaly") and a:canBe("stun") and a:canBe("stone") and a:canBe("instakill")then
-				a:setEffect(a.EFF_STONED, getAnomalyDuration(self), {apply_power=getParadoxSpellpower(self)})
-				game.level.map:particleEmitter(a.x, a.y, 1, "archery")
-			end
-		end
-		return true
-	end,
-	info = function(self, t)
-		return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]):
-		format(getAnomalyRadius(self), getAnomalyDuration(self))
+		format(getAnomalyRadius(self, t))
 	end,
 }
 
@@ -1295,9 +1250,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1317,14 +1272,14 @@ newTalent{
 			table.remove(tgts, id)
 			checkAnomalyTriggers(self, a)
 
-			a:setEffect(self.EFF_FLAWED_DESIGN, getAnomalyDuration(self), {power=getAnomalyEffectPower(self)})
+			a:setEffect(self.EFF_FLAWED_DESIGN, getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)})
 			game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport")
 			game:playSoundNear(self, "talents/spell_generic")
 		end
 		return true
 	end,
 	info = function(self, t)
-		return ([[Reduces the resistances of up to five targets in a ball of radius %d by %d%%.]]):format(self:getTalentRadius(t), getAnomalyEffectPower(self))
+		return ([[Reduces the resistances of up to five targets in a ball of radius %d by %d%%.]]):format(self:getTalentRadius(t), getAnomalyEffectPower(self, t))
 	end,
 }
 
@@ -1336,9 +1291,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1351,7 +1306,7 @@ newTalent{
 		local x, y = checkAnomalyTargeting(self, t, tg)
 		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRange(t))
 		
-		local dam = getAnomalyRadius(self) -- not a typo, very low damage since this isn't a major anomaly
+		local dam = getAnomalyRadius(self, t) -- not a typo, very low damage since this isn't a major anomaly
 
 		-- Randomly take targets
 		for i = 1, rng.avg(3, 6, 3) do
@@ -1398,9 +1353,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1412,7 +1367,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t))
 		
-		local movedam = self:spellCrit(getAnomalyDamageAoE(self))
+		local movedam = self:spellCrit(getAnomalyDamage(self, t))
 
 		-- Randomly take targets
 		for i = 1, rng.avg(3, 6, 3) do
@@ -1448,6 +1403,49 @@ newTalent{
 	end,
 }
 
+newTalent{
+	name = "Anomaly Calcify",
+	type = {"chronomancy/anomalies", 1},
+	anomaly_type = "major",
+	type_no_req = true,
+	no_unlearn_last = true,
+	points = 1,
+	paradox = 0,
+	cooldown =0,
+	range = 10,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
+	direct_hit = true,
+	no_energy = true,
+	requires_target = true,
+	target = function(self, t)
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+	end,
+	message = "@Source@ calcifies several targets.",
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y = checkAnomalyTargeting(self, t, tg)
+		local tgts = getAnomalyTargets(self, t, x, y, "ACTOR", self:getTalentRadius(t))
+
+		-- Randomly take targets
+		for i = 1, rng.avg(1, 5, 3) do
+			if #tgts <= 0 then break end
+			local a, id = rng.table(tgts)
+			table.remove(tgts, id)
+			checkAnomalyTriggers(self, a)
+			
+			if a:canBe("anomaly") and a:canBe("stun") and a:canBe("stone") and a:canBe("instakill")then
+				a:setEffect(a.EFF_STONED, getAnomalyDuration(self, t), {apply_power=getParadoxSpellpower(self, t)})
+				game.level.map:particleEmitter(a.x, a.y, 1, "archery")
+			end
+		end
+		return true
+	end,
+	info = function(self, t)
+		return ([[Turns up to 5 targets in a radius %d ball to stone for %d turns.]]):
+		format(getAnomalyRadius(self, t), getAnomalyDuration(self, t))
+	end,
+}
+
 newTalent{
 	name = "Anomaly Call",
 	type = {"chronomancy/anomalies", 1},
@@ -1456,9 +1454,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 50,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1499,16 +1497,16 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
 	target = function(self, t)
 		return {type="hit", range=self:getTalentRange(t), talent=t}
 	end,
-	getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self)) / 100) end,
+	getHaste = function(self, t) return 1 - 1 / (1 + (getAnomalyEffectPower(self, t)) / 100) end,
 	message = "The odds have tilted.",
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
@@ -1520,15 +1518,15 @@ newTalent{
 		table.remove(tgts, id)
 		checkAnomalyTriggers(self, a)
 
-		a:setEffect(self.EFF_SPEED, getAnomalyDuration(self), {power=t.getHaste(self, t)})
-		a:setEffect(self.EFF_REGENERATION,  getAnomalyDuration(self), {power=getAnomalyEffectPower(self)})
-		a:setEffect(self.EFF_PAIN_SUPPRESSION,  getAnomalyDuration(self), {power=getAnomalyEffectPower(self)})
+		a:setEffect(self.EFF_SPEED, getAnomalyDuration(self, t), {power=t.getHaste(self, t)})
+		a:setEffect(self.EFF_REGENERATION,  getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)})
+		a:setEffect(self.EFF_PAIN_SUPPRESSION,  getAnomalyDuration(self, t), {power=getAnomalyEffectPower(self, t)})
 		game.level.map:particleEmitter(a.x, a.y, 1, "temporal_teleport")
 		game:playSoundNear(self, "talents/spell_generic")
 		return true
 	end,
 	info = function(self, t)
-		return ([[Substantially toughens and hastes one target for %d turns.]]):format(getAnomalyDuration(self))
+		return ([[Substantially toughens and hastes one target for %d turns.]]):format(getAnomalyDuration(self, t))
 	end,
 }
 
@@ -1540,9 +1538,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1558,7 +1556,7 @@ newTalent{
 			return
 		end
 		if self:attr("summon_time") then return end
-		local m = makeParadoxClone(self, self, getAnomalyDuration(self)*2)
+		local m = makeParadoxClone(self, self, getAnomalyDuration(self, t)*2)
 		game.zone:addEntity(game.level, m, "actor", x, y)
 		m.faction = "enemies"
 		m.summoner = nil
@@ -1569,7 +1567,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Clones the caster.]]):format(getAnomalyDuration(self))
+		return ([[Clones the caster.]]):format(getAnomalyDuration(self, t))
 	end,
 }
 
@@ -1581,9 +1579,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1607,7 +1605,7 @@ newTalent{
 				return
 			end
 			if a:attr("summon_time") then return end
-			local m = makeParadoxClone(self, a, getAnomalyDuration(self)*2)
+			local m = makeParadoxClone(self, a, getAnomalyDuration(self, t)*2)
 			game.zone:addEntity(game.level, m, "actor", x, y)
 			m.ai_state = { talent_in=1, ally_compassion=10}
 			game.level.map:particleEmitter(x, y, 1, "generic_teleport", {rm=60, rM=130, gm=20, gM=110, bm=90, bM=130, am=70, aM=180})
@@ -1616,7 +1614,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Clones all creatures in a radius of 10.]]):format(getAnomalyDuration(self))
+		return ([[Clones all creatures in a radius of 10.]]):format(getAnomalyDuration(self, t))
 	end,
 }
 
@@ -1628,9 +1626,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true, 
 	requires_target = true,
@@ -1662,9 +1660,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1676,7 +1674,7 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t))
 		
-		local movedam = self:spellCrit(getAnomalyDamage(self)) -- High damage
+		local movedam = self:spellCrit(getAnomalyDamage(self, t)) -- High damage
 
 		-- Randomly take targets
 		if #tgts <= 0 then return end
@@ -1720,9 +1718,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1734,8 +1732,9 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local tgts = getAnomalyTargets(self, t, self.x, self.y, "ACTOR", self:getTalentRange(t))
 
-		local movedam = self:spellCrit(getAnomalyDamageAoE(self))
-		local dam = self:spellCrit(getAnomalyDamage(self)/2)
+		local movedam = self:spellCrit(getAnomalyDamage(self, t))
+		local dam = self:spellCrit(getAnomalyDamage(self, t)/2)
+		local apply_power = getParadoxSpellpower(self, t)
 
 		-- Randomly take targets
 		for i = 1, rng.avg(3, 6, 3) do
@@ -1748,7 +1747,7 @@ newTalent{
 			local proj = require("mod.class.Projectile"):makeHoming(
 				self,
 				{particle="bolt_lightning", trail="lightningtrail"},
-				{speed=2, name="Tornado", dam=dam, movedam=movedam, start_x=orig_x, start_y=orig_y},
+				{speed=2, name="Tornado", dam=dam, movedam=movedam, start_x=orig_x, start_y=orig_y, apply=apply_power},
 				target,
 				self:getTalentRange(t),
 				function(self, src)
@@ -1760,7 +1759,7 @@ newTalent{
 					src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.LIGHTNING, self.def.dam)
 					src:project({type="ball", radius=1, x=self.x, y=self.y}, self.x, self.y, DT.MINDKNOCKBACK, self.def.dam)
 					if target:canBe("stun") then
-						target:setEffect(target.EFF_STUNNED, 4, {apply_power=getParadoxSpellpower(src)})
+						target:setEffect(target.EFF_STUNNED, 4, {apply_power=self.def.apply})
 					else
 						game.logSeen(target, "%s resists the tornado!", target.name:capitalize())
 					end
@@ -1796,9 +1795,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1860,7 +1859,7 @@ newTalent{
 					local target = game.level.map(px, py, engine.Map.ACTOR)
 					if target then
 						if target:canBe("stun") then
-							target:setEffect(target.EFF_STUNNED, 3, {apply_power=src:combatSpellpower()})
+							target:setEffect(target.EFF_STUNNED, 3, {apply_power=getParadoxSpellpower(src, t)})
 						else
 							game.logSeen(target, "%s resists the stun!", target.name:capitalize())
 						end
@@ -1871,7 +1870,7 @@ newTalent{
 			end
 		end
 
-		local dam = self:spellCrit(getAnomalyDamage(self))
+		local dam = self:spellCrit(getAnomalyDamage(self, t))
 		meteor(self, x, y, dam)
 
 		return true
@@ -1890,9 +1889,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
@@ -1923,7 +1922,7 @@ newTalent{
 				end
 				return true
 			end,
-			temporary = getAnomalyDuration(self)*10,
+			temporary = getAnomalyDuration(self, t)*10,
 			x = tx, y = ty,
 			canAct = false,
 			energy = {value=0},
@@ -1972,9 +1971,9 @@ newTalent{
 	no_unlearn_last = true,
 	points = 1,
 	paradox = 0,
-	cooldown = 1,
+	cooldown =0,
 	range = 10,
-	radius = function(self, t) return getAnomalyRadius(self) end,
+	radius = function(self, t) return getAnomalyRadius(self, t) end,
 	direct_hit = true,
 	no_energy = true,
 	requires_target = true,
diff --git a/game/modules/tome/data/talents/chronomancy/blade-threading.lua b/game/modules/tome/data/talents/chronomancy/blade-threading.lua
index ab1997ab06..75472cf5a8 100644
--- a/game/modules/tome/data/talents/chronomancy/blade-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/blade-threading.lua
@@ -28,9 +28,10 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	tactical = { ATTACK = {weapon = 2}, DISABLE = 3 },
 	requires_target = true,
-	no_energy = "fake",
+	speed = "weapon",
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+	getWarp = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
 	on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end,
 	action = function(self, t)
 		local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t))
@@ -39,49 +40,26 @@ newTalent{
 		local x, y, target = self:getTarget(tg)
 		if not x or not y or not target then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end
 		if core.fov.distance(self.x, self.y, x, y) > 1 then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end
-		local hitted = self:attackTarget(target, DamageType.MATTER, dam)
-
+		
+		-- Hit?
+		local hitted = self:attackTarget(target, nil, dam, true)
+		
+		-- Project our warp
 		if hitted then
-			local chance = rng.range(1, 4)
-			if chance == 1 then
-				if target:canBe("stun") then
-					target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)})
-				else
-					game.logSeen(target, "%s resists the stun!", target.name:capitalize())
-				end
-			elseif chance == 2 then
-				if target:canBe("blind") then
-					target:setEffect(target.EFF_BLINDED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)})
-				else
-					game.logSeen(target, "%s resists the blindness!", target.name:capitalize())
-				end
-			elseif chance == 3 then
-				if target:canBe("pin") then
-					target:setEffect(target.EFF_PINNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)})
-				else
-					game.logSeen(target, "%s resists the pin!", target.name:capitalize())
-				end
-			elseif chance == 4 then
-				if target:canBe("confusion") then
-					target:setEffect(target.EFF_CONFUSED, t.getDuration(self, t), {power=50, apply_power=getParadoxSpellpower(self)})
-				else
-					game.logSeen(target, "%s resists the confusion!", target.name:capitalize())
-				end
-			end
-			
+			self:project({type="hit"}, target.x, target.y, DamageType.WARP, {dam=self:spellCrit(t.getWarp(self, t)), chance=100, dur=t.getDuration(self, t), apply_power=getParadoxSpellpower(self, t)})
 			game.level.map:particleEmitter(target.x, target.y, 1, "generic_discharge", {rm=64, rM=64, gm=134, gM=134, bm=170, bM=170, am=35, aM=90})
-			--game:playSoundNear(self, "talents/distortion")
-		end				
-
+		end
+		
 		return true
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t) * 100
 		local duration = t.getDuration(self, t)
-		return ([[Attack the target with your melee weapons for %d%%.  Half of this damage will be temporal and half physical.
-		If the attack hits the target may be stunned, blinded, pinned, or confused for %d turns.
-		Chance of applying a random effect improves with your Spellpower.]])
-		:format(damage, duration)
+		local warp = t.getWarp(self, t)
+		return ([[Attack the target with your melee weapons for %d%%.  
+		If the attack hits you'll warp the target, dealing %0.2f temporal and %0.2f physical damage, and may stun, blind, pin, or confuse them for %d turns.
+		The bonus damage improves with your Spellpower.]])
+		:format(damage, damDesc(self, DamageType.TEMPORAL, warp/2), damDesc(self, DamageType.PHYSICAL, warp/2), duration)
 	end
 }
 
@@ -117,19 +95,17 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 15) end,
 	tactical = { ATTACKAREA = {weapon = 2}, DISABLE = 3 },
 	requires_target = true,
-	no_energy = "fake",
+	speed = "weapon",
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
-	getPower = function(self, t) return self:combatTalentSpellDamage(t, 50, 150, getParadoxSpellpower(self)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
+	getPower = function(self, t) return self:combatTalentSpellDamage(t, 50, 150, getParadoxSpellpower(self, t)) end,
 	on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end,
 	action = function(self, t)
 		local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t))
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y, target = self:getTarget(tg)
 		if not x or not y or not target then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end
-		local hit1 = false
-		local hit2 = false
-		local hit3 = false
+		local braid_targets = {}
 
 		-- do the braid
 		if core.fov.distance(self.x, self.y, x, y) == 1 then
@@ -138,35 +114,30 @@ newTalent{
 			local lx, ly = util.coordAddDir(self.x, self.y, util.dirSides(dir, self.x, self.y).left)
 			local rx, ry = util.coordAddDir(self.x, self.y, util.dirSides(dir, self.x, self.y).right)
 			local lt, rt = game.level.map(lx, ly, Map.ACTOR), game.level.map(rx, ry, Map.ACTOR)
-
+			
 			-- target hit
-			hit1 = self:attackTarget(target, nil, damage)
+			local hit1 = self:attackTarget(target, nil, damage, true)
+			if hit1 then braid_targets[#braid_targets+1] = target end
 			
 			--left hit
-			if lt then
-				hit2 = self:attackTarget(lt, nil, damage, true)
+			if lt and self:reactionToward(lt) < 0 then
+				local hit2 = self:attackTarget(lt, nil, damage, true)
+				if hit2 then braid_targets[#braid_targets+1] = lt end
 			end
 			--right hit
-			if rt then
-				hit3 = self:attackTarget(rt, nil, damage, true)
+			if rt and self:reactionToward(rt) < 0 then
+				local hit3 = self:attackTarget(rt, nil, damage, true)
+				if hit3 then braid_targets[#braid_targets+1] = rt end
 			end
 			
-			-- Braid them; no save
-			if hit1 then
-				if hit2 or hit3 then
-					target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=lt or nil, braid_two=rt or nil})
-				end
-			end
-			if hit2 then
-				if hit1 or hit3 then
-					lt:setEffect(lt.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=target or nil, braid_two=rt or nil})
-				end
-			end
-			if hit3 then
-				if hit1 or hit2 then
-					rt:setEffect(rt.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, braid_one=target or nil, braid_two=lt or nil})
+			-- if we hit more than one, braid them
+			if #braid_targets > 1 then
+				for i = 1, #braid_targets do
+					local target = braid_targets[i]
+					target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getPower(self, t), src=self, targets=braid_targets})
 				end
 			end
+
 		else
 			if swap then doWardenWeaponSwap(self, t, nil, "bow") end
 			return nil
@@ -195,8 +166,7 @@ newTalent{
 	tactical = { ATTACKAREA = {weapon = 2}, ATTACK = {weapon = 2},  },
 	requires_target = true,
 	is_teleport = true,
-	direct_hit = true,
-	no_energy = "fake",
+	speed = "weapon",
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.6, 1.2) end,
 	getTeleports = function(self, t) return self:getTalentLevel(t) >= 5 and 2 or 1 end,
 	on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "dual") then if not silent then game.logPlayer(self, "You require two weapons to use this talent.") end return false end return true end,
@@ -208,7 +178,7 @@ newTalent{
 			
 		-- Hit the target
 		if core.fov.distance(self.x, self.y, target.x, target.y) > 1 then if swap then doWardenWeaponSwap(self, t, nil, "bow") end return nil end
-		local hitted = self:attackTarget(target, nil, dam)
+		local hitted = self:attackTarget(target, nil, dam, true)
 
 		if hitted then
 			-- Get available targets
@@ -219,6 +189,7 @@ newTalent{
 				local a = game.level.map(x, y, Map.ACTOR)
 				if a and self:reactionToward(a) < 0 and self:hasLOS(a.x, a.y) then
 					tgts[#tgts+1] = a
+					print("Temporal Assault Target %s", a.name)
 				end
 			end end
 			
@@ -229,7 +200,7 @@ newTalent{
 				local a, id = rng.table(tgts)
 				-- since we're using a precise teleport we'll look for a free grid first
 				local tx2, ty2 = util.findFreeGrid(a.x, a.y, 5, true, {[Map.ACTOR]=true})
-				if tx2 and ty2 then
+				if tx2 and ty2 and not a.dead then
 					game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
 					if not self:teleportRandom(tx2, ty2, 0) then
 						attempts = attempts - 1
diff --git a/game/modules/tome/data/talents/chronomancy/bow-threading.lua b/game/modules/tome/data/talents/chronomancy/bow-threading.lua
index 042fbe96e2..b2fe1e6afc 100644
--- a/game/modules/tome/data/talents/chronomancy/bow-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/bow-threading.lua
@@ -29,7 +29,7 @@ newTalent{
 	tactical = { BUFF = 2 },
 	points = 5,
 	getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end,
-	getApplyPower = function(self, t) return getParadoxSpellpower(self) end,
+	getApplyPower = function(self, t) return getParadoxSpellpower(self, t) end,
 	activate = function(self, t)
 		return {}
 	end,
@@ -52,7 +52,7 @@ newTalent{
 	tactical = { ATTACK = {weapon = 2} },
 	requires_target = true,
 	range = archery_range,
-	no_energy = "fake",
+	speed = 'archery',
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.1, 2.2) end,
 	getParadoxReduction = function(self, t) return math.floor(self:combatTalentScale(t, 10, 20)) end,
 	on_pre_use = function(self, t, silent) if not doWardenPreUse(self, "bow") then if not silent then game.logPlayer(self, "You require a bow to use this talent.") end return false end return true end,
@@ -62,9 +62,9 @@ newTalent{
 	action = function(self, t)
 		local dam, swap = doWardenWeaponSwap(self, t, t.getDamage(self, t))
 
-		local targets = self:archeryAcquireTargets(nil, {one_shot=true, infinite=true})
+		local targets = self:archeryAcquireTargets({type="bolt"}, {one_shot=true, infinite=true, no_energy = true})
 		if not targets then if swap then doWardenWeaponSwap(self, t, nil, "blade") end return end
-		self:archeryShoot(targets, t, nil, {mult=dam, damtype=DamageType.TEMPORAL})
+		self:archeryShoot(targets, t, {type="bolt"}, {mult=dam, damtype=DamageType.TEMPORAL})
 
 		return true
 	end,
@@ -88,9 +88,9 @@ newTalent{
 	requires_target = true,
 	range = archery_range,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end,
-	no_energy = "fake",
+	speed = 'archery',
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
-	getDamageAoE = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end,
+	getDamageAoE = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) end,
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t}
 	end,
@@ -101,17 +101,45 @@ newTalent{
 			if not x or not y then return nil end
 			local _ _, _, _, x, y = self:canProject(tg, x, y)
 			
-			local dam = self:spellCrit(t.getDamageAoE(self, t))
-			local grids = self:project(tg, x, y, function(px, py)
+			local tgts = {}
+			self:project(tg, x, y, function(px, py)
 				local target = game.level.map(px, py, Map.ACTOR)
-				if not target then return end
-				local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
-				if tx and ty and target:canBe("knockback") then
-					target:move(tx, ty, true)
-					game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize())
+				if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then
+					-- If we've already moved this target don't move it again
+					for _, v in pairs(tgts) do
+						if v == target then
+							return
+						end
+					end
+
+					-- Do our Knockback
+					local can = function(target)
+						if target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback") then -- Deprecated Checkhit call
+							return true
+						else
+							game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
+						end
+					end
+					if can(target) then
+						target:pull(x, y, tg.radius, can)
+						tgts[#tgts+1] = target
+						game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize())
+						target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t))
+					end
 				end
 			end)
-			self:project(tg, x, y, DamageType.GRAVITY, self:spellCrit(dam))
+			
+			-- 25% bonus damage per target beyond the first
+			local dam = self:spellCrit(t.getDamageAoE(self, t))
+			dam = dam + math.min(dam, dam*(#tgts-1)/4)
+			
+			-- Project our damage last based on number of targets hit
+			self:project(tg, x, y, function(px, py)
+				local dist_factor = 1 + (core.fov.distance(x, y, px, py)/5)
+				local damage = dam/dist_factor
+				DamageType:get(DamageType.GRAVITY).projector(self, px, py, DamageType.GRAVITY, damage)
+			end)
+
 			game.level.map:particleEmitter(x, y, tg.radius, "gravity_spike", {radius=tg.radius, allow=core.shader.allow("distort")})
 
 			game:playSoundNear(self, "talents/earth")
@@ -127,9 +155,9 @@ newTalent{
 		
 		tg.type = "bolt" -- switch our targeting back to a bolt
 
-		local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y})
+		local targets = self:archeryAcquireTargets(tg, {one_shot=true, x=x, y=y, no_energy = true})
 		if not targets then return end
-		self:archeryShoot(targets, t, nil, {mult=dam})
+		self:archeryShoot(targets, t, {type="bolt"}, {mult=dam})
 
 		return true
 	end,
@@ -137,9 +165,11 @@ newTalent{
 		local damage = t.getDamage(self, t) * 100
 		local radius = self:getTalentRadius(t)
 		local aoe = t.getDamageAoE(self, t)
-		return ([[Fire a shot doing %d%% damage.  When the arrow reaches its destination it will draw in creatures in a radius of %d and inflict %0.2f additional physical damage.
-		The additional damage scales with your Spellpower and inflicts 50%% extra damage to pinned targets.]])
-		:format(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe))
+		return ([[Fire a shot doing %d%% damage.  When the arrow reaches its destination it will draw in creatures in a radius of %d and inflict %0.2f physical damage.
+		Each target moved beyond the first deals an additional %0.2f physical damage (up to %0.2f bonus damage).
+		Targets take reduced damage the further they are from the epicenter (20%% less per tile).
+		The additional damage scales with your Spellpower.]])
+		:format(damage, radius, damDesc(self, DamageType.PHYSICAL, aoe), damDesc(self, DamageType.PHYSICAL, aoe/4), damDesc(self, DamageType.PHYSICAL, aoe))
 	end
 }
 
@@ -154,7 +184,7 @@ newTalent{
 	requires_target = true,
 	range = archery_range,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end,
-	no_energy = "fake",
+	speed = 'archery',
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
 	getClones = function(self, t) return self:getTalentLevel(t) >= 5 and 3 or self:getTalentLevel(t) >= 3 and 2 or 1 end,
 	target = function(self, t)
@@ -176,7 +206,7 @@ newTalent{
 			return nil
 		end
 				
-		local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y})
+		local targets = self:archeryAcquireTargets(self:getTalentTarget(t), {one_shot=true, x=x, y=y, no_energy = true})
 		if not targets then return end
 		self:archeryShoot(targets, t, {type="bolt", friendlyfire=false, friendlyblock=false}, {mult=dam})
 		
@@ -204,6 +234,7 @@ newTalent{
 				m.arrow_stitched_clone = true
 				m.generic_damage_penalty = 50
 				m.energy.value = 1000
+				m:attr("archery_pass_friendly", 1)
 				m.on_act = function(self)
 					if not self.shoot_target.dead then
 						self:forceUseTalent(self.T_ARROW_STITCHING, {force_level=t.leve, ignore_cd=true, ignore_energy=true, force_target=self.shoot_target, ignore_ressources=true, silent=true})
diff --git a/game/modules/tome/data/talents/chronomancy/chronomancer.lua b/game/modules/tome/data/talents/chronomancy/chronomancer.lua
index 9da046ab2d..d99be34c9b 100644
--- a/game/modules/tome/data/talents/chronomancy/chronomancer.lua
+++ b/game/modules/tome/data/talents/chronomancy/chronomancer.lua
@@ -24,18 +24,18 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronoma
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/threaded-combat", name = "Threaded Combat", min_lev = 10, description = "A blend of ranged and dual-weapon combat." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/temporal-hounds", name = "Temporal Hounds", min_lev = 10, description = "Call temporal hounds to aid you in combat." }
 
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/energy", name = "energy", generic = true, description = "Manipulate raw energy by addition or subtraction." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/fate-threading", name = "Fate Threading", description = "Manipulate the threads of fate." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/gravity", name = "gravity", description = "Call upon the force of gravity to crush, push, and pull your foes." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/matter", name = "matter", description = "Change and shape matter itself." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/paradox", name = "paradox", min_lev = 10, description = "Create loopholes in the laws of spacetime." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/speed-control", name = "Speed Control", description = "Control how fast objects and creatures move through spacetime." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timeline-threading", name = "Timeline Threading", min_lev = 10, description = "Examine and alter the timelines that make up the spacetime continuum." }
-newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timetravel", name = "Time Travel", min_lev = 10, description = "Travel through time yourself, or send your foes into the future." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spacetime-folding", name = "Spacetime Folding", description = "Mastery of folding points in space." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/speed-control", name = "Speed Control", description = "Control how fast objects and creatures move through spacetime." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timeline-threading", name = "Timeline Threading", description = "Examine and alter the timelines that make up the spacetime continuum." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/timetravel", name = "timetravel", description = "Directly manipulate the flow of time" }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spatial-tears", name = "Spatial Tears", min_lev = 10, description = "Manipulate topological defects in the fabric of spacetime." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spellbinding", name = "Spellbinding", min_lev = 10, description = "Manipulate chronomantic spells." }
 
 -- Generic Chronomancy
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/chronomancy", name = "Chronomancy", generic = true, description = "Allows you to glimpse the future, or become more aware of the present." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/energy", name = "energy", generic = true, min_lev = 10, description = "Manipulate raw energy by addition or subtraction." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/fate-weaving", name = "Fate Weaving", generic = true, description = "Weave the threads of fate." }
 newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/spacetime-weaving", name = "Spacetime Weaving", generic = true, description = "Weave the threads of spacetime." }
 
@@ -43,11 +43,11 @@ newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronoma
 newTalentType{ no_silence=true, is_spell=true, type="chronomancy/other", name = "Other", generic = true, description = "Miscellaneous Chronomancy effects." }
 
 newTalentType{ no_silence=true, is_spell=true, type="chronomancy/age-manipulation", name = "Age Manipulation", description = "Manipulate the age of creatures you encounter." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/matter", name = "matter", description = "Change and shape matter itself." }
+newTalentType{ allow_random=true, no_silence=true, is_spell=true, type="chronomancy/paradox", name = "paradox", description = "Break the laws of spacetime." }
 newTalentType{ no_silence=true, is_spell=true, type="chronomancy/temporal-archery", name = "Temporal Archery", description = "A blend of chronomancy and ranged combat." }
 newTalentType{ no_silence=true, is_spell=true, type="chronomancy/temporal-combat", name = "Temporal Combat", description = "A blend of chronomancy and physical combat." }
 
-
-
 -- Anomalies are not learnable but can occur instead of an intended spell when paradox gets to high.
 newTalentType{ no_silence=true, is_spell=true, type="chronomancy/anomalies", name = "anomalies", description = "Spacetime anomalies that can randomly occur when paradox is to high." }
 
@@ -127,6 +127,7 @@ load("/data/talents/chronomancy/gravity.lua")
 load("/data/talents/chronomancy/matter.lua")
 load("/data/talents/chronomancy/paradox.lua")
 load("/data/talents/chronomancy/speed-control.lua")
+load("/data/talents/chronomancy/spellbinding.lua")
 load("/data/talents/chronomancy/temporal-archery.lua")
 load("/data/talents/chronomancy/temporal-combat.lua")
 load("/data/talents/chronomancy/guardian.lua")
@@ -136,6 +137,7 @@ load("/data/talents/chronomancy/timeline-threading.lua")
 load("/data/talents/chronomancy/timetravel.lua")
 load("/data/talents/chronomancy/spacetime-folding.lua")
 load("/data/talents/chronomancy/spacetime-weaving.lua")
+load("/data/talents/chronomancy/spatial-tears.lua")
 
 -- Loads many functions and misc. talents
 load("/data/talents/chronomancy/other.lua")
diff --git a/game/modules/tome/data/talents/chronomancy/chronomancy.lua b/game/modules/tome/data/talents/chronomancy/chronomancy.lua
index 6410b3fd85..9526791660 100644
--- a/game/modules/tome/data/talents/chronomancy/chronomancy.lua
+++ b/game/modules/tome/data/talents/chronomancy/chronomancy.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Icons, Particles, Timed Effect Particles
+-- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
 	name = "Precognition",
@@ -27,8 +27,8 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	cooldown = 20,
 	no_npc_use = true,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 14)) end,
-	range = function(self, t) return 10 + math.min(self:combatTalentSpellDamage(t, 10, 20, getParadoxSpellpower(self))) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 14))) end,
+	range = function(self, t) return 10 + math.min(self:combatTalentSpellDamage(t, 10, 20, getParadoxSpellpower(self, t))) end,
 	action = function(self, t)
 		-- Foresight bonuses
 		local defense = 0
@@ -86,13 +86,16 @@ newTalent{
 	sustain_paradox = 36,
 	mode = "sustained",
 	no_sustain_autoreset = true,
-	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15
+	cooldown = 50,
+	getTrigger= function(self, t) return self:combatTalentScale(t, 0.25, 0.45, 0.6) end,
 	tactical = { DEFEND = 2 },
-	no_npc_use = true,
+	no_npc_use = true,  -- so rares don't learn useless talents
+	allow_temporal_clones = true,  -- let clones copy it anyway so they can benefit from the effects
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- but don't let them cast it
 	callbackOnHit = function(self, t, cb)
 		local p = self:isTalentActive(t.id)
 		local life_after = self.life - cb.value
-		local cont_trigger = self.max_life * 0.3
+		local cont_trigger = self.max_life * t.getTrigger(self, t)
 		
 		-- Cast our contingent spell
 		if p and p.rest_count <= 0 and cont_trigger > life_after then
@@ -100,15 +103,18 @@ newTalent{
 			local cont_id = self:getTalentFromId(cont_t)
 			local t_level = math.min(self:getTalentLevel(t), self:getTalentLevel(cont_t))
 			
-			-- Make sure we still know the talent and that the preuse conditions apply
-			if t_level == 0 or not self:preUseTalent(cont_id, true, true) then
+			-- Make sure we still know the talent and that the pre-use conditions apply
+			if t_level == 0 or not self:knowTalent(cont_id) or not self:preUseTalent(cont_id, true, true) then
 				game.logPlayer(self, "#LIGHT_RED#Your Contingency has failed to cast %s!", self:getTalentFromId(cont_t).name)
 			else
-				self:forceUseTalent(cont_t, {ignore_ressources=true, ignore_cd=true, ignore_energy=true, force_level=t_level})
 				game.logPlayer(self, "#STEEL_BLUE#Your Contingency triggered %s!", self:getTalentFromId(cont_t).name)
+				p.rest_count = self:getTalentCooldown(t)
+				game:onTickEnd(function()
+					if not self.dead then
+						self:forceUseTalent(cont_t, {ignore_ressources=true, ignore_cd=true, ignore_energy=true, force_level=t_level})
+					end
+				end)
 			end
-			
-			p.rest_count = self:getTalentCooldown(t)
 		end
 		
 		return cb.value
@@ -135,14 +141,15 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
+		local trigger = t.getTrigger(self, t) * 100
 		local cooldown = self:getTalentCooldown(t)
 		local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None"
-		return ([[Choose an activatable spell that's not targeted.  When you take damage that reduces your life below 30%% the spell will automatically cast.
+		return ([[Choose an activatable spell that's not targeted.  When you take damage that reduces your life below %d%% the spell will automatically cast.
 		This spell will cast even if it is currently on cooldown, will not consume a turn or resources, and uses the talent level of Contingency or its own, whichever is lower.
 		This effect can only occur once every %d turns and takes place after the damage is resolved.
 		
 		Current Contingency Spell: %s]]):
-		format(cooldown, talent)
+		format(trigger, cooldown, talent)
 	end,
 }
 
@@ -153,8 +160,10 @@ newTalent{
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
 	cooldown = 50,
-	no_npc_use = true,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 10, 25)) end,
+	no_npc_use = true,  -- so rares don't learn useless talents
+	allow_temporal_clones = true,  -- let clones copy it anyway so they can benefit from the effects
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- but don't let them cast it
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 10, 25))) end,
 	on_pre_use = function(self, t, silent)
 		if checkTimeline(self) then
 			if not silent then
@@ -191,7 +200,7 @@ newTalent{
 		return ([[You peer into three possible futures, allowing you to explore each for %d turns.  When the effect expires, you'll choose which of the three futures becomes your present.
 		If you know Foresight you'll gain additional defense and chance to shrug off critical hits (equal to your Foresight values) while See the Threads is active.
 		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
-		Note that seeing visions of your own death can still be fatal.
+		If you die in any thread you'll revert the timeline to the point when you first cast the spell and the effect will end.
 		This spell may only be used once per zone level.]])
 		:format(duration)
 	end,
diff --git a/game/modules/tome/data/talents/chronomancy/energy.lua b/game/modules/tome/data/talents/chronomancy/energy.lua
index 89418eaefb..d552f75a13 100644
--- a/game/modules/tome/data/talents/chronomancy/energy.lua
+++ b/game/modules/tome/data/talents/chronomancy/energy.lua
@@ -17,23 +17,27 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+-- EDGE TODO: Particles, Timed Effect Particles
+
 newTalent{
 	name = "Energy Decomposition",
 	type = {"chronomancy/energy",1},
 	mode = "sustained",
-	require = chrono_req1,
+	require = chrono_req_high1,
 	points = 5,
-	sustain_paradox = 20,
+	sustain_paradox = 24,
 	cooldown = 10,
 	tactical = { BUFF = 2 },
-	getAbsorption = function(self, t) return  self:combatTalentSpellDamage(t, 5, 150, getParadoxSpellpower(self)) end, -- Increase shield strength
-	on_damage = function(self, t, damtype, dam)
-		if not DamageType:get(damtype).antimagic_resolve then return dam end
-		local absorb = t.getAbsorption(self, t)
-		-- works like armor with 30% hardiness for projected energy effects
-		dam = math.max(dam * 0.3 - absorb, 0) + (dam * 0.7)
+	getDecomposition = function(self, t) return  self:combatTalentSpellDamage(t, 5, 150, getParadoxSpellpower(self, t)) end, -- Increase shield strength
+	callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr)
+		local decomp = t.getDecomposition(self, t)
+		local lastdam = dam
+		
+		-- works like armor with 30% hardiness
+		dam = math.max(dam * 0.3 - decomp, 0) + (dam * 0.7)
 		print("[PROJECTOR] after static reduction dam", dam)
-		return dam
+		game:delayedLogDamage(src or self, self, 0, ("%s(%d dissipated)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", lastdam - dam), false)
+		return {dam=dam}
 	end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/heal")
@@ -46,67 +50,41 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local absorption = t.getAbsorption(self, t)
-		return ([[Partially dissipates all incoming energy damage (all except mind and physical damage), reducing it by 30%%, up to a maximum of %d.
-		The maximum damage reduction will scale with your Spellpower.]]):format(absorption)
-	end,
-}
-
-newTalent{
-	name = "Entropic Field",
-	type = {"chronomancy/energy",2},
-	mode = "sustained",
-	require = chrono_req2,
-	points = 5,
-	sustain_paradox = 20,
-	cooldown = 10,
-	tactical = { BUFF = 2 },
-	getPower = function(self, t) return math.min(90, 10 +  self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self))) end,
-	activate = function(self, t)
-		game:playSoundNear(self, "talents/heal")
-		return {
-			particle = self:addParticles(Particles.new("time_shield", 1)),
-			phys = self:addTemporaryValue("resists", {[DamageType.PHYSICAL]=t.getPower(self, t)/2}),
-			proj = self:addTemporaryValue("slow_projectiles", t.getPower(self, t)),
-		}
-	end,
-	deactivate = function(self, t, p)
-		self:removeParticles(p.particle)
-		self:removeTemporaryValue("resists", p.phys)
-		self:removeTemporaryValue("slow_projectiles", p.proj)
-		return true
-	end,
-	info = function(self, t)
-		local power = t.getPower(self, t)
-		return ([[You encase yourself in a field that slows incoming projectiles by %d%%, and increases your physical resistance by %d%%.
-		The effect will scale with your Spellpower.]]):format(power, power / 2)
+		local decomp = t.getDecomposition(self, t)
+		return ([[Partially dissipates all incoming damage, reducing it by 30%%, up to a maximum of %d.
+		The maximum damage reduction will scale with your Spellpower.]]):format(decomp)
 	end,
 }
 
 newTalent{
 	name = "Energy Absorption",
-	type = {"chronomancy/energy", 3},
-	require = chrono_req3,
+	type = {"chronomancy/energy", 2},
+	require = chrono_req_high2,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
-	cooldown = 10,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 6,
+	fixed_cooldown = true,
 	tactical = { DISABLE = 2 },
 	direct_hit = true,
 	requires_target = true,
-	range = 6,
+	range = 10,
 	getTalentCount = function(self, t)
-		return 1 + math.floor(self:combatTalentScale(math.max(1, self:getTalentLevel(t)), 0.5, 2.5, "log"))
+		return 1 + math.floor(self:combatTalentLimit(t, 3, 0, 2))
 	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end,
 	getCooldown = function(self, t) return math.ceil(self:combatTalentScale(t, 1, 2.6)) end,
+	target = function (self, t)
+		return {type="hit", range=self:getTalentRange(t), talent=t}
+	end,
 	action = function(self, t)
-		local tg = {type="hit", range=self:getTalentRange(t)}
+		local tg = self:getTalentTarget(t)
 		local tx, ty = self:getTarget(tg)
 		if not tx or not ty then return nil end
 		local _ _, tx, ty = self:canProject(tg, tx, ty)
 		local target = game.level.map(tx, ty, Map.ACTOR)
 		if not target then return end
 
-		if not self:checkHit(self:combatSpellpower(), target:combatSpellResist()) then
+		if not self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist()) then
 			game.logSeen(target, "%s resists!", target.name:capitalize())
 			return true
 		end
@@ -124,7 +102,7 @@ newTalent{
 			local t = rng.tableRemove(tids)
 			if not t then break end
 			target.talents_cd[t.id] = cdr
-			game.logSeen(target, "%s's %s is disrupted by the Energy Absorption!", target.name:capitalize(), t.name)
+			game.logSeen(target, "%s's %s is disrupted by the Energy Drain!", target.name:capitalize(), t.name)
 			count = count + 1
 		end
 
@@ -132,17 +110,22 @@ newTalent{
 			local tids = {}
 			for tid, _ in pairs(self.talents_cd) do
 				local tt = self:getTalentFromId(tid)
-				if tt.type[1]:find("^chronomancy/") then
-					tids[#tids+1] = tid
+				if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then
+					tids[#tids+1] = tt
 				end
 			end
+	
 			for i = 1, count do
 				if #tids == 0 then break end
 				local tid = rng.tableRemove(tids)
-				self.talents_cd[tid] = self.talents_cd[tid] - cdr
+				self:alterTalentCoolingdown(tid, - cdr)
 			end
+			
+			-- Deal our damage in one lump sum
+			self:project(tg, target.x, target.y, DamageType.TEMPORAL, self:spellCrit(count * t.getDamage(self, t)))
 		end
-		target:crossTierEffect(target.EFF_SPELLSHOCKED, self:combatSpellpower())
+		
+		target:crossTierEffect(target.EFF_SPELLSHOCKED, getParadoxSpellpower(self, t))
 		game.level.map:particleEmitter(tx, ty, 1, "generic_charge", {rm=10, rM=110, gm=10, gM=50, bm=20, bM=125, am=25, aM=255})
 		game.level.map:particleEmitter(self.x, self.y, 1, "generic_charge", {rm=200, rM=255, gm=200, gM=255, bm=200, bM=255, am=125, aM=125})
 		game:playSoundNear(self, "talents/spell_generic")
@@ -151,33 +134,73 @@ newTalent{
 	info = function(self, t)
 		local talentcount = t.getTalentCount(self, t)
 		local cooldown = t.getCooldown(self, t)
+		local damage = t.getDamage(self, t)
 		return ([[You sap the target's energy and add it to your own, placing up to %d random talents on cooldown for %d turns.  
-		For each talent put on cooldown, you reduce the cooldown of one of your chronomancy talents currently on cooldown by %d turns.]]):
-		format(talentcount, cooldown, cooldown)
+		For each talent put on cooldown, you reduce the cooldown of one of your chronomancy talents currently on cooldown by %d turns and deal %0.2f temporal damage to the target.
+		The damage done will scale with your Spellpower.]]):
+		format(talentcount, cooldown, cooldown, damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
 
 newTalent{
 	name = "Redux",
-	type = {"chronomancy/energy",4},
-	require = chrono_req4,
+	type = {"chronomancy/energy",3},
+	require = chrono_req_high3,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 40) end,
-	cooldown = 12,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 24,
 	tactical = { BUFF = 2 },
-	no_energy = true,
-	getMaxLevel = function(self, t) return self:getTalentLevel(t) end,
+	fixed_cooldown = true,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 4))) end,
+	getMaxCooldown = function(self, t) return math.floor(self:combatTalentScale(t, 3, 8)) end,
 	action = function(self, t)
 		-- effect is handled in actor postUse
-		self:setEffect(self.EFF_REDUX, 5, {})
+		self:setEffect(self.EFF_REDUX, t.getDuration(self, t), {max_cd=t.getMaxCooldown(self, t)})
 		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
-		local maxlevel = t.getMaxLevel(self, t)
-		return ([[You may recast the next activated chronomancy spell (up to talent level %0.1f) that you cast within the next 5 turns on the turn following its initial casting.
-		The Paradox cost of the initial spell will be paid each time it is cast, and the second casting will still consume a turn.
-		This spell takes no time to cast.]]):
-		format(maxlevel)
+		local duration = t.getDuration(self, t)
+		local cooldown = t.getMaxCooldown(self, t)
+		return ([[For the next %d turns chronomancy spells with a cooldown of %d or less do not go on cooldown when cast.]]):
+		format(duration, cooldown)
 	end,
 }
+
+newTalent{
+	name = "Entropy",
+	type = {"chronomancy/energy",4},
+	require = chrono_req_high4,
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 12,
+	tactical = { ATTACK = { TEMPORAL = 2 }, DEBUFF=3 },
+	range = 10,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 100, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
+	target = function(self, t)
+		return {type="hit", range=self:getTalentRange(t), talent=t}
+	end,
+	requires_target = true,
+	direct_hit = true,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y, target = self:getTarget(tg)
+		if not x or not y or not target then return nil end
+		local _ _, x, y = self:canProject(tg, x, y)
+		
+		local damage = self:spellCrit(t.getDamage(self, t))
+		target:setEffect(target.EFF_ENTROPY, t.getDuration(self, t), {power=damage, src=self, apply_power=getParadoxSpellpower(self, t)})
+
+		game:playSoundNear(self, "talents/dispel")
+
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[Over the next %d turns all beneficial timed effects on the target tick twice as fast.
+		Each timed effect affected by this talent deals %0.2f temporal damage to the target.
+		The damage will scale with your Spellpower.]]):format(duration, damDesc(self, DamageType.TEMPORAL, damage))
+	end,
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/fate-threading.lua b/game/modules/tome/data/talents/chronomancy/fate-threading.lua
index 71cb732e33..9d42d04a95 100644
--- a/game/modules/tome/data/talents/chronomancy/fate-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/fate-threading.lua
@@ -20,19 +20,111 @@
 -- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
-	name = "Trim Threads",
+	name = "Disentangle",
 	type = {"chronomancy/fate-threading", 1},
 	require = chrono_req1,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 12,
+	tactical = { PARADOX = 2 },
+	getReduction = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end,
+	getParadoxMulti = function(self, t) return self:combatTalentLimit(t, 2, 0.10, .75) end,
+	anomaly_type = "no-major",
+	no_energy = true,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "anomaly_paradox_recovery", t.getParadoxMulti(self, t))
+	end,
+	action = function(self, t)
+		local reduction = self:spellCrit(t.getReduction(self, t))
+		self:paradoxDoAnomaly(reduction, t.anomaly_type, "forced")
+		return true
+	end,
+	info = function(self, t)
+		local reduction = t.getReduction(self, t)
+		local paradox = 100 * t.getParadoxMulti(self, t)
+		return ([[Disentangle the timeline, reducing your Paradox by %d and creating an anomaly.  This spell will never produce a major anomaly.
+		Additionally you recover %d%% more Paradox from random anomalies (%d%% total).
+		The Paradox reduction will increase with your Spellpower.]]):format(reduction, paradox, paradox + 200)
+	end,
+}
+
+newTalent{
+	name = "Preserve Pattern",
+	type = {"chronomancy/fate-threading", 2},
+	require = chrono_req2,
+	mode = "sustained", 
+	sustain_paradox = 0,
+	points = 5,
+	cooldown = 10,
+	tactical = { DEFEND = 2 },
+	getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50%
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 6))) end,
+	getConversionRatio = function(self, t) return 200 / self:combatTalentSpellDamage(t, 60, 600) end,
+	damage_feedback = function(self, t, p, src)
+		if p.particle and p.particle._shader and p.particle._shader.shad and src and src.x and src.y then
+			local r = -rng.float(0.2, 0.4)
+			local a = math.atan2(src.y - self.y, src.x - self.x)
+			p.particle._shader:setUniform("impact", {math.cos(a) * r, math.sin(a) * r})
+			p.particle._shader:setUniform("impact_tick", core.game.getTime())
+		end
+	end,
+	iconOverlay = function(self, t, p)
+		local val = p.rest_count or 0
+		if val <= 0 then return "" end
+		local fnt = "buff_font"
+		return tostring(math.ceil(val)), fnt
+	end,
+	doPerservePattern = function(self, t, src, dam)
+		local absorb = dam * t.getPercent(self, t)
+		local paradox = absorb*t.getConversionRatio(self, t)
+		self:setEffect(self.EFF_PRESERVE_PATTERN, t.getDuration(self, t), {paradox=paradox/t.getDuration(self, t), no_ct_effect=true})
+		game:delayedLogMessage(self, nil,  "preserve pattern", "#LIGHT_BLUE##Source# converts damage to paradox!")
+		game:delayedLogDamage(src, self, 0, ("#LIGHT_BLUE#(%d converted)#LAST#"):format(absorb), false)
+		dam = dam - absorb
+		
+		return dam
+	end,
+	activate = function(self, t)
+		game:playSoundNear(self, "talents/arcane")
+
+		local particle
+		if core.shader.active(4) then
+			particle = self:addParticles(Particles.new("shader_shield", 1, {size_factor=1.4, img="runicshield"}, {type="runicshield", shieldIntensity=0.14, ellipsoidalFactor=1, scrollingSpeed=-1, time_factor=12000, bubbleColor={1, 0.5, 0.3, 0.2}, auraColor={1, 0.5, 0.3, 1}}))
+		else
+			particle = self:addParticles(Particles.new("time_shield", 1))
+		end
+
+		return {
+			particle = particle,
+		}
+	end,
+	deactivate = function(self, t, p)
+		self:removeParticles(p.particle)
+		return true
+	end,
+	info = function(self, t)
+		local ratio = t.getPercent(self, t) * 100
+		local absorb = t.getConversionRatio(self, t) * 100
+		local duration = t.getDuration(self, t)
+		return ([[While active, %d%% of all damage you take increases your Paradox by %d%% of the damage absorbed over %d turns.
+		The amount of Paradox damage you recieve will be reduced by your Spellpower.]]):
+		format(ratio, absorb, duration)
+	end,
+}
+
+newTalent{
+	name = "Trim Threads",
+	type = {"chronomancy/fate-threading", 3},
+	require = chrono_req3,
+	points = 5,
 	cooldown = 4,
 	tactical = { ATTACKAREA = { TEMPORAL = 2 } },
 	range = 10,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 2.5)) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1, 2)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 4) end,
+	getReduction = function(self, t) return self:getTalentLevel(t) * 2 end,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, nowarning=true, talent=t}
 	end,
 	requires_target = true,
 	direct_hit = true,
@@ -50,60 +142,37 @@ newTalent{
 		self:project(tg, x, y, function(px, py)
 			local target = game.level.map(px, py, Map.ACTOR)
 			if not target then return end
-			target:setEffect(target.EFF_TRIM_THREADS, 3, {power=damage/3, src=self, apply_power=getParadoxSpellpower(self)})
+			target:setEffect(target.EFF_TRIM_THREADS, t.getDuration(self, t), {power=damage/4, src=self, reduction=t.getReduction(self, t), apply_power=getParadoxSpellpower(self, t)})
 		end)
 
 		game.level.map:particleEmitter(x, y, tg.radius, "temporal_flash", {radius=tg.radius})
 
-		game:playSoundNear(self, "talents/dispel")
+		game:playSoundNear(self, "talents/tidalwave")
 
 		return true
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Deals %0.2f temporal damage over three turns to all targets in a radius of %d.  If the target is hit by an Anomaly the remaining damage will be done instantly.
-		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), radius)
-	end,
-}
-
-newTalent{
-	name = "Disentangle",
-	type = {"chronomancy/fate-threading", 2},
-	require = chrono_req2,
-	points = 5,
-	cooldown = 12,
-	tactical = { PARADOX = 2 },
-	getReduction = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)) end,
-	getParadoxMulti = function(self, t) return self:combatTalentLimit(t, 2, 0.10, .75) end,
-	anomaly_type = "no-major",
-	no_energy = true,
-	passives = function(self, t, p)
-		self:talentTemporaryValue(p, "anomaly_paradox_recovery", t.getParadoxMulti(self, t))
-	end,
-	action = function(self, t)
-		local reduction = self:spellCrit(t.getReduction(self, t))
-		self:paradoxDoAnomaly(reduction, t.anomaly_type, "forced")
-		return true
-	end,
-	info = function(self, t)
 		local reduction = t.getReduction(self, t)
-		local paradox = 100 * t.getParadoxMulti(self, t)
-		return ([[Disentangle the timeline, reducing your Paradox by %d and creating an anomaly.  This spell will never produce a major anomaly.
-		Additionally you recover %d%% more Paradox from random anomalies (%d%% total).
-		The Paradox reduction will increase with your Spellpower.]]):format(reduction, paradox, paradox + 200)
+		return ([[Deals %0.2f temporal damage over %d turns to all other targets in a radius of %d.  If the target is slain before the effect expires you'll recover %d Paradox.
+		If the target is hit by an Anomaly the remaining damage will be done instantly.
+		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration, radius, reduction)
 	end,
 }
 
 newTalent{
 	name = "Bias Weave",
-	type = {"chronomancy/fate-threading", 3},
-	require = chrono_req3,
+	type = {"chronomancy/fate-threading", 4},
+	require = chrono_req4,
 	points = 5,
 	cooldown = 10,
 	-- Anomaly biases can be set manually for monsters
 	-- Use the following format anomaly_bias = { type = "teleport", chance=50}
-	on_pre_use = function(self, t, silent) if not self == game.player then return false end	return true end,
+	no_npc_use = true,  -- so rares don't learn useless talents
+	allow_temporal_clones = true,  -- let clones copy it anyway so they can benefit from the effects
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- but don't let them cast it
 	getBiasChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75) end,
 	getTargetChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75) end,
 	getAnomalySpeed = function(self, t) return self:combatTalentLimit(t, 1, 0.10, .75) end,
@@ -141,72 +210,4 @@ newTalent{
 		Additionally random anomalies only cost you %d%% of a turn rather than a full turn when they occur.
 		Major anomalies, those occuring when your modified Paradox is over 600, are not affected by this talent.]]):format(target_chance, bias_chance, anomaly_recovery)
 	end,
-}
-
-newTalent{
-	name = "Preserve Pattern",
-	type = {"chronomancy/fate-threading", 4},
-	require = chrono_req4,
-	points = 5,
-	mode = "sustained",
-	sustain_paradox = 48,
-	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15
-	tactical = { DEFEND = 2 },
-	getHeal = function(self, t) return self.max_life * self:combatTalentLimit(t, 1.5, 0.09, 0.4) end, -- Limit < 150% max life (to survive a large string of hits between turns)
-	callbackOnHit = function(self, t, cb)
-		local p = self:isTalentActive(t.id)
-		
-		if p and p.rest_count <= 0 and cb.value >= self.life then
-			-- Save them from the hit and heal up
-			cb.value = 0
-			self.life = 1
-			self:heal(t.getHeal(self, t))
-			
-			-- Make them invulnerable so they don't die to anomalies
-			game.logSeen(self, "#STEEL_BLUE#%s is rapidly shunted into another timeline!#LAST#", self.name:capitalize())
-			local invuln = self.invulnerable
-			self.invulnerable = 1
-			
-			-- Make some anomalies and remove invulnerability
-			for i = 1, rng.avg(3, 6, 3) do self:paradoxDoAnomaly(0, nil, "forced", self, true) end
-			self.invulnerable = invuln
-			
-			-- Set the counter on the sustain
-			p.rest_count = self:getTalentCooldown(t)
-			if self.player then world:gainAchievement("AVOID_DEATH", self) end
-		end
-		
-		return cb.value
-	end,
-	callbackOnActBase = function(self, t)
-		local p = self:isTalentActive(t.id)
-		if p.rest_count > 0 then p.rest_count = p.rest_count - 1 end
-	end,
-	iconOverlay = function(self, t, p)
-		local val = p.rest_count or 0
-		if val <= 0 then return "" end
-		local fnt = "buff_font"
-		return tostring(math.ceil(val)), fnt
-	end,
-	activate = function(self, t)
-		game:playSoundNear(self, "talents/heal")
-		local ret = { rest_count = 0 }
-	--[[if core.shader.active(4) then
-			ret.particle = self:addParticles(Particles.new("shader_ring_rotating", 1, {toback=true, a=0.6, rotation=0, radius=2, img="flamesgeneric"}, {type="sunaura", time_factor=6000}))
-		else
-			ret.particle = self:addParticles(Particles.new("golden_shield", 1))
-		end]]
-		return ret
-	end,
-	deactivate = function(self, t, p)
-	--	self:removeParticles(p.particle)
-		return true
-	end,
-	info = function(self, t)
-		local heal = t.getHeal(self, t)
-		local cooldown = self:getTalentCooldown(t)
-		return ([[Any attack that would drop you below 1 hit point instead triggers Preserve Pattern, setting your life to 1, then healing you for %d.
-		This effect causes three to six anomalies to occur as you move from timeline to timeline until you find one in which you're still alive.
-		These anomalies may not be targeted though they may be biased.  This effect can only occur once every %d turns.]]):format(heal, cooldown)
-	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/fate-weaving.lua b/game/modules/tome/data/talents/chronomancy/fate-weaving.lua
index 4ca1424078..4b94a54eb4 100644
--- a/game/modules/tome/data/talents/chronomancy/fate-weaving.lua
+++ b/game/modules/tome/data/talents/chronomancy/fate-weaving.lua
@@ -26,13 +26,31 @@ newTalent{
 	mode = "passive",
 	points = 5,
 	getSaveBonus = function(self, t) return math.ceil(self:combatTalentScale(t, 2, 8, 0.75)) end,
-	doSpinFate = function(self, t)
-		local save_bonus = t.getSaveBonus(self, t)
-		local resists = self:knowTalent(self.T_FATEWEAVER) and self:callTalent(self.T_FATEWEAVER, "getResist") or 0
-		
-		self:setEffect(self.EFF_SPIN_FATE, 3, {save_bonus=save_bonus, resists=resists, spin=1, max_spin=3})
+	callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr)
+		if dam > 0 and src ~= self then
+			if self.turn_procs and not self.turn_procs.spin_fate then
+				
+				self:setEffect(self.EFF_SPIN_FATE, 3, {save_bonus=t.getSaveBonus(self, t), spin=1, max_spin=3})
+				
+				-- Set our turn procs, we do spin_fate last since it's the only one checked above
+				if self.hasEffect and self:hasEffect(self.EFF_WEBS_OF_FATE) and not self.turn_procs.spin_webs then
+					self.turn_procs.spin_webs = true
+				elseif self.hasEffect and self:hasEffect(self.EFF_SEAL_FATE) and not self.turn_procs.spin_seal then
+					self.turn_procs.spin_seal = true
+				else
+					self.turn_procs.spin_fate = true
+				end
+				
+				-- Reduce damage if we know Fateweaver
+				if self:knowTalent(self.T_FATEWEAVER) then
+					local reduction = dam * self:callTalent(self.T_FATEWEAVER, "getReduction")
+					dam = dam - reduction
+					game:delayedLogDamage(src, self, 0, ("%s(%d fatewever)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", reduction), false)
+				end				
+			end
+		end
 		
-		return true
+		return {dam=dam}
 	end,
 	info = function(self, t)
 		local save = t.getSaveBonus(self, t)
@@ -41,7 +59,6 @@ newTalent{
 		format(save, save * 3)
 	end,
 }
-
 newTalent{
 	name = "Webs of Fate",
 	type = {"chronomancy/fate-weaving", 2},
@@ -50,15 +67,16 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	cooldown = 12,
 	tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 },
-	getPower = function(self, t) return self:combatTalentSpellDamage(t, 20, 100, getParadoxSpellpower(self))/100 end,
-	getDuration = function(self, t) return 5 end,
+	getPower = function(self, t) return paradoxTalentScale(self, t, 15, 30, 50)/100 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 5) end,
+	no_energy = true,
 	action = function(self, t)
 		local effs = {}
 			
 		-- Find all pins
 		for eff_id, p in pairs(self.tmp) do
 			local e = self.tempeffect_def[eff_id]
-			if e.subtype.pin then
+			if e.subtype.pin or e.subtype.stun then
 				effs[#effs+1] = {"effect", eff_id}
 			end
 		end
@@ -73,27 +91,23 @@ newTalent{
 		end
 		
 		-- Set our power based on current spin
-		local move = t.getPower(self, t)
-		local pin = t.getPower(self, t)/2
+		local imm = t.getPower(self, t)
 		local eff = self:hasEffect(self.EFF_SPIN_FATE)
 		if eff then 
-			move = move * (1 + eff.spin/3)
-			pin = pin * (1 + eff.spin/3)
+			imm = imm * (1 + eff.spin/3)
 		end
-		pin = math.min(1, pin) -- Limit 100%
 		
-		self:setEffect(self.EFF_WEBS_OF_FATE, t.getDuration(self, t), {move=move, pin=pin})
+		self:setEffect(self.EFF_WEBS_OF_FATE, t.getDuration(self, t), {imm=imm})
 		
 		return true
 	end,
 	info = function(self, t)
 		local power = t.getPower(self, t) * 100
 		local duration = t.getDuration(self, t)
-		return ([[Activate to remove pins.  You also gain %d%% movement speed and %d%% pin immunity for %d turns.
-		If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%% and %d%% respectively).
-		This spell will automatically cast when you're hit by most anomalies.  This will not consume a turn or put the spell on cooldown.
-		While Webs of Fate is active you may gain one additional spin per turn.
-		These bonuses will scale with your Spellpower.]]):format(power, math.min(100, power/2), duration, power * 2, math.min(100, power/2 * 2))
+		return ([[Activate to remove pins and stuns.  You also gain %d%% pin and stun immunity for %d turns.
+		If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%%).
+		While Webs of Fate is active you may gain one additional spin per turn.  These bonuses will scale with your Spellpower.]])
+		:format(power, duration, power * 2)
 	end,
 }
 
@@ -103,11 +117,12 @@ newTalent{
 	require = chrono_req3,
 	mode = "passive",
 	points = 5,
-	getResist = function(self, t) return self:combatTalentScale(t, 2, 8, 0.75) end,
+	getReduction = function(self, t) return paradoxTalentScale(self, t, 10, 30, 40)/100 end,
 	info = function(self, t)
-		local resist = t.getResist(self, t)
-		return ([[You now gain %0.1f%% resist all when you gain spin with Spin Fate (up to a maximum of %0.1f%% resist all at three spin).]]):
-		format(resist, resist*3)
+		local reduction = t.getReduction(self, t)*100
+		return ([[When Spin Fate is triggered you reduce the triggering damage by %d%%.
+		This effect scales with your Spellpower.]]):
+		format(reduction)
 	end,
 }
 
@@ -119,27 +134,18 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
 	cooldown = 24,
 	tactical = { BUFF = 2 },
-	getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 25, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return 5 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 5) end,
+	getProcs = function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end,
+	no_energy = true,
 	action = function(self, t)
-		-- Set our power based on current spin
-		local crits = t.getPower(self, t)
-		local eff = self:hasEffect(self.EFF_SPIN_FATE)
-		if eff then 
-			crits = crits * (1 + eff.spin/3)
-		end
-			
-		self:setEffect(self.EFF_SEAL_FATE, t.getDuration(self, t), {crit=crits})
-		
+		self:setEffect(self.EFF_SEAL_FATE, t.getDuration(self, t), {procs=t.getProcs(self, t)})
 		return true
 	end,
 	info = function(self, t)
-		local power = t.getPower(self, t)
+		local procs = t.getProcs(self, t)
 		local duration = t.getDuration(self, t)
-		return ([[Activate to increase critical hit chance and critical damage by %d%% for five turns.
-		If you have Spin Fate active these bonuses will be increased by 33%% per spin (up to a maximum of %d%%).
-		This spell will automatically cast when you're hit by most anomalies.  This will not consume a turn or put the spell on cooldown.
-		While Seal Fate is active you may gain one additional spin per turn.
-		These bonuses will scale with your Spellpower.]]):format(power, power * 2)
+		return ([[Activate to Seal Fate for %d turns.  When you damage a target while Seal Fate is active you have a 50%% chance to increase the duration of one detrimental status effect on it by one turn.
+		If you have Spin Fate active the chance twill be increased by 33%% per Spin (to a maximum of 100%% at three Spin.)
+		This can occur at most %d times per turn.  While Seal Fate is active you may gain one additional spin per turn.]]):format(duration, procs)
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/gravity.lua b/game/modules/tome/data/talents/chronomancy/gravity.lua
index f76e1f7f77..37c7e88612 100644
--- a/game/modules/tome/data/talents/chronomancy/gravity.lua
+++ b/game/modules/tome/data/talents/chronomancy/gravity.lua
@@ -17,27 +17,71 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+-- EDGE TODO: Particles, Timed Effect Particles
+
 newTalent{
 	name = "Repulsion Blast",
 	type = {"chronomancy/gravity",1},
 	require = chrono_req1,
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	cooldown = 4,
+	cooldown = 3,
 	tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 },
 	range = 0,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 4.5, 6.5)) end,
 	requires_target = true,
 	direct_hit = true,
 	target = function(self, t)
-		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), friendlyfire=false, talent=t}
+		return {type="cone", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) 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.REPULSION, self:spellCrit(t.getDamage(self, t)))
+		
+		-- Project our base damage		
+		local dam = self:spellCrit(t.getDamage(self, t))
+		local bonus_dam = dam/2
+		self:project(tg, x, y, DamageType.GRAVITY, dam)
+		
+		-- Do our knockback
+		local tgts = {}
+		local grids = self:project(tg, x, y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then
+				-- If we've already moved this target don't move it again
+				for _, v in pairs(tgts) do
+					if v == target then
+						return
+					end
+				end
+				
+				local hit = target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback")
+					
+				if hit then
+					local slam = false
+					local dist = self:getTalentRadius(t) + 1 - core.fov.distance(self.x, self.y, px, py)
+					target:knockback(self.x, self.y, dist, false, function(g, x, y)
+						-- Deal our bonus damage
+						if game.level.map:checkAllEntities(x, y, "block_move", target) then
+							slam = true
+							self:project({type="hit"}, target.x, target.y, DamageType.GRAVITY, bonus_dam)
+							self:project({type="hit"}, x, y, DamageType.GRAVITY, bonus_dam)
+							game.logSeen(target, "%s slams into something solid!", target.name:capitalize())
+						end
+					end)
+					
+					tgts[#tgts+1] = target
+					if not slam then game.logSeen(target, "%s is knocked back!", target.name:capitalize()) end
+					target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t))
+				else
+					game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
+				end
+				
+			end
+		end)
+		
 		game.level.map:particleEmitter(self.x, self.y, tg.radius, "gravity_breath", {radius=tg.radius, tx=x-self.x, ty=y-self.y, allow=core.shader.allow("distort")})
 		game:playSoundNear(self, "talents/earth")
 		return true
@@ -45,9 +89,9 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Sends out a blast wave of gravity in a %d radius cone, dealing %0.2f physical damage and knocking back creatures caught in the area.  This deals 50%% extra damage to pinned targets, in addition to the knockback.
-		The blast wave may hit targets more then once, depending on the radius and the knockback effect.
-		The damage will scale with your Spellpower.]]):
+		return ([[Sends out a blast wave of gravity in a radius %d cone, dealing %0.2f base physical damage and knocking back targets caught in the area.
+		Targets knocked into walls or other targets take 50%% additional damage and deal 50%% damage to targets they're knocked into.
+		Closer targets will be knocked back further and the damage will scale with your Spellpower.]]):
 		format(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
 	end,
 }
@@ -58,31 +102,61 @@ newTalent{
 	require = chrono_req2,
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
-	cooldown = 6,
+	cooldown = 4,
 	tactical = { ATTACKAREA = {PHYSICAL = 2}, DISABLE = 2 },
 	range = 10,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.3, 3.7)) end,
 	direct_hit = true,
 	requires_target = true,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 170, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 290, getParadoxSpellpower(self, t)) 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
 		local _ _, _, _, x, y = self:canProject(tg, x, y)
-		local grids = self:project(tg, x, y, function(px, py)
+		
+		local tgts = {}
+		self:project(tg, x, y, function(px, py)
 			local target = game.level.map(px, py, Map.ACTOR)
-			if not target then return end
-			local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
-			if tx and ty and target:canBe("knockback") then
-				target:move(tx, ty, true)
-				game.logSeen(target, "%s is drawn in by the gravity spike!", target.name:capitalize())
+			if target and not target:isTalentActive(target.T_GRAVITY_LOCUS) then
+				-- If we've already moved this target don't move it again
+				for _, v in pairs(tgts) do
+					if v == target then
+						return
+					end
+				end
+
+				-- Do our Knockback
+				local can = function(target)
+					if target:checkHit(getParadoxSpellpower(self, t), target:combatPhysicalResist(), 0, 95) and target:canBe("knockback") then -- Deprecated Checkhit call
+						return true
+					else
+						game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
+					end
+				end
+				if can(target) then
+					target:pull(x, y, tg.radius, can)
+					tgts[#tgts+1] = target
+					game.logSeen(target, "%s is drawn in by the singularity!", target.name:capitalize())
+					target:crossTierEffect(target.EFF_OFFBALANCE, getParadoxSpellpower(self, t))
+				end
 			end
 		end)
-		self:project(tg, x, y, DamageType.GRAVITY, self:spellCrit(t.getDamage(self, t)))
+		
+		-- 25% bonus damage per target beyond the first
+		local dam = self:spellCrit(t.getDamage(self, t))
+		dam = dam + math.min(dam, dam*(#tgts-1)/4)
+		
+		-- Project our damage last based on number of targets hit
+		self:project(tg, x, y, function(px, py)
+			local dist_factor = 1 + (core.fov.distance(x, y, px, py)/5)
+			local damage = dam/dist_factor
+			DamageType:get(DamageType.GRAVITY).projector(self, px, py, DamageType.GRAVITY, damage)
+		end)
+		
 		game.level.map:particleEmitter(x, y, tg.radius, "gravity_spike", {radius=tg.radius, allow=core.shader.allow("distort")})
 
 		game:playSoundNear(self, "talents/earth")
@@ -91,53 +165,49 @@ newTalent{
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spells center and inflicts %0.2f physical damage.  This deals 50%% extra damage to pinned targets, in addition to the knockback.
-		The damage dealt will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, t.getDamage(self, t)))
+		return ([[Creates a gravity spike in a radius of %d that moves all targets towards the spell's center and inflicts %0.2f physical damage.
+		Each target moved beyond the first deals an additional %0.2f physical damage (up to %0.2f bonus damage).
+		Targets take reduced damage the further they are from the epicenter (20%% less per tile).
+		The damage dealt will scale with your Spellpower.]])
+		:format(radius, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.PHYSICAL, damage/4), damDesc(self, DamageType.PHYSICAL, damage))
 	end,
 }
 
 newTalent{
-	name = "Repulsion Field",
+	name = "Gravity Locus",
 	type = {"chronomancy/gravity",3},
 	require = chrono_req3,
+	mode = "sustained",
+	sustain_paradox = 24,
+	cooldown = 10,
+	tactical = { BUFF = 2 },
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 30) end,
-	cooldown = 14,
-	tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 },
-	range = 0,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end,
-	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false}
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end,
+	getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80) end,
+	callbackOnMeleeHit = function(self, t, target)
+		if not self.dead and self:isTalentActive(self.T_GRAVITY_LOCUS) then
+			self:project({type="hit", talent=t}, target.x, target.y, DamageType.GRAVITY, {dam=t.getDamage(self, t), anti=true, dur=2, apply=getParadoxSpellpower(self, t)})
+		end
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 80, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
-	direct_hit = true,
-	requires_target = true,
-	action = function(self, t)
-		local tg = self:getTalentTarget(t)
-		game.level.map:addEffect(self,
-			self.x, self.y, t.getDuration(self, t),
-			DamageType.REPULSION, t.getDamage(self, t),
-			tg.radius,
-			5, nil,
-			engine.MapEffect.new{color_br=200, color_bg=120, color_bb=0, effect_shader="shader_images/paradox_effect.png"},
-			function(e)
-				e.x = e.src.x
-				e.y = e.src.y
-				return true
-			end,
-			tg.selffire
-		)
-		game:playSoundNear(self, "talents/cloud")
+	activate = function(self, t)
+		game:playSoundNear(self, "talents/heal")
+		local particle = Particles.new("ultrashield", 1, {rm=204, rM=220, gm=102, gM=120, bm=0, bM=0, am=35, aM=90, radius=0.5, density=10, life=28, instop=100})
+		return {
+			proj = self:addTemporaryValue("slow_projectiles", t.getSlow(self, t)),
+			particle = self:addParticles(particle)
+		}
+	end,
+	deactivate = function(self, t, p)
+		self:removeTemporaryValue("slow_projectiles", p.proj)
+		self:removeParticles(p.particle)
 		return true
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
-		local duration = t.getDuration(self, t)
-		local radius = self:getTalentRadius(t)
-		return ([[You surround yourself with a radius %d distortion of gravity, knocking back and dealing %0.2f physical damage to all creatures inside it.  The effect lasts %d turns.  Deals 50%% extra damage to pinned targets, in addition to the knockback.
-		The blast wave may hit targets more then once, depending on the radius and the knockback effect.
-		The damage will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, damage), duration)
+		local proj = t.getSlow(self, t)
+		return ([[Create a gravity field around you that slows incoming projectiles by %d%% and protects you from all gravity effects.
+		While this spell is active creatures that hit you in melee combat will take %0.2f physical damage and have their knockback resistance reduced by half for two turns.
+		The projectile slowing and damage will scale with your spellpower.]]):format(proj, damDesc(self, DamageType.PHYSICAL, damage))
 	end,
 }
 
@@ -146,31 +216,31 @@ newTalent{
 	type = {"chronomancy/gravity", 4},
 	require = chrono_req4,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 40) end,
-	cooldown = 24,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 12,
 	tactical = { ATTACKAREA = {PHYSICAL = 2}, DISABLE = 2 },
 	range = 10,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
 	direct_hit = true,
 	requires_target = true,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self, t)) end,
+	getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 4, 8))) end,
 	action = function(self, t)
-		local duration = t.getDuration(self,t)
-		local radius = self:getTalentRadius(t)
-		local dam = t.getDamage(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
 		local _ _, _, _, x, y = self:canProject(tg, x, y)
+
 		-- Add a lasting map effect
+		local dam = self:spellCrit(t.getDamage(self, t))
 		game.level.map:addEffect(self,
-			x, y, duration,
-			DamageType.GRAVITYPIN, dam,
-			radius,
+			x, y, t.getDuration(self,t),
+			DamageType.GRAVITY, {dam=dam, dur=1, slow=t.getSlow(self, t), apply=getParadoxSpellpower(self, t)},
+			self:getTalentRadius(t),
 			5, nil,
 			{type="gravity_well"},
 			nil, self:spellFriendlyFire()
@@ -182,7 +252,8 @@ newTalent{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		return ([[Increases local gravity of an area, doing %0.2f physical damage with a chance to pin in a radius of %d each turn for %d turns.
-		The damage done will scale with your Spellpower.]]):format(damDesc(self, DamageType.PHYSICAL, damage), radius, duration)
+		local slow = t.getSlow(self, t)
+		return ([[Increases local gravity in a radius of %d for %d turns, dealing %0.2f physical damage and slowing the movement speed of all affected targets by %d%%.
+		The damage done will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), slow*100)
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/guardian.lua b/game/modules/tome/data/talents/chronomancy/guardian.lua
index c6ce9167db..26f1b68d3d 100644
--- a/game/modules/tome/data/talents/chronomancy/guardian.lua
+++ b/game/modules/tome/data/talents/chronomancy/guardian.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Icons, Particles, Timed Effect Particles
+-- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
 	name = "Strength of Purpose",
@@ -46,9 +46,8 @@ newTalent{
 	cooldown = 24,
 	fixed_cooldown = true,
 	tactical = { HEAL = 1 },
-	getDuration = function(self, t) return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 14, 4, 8)) end, -- Limit < 14
-	getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end,
-	getNumber = function(self, t) return math.ceil(self:getTalentLevel(t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentLimit(self:getTalentLevel(t), 14, 4, 8))) end, -- Limit < 14
+	getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		self:setEffect(self.EFF_INVIGORATE, t.getDuration(self,t), {power=t.getPower(self, t)})
 		return true
@@ -67,24 +66,24 @@ newTalent{
 	require = chrono_req3,
 	points = 5,
 	mode = "passive",
-	getSplit = function(self, t) return math.min(100, self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self)))/100 end,
-	getDuration = function(self, t) return 2 end,
+	getSplit = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 2) end,
 	getLifeTrigger = function(self, t) return self:combatTalentLimit(t, 10, 40, 24)	end,
 	remove_on_clone = true,
 	callbackOnHit = function(self, t, cb, src)
 		local split = cb.value * t.getSplit(self, t)
 	
 		-- If we already split this turn pass damage to our clone
-		if self.turn_procs.double_edge and self.turn_procs.double_edge ~= self and not self.turn_procs.double_edge.dead then
+		if self.turn_procs.double_edge and self.turn_procs.double_edge ~= self and game.level:hasEntity(self.turn_procs.double_edge) then
 			split = split/2
 			-- split the damage
-			game:delayedLogDamage(src, self.turn_procs.double_edge, split, ("#PINK#%d displaced#LAST#"):format(split), false)
+			game:delayedLogDamage(src, self.turn_procs.double_edge, split, ("#STEEL_BLUE#(%d shared)#LAST#"):format(split), nil)
 			cb.value = cb.value - split
 			self.turn_procs.double_edge:takeHit(split, src)
 		end
 			
 		-- Do our split
-		if self.max_life and cb.value >= self.max_life * t.getLifeTrigger(self, t) * 0.01 and not self.turn_procs.double_edge then
+		if self.max_life and cb.value >= self.max_life * (t.getLifeTrigger(self, t)/100) and not self.turn_procs.double_edge then
 			-- Look for space first
 			local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true})
 			if tx and ty then
@@ -93,17 +92,6 @@ newTalent{
 				-- clone our caster
 				local m = makeParadoxClone(self, self, t.getDuration(self, t))
 				
-				-- remove some talents; note most of this is handled by makeParadoxClone already but we don't want to keep splitting
-				local tids = {}
-				for tid, _ in pairs(m.talents) do
-					local t = m:getTalentFromId(tid)
-					if t.remove_on_clone then tids[#tids+1] = t end
-				end
-				for i, t in ipairs(tids) do
-					if t.mode == "sustained" and m:isTalentActive(t.id) then m:forceUseTalent(t.id, {ignore_energy=true, silent=true}) end
-					m.talents[t.id] = nil
-				end
-				
 				-- add our clone
 				game.zone:addEntity(game.level, m, "actor", tx, ty)
 				m.ai_state = { talent_in=2, ally_compassion=10 }
@@ -125,7 +113,8 @@ newTalent{
 				self.turn_procs.double_edge = m
 				m:takeHit(split, src)
 				m:setTarget(src or nil)
-				game:delayedLogDamage(src, m, split, ("#PINK#%d displaced#LAST#"):format(split), false)
+				game:delayedLogMessage(self, nil, "guardian_damage", "#STEEL_BLUE##Source# shares damage with %s guardian!", string.his_her(self))
+				game:delayedLogDamage(src or self, self, 0, ("#STEEL_BLUE#(%d shared)#LAST#"):format(split), nil)
 												
 			else
 				game.logPlayer(self, "Not enough space to summon warden!")
@@ -154,9 +143,9 @@ newTalent{
 	tactical = { ATTACK = {weapon = 2}, DISABLE = 3 },
 	requires_target = true,
 	range = archery_range,
-	no_energy = "fake",
+	speed = function(self, t) return self:hasArcheryWeapon("bow") and "archery" or "weapon" end,
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1, 1.5) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
 	on_pre_use = function(self, t, silent) if self:attr("disarmed") then if not silent then game.logPlayer(self, "You require a weapon to use this talent.") end return false end return true end,
 	archery_onhit = function(self, t, target, x, y)
 		target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {})
@@ -166,19 +155,19 @@ newTalent{
 		
 		if self:hasArcheryWeapon("bow") then
 			-- Ranged attack
-			local targets = self:archeryAcquireTargets(nil, {one_shot=true})
+			local targets = self:archeryAcquireTargets({type="bolt"}, {one_shot=true, no_energy = true})
 			if not targets then return end
-			self:archeryShoot(targets, t, nil, {mult=t.getDamage(self, t)})
+			self:archeryShoot(targets, t, {type="bolt"}, {mult=t.getDamage(self, t)})
 		elseif mainhand then
 			-- Melee attack
 			local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 			local x, y, target = self:getTarget(tg)
 			if not x or not y or not target then return nil end
 			if core.fov.distance(self.x, self.y, x, y) > 1 then return nil end
-			local hitted = self:attackTarget(target, nil, t.getDamage(self, t))
+			local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true)
 
 			if hitted then
-				target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)})
+				target:setEffect(target.EFF_BREACH, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self, t)})
 			end
 		else
 			game.logPlayer(self, "You cannot use Breach without an appropriate weapon!")
diff --git a/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
new file mode 100644
index 0000000000..0c094ad7b3
--- /dev/null
+++ b/game/modules/tome/data/talents/chronomancy/induced-phenomena.lua
@@ -0,0 +1,339 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+-- EDGE TODO: Particles, Timed Effect Particles
+
+newTalent{
+	name = "Cosmic Cycle",
+	type = {"chronomancy/induced-phenomena", 1},
+	require = chrono_req_high1,
+	points = 5,
+	sustain_paradox = 36,
+	mode = "sustained",
+	no_sustain_autoreset = true,
+	cooldown = 12,
+	tactical = { BUFF = 2},
+	range = 0,
+	radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end,
+	target = function(self, t)
+		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
+	end,
+	iconOverlay = function(self, t, p)
+		local val = p.radius or 0
+		if val <= 0 then return "" end
+		local fnt = "buff_font"
+		return tostring(math.ceil(val)), fnt
+	end,
+	getWillMultiplier = function(self, t) return self:combatTalentLimit(t, 100, 17, 50)/100 end, --Limit < 100%
+	getResistPen = function(self, t) return self:combatTalentLimit(t, 100, 17, 50) end, --Limit < 100%
+	callbackOnActBase = function(self, t)
+		local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+		if not p then return end
+		p.old_tgts = p.new_tgts
+		p.new_tgts = {}
+		
+		-- Update our target table
+		self:project(self:getTalentTarget(t), self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target then return end
+			p.new_tgts[#p.new_tgts+1] = target
+		end)
+
+		if self:knowTalent(self.T_REVERSE_CAUSALITY) then
+			self:callTalent(self.T_REVERSE_CAUSALITY, "doReverseCausality")
+		end
+		
+		if self:knowTalent(self.T_EPOCH) then
+			if p.mode == "expansion" then
+				self:callTalent(self.T_EPOCH, "doAging")
+			else
+				self:callTalent(self.T_EPOCH, "doRegression")
+			end
+		end
+	end,
+	doExpansion = function(self, t, radius)
+		local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+		
+		-- Update Radius
+		p.radius = radius or p.radius
+		self:removeParticles(p.particle)
+		p.particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=0.2, img="cycle_expansion", radius=p.radius}))
+		
+		if p.mode ~= "expansion" then
+			-- change mode
+			p.mode = "expansion"
+			
+			-- Update temporary values
+			self:removeTemporaryValue("paradox_will_multi", p.will)
+			p.resist = self:addTemporaryValue("resists_pen", {[DamageType.TEMPORAL] = t.getResistPen(self, t)})
+		end
+		
+		game.logPlayer(self, "#LIGHT_BLUE#Your cosmic cycle expands.")
+		
+	end,
+	doContraction = function(self, t, radius)
+		local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+		
+		-- Change radius and particles
+		p.radius = radius or p.radius
+		self:removeParticles(p.particle)
+		p.particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=-0.2, img="cycle_contraction", radius=p.radius}))
+		
+		if p.mode ~= "contraction" then
+			p.mode = "contraction"
+
+			-- Update temporary values
+			self:removeTemporaryValue("resists_pen", p.resist)
+			p.will = self:addTemporaryValue("paradox_will_multi", t.getWillMultiplier(self, t))
+		end
+		
+		game.logPlayer(self, "#LIGHT_RED#Your cosmic cycle contracts.")
+		
+	end,
+	doCosmicCycle = function(self, t)
+		game:onTickEnd(function()
+			local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+			if not p then return end
+			local radius = math.floor(self:getParadox()/100)
+			
+			-- Cycle between expansion and contraction
+			if radius > p.radius then
+				t.doExpansion(self, t, radius)
+			elseif radius < p.radius then
+				t.doContraction(self, t, radius)
+			end
+		end)
+	end,
+	activate = function(self, t)
+		local radius = math.floor(self:getParadox()/100)
+		local will = self:addTemporaryValue("paradox_will_multi", 0)
+		local resist =  self:addTemporaryValue("resists_pen", {[DamageType.TEMPORAL] = t.getResistPen(self, t)})
+		
+		local ret ={
+			mode = "expansion", radius = radius, new_tgts ={}, old_tgts ={}, resist = resist, will = will,
+			particle = self:addParticles(Particles.new("circle", 1, {shader=true, toback=true, a=55, appear=0, speed=0.2, img="cycle_expansion", radius=radius}))
+		}
+		game:playSoundNear(self, "talents/arcane")
+		return ret
+	end,
+	deactivate = function(self, t, p)
+		self:removeParticles(p.particle)
+		self:removeTemporaryValue("resists_pen", p.resist)
+		self:removeTemporaryValue("paradox_will_multi", p.will)
+		return true	
+	end,
+	info = function(self, t)
+		local paradox = t.getResistPen(self, t)
+		local will = t.getWillMultiplier(self, t) * 100
+		return ([[Tune yourself into the ebb and flow of spacetime.  When your Paradox crosses a 100 point threshold, your Cosmic Cycle gains or loses one radius.
+		While Cosmic Cycle is expanding, your temporal resistance penetration will be increased by %d%%.  While it's contracting, your Willpower for Paradox calculations will be increased by %d%%.]]):
+		format(paradox, will)
+	end,
+}
+
+newTalent{
+	name = "Polarity Shift",
+	type = {"chronomancy/induced-phenomena",2},
+	require = chrono_req_high2,
+	points = 5,
+	cooldown = 6,
+	tactical = { BUFF = 2, ATTACKAREA = {TEMPORAL = 2} },
+	direct_hit = true,
+	requires_target = true,
+	on_pre_use = function(self, t, silent) if not self:isTalentActive(self.T_COSMIC_CYCLE) then if not silent then game.logPlayer(self, "You must have Cosmic Cycle active to use this talent.") end return false end return true end,
+	radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end,
+	target = function(self, t)
+		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, friendlyfire=false, talent=t}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 100) end,
+	getBraid = function(self, t) return self:combatTalentSpellDamage(t, 25, 50, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
+	action = function(self, t)
+		local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+		local tg = self:getTalentTarget(t)
+		
+		if p.mode == "contraction" then
+			self:callTalent(self.T_COSMIC_CYCLE, "doExpansion")
+			
+			local dam = self:spellCrit(t.getDamage(self, t))
+			self:project(tg, self.x, self.y, function(tx, ty)
+				local target = game.level.map(tx, ty, engine.Map.ACTOR)
+				if not target then return end
+
+				local proj = require("mod.class.Projectile"):makeHoming(
+						self,
+						{particle="arrow", particle_args={tile=("particles_images/alt_temporal_bolt_0%d"):format(rng.range(1, 7)), proj_x=tx, proj_y=ty, src_x=self.x, src_y=self.y},  trail="trail_paradox"},
+						{speed=1, name="Polarity Bolt", dam=dam, movedam=dam},
+						target,
+						self:getTalentRadius(t),
+						function(self, src)
+							local DT = require("engine.DamageType")
+							DT:get(DT.TEMPORAL).projector(src, self.x, self.y, DT.TEMPORAL, self.def.movedam)
+						end,
+						function(self, src, target)
+							local DT = require("engine.DamageType")
+							DT:get(DT.TEMPORAL).projector(src, self.x, self.y, DT.TEMPORAL, self.def.movedam)
+						end
+					)
+				game.zone:addEntity(game.level, proj, "projectile", self.x, self.y)
+			end)
+
+		else
+			self:callTalent(self.T_COSMIC_CYCLE, "doContraction")
+
+			-- Get our targets
+			local braid_targets = {}
+			self:project(tg, self.x, self.y, function(tx, ty)
+				local target = game.level.map(tx, ty, engine.Map.ACTOR)
+				if target then
+					braid_targets[#braid_targets+1] = target
+				end
+			end)
+			
+			-- if we hit more than one, braid them
+			if #braid_targets > 1 then
+				for i = 1, #braid_targets do
+					local target = braid_targets[i]
+					target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getBraid(self, t), src=self, targets=braid_targets})
+				end
+			end
+		end
+		
+		game:playSoundNear(self, "talents/spell_generic")
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local braid = t.getBraid(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[Reverses the polarity of your Cosmic Cycle.  If it's currently contracting, it will begin to expand, firing a homing missile at each target within the radius that deals %0.2f temporal damage.
+		If it's currently expanding, it will begin to contract, braiding the lifelines of all targets within the radius for %d turns.  Braided targets take %d%% of all damage dealt to other braided targets.
+		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration, braid)
+	end,
+}
+
+newTalent{
+	name = "Reverse Causality",
+	type = {"chronomancy/induced-phenomena", 3},
+	require = chrono_req_high3,
+	points = 5,
+	mode = "passive",
+	getHeal = function(self, t) return self:combatTalentSpellDamage(t, 15, 70, getParadoxSpellpower(self, t)) end,
+	getReduction= function(self, t) return math.floor(self:combatTalentScale(t, 1, 5)) end,
+	doReverseCausality = function(self, t)
+		local p = self:isTalentActive(self.T_COSMIC_CYCLE)
+		if not p then return end
+		
+		local keys = table.compareKeys(p.new_tgts, p.old_tgts)
+		if p.mode == "expansion" then
+			local heal = self:spellCrit(t.getHeal(self, t))
+			heal = heal * #keys.left
+			if heal > 0 then
+				self:heal(heal, self)
+			end
+		else
+			local effs = {}
+			for eff_id, p in pairs(self.tmp) do
+				local e = self.tempeffect_def[eff_id]
+				if e.type ~= "other" and e.status == "detrimental" then
+					effs[#effs+1] = p
+				end
+			end
+			
+			for i=1, #keys.right do
+				local eff = effs[i]
+				if not eff then break end
+				eff.dur = eff.dur - t.getReduction(self, t)
+				if eff.dur <= 0 then
+					self:removeEffect(eff.effect_id)
+					effs[i] = nil
+				end
+			end
+		end
+			
+	end,
+	info = function(self, t)
+		local heal = t.getHeal(self, t)
+		local reduction = t.getReduction(self, t)
+		return ([[When a creature enters your expanding Cosmic Cycle, you heal %d life at the start of your next turn.
+		When a creature leaves your contracting Cosmic Cycle, you reduce the duration of one detrimental effect on you by %d at the start of your next turn.
+		The healing will scale with your Spellpower.]]):format(heal, reduction)
+	end,
+}
+
+newTalent{
+	name = "Epoch",
+	type = {"chronomancy/induced-phenomena", 4},
+	require = chrono_req_high4,
+	points = 5,
+	mode = "passive",
+	radius = function(self, t) local p=self:isTalentActive(self.T_COSMIC_CYCLE) return p and p.radius or 0 end,
+	target = function(self, t)
+		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, friendlyfire=false, talent=t}
+	end,
+	getRegression = function(self, t) return self:combatTalentSpellDamage(t, 5, 25, getParadoxSpellpower(self, t)) end,
+	getAgingChance = function(self, t) return paradoxTalentScale(self, t, 15, 50, 100) end,
+	doAging = function(self, t)
+		local tg = self:getTalentTarget(t)
+		
+		self:project(self:getTalentTarget(t), self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target then return end
+			
+			if rng.percent(t.getAgingChance(self, t)) then
+				local effect = rng.range(1, 3)
+				if effect == 1 then
+					if target:canBe("blind") then
+						target:setEffect(target.EFF_BLINDED, 3, {apply_power=getParadoxSpellpower(self, t), no_ct_effect=true})
+					else
+						game.logSeen(target, "%s resists the blindness!", target.name:capitalize())
+					end
+				elseif effect == 2 then
+					if target:canBe("pin") then
+						target:setEffect(target.EFF_PINNED, 3, {apply_power=getParadoxSpellpower(self, t), no_ct_effect=true})
+					else
+						game.logSeen(target, "%s resists the pin!", target.name:capitalize())
+					end
+				elseif effect == 3 then
+					if target:canBe("confusion") then
+						target:setEffect(target.EFF_CONFUSED, 3, {power=50, apply_power=getParadoxSpellpower(self, t), no_ct_effect=true})
+					else
+						game.logSeen(target, "%s resists the confusion!", target.name:capitalize())
+					end
+				end
+			end
+		end)
+	end,
+	doRegression = function(self, t)
+		local tg = self:getTalentTarget(t)
+		
+		self:project(self:getTalentTarget(t), self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target then return end
+			target:setEffect(target.EFF_REGRESSION, 1, {power=t.getRegression(self, t), apply_power=getParadoxSpellpower(self, t), no_ct_effect=true})		
+		end)
+	end,
+	info = function(self, t)
+		local regress = t.getRegression(self, t)
+		local aging = t.getAgingChance(self, t)
+		return ([[While your cosmic cycle is expanding, creatures in its radius have a %d%% chance to suffer the effects of aging; pinning, blinding, or confusing them for 3 turns.
+		While your cosmic cycle is contracting, creatures in its radius suffer from age regression; reducing their three highest stats by %d.
+		The chance and stat reduction will scale with your Spellpower.]]):format(aging, regress)
+	end,
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/matter.lua b/game/modules/tome/data/talents/chronomancy/matter.lua
index 7347030e75..7d50b7ea94 100644
--- a/game/modules/tome/data/talents/chronomancy/matter.lua
+++ b/game/modules/tome/data/talents/chronomancy/matter.lua
@@ -32,7 +32,7 @@ newTalent{
 	target = function(self, t)
 		return {type="beam", range=self:getTalentRange(t), talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
@@ -60,8 +60,8 @@ newTalent{
 	sustain_paradox = 20,
 	cooldown = 12,
 	tactical = { BUFF =2, DEFEND = 2 },
-	getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 1, 150, getParadoxSpellpower(self)) end,
-	getArmor = function(self, t) return math.ceil(self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self))) end,
+	getDamageOnMeleeHit = function(self, t) return self:combatTalentSpellDamage(t, 1, 150, getParadoxSpellpower(self, t)) end,
+	getArmor = function(self, t) return math.ceil(self:combatTalentSpellDamage(t, 20, 50, getParadoxSpellpower(self, t))) end,
 	do_carbonRegrowth = function(self, t)
 		local maxspikes = t.getArmor(self, t)
 		if self.carbon_armor < maxspikes then
@@ -112,8 +112,8 @@ newTalent{
 	tactical = { ATTACK = 2 },
 	requires_target = true,
 	direct_hit = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 60, getParadoxSpellpower(self)) end,
-	getExplosion = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 60, getParadoxSpellpower(self, t)) end,
+	getExplosion = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -152,7 +152,7 @@ newTalent{
 	target = function(self, t)
 		return {type="hit", range=self:getTalentRange(t), talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 30, 300, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 30, 300, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y, target = self:getTarget(tg)
@@ -196,5 +196,4 @@ newTalent{
 		Quantum Spike deals 50%% additional damage to targets affected by temporal destabilization and/or continuum destabilization.
 		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
 	end,
-}
-
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/other.lua b/game/modules/tome/data/talents/chronomancy/other.lua
index 2196d55db7..cce458a64d 100644
--- a/game/modules/tome/data/talents/chronomancy/other.lua
+++ b/game/modules/tome/data/talents/chronomancy/other.lua
@@ -23,10 +23,8 @@
 -- Note that 300 is the optimal balance
 -- Caps at -50% and +50%
 getParadoxModifier = function (self)
-	local pm = util.bound(math.sqrt(self:getParadox() / 300), 0.5, 1.5)
---	local pm = math.sqrt(self:getParadox()/300)
---	pm = math.min(1.5, pm)
---	pm = math.max(0.5, pm)
+	local paradox = self:getParadox()
+	local pm = util.bound(math.sqrt(paradox / 300), 0.5, 1.5)
 	return pm
 end
 
@@ -37,13 +35,42 @@ getParadoxCost = function (self, t, value)
 end
 
 -- Paradox Spellpower (regulates spellpower for chronomancy)
-getParadoxSpellpower = function(self, mod, add)
+getParadoxSpellpower = function(self, t, mod, add)
 	local pm = getParadoxModifier(self)
-	local mod = mod or 0
-	local spellpower = self:combatSpellpower(pm + mod, add)
+	local mod = mod or 1
+	
+	-- Empower?
+	local p = self:isTalentActive(self.T_EMPOWER)
+	if p and p.talent == t.id then
+		pm = pm + self:callTalent(self.T_EMPOWER, "getPower")
+	end
+	
+	local spellpower = self:combatSpellpower(mod * pm, add)
 	return spellpower
 end
 
+-- Paradox Talent scaling based on Spellpower (thanks grayswandir)
+paradoxTalentScale = function(self, t, low, high, limit)
+        local low_power = 50
+        local high_power = 150
+        return self:combatLimit(
+                self:combatTalentSpellDamage(t, low_power, high_power, getParadoxSpellpower(self, t)),
+                limit,
+                low, low_power,
+                high, high_power)
+end
+
+-- Extension Spellbinding
+getExtensionModifier = function(self, t, value)
+	local mod = 1
+	local p = self:isTalentActive(self.T_EXTENSION)
+	if p and p.talent == t.id then
+		mod = mod + self:callTalent(self.T_EXTENSION, "getPower")
+	end
+	value = math.ceil(value * mod)
+	return value
+end
+
 --- Warden weapon functions
 -- Checks for weapons in main and quickslot
 doWardenPreUse = function(self, weapon, silent)
@@ -130,11 +157,15 @@ makeParadoxClone = function(self, target, duration)
 	m.puuid = nil
 	m.on_acquire_target = nil
 	m.no_inventory_access = true
+	m.no_levelup_access = true
 	m.on_takehit = nil
 	m.seen_by = nil
 	m.can_talk = nil
 	m.clone_on_hit = nil
 	m.self_resurrect = nil
+	m.escort_quest = nil
+	m.unused_talents = 0
+	m.unused_generics = 0
 	if m.talents.T_SUMMON then m.talents.T_SUMMON = nil end
 	if m.talents.T_MULTIPLY then m.talents.T_MULTIPLY = nil end
 	
@@ -146,12 +177,11 @@ makeParadoxClone = function(self, target, duration)
 	local tids = {}
 	for tid, _ in pairs(m.talents) do
 		local t = m:getTalentFromId(tid)
-		if t.no_npc_use then tids[#tids+1] = t end
-		if t.remove_on_clone then tids[#tids+1] = t end
+		if (t.no_npc_use and not t.allow_temporal_clones) or t.remove_on_clone then tids[#tids+1] = t end
 	end
 	for i, t in ipairs(tids) do
 		if t.mode == "sustained" and m:isTalentActive(t.id) then m:forceUseTalent(t.id, {ignore_energy=true, silent=true}) end
-		m.talents[t.id] = nil
+		m:unlearnTalentFull(t.id)
 	end
 	
 	-- remove timed effects
@@ -233,10 +263,10 @@ newTalent{
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
 		local preference = self.preferred_paradox
-		local spellpower = getParadoxSpellpower(self)
+		local spellpower = getParadoxSpellpower(self, t)
 		local after_will, will_modifier, sustain_modifier = self:getModifiedParadox()
 		local anomaly = self:paradoxFailChance()
-		return ([[Use to set your preferred Paradox.  While resting you'll adjust your Paradox towards this number over %d turns.
+		return ([[Use to set your preferred Paradox.  While resting or waiting you'll adjust your Paradox towards this number over %d turns.
 		The time it takes you to adjust your Paradox scales down with your Spellpower to a minimum of 10 turns.
 		
 		Preferred Paradox          :  %d
@@ -265,7 +295,7 @@ newTalent{
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=self:spellFriendlyFire(), talent=t}
 	end,
 	getDuration = function(self, t) return math.ceil(self:combatTalentScale(self:getTalentLevel(t), 2.3, 4.3)) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 170, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
@@ -303,8 +333,8 @@ newTalent{
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t)}
 	end,
-	getSlow = function(self, t) return math.min(10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self))/ 100 , 0.6) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 60, getParadoxSpellpower(self)) end,
+	getSlow = function(self, t) return math.min(10 + self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t))/ 100 , 0.6) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 60, getParadoxSpellpower(self, t)) end,
 	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
@@ -334,72 +364,6 @@ newTalent{
 	end,
 }
 
-newTalent{
-	name = "Swap",
-	type = {"chronomancy/other", 1},
-	require = chrono_req1,
-	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	cooldown = 10,
-	tactical = { DISABLE = 2, },
-	requires_target = true,
-	direct_hit = true,
-	range = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
-	getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 3, 7)) end,
-	getConfuseEfficency = function(self, t) return math.min(50, self:getTalentLevelRaw(t) * 10) end,
-	action = function(self, t)
-		local tg = {type="hit", range=self:getTalentRange(t)}
-		local tx, ty, target = self:getTarget(tg)
-		if not tx or not ty then return nil end
-		if tx then
-			local _ _, tx, ty = self:canProject(tg, tx, ty)
-			if tx then
-				target = game.level.map(tx, ty, Map.ACTOR)
-				if not target then return nil end
-			end
-		end
-		
-		-- checks for spacetime mastery hit bonus
-		local power = getParadoxSpellpower(self)
-		if self:knowTalent(self.T_SPACETIME_MASTERY) then
-			power =  getParadoxSpellpower(self) * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower"))
-		end
-		
-		if target:canBe("teleport") and self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then
-			-- first remove the target so the destination tile is empty
-			game.level.map:remove(target.x, target.y, Map.ACTOR)
-			local px, py 
-			px, py = self.x, self.y
-			if self:teleportRandom(tx, ty, 0) then
-				-- return the target at the casters old location
-				game.level.map(px, py, Map.ACTOR, target)
-				self.x, self.y, target.x, target.y = target.x, target.y, px, py
-				game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
-				game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
-				target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)})
-				-- confuse them
-				self:project(tg, target.x, target.y, DamageType.CONFUSION, { dur = t.getConfuseDuration(self, t), dam = t.getConfuseEfficency(self, t),	})
-			else
-				-- return the target without effect
-				game.level.map(target.x, target.y, Map.ACTOR, target)
-				game.logSeen(self, "The spell fizzles!")
-			end
-		else
-			game.logSeen(target, "%s resists the swap!", target.name:capitalize())
-		end
-
-		game:playSoundNear(self, "talents/teleport")
-		return true
-	end,
-	info = function(self, t)
-		local range = self:getTalentRange(t)
-		local duration = t.getConfuseDuration(self, t)
-		local power = t.getConfuseEfficency(self, t)
-		return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d.  The targeted creature will be confused (power %d%%) for %d turns.
-		The spell's hit chance will increase with your Spellpower.]]):format (range, power, duration)
-	end,
-}
-
 newTalent{
 	name = "Spacetime Mastery",
 	type = {"chronomancy/other", 1},
@@ -518,4 +482,597 @@ newTalent{
 		This spell takes no time to cast.]]):
 		format(power, duration)
 	end,
+}
+
+newTalent{
+	name = "Gather the Threads",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 12,
+	tactical = { BUFF = 2 },
+	getThread = function(self, t) return self:combatTalentScale(t, 7, 30, 0.75) end,
+	getReduction = function(self, t) return self:combatTalentScale(t, 3.6, 15, 0.75) end,
+	action = function(self, t)
+		self:setEffect(self.EFF_GATHER_THE_THREADS, 5, {power=t.getThread(self, t), reduction=t.getReduction(self, t)})
+		game:playSoundNear(self, "talents/spell_generic2")
+		return true
+	end,
+	info = function(self, t)
+		local primary = t.getThread(self, t)
+		local reduction = t.getReduction(self, t)
+		return ([[You begin to gather energy from other timelines. Your Spellpower will increase by %0.2f on the first turn and %0.2f more each additional turn.
+		The effect ends either when you cast a spell, or after five turns.
+		Eacn turn the effect is active, your Paradox will be reduced by %d.
+		This spell will not break Spacetime Tuning, nor will it be broken by activating Spacetime Tuning.]]):format(primary + (primary/5), primary/5, reduction)
+	end,
+}
+
+newTalent{
+	name = "Entropic Field",
+	type = {"chronomancy/other",1},
+	mode = "sustained",
+	points = 5,
+	sustain_paradox = 20,
+	cooldown = 10,
+	tactical = { BUFF = 2 },
+	getPower = function(self, t) return math.min(90, 10 +  self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t))) end,
+	activate = function(self, t)
+		game:playSoundNear(self, "talents/heal")
+		return {
+			particle = self:addParticles(Particles.new("time_shield", 1)),
+			phys = self:addTemporaryValue("resists", {[DamageType.PHYSICAL]=t.getPower(self, t)/2}),
+			proj = self:addTemporaryValue("slow_projectiles", t.getPower(self, t)),
+		}
+	end,
+	deactivate = function(self, t, p)
+		self:removeParticles(p.particle)
+		self:removeTemporaryValue("resists", p.phys)
+		self:removeTemporaryValue("slow_projectiles", p.proj)
+		return true
+	end,
+	info = function(self, t)
+		local power = t.getPower(self, t)
+		return ([[You encase yourself in a field that slows incoming projectiles by %d%%, and increases your physical resistance by %d%%.
+		The effect will scale with your Spellpower.]]):format(power, power / 2)
+	end,
+}
+
+newTalent{
+	name = "Fade From Time",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 24,
+	tactical = { DEFEND = 2, CURE = 2 },
+	getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end,
+	getdurred = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)), 100, 0, 0, 32.9, 32.9) end, -- Limit < 100%
+	action = function(self, t)
+		-- fading managed by FADE_FROM_TIME effect in mod.data.timed_effects.other.lua
+		self:setEffect(self.EFF_FADE_FROM_TIME, 10, {power=t.getResist(self, t), durred=t.getdurred(self,t)})
+		game:playSoundNear(self, "talents/heal")
+		return true
+	end,
+	info = function(self, t)
+		local resist = t.getResist(self, t)
+		local dur = t.getdurred(self,t)
+		return ([[You partially remove yourself from the timeline for 10 turns.
+		This increases your resistance to all damage by %d%%, reduces the duration of all detrimental effects on you by %d%%, and reduces all damage you deal by 20%%.
+		The resistance bonus, effect reduction, and damage penalty will gradually lose power over the duration of the spell.
+		The effects scale with your Spellpower.]]):
+		format(resist, dur)
+	end,
+}
+
+newTalent{
+	name = "Paradox Clone",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 50) end,
+	cooldown = 50,
+	tactical = { ATTACK = 1, DISABLE = 2 },
+	range = 2,
+	requires_target = true,
+	no_npc_use = true,
+	getDuration = function(self, t)	return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 50, 4, 8)) end, -- Limit <50
+	getModifier = function(self, t) return rng.range(t.getDuration(self,t)*2, t.getDuration(self, t)*4) end,
+	action = function (self, t)
+		if checkTimeline(self) == true then
+			return
+		end
+
+		local tg = {type="bolt", nowarning=true, range=self:getTalentRange(t), nolock=true, talent=t}
+		local tx, ty = self:getTarget(tg)
+		if not tx or not ty then return nil end
+		local _ _, tx, ty = self:canProject(tg, tx, ty)
+		if not tx or not ty then return nil end
+		
+		local x, y = util.findFreeGrid(tx, ty, 2, true, {[Map.ACTOR]=true})
+		if not x then
+			game.logPlayer(self, "Not enough space to summon!")
+			return
+		end
+
+		local sex = game.player.female and "she" or "he"
+		local m = require("mod.class.NPC").new(self:cloneFull{
+			no_drops = true,
+			faction = self.faction,
+			summoner = self, summoner_gain_exp=true,
+			exp_worth = 0,
+			summon_time = t.getDuration(self, t),
+			ai_target = {actor=nil},
+			ai = "summoned", ai_real = "tactical",
+			ai_tactic = resolvers.tactic("ranged"), ai_state = { talent_in=1, ally_compassion=10},
+			desc = [[The real you... or so ]]..sex..[[ says.]]
+		})
+		m:removeAllMOs()
+		m.make_escort = nil
+		m.on_added_to_level = nil
+		
+		m.energy.value = 0
+		m.player = nil
+		m.puuid = nil
+		m.max_life = m.max_life
+		m.life = util.bound(m.life, 0, m.max_life)
+		m.forceLevelup = function() end
+		m.die = nil
+		m.on_die = nil
+		m.on_acquire_target = nil
+		m.seen_by = nil
+		m.can_talk = nil
+		m.on_takehit = nil
+		m.no_inventory_access = true
+		m.clone_on_hit = nil
+		m.remove_from_party_on_death = true
+		
+		-- Remove some talents
+		local tids = {}
+		for tid, _ in pairs(m.talents) do
+			local t = m:getTalentFromId(tid)
+			if t.no_npc_use then tids[#tids+1] = t end
+		end
+		for i, t in ipairs(tids) do
+			m.talents[t.id] = nil
+		end
+		
+		game.zone:addEntity(game.level, m, "actor", x, y)
+		game.level.map:particleEmitter(x, y, 1, "temporal_teleport")
+		game:playSoundNear(self, "talents/teleport")
+
+		if game.party:hasMember(self) then
+			game.party:addMember(m, {
+				control="no",
+				type="minion",
+				title="Paradox Clone",
+				orders = {target=true},
+			})
+		end
+
+		self:setEffect(self.EFF_IMMINENT_PARADOX_CLONE, t.getDuration(self, t) + t.getModifier(self, t), {})
+		return true
+	end,
+	info = function(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[You summon your future self to fight alongside you for %d turns.  At some point in the future, you'll be pulled into the past to fight alongside your past self after the initial effect ends.
+		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.]]):format(duration)
+	end,
+}
+
+newTalent{
+	name = "Displace Damage",
+	type = {"chronomancy/other", 1},
+	mode = "sustained",
+	require = chrono_req1,
+	sustain_paradox = 48,
+	cooldown = 10,
+	tactical = { BUFF = 2 },
+	points = 5,
+	-- called by _M:onTakeHit function in mod\class\Actor.lua to perform the damage displacment
+	getDisplaceDamage = function(self, t) return self:combatTalentLimit(t, 25, 5, 15)/100 end, -- Limit < 25%
+	range = 10,
+	callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr)
+		if dam > 0 and src ~= self then
+			-- find available targets
+			local tgts = {}
+			local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true)
+			for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
+				local a = game.level.map(x, y, Map.ACTOR)
+				if a and self:reactionToward(a) < 0 then
+					tgts[#tgts+1] = a
+				end
+			end end
+
+			-- Displace the damage
+			local a = rng.table(tgts)
+			if a then
+				local displace = dam * t.getDisplaceDamage(self, t)
+				game:delayedLogMessage(self, a, "displace_damage"..(a.uid or ""), "#PINK##Source# displaces some damage onto #Target#!")
+				DamageType.defaultProjector(self, a.x, a.y, type, displace, tmp, true)
+				dam = dam - displace
+			end
+		end
+		
+		return {dam=dam}
+	end,
+	activate = function(self, t)
+		return {}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local displace = t.getDisplaceDamage(self, t) * 100
+		return ([[You bend space around you, displacing %d%% of any damage you receive onto a random enemy within range.
+		]]):format(displace)
+	end,
+}
+
+newTalent{
+	name = "Repulsion Field",
+	type = {"chronomancy/other",1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 30) end,
+	cooldown = 14,
+	tactical = { ATTACKAREA = {PHYSICAL = 2}, ESCAPE = 2 },
+	range = 0,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end,
+	target = function(self, t)
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 8, 80, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 4, 8)) end,
+	direct_hit = true,
+	requires_target = true,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		game.level.map:addEffect(self,
+			self.x, self.y, t.getDuration(self, t),
+			DamageType.REPULSION, t.getDamage(self, t),
+			tg.radius,
+			5, nil,
+			engine.MapEffect.new{color_br=200, color_bg=120, color_bb=0, effect_shader="shader_images/paradox_effect.png"},
+			function(e)
+				e.x = e.src.x
+				e.y = e.src.y
+				return true
+			end,
+			tg.selffire
+		)
+		game:playSoundNear(self, "talents/cloud")
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
+		local radius = self:getTalentRadius(t)
+		return ([[You surround yourself with a radius %d distortion of gravity, knocking back and dealing %0.2f physical damage to all creatures inside it.  The effect lasts %d turns.  Deals 50%% extra damage to pinned targets, in addition to the knockback.
+		The blast wave may hit targets more then once, depending on the radius and the knockback effect.
+		The damage will scale with your Spellpower.]]):format(radius, damDesc(self, DamageType.PHYSICAL, damage), duration)
+	end,
+}
+
+newTalent{
+	name = "Temporal Clone",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	cooldown = 12,
+	paradox = function (self, t) return getParadoxCost(self, t, 15) end,
+	tactical = { ATTACK = 2, DISABLE = 2 },
+	requires_target = true,
+	range = 10,
+	remove_on_clone = true,
+	target = function (self, t)
+		return {type="hit", range=self:getTalentRange(t), talent=t, nowarning=true}
+	end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 12))) end,
+	getDamagePenalty = function(self, t) return 60 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self, t)), 30) end,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y, target = self:getTarget(tg)
+		if not x or not y then return nil end
+		local _ _, _, _, x, y = self:canProject(tg, x, y)
+		if not x or not y then return nil end
+		local target = game.level.map(x, y, Map.ACTOR)
+		if not target then return end
+
+		-- Find space
+		local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
+		if not tx then
+			game.logPlayer(self, "Not enough space to summon!")
+			return
+		end
+
+		-- Rank Penalty
+		local duration = t.getDuration(self, t)
+		if target.rank > 1 then duration = math.ceil(t.getDuration(self, t)/(target.rank/2)) end
+		
+		 -- Clone the target
+		local m = makeParadoxClone(self, target, duration)
+		-- Add and change some values
+		m.faction = self.faction
+		m.summoner = self
+		m.generic_damage_penalty = t.getDamagePenalty(self, t)
+		m.max_life = m.max_life * (100 - t.getDamagePenalty(self, t))/100
+		m.life = m.max_life
+		m.remove_from_party_on_death = true
+		
+		-- Handle some AI stuff
+		m.ai_state = { talent_in=2, ally_compassion=10 }
+
+		game.zone:addEntity(game.level, m, "actor", tx, ty)
+		
+		-- Set our target
+		if self:reactionToward(target) < 0 then
+			m:setTarget(target)
+		end
+		
+		if game.party:hasMember(self) then
+			game.party:addMember(m, {
+				control="no",
+				type="temporal-clone",
+				title="Temporal Clone",
+				orders = {target=true},
+			})
+		end
+			
+		game.level.map:particleEmitter(tx, ty, 1, "temporal_teleport")
+		game:playSoundNear(self, "talents/spell_generic")
+		
+		return true
+	end,
+	info = function(self, t)
+		local duration = t.getDuration(self, t)
+		local damage_penalty = t.getDamagePenalty(self, t)
+		return ([[Clones the target creature for up to %d turns.  The duration of the effect will be divided by half the target's rank, and the target will have have %d%% of its normal life and deal %d%% less damage.
+		If you clone a hostile creature the clone will target the creature it was cloned from.
+		The life and damage penalties will be lessened by your Spellpower.]]):
+		format(duration, 100 - damage_penalty, damage_penalty)
+	end,
+}
+
+newTalent{
+	name = "Paradox Mastery",
+	type = {"chronomancy/other", 1},
+	mode = "passive",
+	points = 5,
+	-- Static history bonus handled in timetravel.lua, backfire calcs performed by _M:getModifiedParadox function in mod\class\Actor.lua	
+	WilMult = function(self, t) return self:combatTalentScale(t, 0.15, 0.5) end,
+	stabilityDuration = function(self, t) return math.floor(self:combatTalentScale(t, 0.4, 2.7, "log")) end,  --This is still used by an older talent, leave it here for backwards compatability
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "paradox_will_mutli", t.WilMult(self, t))
+	end,
+	info = function(self, t)
+		return ([[You've learned to focus your control over the spacetime continuum, and quell anomalous effects.  Increases your effective Willpower for anomaly calculations by %d%%.]]):
+		format(t.WilMult(self, t) * 100)
+	end,
+}
+
+newTalent{
+	name = "Damage Smearing",
+	type = {"chronomancy/other", 1},
+	mode = "sustained",
+	sustain_paradox = 48,
+	cooldown = 24,
+	tactical = { DEFEND = 2 },
+	points = 5,
+	getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50%
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 6))) end,
+	callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr)
+		if dam > 0 and type ~= DamageType.TEMPORAL then
+			local smear = dam * t.getPercent(self, t)
+			self:setEffect(self.EFF_DAMAGE_SMEARING, t.getDuration(self, t), {dam=smear/t.getDuration(self, t), no_ct_effect=true})
+			game:delayedLogDamage(src, self, 0, ("%s(%d smeared)#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", smear), false)
+			dam = dam - smear
+		end
+			
+		return {dam=dam}
+	end,
+	activate = function(self, t)
+		game:playSoundNear(self, "talents/spell_generic")
+		return {}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local percent = t.getPercent(self, t) * 100
+		local duration = t.getDuration(self, t)
+		return ([[You convert %d%% of all non-temporal damage you receive into temporal damage spread out over %d turns.
+		This damage will bypass resistance and affinity.]]):format(percent, duration)
+	end,
+}
+
+newTalent{
+	name = "Banish",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 10,
+	tactical = { ESCAPE = 2 },
+	range = 0,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end,
+	getTeleport = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 8, 16)) end,
+	target = function(self, t)
+		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
+	end,
+	requires_target = true,
+	direct_hit = true,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local hit = false
+
+		self:project(tg, self.x, self.y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target or target == self then return end
+			game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
+			if self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) and target:canBe("teleport") then
+				if not target:teleportRandom(target.x, target.y, self:getTalentRadius(t) * 4, self:getTalentRadius(t) * 2) then
+					game.logSeen(target, "The spell fizzles on %s!", target.name:capitalize())
+				else
+					target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)})
+					game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
+					hit = true
+				end
+			else
+				game.logSeen(target, "%s resists the banishment!", target.name:capitalize())
+			end
+		end)
+		
+		if not hit then
+			game:onTickEnd(function()
+				if not self:attr("no_talents_cooldown") then
+					self.talents_cd[self.T_BANISH] = self.talents_cd[self.T_BANISH] /2
+				end
+			end)
+		end
+
+		game:playSoundNear(self, "talents/teleport")
+
+		return true
+	end,
+	info = function(self, t)
+		local radius = self:getTalentRadius(t)
+		local range = t.getTeleport(self, t)
+		return ([[Randomly teleports all targets within a radius of %d around you.  Targets will be teleported between %d and %d tiles from their current location.
+		If no targets are teleported the cooldown will be halved.
+		The chance of teleportion will scale with your Spellpower.]]):format(radius, range / 2, range)
+	end,
+}
+
+newTalent{
+	name = "Swap",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 10,
+	tactical = { DISABLE = 1 },
+	requires_target = true,
+	direct_hit = true,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	getConfuseDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 3, 7)) end,
+	getConfuseEfficency = function(self, t) return math.min(50, self:getTalentLevelRaw(t) * 10) end,
+	action = function(self, t)
+		local tg = {type="hit", range=self:getTalentRange(t)}
+		local tx, ty, target = self:getTarget(tg)
+		if not tx or not ty then return nil end
+		if tx then
+			local _ _, tx, ty = self:canProject(tg, tx, ty)
+			if tx then
+				target = game.level.map(tx, ty, Map.ACTOR)
+				if not target then return nil end
+			end
+		end
+		
+		-- Check hit
+		if target:canBe("teleport") and self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then
+			-- Grab the caster's location
+			local px, py = self.x, self.y
+		
+			-- Remove the target so the destination tile is empty
+			game.level.map:remove(target.x, target.y, Map.ACTOR)
+			
+			-- Try to teleport to the target's old location
+			if self:teleportRandom(tx, ty, 0) then
+				-- Put the target back in the caster's old location
+				game.level.map(px, py, Map.ACTOR, target)
+				target.x, target.y = px, py
+				
+				-- confuse them
+				self:project(tg, target.x, target.y, DamageType.CONFUSION, { dur = t.getConfuseDuration(self, t), dam = t.getConfuseEfficency(self, t), apply_power=getParadoxSpellpower(self, t)})
+				target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)})
+				
+				game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
+				game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+			else
+				-- If we can't teleport, return the target
+				game.level.map(target.x, target.y, Map.ACTOR, target)
+				game.logSeen(self, "The spell fizzles!")
+			end
+		else
+			game.logSeen(target, "%s resists the swap!", target.name:capitalize())
+		end
+
+		game:playSoundNear(self, "talents/teleport")
+		return true
+	end,
+	info = function(self, t)
+		local range = self:getTalentRange(t)
+		local duration = t.getConfuseDuration(self, t)
+		local power = t.getConfuseEfficency(self, t)
+		return ([[You manipulate the spacetime continuum in such a way that you switch places with another creature with in a range of %d.  The targeted creature will be confused (power %d%%) for %d turns.
+		The spell's hit chance will increase with your Spellpower.]]):format (range, power, duration)
+	end,
+}
+
+newTalent{
+	name = "Temporal Wake",
+	type = {"chronomancy/other", 1},
+	points = 5,
+	random_ego = "attack",
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 10,
+	tactical = { ATTACK = {TEMPORAL = 1, PHYSICAL = 1}, CLOSEIN = 2, DISABLE = { stun = 2 } },
+	direct_hit = true,
+	requires_target = true,
+	is_teleport = true,
+	target = function(self, t)
+		return {type="beam", start_x=x, start_y=y, range=self:getTalentRange(t), selffire=false, talent=t}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y, target = self:getTarget(tg)
+		if not x or not y then return nil end
+		if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then
+			game.logSeen(self, "You do not have line of sight.")
+			return nil
+		end
+		local _ _, x, y = self:canProject(tg, x, y)
+		local ox, oy = self.x, self.y
+		
+		-- If we target an actor directly project onto the other side of it (quality of life)
+		if target then
+			local dir = util.getDir(x, y, self.x, self.y)
+			x, y = util.coordAddDir(x, y, dir)
+		end
+		
+		-- since we're using a precise teleport we'll look for a free grid first
+		local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
+		if tx and ty then
+			if not self:teleportRandom(tx, ty, 0) then
+				game.logSeen(self, "The teleport fizzles!")
+			else
+				local dam = self:spellCrit(t.getDamage(self, t))
+				local x, y = ox, oy
+				self:project(tg, x, y, function(px, py)
+					local target = game.level.map(px, py, Map.ACTOR)
+					if target then
+						-- Deal warp damage first so we don't overwrite a big stun with a little one
+						DamageType:get(DamageType.WARP).projector(self, px, py, DamageType.WARP, dam)
+						
+						-- Try to stun
+						if target:canBe("stun") then
+							target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self, t)})
+						else
+							game.logSeen(target, "%s resists the stun!", target.name:capitalize())
+						end
+					end
+				end)
+				game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "temporal_lightning", {tx=x-self.x, ty=y-self.y})
+				game:playSoundNear(self, "talents/lightning")
+			end
+		end
+		
+		return true
+	end,
+	info = function(self, t)
+		local stun = t.getDuration(self, t)
+		local damage = t.getDamage(self, t)
+		return ([[Violently fold the space between yourself and another point within range.
+		You teleport to the target location, and leave a temporal wake behind that stuns for %d turns and deals %0.2f temporal and %0.2f physical warp damage to targets in the path.
+		The damage will scale with your Spellpower.]]):
+		format(stun, damDesc(self, DamageType.TEMPORAL, damage/2), damDesc(self, DamageType.PHYSICAL, damage/2))
+	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/paradox.lua b/game/modules/tome/data/talents/chronomancy/paradox.lua
index 936e39dc76..1cba0e3267 100644
--- a/game/modules/tome/data/talents/chronomancy/paradox.lua
+++ b/game/modules/tome/data/talents/chronomancy/paradox.lua
@@ -17,234 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
-newTalent{
-	name = "Paradox Mastery",
-	type = {"chronomancy/paradox", 1},
-	mode = "passive",
-	require = chrono_req_high1,
-	points = 5,
-	-- Static history bonus handled in timetravel.lua, backfire calcs performed by _M:getModifiedParadox function in mod\class\Actor.lua	
-	WilMult = function(self, t) return self:combatTalentScale(t, 0.15, 0.5) end,
-	stabilityDuration = function(self, t) return math.floor(self:combatTalentScale(t, 0.4, 2.7, "log")) end,
-	getResist = function(self, t) return self:combatTalentScale(t, 10, 35) end,
-	passives = function(self, t, p)
-		self:talentTemporaryValue(p, "resists", {[DamageType.TEMPORAL] = t.getResist(self, t)})
-	end,
-	info = function(self, t)
-		return ([[You've learned to focus your control over the spacetime continuum, and quell anomalous effects.  Increases your Temporal resistance by %d%%, extends the duration of the Static History stability effect by %d turns, and increases your effective willpower for failure, anomaly, and backfire calculations by %d%%.]]):
-		format(t.getResist(self, t), t.stabilityDuration(self, t), t.WilMult(self, t) * 100)
-	end,
-}
+-- EDGE TODO: Particles, Timed Effect Particles
 
-newTalent{
-	name = "Cease to Exist",
-	type = {"chronomancy/paradox", 2},
-	require = chrono_req_high2,
-	points = 5,
-	cooldown = 24,
-	paradox = function (self, t) return getParadoxCost(self, t, 40) end,
-	range = 10,
-	tactical = { ATTACK = 2 },
-	requires_target = true,
-	direct_hit = true,
-	no_npc_use = true,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 5, 9)) end,
-	getPower = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end,
-	-- Resistance reduction handled under CEASE_TO_EXIST in data\timed_effects\magical.lua
-	getPower = function(self, t)
-		return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)), 100, 0, 0, 32.9, 32.9) -- Limit < 100%
-	end,
-	on_pre_use = function(self, t, silent)
-		if checkTimeline(self) then
-			if not silent then
-				game.logPlayer(self, "The timeline is too fractured to do this now.")
-			end
-			return false
-		end
-		return true
-	end,
-	do_instakill = function(self, t)
-		-- search for target because it's ID will change when the chrono restore takes place
-		local tg = false
-		local grids = core.fov.circle_grids(self.x, self.y, 10, true)
-		for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
-			local a = game.level.map(x, y, Map.ACTOR)
-			if a and a:hasEffect(a.EFF_CEASE_TO_EXIST) then
-				tg = a
-			end
-		end end
-		
-		if tg then
-			game:onTickEnd(function()
-				tg:removeEffect(tg.EFF_CEASE_TO_EXIST)
-				game.logSeen(tg, "#LIGHT_BLUE#%s never existed, this never happened!", tg.name:capitalize())
-				tg:die(self)
-			end)
-		end
-	end,
-	action = function(self, t)
-		-- get our target
-		local tg = {type="hit", range=self:getTalentRange(t)}
-		local tx, ty = self:getTarget(tg)
-		if not tx or not ty then return nil end
-		local _ _, tx, ty = self:canProject(tg, tx, ty)
-		
-		local target = game.level.map(tx, ty, Map.ACTOR)
-		if not target then return end
 
-		if target == self then
-			game.logSeen(self, "#LIGHT_STEEL_BLUE#%s tries to remove %sself from existance!", self.name, string.his_her(self))
-			self:incParadox(400)
-			game.level.map:particleEmitter(self.x, self.y, 1, "ball_temporal", {radius=1, tx=self.x, ty=self.y})
-			return true
-		end
-		
-		-- does the spell hit?  if not nothing happens
-		if not self:checkHit(self:combatSpellpower(), target:combatSpellResist()) then
-			game.logSeen(target, "%s resists!", target.name:capitalize())
-			return true
-		end
-	
-		-- Manualy start cooldown before the chronoworld is made
-		game.player:startTalentCooldown(t)
-		
-		-- set up chronoworld next, we'll load it when the target dies in class\actor
-		game:onTickEnd(function()
-			game:chronoClone("cease_to_exist")
-		end)
-			
-		target:setEffect(target.EFF_CEASE_TO_EXIST, t.getDuration(self,t), {power=t.getPower(self, t)})
-				
-		return true
-	end,
-	info = function(self, t)
-		local duration = t.getDuration(self, t)
-		local power = t.getPower(self, t)
-		return ([[Over the next %d turns, you attempt to remove the target from the timeline.  Its resistances will be reduced by %d%%, and if you manage to kill it while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain.
-		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
-		The duration will scale with your Paradox and the resistance penalty will scale with your Spellpower.]])
-		:format(duration, power)
-	end,
-}
 
-newTalent{
-	name = "Fade From Time",
-	type = {"chronomancy/paradox", 3},
-	require = chrono_req_high3,
-	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
-	cooldown = 24,
-	tactical = { DEFEND = 2, CURE = 2 },
-	getResist = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end,
-	getdurred = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)), 100, 0, 0, 32.9, 32.9) end, -- Limit < 100%
-	action = function(self, t)
-		-- fading managed by FADE_FROM_TIME effect in mod.data.timed_effects.other.lua
-		self:setEffect(self.EFF_FADE_FROM_TIME, 10, {power=t.getResist(self, t), durred=t.getdurred(self,t)})
-		game:playSoundNear(self, "talents/heal")
-		return true
-	end,
-	info = function(self, t)
-		local resist = t.getResist(self, t)
-		local dur = t.getdurred(self,t)
-		return ([[You partially remove yourself from the timeline for 10 turns.
-		This increases your resistance to all damage by %d%%, reduces the duration of all detrimental effects on you by %d%%, and reduces all damage you deal by 20%%.
-		The resistance bonus, effect reduction, and damage penalty will gradually lose power over the duration of the spell.
-		The effects scale with your Spellpower.]]):
-		format(resist, dur)
-	end,
-}
-
-newTalent{
-	name = "Paradox Clone",
-	type = {"chronomancy/paradox", 4},
-	require = chrono_req_high4,
-	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 50) end,
-	cooldown = 50,
-	tactical = { ATTACK = 1, DISABLE = 2 },
-	range = 2,
-	requires_target = true,
-	no_npc_use = true,
-	getDuration = function(self, t)	return math.floor(self:combatTalentLimit(self:getTalentLevel(t), 50, 4, 8)) end, -- Limit <50
-	getModifier = function(self, t) return rng.range(t.getDuration(self,t)*2, t.getDuration(self, t)*4) end,
-	action = function (self, t)
-		if checkTimeline(self) == true then
-			return
-		end
-
-		local tg = {type="bolt", nowarning=true, range=self:getTalentRange(t), nolock=true, talent=t}
-		local tx, ty = self:getTarget(tg)
-		if not tx or not ty then return nil end
-		local _ _, tx, ty = self:canProject(tg, tx, ty)
-		if not tx or not ty then return nil end
-		
-		local x, y = util.findFreeGrid(tx, ty, 2, true, {[Map.ACTOR]=true})
-		if not x then
-			game.logPlayer(self, "Not enough space to summon!")
-			return
-		end
-
-		local sex = game.player.female and "she" or "he"
-		local m = require("mod.class.NPC").new(self:cloneFull{
-			no_drops = true,
-			faction = self.faction,
-			summoner = self, summoner_gain_exp=true,
-			exp_worth = 0,
-			summon_time = t.getDuration(self, t),
-			ai_target = {actor=nil},
-			ai = "summoned", ai_real = "tactical",
-			ai_tactic = resolvers.tactic("ranged"), ai_state = { talent_in=1, ally_compassion=10},
-			desc = [[The real you... or so ]]..sex..[[ says.]]
-		})
-		m:removeAllMOs()
-		m.make_escort = nil
-		m.on_added_to_level = nil
-		
-		m.energy.value = 0
-		m.player = nil
-		m.puuid = nil
-		m.max_life = m.max_life
-		m.life = util.bound(m.life, 0, m.max_life)
-		m.forceLevelup = function() end
-		m.die = nil
-		m.on_die = nil
-		m.on_acquire_target = nil
-		m.seen_by = nil
-		m.can_talk = nil
-		m.on_takehit = nil
-		m.no_inventory_access = true
-		m.clone_on_hit = nil
-		m.remove_from_party_on_death = true
-		
-		-- Remove some talents
-		local tids = {}
-		for tid, _ in pairs(m.talents) do
-			local t = m:getTalentFromId(tid)
-			if t.no_npc_use then tids[#tids+1] = t end
-		end
-		for i, t in ipairs(tids) do
-			m.talents[t.id] = nil
-		end
-		
-		game.zone:addEntity(game.level, m, "actor", x, y)
-		game.level.map:particleEmitter(x, y, 1, "temporal_teleport")
-		game:playSoundNear(self, "talents/teleport")
-
-		if game.party:hasMember(self) then
-			game.party:addMember(m, {
-				control="no",
-				type="minion",
-				title="Paradox Clone",
-				orders = {target=true},
-			})
-		end
-
-		self:setEffect(self.EFF_IMMINENT_PARADOX_CLONE, t.getDuration(self, t) + t.getModifier(self, t), {})
-		return true
-	end,
-	info = function(self, t)
-		local duration = t.getDuration(self, t)
-		return ([[You summon your future self to fight alongside you for %d turns.  At some point in the future, you'll be pulled into the past to fight alongside your past self after the initial effect ends.
-		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.]]):format(duration)
-	end,
-}
diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
index b32c5ab6f6..e8c0b67bab 100644
--- a/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
+++ b/game/modules/tome/data/talents/chronomancy/spacetime-folding.lua
@@ -21,15 +21,99 @@
 
 local Trap = require "mod.class.Trap"
 
+makeWarpMine = function(self, t, x, y, type)
+	-- Mine values
+	local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage"))
+	local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
+	local detect = math.floor(self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8)
+	local disarm = math.floor(self:callTalent(self.T_WARP_MINES, "trapPower"))
+	local power = getParadoxSpellpower(self, t)
+	local dest_power = getParadoxSpellpower(self, t, 0.3)
+	
+	-- Our Mines
+	local mine = Trap.new{
+		name = ("warp mine: %s"):format(type),
+		type = "temporal", id_by_type=true, unided_name = "trap",
+		display = '^', color=colors.BLUE, image = ("trap/chronomine_%s_0%d.png"):format(type == "toward" and "blue" or "red", rng.avg(1, 4, 3)),
+		shader = "shadow_simulacrum", shader_args = { color = {0.2, 0.2, 0.2}, base = 0.8, time_factor = 1500 },
+		dam = dam, t=t, power = power, dest_power = dest_power,
+		temporary = duration,
+		x = x, y = y, type = type,
+		summoner = self, summoner_gain_exp = true,
+		disarm_power = disarm,	detect_power = detect,
+		canTrigger = function(self, x, y, who)
+			if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end
+			return false
+		end,
+		triggered = function(self, x, y, who)
+			-- Project our damage
+			self.summoner:project({type="hit",x=x,y=y, talent=t}, x, y, engine.DamageType.WARP, self.dam)
+			
+			-- Teleport?
+			if not who.dead then
+				-- Does our teleport hit?
+				local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport")
+				if hit then
+					game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+					local teleport_done = false
+					
+					if self.type == "toward" then
+						-- since we're using a precise teleport we'll look for a free grid first
+						local tx, ty = util.findFreeGrid(self.summoner.x, self.summoner.y, 5, true, {[engine.Map.ACTOR]=true})
+						if tx and ty then
+							game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+							if not who:teleportRandom(self.summoner.x, self.summoner.y, 1, 0) then
+								game.logSeen(self, "The teleport fizzles!")
+							else
+								teleport_done = true
+							end
+						end
+					elseif self.type == "away" then
+						game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+						if not who:teleportRandom(self.summoner.x, self.summoner.y, 10, 5) then
+							game.logSeen(self, "The teleport fizzles!")
+						else
+							teleport_done = true
+						end
+					end
+					
+					-- Destabailize?
+					if teleport_done then
+						who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power})
+						game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+						game:playSoundNear(self, "talents/teleport")
+					end
+				else
+					game.logSeen(who, "%s resists the teleport!", who.name:capitalize())
+				end					
+			end
+	
+			return true, true
+		end,
+		canAct = false,
+		energy = {value=0},
+		act = function(self)
+			self:useEnergy()
+			self.temporary = self.temporary - 1
+			if self.temporary <= 0 then
+				if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end
+				game.level:removeEntity(self)
+			end
+		end,
+	}
+	
+	return mine
+end
+
 newTalent{
 	name = "Warp Mines",
 	type = {"chronomancy/spacetime-folding", 1},
 	points = 5,
 	mode = "passive",
 	require = chrono_req1,
-	getRange = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end, -- Duration of glyph
+	getRange = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end, -- Duration of mines
 	trapPower = function(self,t) return math.max(1,self:combatScale(self:getTalentLevel(t) * self:getMag(15, true), 0, 0, 75, 75)) end, -- Used to determine detection and disarm power, about 75 at level 50
 	on_learn = function(self, t)
 		local lev = self:getTalentLevelRaw(t)
@@ -52,10 +136,10 @@ newTalent{
 		local disarm = t.trapPower(self,t)
 		local duration = t.getDuration(self, t)
 		return ([[Learn to lay Warp Mines in a radius of 1 out to a range of %d.
-		Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f temporal and %0.2f physical damage.
+		Warp Mines teleport targets that trigger them either toward you or away from you depending on the type of mine used and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
 		The damage caused by your Warp Mines will improve with your Spellpower.]]):
-		format(range, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) --I5
+		format(range, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) --I5
 	end,
 }
 
@@ -65,7 +149,7 @@ newTalent{
 	points = 1,
 	cooldown = 10,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	tactical = { ATTACKAREA = { TEMPORAL = 2 }, CLOSEIN = 2  },
+	tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, CLOSEIN = 2  },
 	requires_target = true,
 	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange")end,
 	no_unlearn_last = true,
@@ -75,76 +159,17 @@ newTalent{
 		local tx, ty = self:getTarget(tg)
 		if not tx or not ty then return nil end
 		local __, tx, ty = self:canProject(tg, tx, ty)
-		
-
-		local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage"))
-		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
-		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
-		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		
+	
 		-- Lay the mines in a ball
 		self:project(tg, tx, ty, function(px, py)
 			local target_trap = game.level.map(px, py, Map.TRAP)
 			if target_trap then return end
 			if game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") then return end
 			
-			-- Our Mines
-			local power = getParadoxSpellpower(self)
-			local trap = Trap.new{
-				name = "warp mine: toward",
-				type = "temporal", id_by_type=true, unided_name = "trap",
-				display = '^', color=colors.BLUE, image = "trap/trap_warpmine_01.png",
-				shader = "shadow_simulacrum",
-				shader_args = { color = {0.2, 0.2, 0.6}, base = 0.8, time_factor = 1500 },
-				dam = dam, power = power,
-				canTrigger = function(self, x, y, who)
-					if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end
-					return false
-				end,
-				triggered = function(self, x, y, who)
-					self:project({type="hit",x=x,y=y}, x, y, engine.DamageType.MATTER, self.dam)
-					-- Teleport Toward
-					if not who.dead then
-						local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport")
-						if not hit then	
-							game.logSeen(who, "%s resists the teleport!", who.name:capitalize())
-						else
-							game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-							-- since we're using a precise teleport we'll look for a free grid first
-							local tx, ty = util.findFreeGrid(self.summoner.x, self.summoner.y, 5, true, {[Map.ACTOR]=true})
-							if tx and ty then
-								game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-								if not who:teleportRandom(self.summoner.x, self.summoner.y, 1, 0) then
-									game.logSeen(self, "The warp fizzles!")
-								else
-									who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3})
-									game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-								end
-							end
-						end
-					end
-			
-					return true, true
-				end,
-				temporary = duration,
-				x = px, y = py,
-				disarm_power = math.floor(disarm),
-				detect_power = math.floor(detect),
-				canAct = false,
-				energy = {value=0},
-				act = function(self)
-					self:useEnergy()
-					self.temporary = self.temporary - 1
-					if self.temporary <= 0 then
-						if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end
-						game.level:removeEntity(self)
-					end
-				end,
-				summoner = self,
-				summoner_gain_exp = true,
-			}
+			-- Make our mine
+			local trap = makeWarpMine(self, t, px, py, "toward")
 			
-			-- Add mines
+			-- Add the mine
 			game.level:addEntity(trap)
 			trap:identify(true)
 			trap:setKnown(self, true)
@@ -161,11 +186,11 @@ newTalent{
 		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
 		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
 		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f temporal and %0.2f physical damage.
+		return ([[Lay Warp Mines in a radius of 1 that teleport enemies to you and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
 		The damage caused by your Warp Mines will improve with your Spellpower.
 		Using this talent will trigger the cooldown on Warp Mine Away.]]):
-		format(damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) 
+		format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration)
 	end,
 }
 
@@ -175,7 +200,7 @@ newTalent{
 	points = 1,
 	cooldown = 10,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	tactical = { ATTACKAREA = { TEMPORAL = 2 }, ESCAPE = 2  },
+	tactical = { ATTACKAREA = { TEMPORAL = 1, PHYSICAL = 1 }, ESCAPE = 2  },
 	requires_target = true,
 	range = function(self, t) return self:callTalent(self.T_WARP_MINES, "getRange") end,
 	no_unlearn_last = true,
@@ -185,12 +210,6 @@ newTalent{
 		local tx, ty = self:getTarget(tg)
 		if not tx or not ty then return nil end
 		local _ _, tx, ty = self:canProject(tg, tx, ty)
-				
-		local dam = self:spellCrit(self:callTalent(self.T_WARP_MINES, "getDamage"))
-		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
-		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
-		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		local power = getParadoxSpellpower(self)
 		
 		-- Lay the mines in a ball
 		self:project(tg, tx, ty, function(px, py)
@@ -198,57 +217,10 @@ newTalent{
 			if target_trap then return end
 			if game.level.map:checkEntity(px, py, Map.TERRAIN, "block_move") then return end
 			
-			-- Our Mines
-			local trap = Trap.new{
-				name = "warp mine away",
-				type = "temporal", id_by_type=true, unided_name = "trap",
-				display = '^', color=colors.BLUE, image = "trap/trap_warpmine_02.png",
-				shader = "shadow_simulacrum",
-				shader_args = { color = {0.6, 0.2, 0.2}, base = 0.8, time_factor = 1500 },
-				dam = dam, power = power,
-				canTrigger = function(self, x, y, who)
-					if who:reactionToward(self.summoner) < 0 then return mod.class.Trap.canTrigger(self, x, y, who) end
-					return false
-				end,
-				triggered = function(self, x, y, who)
-					self:project({type="hit",x=x,y=y}, x, y, engine.DamageType.MATTER, self.dam)
-					-- Teleport Away
-					if not who.dead then
-						local hit = self.summoner:checkHit(self.power, who:combatSpellResist() + (who:attr("continuum_destabilization") or 0)) and who:canBe("teleport")
-						if not hit then	
-							game.logSeen(who, "%s resists the teleport!", who.name:capitalize())
-						else
-							game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-							if not who:teleportRandom(self.summoner.x, self.summoner.y, 10, 5) then
-								game.logSeen(self, "The warp fizzles!")
-							else
-								who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3})
-								game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-							end
-						end
-					end
+			-- Make our mine
+			local trap = makeWarpMine(self, t, px, py, "away")
 			
-					return true, true
-				end,
-				temporary = duration,
-				x = px, y = py,
-				disarm_power = math.floor(disarm),
-				detect_power = math.floor(detect),
-				canAct = false,
-				energy = {value=0},
-				act = function(self)
-					self:useEnergy()
-					self.temporary = self.temporary - 1
-					if self.temporary <= 0 then
-						if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end
-						game.level:removeEntity(self)
-					end
-				end,
-				summoner = self,
-				summoner_gain_exp = true,
-			}
-			
-			-- Add mines
+			-- Add the mine
 			game.level:addEntity(trap)
 			trap:identify(true)
 			trap:setKnown(self, true)
@@ -265,139 +237,225 @@ newTalent{
 		local duration = self:callTalent(self.T_WARP_MINES, "getDuration")
 		local detect = self:callTalent(self.T_WARP_MINES, "trapPower") * 0.8
 		local disarm = self:callTalent(self.T_WARP_MINES, "trapPower")
-		return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f temporal and %0.2f physical damage.
+		return ([[Lay Warp Mines in a radius of 1 that teleport enemies away from you and inflict %0.2f physical and %0.2f temporal (warp) damage.
 		The mines are hidden traps (%d detection and %d disarm power based on your Magic) and last for %d turns.
 		The damage caused by your Warp Mines will improve with your Spellpower.
 		Using this talent will trigger the cooldown on Warp Mine Away.]]):
-		format(damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage), detect, disarm, duration) 
+		format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), detect, disarm, duration) 
 	end,
 }
 
 newTalent{
-	name = "Banish",
+	name = "Wormhole",
 	type = {"chronomancy/spacetime-folding", 2},
 	require = chrono_req2,
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	cooldown = 10,
 	tactical = { ESCAPE = 2 },
-	range = 0,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 5.5)) end,
-	getTeleport = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 8, 16)) end,
-	target = function(self, t)
-		return {type="ball", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
-	end,
-	direct_hit = true,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	radius = function(self, t) return math.floor(self:combatTalentLimit(t, 1, 7, 3)) end, -- Limit to radius 1
+	requires_target = true,
+	getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end,
+	no_npc_use = true,
 	action = function(self, t)
-		local tg = self:getTalentTarget(t)
-		local hit = false
+		-- Target the entrance location
+		local tg = {type="bolt", nowarning=true, range=1, nolock=true, simple_dir_request=true, talent=t}
+		local entrance_x, entrance_y = self:getTarget(tg)
+		if not entrance_x or not entrance_y then return nil end
+		local _ _, entrance_x, entrance_y = self:canProject(tg, entrance_x, entrance_y)
+		local trap = game.level.map(entrance_x, entrance_y, engine.Map.TRAP)
+		if trap or game.level.map:checkEntity(entrance_x, entrance_y, Map.TERRAIN, "block_move") then game.logPlayer(self, "You can't place a wormhole entrance here.") return end
 
-		--checks for spacetime mastery hit bonus
-		local power = getParadoxSpellpower(self)
-		if self:knowTalent(self.T_SPACETIME_MASTERY) then
-			power = getParadoxSpellpower(self) * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower"))
-		end
+		-- Target the exit location
+		local tg = {type="hit", nolock=true, pass_terrain=true, nowarning=true, range=self:getTalentRange(t)}
+		local exit_x, exit_y = self:getTarget(tg)
+		if not exit_x or not exit_y then return nil end
+		local _ _, exit_x, exit_y = self:canProject(tg, exit_x, exit_y)
+		local trap = game.level.map(exit_x, exit_y, engine.Map.TRAP)
+		if trap or game.level.map:checkEntity(exit_x, exit_y, Map.TERRAIN, "block_move") or core.fov.distance(entrance_x, entrance_y, exit_x, exit_y) < 2 then game.logPlayer(self, "You can't place a wormhole exit here.") return end
 
-		self:project(tg, self.x, self.y, function(px, py)
-			local target = game.level.map(px, py, Map.ACTOR)
-			if not target or target == self then return end
-			game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
-			if self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) and target:canBe("teleport") then
-				if not target:teleportRandom(target.x, target.y, self:getTalentRadius(t) * 4, self:getTalentRadius(t) * 2) then
-					game.logSeen(target, "The spell fizzles on %s!", target.name:capitalize())
-				else
-					target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=power*0.3})
-					game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
-					hit = true
-				end
-			else
-				game.logSeen(target, "%s resists the banishment!", target.name:capitalize())
-			end
-		end)
+		-- Wormhole values
+		local power = getParadoxSpellpower(self, t)
+		local dest_power = getParadoxSpellpower(self, t, 0.3)
 		
-		if not hit then
-			game:onTickEnd(function()
-				if not self:attr("no_talents_cooldown") then
-					self.talents_cd[self.T_BANISH] = self.talents_cd[self.T_BANISH] /2
-				end
-			end)
+		-- Our base wormhole
+		local function makeWormhole(x, y, dest_x, dest_y)
+			local wormhole = mod.class.Trap.new{
+				name = "wormhole",
+				type = "annoy", subtype="teleport", id_by_type=true, unided_name = "trap",
+				image = "terrain/wormhole.png",
+				display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE,
+				message = "@Target@ moves onto the wormhole.",
+				temporary = t.getDuration(self, t),
+				x = x, y = y, dest_x = dest_x, dest_y = dest_y,
+				radius = self:getTalentRadius(t),
+				canAct = false,
+				energy = {value=0},
+				disarm = function(self, x, y, who) return false end,
+				power = power, dest_power = dest_power,
+				summoned_by = self, -- "summoner" is immune to it's own traps
+				triggered = function(self, x, y, who)
+					local hit = who == self.summoned_by or who:checkHit(self.power, who:combatSpellResist()+(who:attr("continuum_destabilization") or 0), 0, 95) and who:canBe("teleport") -- Bug fix, Deprecrated checkhit call
+					if hit then
+						game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+						if not who:teleportRandom(self.dest_x, self.dest_y, self.radius, 1) then
+							game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize())
+						else
+							if who ~= self.summoned_by then who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power}) end
+							game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
+							game:playSoundNear(self, "talents/teleport")
+						end
+					else
+						game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize())
+					end
+					return true
+				end,
+				act = function(self)
+					self:useEnergy()
+					self.temporary = self.temporary - 1
+					if self.temporary <= 0 then
+						game.logSeen(self, "Reality asserts itself and forces the wormhole shut.")
+						if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end
+						game.level:removeEntity(self)
+					end
+				end,
+			}
+			
+			return wormhole
 		end
+		
+		-- Adding the entrance wormhole
+		local entrance = makeWormhole(entrance_x, entrance_y, exit_x, exit_y)
+		game.level:addEntity(entrance)
+		entrance:identify(true)
+		entrance:setKnown(self, true)
+		game.zone:addEntity(game.level, entrance, "trap", entrance_x, entrance_y)
+		entrance.faction = nil
+		game:playSoundNear(self, "talents/heal")
 
-		game:playSoundNear(self, "talents/teleport")
+		-- Adding the exit wormhole
+		local exit = makeWormhole(exit_x, exit_y, entrance_x, entrance_y)
+		exit.x = exit_x
+		exit.y = exit_y
+		game.level:addEntity(exit)
+		exit:identify(true)
+		exit:setKnown(self, true)
+		game.zone:addEntity(game.level, exit, "trap", exit_x, exit_y)
+		exit.faction = nil
 
+		-- Linking the wormholes
+		entrance.dest = exit
+		exit.dest = entrance
+
+		game.logSeen(self, "%s folds the space between two points.", self.name)
 		return true
 	end,
 	info = function(self, t)
+		local duration = t.getDuration(self, t)
 		local radius = self:getTalentRadius(t)
-		local range = t.getTeleport(self, t)
-		return ([[Randomly teleports all targets within a radius of %d around you.  Targets will be teleported between %d and %d tiles from their current location.
-		If no targets are teleported the cooldown will be halved.
-		The chance of teleportion will scale with your Spellpower.]]):format(radius, range / 2, range)
+		local range = self:getTalentRange(t)
+		return ([[You fold the space between yourself and a second point within a range of %d, creating a pair of wormholes.  Any creature stepping on either wormhole will be teleported near the other (radius %d accuracy).  
+		The wormholes will last %d turns and must be placed at least two tiles apart.
+		The chance of teleporting enemies will scale with your Spellpower.]])
+		:format(range, radius, duration)
 	end,
 }
 
 newTalent{
-	name = "Temporal Wake",
+	name = "Spatial Tether",
 	type = {"chronomancy/spacetime-folding", 3},
 	require = chrono_req3,
 	points = 5,
-	random_ego = "attack",
-	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	cooldown = 10,
-	tactical = { ATTACK = {TEMPORAL = 1}, CLOSEIN = 2, DISABLE = { stun = 2 } },
-	direct_hit = true,
+	tactical = { DISABLE = 2 },
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
 	requires_target = true,
-	is_teleport = true,
+	getDuration = function (self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10))) end,
+	getChance = function(self, t) return paradoxTalentScale(self, t, 10, 20, 30) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self, t)) end,
 	target = function(self, t)
-		return {type="beam", range=self:getTalentRange(t), friendlyfire=false, talent=t}
+		return {type="hit", range=self:getTalentRange(t), nowarning=true, talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
-	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end,
+	no_energy=true,
 	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
-		if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then
-			game.logSeen(self, "You do not have line of sight.")
-			return nil
-		end
 		local _ _, x, y = self:canProject(tg, x, y)
-		local ox, oy = self.x, self.y
+		local target = game.level.map(x, y, Map.ACTOR)
+		if not target then return end
+		if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return end
+		
+		-- Tether values
+		local power = getParadoxSpellpower(self, t)
+		local dest_power = getParadoxSpellpower(self, t, 0.3)
 		
-		-- since we're using a precise teleport we'll look for a free grid first
-		local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
-		if tx and ty then
-			if not self:teleportRandom(tx, ty, 0) then
-				game.logSeen(self, "The teleport fizzles!")
-			else
-				local dam = self:spellCrit(t.getDamage(self, t))
-				local x, y = ox, oy
-				self:project(tg, x, y, function(px, py)
-					DamageType:get(DamageType.MATTER).projector(self, px, py, DamageType.MATTER, dam)
-					local target = game.level.map(px, py, Map.ACTOR)
-					if target then
-						if target:canBe("stun") then
-							target:setEffect(target.EFF_STUNNED, t.getDuration(self, t), {apply_power=getParadoxSpellpower(self)})
+		-- Store the old terrain
+		local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN)
+		if not oe or oe:attr("temporary") then return true end
+	
+		-- Make our tether
+		local tether = mod.class.Object.new{
+			old_feat = oe, type = oe.type, subtype = oe.subtype,
+			name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}},
+			display = '&', color=colors.LIGHT_BLUE,
+			temporary = t.getDuration(self, t), 
+			power = power, dest_power = dest_power, chance = t.getChance(self, t),
+			x = x, y = y, target = target,
+			summoner = self, summoner_gain_exp = true,
+			canAct = false,
+			energy = {value=0},
+			act = function(self)
+				self:useEnergy()
+				self.temporary = self.temporary - 1
+				
+				-- Teleport
+				if not self.target.dead and (game.level and game.level:hasEntity(self.target)) then
+					local hit = self.summoner == self.target or (self.summoner:checkHit(self.power, self.target:combatSpellResist() + (self.target:attr("continuum_destabilization") or 0), 0, 95) and self.target:canBe("teleport"))
+					if hit and rng.percent(self.chance * core.fov.distance(self.x, self.y, self.target.x, self.target.y)) then	
+						game.level.map:particleEmitter(self.target.x, self.target.y, 1, "temporal_teleport")
+						-- Since we're using a precise teleport, find a free grit first
+						local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[engine.Map.ACTOR]=true})
+						if not self.target:teleportRandom(tx, ty, 1, 0) then
+							game.logSeen(self, "The teleport fizzles!")
 						else
-							game.logSeen(target, "%s resists the stun!", target.name:capitalize())
+							if target ~= self.summoner then 
+								self.target:setEffect(self.target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.dest_power})
+							end
+							game.level.map:particleEmitter(self.target.x, self.target.y, 1, "temporal_teleport")
+							game:playSoundNear(self, "talents/teleport")
 						end
+					else
+						game.logSeen(self.target, "%s resists the teleport!", self.target.name:capitalize())
 					end
-				end)
-				game.level.map:particleEmitter(self.x, self.y, math.max(math.abs(x-self.x), math.abs(y-self.y)), "temporal_lightning", {tx=x-self.x, ty=y-self.y})
-				game:playSoundNear(self, "talents/lightning")
-			end
-		end
+				end
+				
+				-- End the effect?
+				if self.temporary <= 0 then
+					game.level.map(self.x, self.y, engine.Map.TERRAIN, self.old_feat)
+					game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y)
+					game.level:removeEntity(self)
+				end
+			end,
+		}
+		
+		-- add our tether to the map
+		game.level:addEntity(tether)
+		game.level.map(x, y, Map.TERRAIN, tether)
+		game.nicer_tiles:updateAround(game.level, x, y)
+		game.level.map:updateMap(x, y)
+		game:playSoundNear(self, "talents/heal")
 		
 		return true
 	end,
 	info = function(self, t)
-		local stun = t.getDuration(self, t)
-		local damage = t.getDamage(self, t)/2
-		return ([[Violently fold the space between yourself and another point within range.
-		You move to the target location, and leave a temporal wake behind that stuns for %d turns and inflicts %0.2f temporal and %0.2f physical damage to everything in the path.
-		The damage will scale with your Spellpower.]]):
-		format(stun, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage))
+		local duration = t.getDuration(self, t)
+		local chance = t.getChance(self, t)
+		return ([[Tethers the target to the location for %d turns.  For each tile the target moves away from the target location it has a %d%% chance each turn of being teleported back to the tether.
+		The teleportation chance scales with your Spellpower.]])
+		:format(duration, chance)
 	end,
 }
 
@@ -407,12 +465,12 @@ newTalent{
 	require = chrono_req4,
 	points = 5,
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
-	cooldown = 24,
+	cooldown = 12,
 	tactical = { DISABLE = 2 },
-	range = 10,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
 	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 10))) end,
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), friendlyfire=false, radius=self:getTalentRadius(t), talent=t}
 	end,
@@ -422,16 +480,19 @@ newTalent{
 		local tg = self:getTalentTarget(t)
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		local _ _, x, y = self:canProject(tg, x, y)
-		
-		local damage = self:spellCrit(t.getDamage(self, t))
-		self:project(tg, x, y, function(px, py)
-			local target = game.level.map(px, py, Map.ACTOR)
-			if not target then return end
-			target:setEffect(target.EFF_DIMENSIONAL_ANCHOR, t.getDuration(self, t), {damage=damage, src=self, apply_power=getParadoxSpellpower(self)})
-		end)
+		local _ _, _, _, x, y = self:canProject(tg, x, y)
+
+		-- Add a lasting map effect
+		local dam = self:spellCrit(t.getDamage(self, t))
+		game.level.map:addEffect(self,
+			x, y, t.getDuration(self,t),
+			DamageType.DIMENSIONAL_ANCHOR, {dam=dam, dur=1, src=self, apply=getParadoxSpellpower(self, t)},
+			self:getTalentRadius(t),
+			5, nil,
+			{type="temporal_cloud"},
+			nil, false, false
+		)
 
-		game.level.map:particleEmitter(x, y, tg.radius, "ball_teleport", {radius=tg.radius})
 		game:playSoundNear(self, "talents/teleport")
 
 		return true
@@ -440,7 +501,7 @@ newTalent{
 		local damage = t.getDamage(self, t)/2
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self, t)
-		return ([[Anchors enemies in a radius of %d.  Anchored targets will be prevented from teleporting for %d turns and take %0.2f temporal and %0.2f physical damage on teleport attempts.
-		The damage will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.TEMPORAL, damage), damDesc(self, DamageType.PHYSICAL, damage))
+		return ([[Create a radius %d anti-telport field for %d turns.  Enemies in the field will be anchored, preventing teleportation and taking %0.2f physical and %0.2f temporal (warp) damage on teleport attempts.
+		The damage will scale with your Spellpower.]]):format(radius, duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
 	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
index 7662ceef24..07e3effa38 100644
--- a/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
+++ b/game/modules/tome/data/talents/chronomancy/spacetime-weaving.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Icons, Particles, Timed Effect Particles
+-- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
 	name = "Dimensional Step",
@@ -27,261 +27,180 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
 	cooldown = 10,
 	tactical = { CLOSEIN = 2, ESCAPE = 2 },
-	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 10, 0.5, 0, 1)) end,
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
 	requires_target = true,
 	target = function(self, t)
-		return {type="hit", range=self:getTalentRange(t), nolock=true, nowarning=true}
+		return {type="hit", nolock=true, range=self:getTalentRange(t)}
 	end,
 	direct_hit = true,
 	no_energy = true,
 	is_teleport = true,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		local x, y = self:getTarget(tg)
+		local x, y, target = self:getTarget(tg)
 		if not x or not y then return nil end
-		if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then
+		if not self:hasLOS(x, y) or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then -- To prevent teleporting through walls
 			game.logSeen(self, "You do not have line of sight.")
 			return nil
 		end
-		local __, x, y = self:canProject(tg, x, y)
-
-		game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
-
-		-- since we're using a precise teleport we'll look for a free grid first
-		local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
-		if tx and ty then
-			if not self:teleportRandom(tx, ty, 0) then
-				game.logSeen(self, "The spell fizzles!")
+		local _ _, x, y = self:canProject(tg, x, y)
+		
+		-- Swap?
+		if self:getTalentLevel(t) >= 5 and target then
+			-- Hit?
+			if target:canBe("teleport") and self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0)) then
+				-- Grab the caster's location
+				local ox, oy = self.x, self.y
+			
+				-- Remove the target so the destination tile is empty
+				game.level.map:remove(target.x, target.y, Map.ACTOR)
+				
+				-- Try to teleport to the target's old location
+				if self:teleportRandom(x, y, 0) then
+					-- Put the target back in the caster's old location
+					game.level.map(ox, oy, Map.ACTOR, target)
+					target.x, target.y = ox, oy
+					
+					game.level.map:particleEmitter(target.x, target.y, 1, "temporal_teleport")
+					game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+				else
+					-- If we can't teleport, return the target
+					game.level.map(target.x, target.y, Map.ACTOR, target)
+					game.logSeen(self, "The spell fizzles!")
+				end
+			else
+				game.logSeen(target, "%s resists the swap!", target.name:capitalize())
+			end
+		else
+			game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+			-- since we're using a precise teleport we'll look for a free grid first
+			local tx, ty = util.findFreeGrid(x, y, 5, true, {[Map.ACTOR]=true})
+			if tx and ty then
+				if not self:teleportRandom(tx, ty, 0) then
+					game.logSeen(self, "The spell fizzles!")
+				else
+					game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+				end
 			end
 		end
-
-		game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+		
 		game:playSoundNear(self, "talents/teleport")
-
 		return true
 	end,
 	info = function(self, t)
 		local range = self:getTalentRange(t)
-		return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight.  Additional talent points increase the range.
-		This spell takes no time to cast.]]):format(range)
+		return ([[Teleports you to up to %d tiles away, to a targeted location in line of sight.
+		At talent level 5 you may swap positions with a target creature.]]):format(range)
 	end,
 }
 
 newTalent{
-	name = "Phase Shift",
+	name = "Dimensional Shift",
 	type = {"chronomancy/spacetime-weaving", 2},
 	mode = "passive",
 	require = chrono_req2,
 	points = 5,
-	getChance = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end,
-	doPhaseShift = function(self, t)
+	getReduction = function(self, t) return math.ceil(self:getTalentLevel(t)) end,
+	getCount = function(self, t)
+		return 1 + math.floor(self:combatTalentLimit(t, 3, 0, 2))
+	end,
+	doShift = function(self, t)
 		local effs = {}
-		-- Go through all effects
 		for eff_id, p in pairs(self.tmp) do
 			local e = self.tempeffect_def[eff_id]
-			if e.status == "detrimental" and e.type ~= "other" then
-				effs[#effs+1] = {"effect", eff_id}
+			if e.type ~= "other" and e.status == "detrimental" and e.subtype ~= "cross tier" then
+				effs[#effs+1] = p
 			end
 		end
-
-		-- Roll to remove each one
-		for i = 1, #effs do
-			if #effs == 0 then break end
+		
+		for i=1, t.getCount(self, t) do
 			local eff = rng.tableRemove(effs)
-			if eff[1] == "effect" and rng.percent(t.getChance(self, t)) then
-				self:removeEffect(eff[2])
+			if not eff then break end
+			eff.dur = eff.dur - t.getReduction(self, t)
+			if eff.dur <= 0 then
+				self:removeEffect(eff.effect_id)
 			end
 		end
+
 	end,
 	info = function(self, t)
-		local chance = t.getChance(self, t)
-		return ([[When you teleport you have a %d%% chance to remove each detrimental status effect currently affecting you.
-		Each effect is checked individually and the chance scales with your Spellpower.]]):
-		format(chance)
+		local count = t.getCount(self, t)
+		local reduction = t.getReduction(self, t)
+		return ([[When you teleport you reduce the duration of up to %d detrimental effects by %d turns.]]):
+		format(count, reduction)
 	end,
 }
 
 newTalent{
-	name = "Wormhole",
+	name = "Phase Shift",
 	type = {"chronomancy/spacetime-weaving", 3},
 	require = chrono_req3,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	cooldown = 10,
-	tactical = { ESCAPE = 2 },
-	range = 10,
-	radius = function(self, t) return math.floor(self:combatTalentLimit(t, 0, 7, 3)) end, -- Limit to radius 0
-	requires_target = true,
-	getDuration = function (self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 6, 10)) end,
-	no_npc_use = true,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 24,
+	tactical = { DEFEND = 2 },
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentLimit(t, 25, 3, 7, true))) end,
 	action = function(self, t)
-		local tg = {type="bolt", nowarning=true, range=1, nolock=true, simple_dir_request=true, talent=t}
-		local entrance_x, entrance_y = self:getTarget(tg)
-		if not entrance_x or not entrance_y then return nil end
-		local _ _, entrance_x, entrance_y = self:canProject(tg, entrance_x, entrance_y)
-		local trap = game.level.map(entrance_x, entrance_y, engine.Map.TRAP)
-		if trap or game.level.map:checkEntity(entrance_x, entrance_y, Map.TERRAIN, "block_move") then game.logPlayer(self, "You can't place a wormhole entrance here.") return end
-
-		-- Finding the exit location
-		-- First, find the center possible exit locations
-		local x, y, radius, minimum_distance
-		radius = self:getTalentRadius(t)
-		minimum_distance = 0
-		local tg = {type="ball", nolock=true, pass_terrain=true, nowarning=true, range=self:getTalentRange(t), radius=radius}
-		x, y = self:getTarget(tg)
-		print("[Target]", x, y)
-		if not x then return nil end
-		-- Make sure the target is within range
-		if core.fov.distance(self.x, self.y, x, y) > self:getTalentRange(t) then
-			game.logPlayer(self, "Pick a valid location.")
-			return false
-		end
-
-		-- Second, select one of the possible exit locations
-		local poss = {}
-		for i = x - radius, x + radius do
-			for j = y - radius, y + radius do
-				if game.level.map:isBound(i, j) and
-					core.fov.distance(x, y, i, j) <= radius and
-					core.fov.distance(x, y, i, j) >= minimum_distance and
-					self:canMove(i, j) and not game.level.map(i, j, engine.Map.TRAP) then
-					poss[#poss+1] = {i,j}
-				end
-			end
-		end
-		if #poss == 0 then game.logPlayer(self, "No exit location could be found.")	return false end
-		local pos = poss[rng.range(1, #poss)]
-		local exit_x, exit_y = pos[1], pos[2]
-		print("[[wormhole]] entrance ", entrance_x, " :: ", entrance_y)
-		print("[[wormhole]] exit ", exit_x, " :: ", exit_y)
-
-		--checks for spacetime mastery hit bonus
-		local power = getParadoxSpellpower(self)
-		if self:knowTalent(self.T_SPACETIME_MASTERY) then
-			power = power * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower"))
-		end
-
-		-- Adding the entrance wormhole
-		local entrance = mod.class.Trap.new{
-			name = "wormhole",
-			type = "annoy", subtype="teleport", id_by_type=true, unided_name = "trap",
-			image = "terrain/wormhole.png",
-			display = '&', color_r=255, color_g=255, color_b=255, back_color=colors.STEEL_BLUE,
-			message = "@Target@ moves onto the wormhole.",
-			temporary = t.getDuration(self, t),
-			x = entrance_x, y = entrance_y,
-			canAct = false,
-			energy = {value=0},
-			disarm = function(self, x, y, who) return false end,
-			power = power,
-			summoned_by = self, -- "summoner" is immune to it's own traps
-			triggered = function(self, x, y, who)
-				if who == self.summoned_by or who:checkHit(self.power, who:combatSpellResist()+(who:attr("continuum_destabilization") or 0), 0, 95) and who:canBe("teleport") then -- Bug fix, Deprecrated checkhit call
-					-- since we're using a precise teleport we'll look for a free grid first
-					local tx, ty = util.findFreeGrid(self.dest.x, self.dest.y, 5, true, {[engine.Map.ACTOR]=true})
-					if tx and ty then
-						game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-						if not who:teleportRandom(tx, ty, 0) then
-							game.logSeen(who, "%s tries to enter the wormhole but a violent force pushes it back.", who.name:capitalize())
-						elseif who ~= self.summoned_by then
-							who:setEffect(who.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self.destabilization_power})
-							game.level.map:particleEmitter(who.x, who.y, 1, "temporal_teleport")
-						end
-					end
-				else
-					game.logSeen(who, "%s ignores the wormhole.", who.name:capitalize())
-				end
-				return true
-			end,
-			act = function(self)
-				self:useEnergy()
-				self.temporary = self.temporary - 1
-				if self.temporary <= 0 then
-					game.logSeen(self, "Reality asserts itself and forces the wormhole shut.")
-					if game.level.map(self.x, self.y, engine.Map.TRAP) == self then game.level.map:remove(self.x, self.y, engine.Map.TRAP) end
-					game.level:removeEntity(self)
-				end
-			end,
-		}
-		entrance.faction = nil
-		game.level:addEntity(entrance)
-		entrance:identify(true)
-		entrance:setKnown(self, true)
-		game.zone:addEntity(game.level, entrance, "trap", entrance_x, entrance_y)
-		game.level.map:particleEmitter(entrance_x, entrance_y, 1, "temporal_teleport")
-		game:playSoundNear(self, "talents/heal")
-
-		-- Adding the exit wormhole
-		local exit = entrance:clone()
-		exit.x = exit_x
-		exit.y = exit_y
-		game.level:addEntity(exit)
-		exit:identify(true)
-		exit:setKnown(self, true)
-		game.zone:addEntity(game.level, exit, "trap", exit_x, exit_y)
-		game.level.map:particleEmitter(exit_x, exit_y, 1, "temporal_teleport")
-
-		-- Linking the wormholes
-		entrance.dest = exit
-		exit.dest = entrance
-
-		game.logSeen(self, "%s folds the space between two points.", self.name)
+		self:setEffect(self.EFF_PHASE_SHIFT, t.getDuration(self, t), {})
+		game:playSoundNear(self, "talents/teleport")
 		return true
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		local radius = self:getTalentRadius(t)
-		return ([[You fold the space between yourself and a second point within range (radius %d accuracy), creating a pair of wormholes.  Any creature stepping on either wormhole will be teleported to the other.  The wormholes will last %d turns.
-		The chance of teleporting enemies will scale with your Spellpower.]])
-		:format(radius, duration)
+		return ([[Phase shift yourself for %d turns; any damage greater than 10%% of your maximum life will teleport you to an adjacent tile and be reduced by 50%% (can only happen once per turn).]]):
+		format(duration)
 	end,
 }
 
 newTalent{
-	name = "Displace Damage",
+	name = "Phase Pulse",
 	type = {"chronomancy/spacetime-weaving", 4},
-	mode = "sustained",
 	require = chrono_req4,
-	sustain_paradox = 48,
+	tactical = { ATTACKAREA = {TEMPORAL = 1, PHYSICAL = 1} },
+	mode = "sustained",
+	sustain_paradox = 36,
 	cooldown = 10,
-	tactical = { BUFF = 2 },
 	points = 5,
-	-- called by _M:onTakeHit function in mod\class\Actor.lua to perform the damage displacment
-	getDisplaceDamage = function(self, t) return self:combatTalentLimit(t, 25, 5, 15)/100 end, -- Limit < 25%
-	range = 10,
-	callbackOnTakeDamage = function(self, t, src, x, y, type, dam, tmp, no_martyr)
-		if dam > 0 and src ~= self then
-			-- find available targets
-			local tgts = {}
-			local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true)
-			for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
-				local a = game.level.map(x, y, Map.ACTOR)
-				if a and self:reactionToward(a) < 0 then
-					tgts[#tgts+1] = a
-				end
-			end end
-
-			-- Displace the damage
-			local a = rng.table(tgts)
-			if a then
-				local displace = dam * t.getDisplaceDamage(self, t)
-				game:delayedLogMessage(self, a, "displace_damage"..(a.uid or ""), "#PINK##Source# displaces some damage onto #Target#!")
-				DamageType.defaultProjector(self, a.x, a.y, type, displace, tmp, true)
-				dam = dam - displace
-			end
-		end
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 70, getParadoxSpellpower(self, t)) end,
+	range = 0,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 1.5, 3.5)) end,
+	target = function(self, t)
+		return {type="ball", range=100, radius=self:getTalentRadius(t), selffire=false, talent=t}
+	end,
+	doPulse = function(self, t, ox, oy, fail)
+		local tg = self:getTalentTarget(t)
+		local dam = self:spellCrit(t.getDamage(self, t))
+		local distance = core.fov.distance(self.x, self.y, ox, oy)
+		local chance = distance * 10
 		
-		return {dam=dam}
+		if not fail then
+			dam = dam * (1 + math.min(1, distance/10))
+			game:onTickEnd(function()
+				self:project(tg, ox, oy, DamageType.WARP, dam)
+				self:project(tg, self.x, self.y, DamageType.WARP, dam)
+			end)
+		else
+			dam = dam *2
+			chance = 100
+			tg.radius = tg.radius * 2
+			game:onTickEnd(function()
+				self:project(tg, self.x, self.y, DamageType.WARP, dam)
+			end)
+		end
 	end,
 	activate = function(self, t)
+		game:playSoundNear(self, "talents/spell_generic")
 		return {}
 	end,
 	deactivate = function(self, t, p)
 		return true
 	end,
 	info = function(self, t)
-		local displace = t.getDisplaceDamage(self, t) * 100
-		return ([[You bend space around you, displacing %d%% of any damage you receive onto a random enemy within range.
-		]]):format(displace)
+		local damage = t.getDamage(self, t)/2
+		local radius = self:getTalentRadius(t)
+		return ([[When you teleport with Phase Pulse active you deal %0.2f physical and %0.2f temporal (warp) damage to all targets in a radius of %d around you.
+		For each space you move from your original location the damage is increased by 10%% (to a maximum bonus of 100%%).  If the teleport fails, the blast radius and damage will be doubled.
+		This effect occurs both at the entrance and exist locations and the damage will scale with your Spellpower.]]):
+		format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage), radius)
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/spatial-tears.lua b/game/modules/tome/data/talents/chronomancy/spatial-tears.lua
new file mode 100644
index 0000000000..a632e4b150
--- /dev/null
+++ b/game/modules/tome/data/talents/chronomancy/spatial-tears.lua
@@ -0,0 +1,311 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+-- EDGE TODO: Particles, Timed Effect Particles
+
+local Object = require "mod.class.Object"
+
+newTalent{
+	name = "Spatial Fragments",
+	type = {"chronomancy/spatial-tears",1},
+	require = chrono_req_high1,
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	cooldown = 3,
+	tactical = { ATTACK = { TEMPORAL = 1, PHYSICAL = 1 }, },
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	proj_speed = 4,
+	target = function(self, t)
+		return {type="bolt", range=self:getTalentRange(t), talent=t, nowarning=true, display={particle="arrow", particle_args={tile=("particles_images/spatial_fragment"):format(rng.range(1, 4))}}}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 100, getParadoxSpellpower(self, t)) end,
+	action = function(self, t)
+		local p = self:isTalentActive(self.T_FRACTURED_SPACE)
+		
+		local tg = self:getTalentTarget(t)
+		-- Beam?
+		local beam = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false
+		if beam then
+			tg.type = "beam"
+		end
+		local x, y, target = self:getTarget(tg)
+		if not x or not y then return nil end
+		if beam then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0 end
+		
+		-- Fire one bolt per available target
+		if target == self then
+			-- Find available targets
+			local tgts = {}
+			local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true)
+			for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
+				local a = game.level.map(x, y, Map.ACTOR)
+				if a and self:reactionToward(a) < 0 then
+					tgts[#tgts+1] = a
+				end
+			end end
+			
+			-- Fire a bolt at each one			
+			local dam = self:spellCrit(t.getDamage(self, t))
+			for i = 1, 3 do
+				if #tgts <= 0 then break end
+				local a, id = rng.table(tgts)
+				table.remove(tgts, id)
+				self:projectile(tg, a.x, a.y, DamageType.WARP, dam, nil)
+			end
+		else
+			-- Fire all bolts at one target
+			local dam = self:spellCrit(t.getDamage(self, t))
+			for i = 1, 3 do
+				self:projectile(tg, x, y, DamageType.WARP, dam, nil)
+			end
+		end
+	
+		game:playSoundNear(self, "talents/earth")
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)/2
+		return ([[Fire three Spatial Fragments at the target that each inflict %0.2f physical and %0.2f temporal (warp) damage.  If you target yourself you'll instead fire one Spatial Fragment at up to three targets within range.
+		If Fractured Space is fully charged the projectiles will be able to pierce through targets.  This will consume your Fractured Space charges.
+		The damage scales with your Spellpower.]])
+		:format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
+	end,
+}
+
+newTalent{
+	name = "Discontinuity",
+	type = {"chronomancy/spatial-tears", 2},
+	require = chrono_req_high2,
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 6,
+	tactical = { ATTACK = { TEMPORAL = 1, PHYSICAL = 1 }, },
+	range = 10,
+	direct_hit = true,
+	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 50) end,
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 10)) end,
+	getLength = function(self, t) return 1 + math.floor(self:combatTalentScale(t, 3, 7)/2)*2 end,
+	target = function(self, t)
+		local halflength = math.floor(t.getLength(self,t)/2)
+		local block = function(_, lx, ly)
+			return game.level.map:checkAllEntities(lx, ly, "block_move")
+		end
+		return {type="wall", range=self:getTalentRange(t), halflength=halflength, talent=t, halfmax_spots=halflength+1, block_radius=block}
+	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
+		local _ _, _, _, x, y = self:canProject(tg, x, y)
+		if game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move") then return nil end
+		
+		local damage = self:spellCrit(t.getDamage(self, t))
+		local block = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false
+		if block then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0 end
+		self:project(tg, x, y, function(px, py, tg, self)
+			local oe = game.level.map(px, py, Map.TERRAIN)
+			if not oe or oe.special then return end
+			if not oe or oe:attr("temporary") or game.level.map:checkAllEntities(px, py, "block_move") then return end
+			local e = Object.new{
+				old_feat = oe,
+				type = "void", subtype = "void",
+				name = "discontinuity",
+				display = ' ', image = ("terrain/rift/rift_floor_0%d.png"):format(rng.avg(0, 4, 3)),
+				_noalpha = false,
+				always_remember = true,
+				does_block_move = block,
+				block_move = block,
+				pass_projectile = true,
+				is_void = true,
+				can_pass = {pass_void=1},
+				show_tooltip = true,
+				temporary = t.getDuration(self, t),
+				x = px, y = py,
+				dam = damage,
+				canAct = false,
+				act = function(self)
+					local tg = {type="ball", range=0, friendlyfire=false, radius = 1, talent=t, x=self.x, y=self.y,}
+					self.summoner.__project_source = self
+					local grids = self.summoner:project(tg, self.x, self.y, engine.DamageType.WARP, self.dam)
+					if core.shader.active() then
+						game.level.map:particleEmitter(self.x, self.y, tg.radius, "starfall", {radius=tg.radius, tx=self.x, ty=self.y})
+					else
+						game.level.map:particleEmitter(self.x, self.y, tg.radius, "shadow_flash", {radius=tg.radius, grids=grids, tx=self.x, ty=self.y})
+					end
+					self.summoner.__project_source = nil
+					self:useEnergy()
+					self.temporary = self.temporary - 1
+					if self.temporary <= 0 then
+						game.level.map(self.x, self.y, engine.Map.TERRAIN, self.old_feat)
+						game.level:removeEntity(self)
+						game.level.map:updateMap(self.x, self.y)
+						game.nicer_tiles:updateAround(game.level, self.x, self.y)
+					end
+				end,
+				dig = function(src, x, y, old)
+					game.level:removeEntity(old)
+					return nil, old.old_feat
+				end,
+				summoner_gain_exp = true,
+				summoner = self,
+			}
+			e.tooltip = mod.class.Grid.tooltip
+			game.level:addEntity(e)
+			game.level.map(px, py, Map.TERRAIN, e)
+			if not block then
+				game.nicer_tiles:updateAround(game.level, px, py)
+				game.level.map:updateMap(px, py)
+			end
+		end)
+		
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)/2
+		local length = t.getLength(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[Create a void wall of length %d that lasts %d turns.  Each turn the wall deals %0.2f physical and %0.2f temporal (warp) damage to all enemies within a radius of 1.
+		If Fractured Space is fully charged the wall will block movement, but not sight or projectiles.  This will consume your Fractured Space charges.
+		The damage will scale with your Spellpower.]])
+		:format(length, duration, damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
+	end,
+}
+
+newTalent{
+	name = "Fractured Space",
+	type = {"chronomancy/spatial-tears",3},
+	require = chrono_req_high3,
+	mode = "sustained",
+	sustain_paradox = 24,
+	cooldown = 10,
+	tactical = { BUFF = 2 },
+	points = 5,
+	getDamage = function(self, t) return self:combatTalentLimit(t, 100, 10, 75)/12 end,
+	getChance = function(self, t) return self:combatTalentLimit(t, 100, 10, 75)/6 end,
+	iconOverlay = function(self, t, p)
+		local val = p.charges or 0
+		if val <= 0 then return "" end
+		local fnt = "buff_font"
+		return tostring(math.ceil(val)), fnt
+	end,
+	callbackOnActBase = function(self, t)
+		-- Charge decay
+		local p = self:isTalentActive(self.T_FRACTURED_SPACE)
+		p.decay = p.decay + 1
+		if p.decay >=2 then
+			p.decay = 0
+			p.charges = math.max(p.charges - 1, 0)
+		end
+	end,
+	activate = function(self, t)
+		game:playSoundNear(self, "talents/heal")
+		--local particle = Particles.new("ultrashield", 1, { rm=0, rM=176, gm=196, gM=255, bm=222, bM=255, am=25, aM=125, radius=0.2, density=30, life=28, instop=-40})
+		return {
+			charges = 0, decay = 0
+		--	particle = self:addParticles(particle)
+		}
+	end,
+	deactivate = function(self, t, p)
+	--	self:removeParticles(p.particle)
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local chance = t.getChance(self, t)
+		local charges = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges or 0
+		return ([[Each time you deal warp damage Fractured Space gains one charge, up to a maximum of six charges.  If you're not generating charges one charge will decay every other turn.
+		Each charge increases warp damage by %d%% and gives your Warp damage a %d%% chance to stun, blind, pin, or confuse affected targets for 3 turns.
+		If Fractured Space is fully charged, your Spatial Tears talents will consume them when cast and have bonus effects (see indvidual talent descriptions).
+		
+		Current damage bonus:   %d%%
+		Current effect chance:  %d%%]]):format(damage, chance, damage * charges, chance * charges)
+	end,
+}
+
+newTalent{
+	name = "Sphere of Destruction",
+	type = {"chronomancy/spatial-tears", 4},
+	require = chrono_req_high4,
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 18) end,
+	cooldown = 18,
+	tactical = { ATTACKAREA = {PHYSICAL = 2, TEMPORAL = 2} },
+	range = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9, 0.5, 0, 1)) end,
+	radius = 3,
+	proj_speed = 3,
+	target = function(self, t)
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 10, 100, getParadoxSpellpower(self, t)) end,
+	action = function(self, t)
+		local tg = {type="beam", range=self:getTalentRange(t), talent=t, display={particle="icestorm"}}
+		local x, y = self:getTarget(tg)
+		if not x or not y  then return nil end
+		local _ _, _, _, x, y = self:canProject(tg, x, y)
+		
+		-- Store some values inside the target table so they're not lost when we reload
+		tg.chrono_sphere = {}
+		tg.chrono_sphere.dam = self:spellCrit(t.getDamage(self, t))
+		tg.chrono_sphere.strip = self:isTalentActive(self.T_FRACTURED_SPACE) and self:isTalentActive(self.T_FRACTURED_SPACE).charges >=6 or false
+		if tg.chrono_sphere.strip then self:isTalentActive(self.T_FRACTURED_SPACE).charges = 0; tg.chrono_sphere.power = getParadoxSpellpower(self, t) end
+		
+		-- A beam projectile
+		self:projectile(tg, x, y, function(px, py, tg, self)
+			-- That projects balls as it moves
+			local tg2 = self:getTalentTarget(self:getTalentFromId(self.T_SPHERE_OF_DESTRUCTION))
+			self:project(tg2, px, py, function(px2, py2)
+				local DamageType = require "engine.DamageType"
+				DamageType:get(DamageType.WARP).projector(self, px2, py2, DamageType.WARP, tg.chrono_sphere.dam)
+				
+				-- Do we strip a sustain?
+				if tg.chrono_sphere.strip then
+					local target = game.level.map(px2, py2, engine.Map.ACTOR)
+					if not target then return end
+
+					local effs = {}
+					-- Go through all sustained spells
+					for tid, act in pairs(target.sustain_talents) do
+						if act then
+							effs[#effs+1] = {"talent", tid}
+						end
+					end
+
+					if #effs == 0 then return end
+					local eff = rng.table(effs)
+
+					if self:checkHit(tg.chrono_sphere.power, target:combatSpellResist(), 0, 95, 5) then
+						target:crossTierEffect(target.EFF_SPELLSHOCKED, tg.chrono_sphere.power)
+						target:forceUseTalent(eff[2], {ignore_energy=true})
+					end
+				end
+			end)
+		end)
+		
+		game:playSoundNear(self, "talents/icestorm")
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)/2
+		return ([[Create a Sphere of Destruction that travels towards the target location, inflicting %0.2f physical and %0.2f temporal (warp) damage in a radius of three.
+		If Fractured Space is fully charged the Sphere will remove a single sustain from targets it damages.  This will consume your Fractured Space charges.
+		The sphere can hit a single target multiple times in one turn and the damage will scale with your Spellpower.]])
+		:format(damDesc(self, DamageType.PHYSICAL, damage), damDesc(self, DamageType.TEMPORAL, damage))
+	end,
+}
diff --git a/game/modules/tome/data/talents/chronomancy/speed-control.lua b/game/modules/tome/data/talents/chronomancy/speed-control.lua
index 254cc93594..acbd0d107c 100644
--- a/game/modules/tome/data/talents/chronomancy/speed-control.lua
+++ b/game/modules/tome/data/talents/chronomancy/speed-control.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Icons, Particles, Timed Effect Particles
+-- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
 	name = "Celerity",
@@ -25,19 +25,18 @@ newTalent{
 	require = chrono_req1,
 	points = 5,
 	mode = "passive",
-	getSpeed = function(self, t) return self:combatTalentScale(t, 0.1, 0.25, 0.5) end,
-	doCelerity = function(self, t)
-		local speed = t.getSpeed(self, t)
-		
-		self:setEffect(self.EFF_CELERITY, 3, {speed=speed, charges=1, max_charges=3})
-		
+	getSpeed = function(self, t) return self:combatTalentScale(t, 10, 30)/100 end,
+	doCelerity = function(self, t, x, y)
+		if self.x ~= x or self.y ~= x then
+			local speed = t.getSpeed(self, t)
+			self:setEffect(self.EFF_CELERITY, 1, {speed=speed, charges=1, max_charges=3})
+		end
 		return true
 	end,
 	info = function(self, t)
 		local speed = t.getSpeed(self, t) * 100
-		return ([[When you move you gain %d%% movement speed, stacking up to three times.
-		Performing any action other than movement will break this effect.]]):
-		format(speed, speed)
+		return ([[When you move you gain %d%% movement speed for one turn.  This effect stacks up to three times.
+		]]):format(speed)
 	end,
 }
 
@@ -48,11 +47,12 @@ newTalent{
 	points = 5,
 	sustain_paradox = 36,
 	mode = "sustained",
+	no_sustain_autoreset = true,
 	cooldown = 12,
 	tactical = { ATTACKAREA = 1, DISABLE = 3 },
 	range = 0,
-	radius = 3,
-	getSlow = function(self, t) return math.min(self:combatTalentSpellDamage(t, 10, 25, getParadoxSpellpower(self))/ 100 , 0.6) end,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2.5, 4.5)) end,
+	getSlow = function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/100 end,
 	target = function(self, t)
 		return {type="ball", range=self:getTalentRange(t), friendlyfire=false, radius = self:getTalentRadius(t), talent=t}
 	end,
@@ -70,18 +70,23 @@ newTalent{
 		else
 			p.charges = math.min(p.charges + 1, 3)
 		end
+		
 		-- Dilate Time
 		if p.charges > 0 and not self.resting then
 			self:project(self:getTalentTarget(t), self.x, self.y, function(px, py)
 				local target = game.level.map(px, py, Map.ACTOR)
 				if not target then return end
-				target:setEffect(target.EFF_SLOW, 2, {power=p.power*p.charges, apply_power=self:combatSpellpower(), no_ct_effect=true})		
+				target:setEffect(target.EFF_SLOW, 1, {power=p.power*p.charges, apply_power=getParadoxSpellpower(self, t), no_ct_effect=true})		
 			end)
 		end
 	end,
+	updateOnTeleport = function(self, t, x, y)
+		local p = self:isTalentActive(self.T_TIME_DILATION)
+		p.x, p.y = x, y
+	end,
 	activate = function(self, t)
 		local ret ={
-			x = self.x, y=self.y, power = t.getSlow(self, t), charges = 0
+			x = self.x, y=self.y, power = t.getSlow(self, t)/3, charges = 0
 		}
 		game:playSoundNear(self, "talents/arcane")
 		return ret
@@ -92,9 +97,10 @@ newTalent{
 	end,
 	info = function(self, t)
 		local slow = t.getSlow(self, t) * 100
-		return ([[Time Dilates around you, reducing the speed of all enemies within a radius of three by up to %d%%.  This effect builds gradually over three turns and loses %d%% power each time you move.
-		The speed decrease will scale with your Spellpower]]):
-		format(slow*3, slow)
+		local radius = self:getTalentRadius(t)
+		return ([[Time Dilates around you, reducing the speed of all enemies within a radius of %d by up to %d%%.  This effect builds gradually over three turns and loses %d%% power each time you move.
+		Movement via teleport will not lower the power and the speed decrease will scale with your Spellpower.]]):
+		format(radius, slow, slow/3)
 	end,
 }
 
@@ -106,15 +112,23 @@ newTalent{
 	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
 	cooldown = 24,
 	tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 },
-	getPower = function(self, t) return self:combatScale(self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)), 0, 0, 0.57, 57, 0.75) end,
+	getPower= function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/300 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 4) end,
+	no_energy = true,
 	action = function(self, t)
-		self:setEffect(self.EFF_SPEED, 4, {power=t.getPower(self, t)})
+		local celerity = self:hasEffect(self.EFF_CELERITY) and self:hasEffect(self.EFF_CELERITY).charges or 0
+		local dilation = self:isTalentActive(self.T_TIME_DILATION) and self:isTalentActive(self.T_TIME_DILATION).charges or 0
+		local move = t.getPower(self, t) * celerity
+		local speed = t.getPower(self, t) * dilation
+		
+		self:setEffect(self.EFF_HASTE, t.getDuration(self, t), {move=move, speed=speed})
 		return true
 	end,
 	info = function(self, t)
-		local power = t.getPower(self, t)
-		return ([[Increases your global speed by %d%% for the next 4 game turns.
-		The speed increase will scale with your Spellpower.]]):format(100 * power)
+		local duration = t.getDuration(self, t)
+		local power = t.getPower(self, t) * 100
+		return ([[Increases your movement speed by %d%% per stack of Celerity and your attack, spell, and mind speed by %d%% per stack of Time Dilation for the next %d game turns.
+		The speed increase will scale with your Spellpower.]]):format(power, power, duration)
 	end,
 }
 
@@ -123,31 +137,33 @@ newTalent{
 	type = {"chronomancy/speed-control", 4},
 	require = chrono_req4,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 48) end,
+	paradox = function (self, t) return getParadoxCost(self, t, 24) end,
 	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 45, 25)) end, -- Limit >10
 	tactical = { BUFF = 2, CLOSEIN = 2, ESCAPE = 2 },
 	no_energy = true,
 	on_pre_use = function(self, t, silent)
 		local time_dilated = false
 		if self:isTalentActive(self.T_TIME_DILATION) then
-			local t, p = self:getTalentFromId(self.T_TIME_DILATION), self:isTalentActive(self.T_TIME_DILATION)
+			local p = self:isTalentActive(self.T_TIME_DILATION)
 			if p.charges == 3 then
 				time_dilated = true
 			end
 		end
-		if not time_dilated then if not silent then game.logPlayer(self, "Time must be fully dilated in order to stop time.") end return false end return true 
+		if not time_dilated then if not silent then game.logPlayer(self, "Time must be fully dilated in order to cast time stop.") end return false end return true 
 	end,
-	getReduction = function(self, t) return 80 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self)), 30) end,
+	getReduction = function(self, t) return 80 - paradoxTalentScale(self, t, 0, 20, 40) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 2) end,
 	action = function(self, t)
-		self.energy.value = self.energy.value + 2000
-		self:setEffect(self.EFF_TIME_STOP, 2, {power=t.getReduction(self, t)})
+		self.energy.value = self.energy.value + (t.getDuration(self, t) * 1000)
+		self:setEffect(self.EFF_TIME_STOP, 1, {power=t.getReduction(self, t)})
 		game.logSeen(self, "#STEEL_BLUE#%s has stopped time!#LAST#", self.name:capitalize())
 		return true
 	end,
 	info = function(self, t)
+		local duration = t.getDuration(self, t)
 		local reduction = t.getReduction(self, t)
-		return ([[Gain two turns.  During this time your damage will be reduced by %d%%.
+		return ([[Gain %d turns.  During this time your damage will be reduced by %d%%.
 		Time must be fully dilated in order to use this talent.
-		The damage reduction penalty will be lessened by your Spellpower.]]):format(reduction)
+		The damage reduction penalty will be lessened by your Spellpower.]]):format(duration, reduction)
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/spellbinding.lua b/game/modules/tome/data/talents/chronomancy/spellbinding.lua
new file mode 100644
index 0000000000..1921cdc7c7
--- /dev/null
+++ b/game/modules/tome/data/talents/chronomancy/spellbinding.lua
@@ -0,0 +1,156 @@
+-- ToME - Tales of Maj'Eyal
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+-- EDGE TODO: Particles, Timed Effect Particles
+
+newTalent{
+	name = "Empower",
+	type = {"chronomancy/spellbinding", 1},
+	require = chrono_req_high1,
+	points = 5,
+	sustain_paradox = 24,
+	mode = "sustained",
+	no_sustain_autoreset = true,
+	cooldown = 10,
+	no_npc_use = true,
+	allow_temporal_clones = true,
+	getPower = function(self, t) return self:combatTalentLimit(t, 1, 0.1, 0.5) end,
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- temporal clones *CAN* learn spellbinding talents but can't change the value
+	activate = function(self, t)
+		local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyEmpower").new(self))
+		if not talent then return nil end
+
+		return {
+			talent = talent, rest_count = 0
+		}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local power = t.getPower(self, t) * 100
+		local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None"
+		return ([[Empowers the selected chronomancy spell, increasing spellpower when casting it by %d%%.
+		
+		Current Empowered Spell: %s]]):
+		format(power, talent)
+	end,
+}
+
+newTalent{
+	name = "Extension",
+	type = {"chronomancy/spellbinding", 1},
+	require = chrono_req_high1,
+	points = 5,
+	sustain_paradox = 24,
+	mode = "sustained",
+	no_sustain_autoreset = true,
+	cooldown = 10,
+	no_npc_use = true,
+	allow_temporal_clones = true,
+	getPower = function(self, t) return self:combatTalentLimit(t, 0.5, 0.05, 0.25) end,
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- temporal clones *CAN* learn spellbinding talents but can't change the value
+	activate = function(self, t)
+		local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyExtension").new(self))
+		if not talent then return nil end
+				
+		return {
+			talent = talent, rest_count = 0
+		}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local power = t.getPower(self, t) * 100
+		local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None"
+		return ([[Extends the duration of the selected chronomancy spell by %d%%.
+		
+		Current Extended Spell: %s]]):
+		format(power, talent)
+	end,
+}
+
+newTalent{
+	name = "Matrix",
+	type = {"chronomancy/spellbinding", 1},
+	require = chrono_req_high1,
+	points = 5,
+	sustain_paradox = 24,
+	mode = "sustained",
+	no_sustain_autoreset = true,
+	cooldown = 10,
+	no_npc_use = true,
+	allow_temporal_clones = true,
+	getPower = function(self, t) return self:combatTalentLimit(t, 0.5, 0.05, 0.25) end,
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- temporal clones *CAN* learn spellbinding talents but can't change the value
+	activate = function(self, t)
+		local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyMatrix").new(self))
+		if not talent then return nil end
+				
+		return {
+			talent = talent, rest_count = 0
+		}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local power = t.getPower(self, t) * 100
+		local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None"
+		return ([[Reduces the cooldown of the selected chronomancy spell by %d%%.
+		
+		Current Matrix Spell: %s]]):
+		format(power, talent)
+	end,
+}
+
+newTalent{
+	name = "Quicken",
+	type = {"chronomancy/spellbinding", 1},
+	require = chrono_req_high1,
+	points = 5,
+	sustain_paradox = 24,
+	mode = "sustained",
+	no_sustain_autoreset = true,
+	cooldown = 10,
+	no_npc_use = true,  -- so rares don't learn useless talents
+	allow_temporal_clones = true,  -- let clones copy it anyway so they can benefit from the effects
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- but don't let them cast it
+	getPower = function(self, t) return self:combatTalentLimit(t, 1, 0.1, 0.5) end,
+	activate = function(self, t)
+		local talent = self:talentDialog(require("mod.dialogs.talents.ChronomancyQuicken").new(self))
+		if not talent then return nil end
+				
+		return {
+			talent = talent, rest_count = 0
+		}
+	end,
+	deactivate = function(self, t, p)
+		return true
+	end,
+	info = function(self, t)
+		local power = t.getPower(self, t) * 100
+		local talent = self:isTalentActive(t.id) and self:getTalentFromId(self:isTalentActive(t.id).talent).name or "None"
+		return ([[Reduces the casting speed of the selected chronomancy spell by %d%%.
+		
+		Current Quickened Spell: %s]]):
+		format(power, talent)
+	end,
+}
diff --git a/game/modules/tome/data/talents/chronomancy/temporal-archery.lua b/game/modules/tome/data/talents/chronomancy/temporal-archery.lua
index 777cf93355..41dac39492 100644
--- a/game/modules/tome/data/talents/chronomancy/temporal-archery.lua
+++ b/game/modules/tome/data/talents/chronomancy/temporal-archery.lua
@@ -80,7 +80,7 @@ newTalent{
 	cooldown = 10,
 	tactical = { BUFF = 2 },
 	no_energy = true,
-	getPower = function(self, t) return 10 + self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self)) end,
+	getPower = function(self, t) return 10 + self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self, t)) end,
 	activate = function(self, t)
 		local power = t.getPower(self, t)
 		return {
diff --git a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
index 7622814fe1..87d8930df7 100644
--- a/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
+++ b/game/modules/tome/data/talents/chronomancy/temporal-hounds.lua
@@ -29,7 +29,7 @@ summonTemporalHound = function(self, t)
 	end
 	
 	local m = require("mod.class.NPC").new{
-		type = "animal", subtype = "hounds",
+		type = "animal", subtype = "canine",
 		display = "C", image = "npc/summoner_wardog.png",
 		color=colors.LIGHT_DARK, shader = "shadow_simulacrum",
 		shader_args = { color = {0.6, 0.6, 0.2}, base = 0.8, time_factor = 1500 },
@@ -51,9 +51,10 @@ summonTemporalHound = function(self, t)
 		infravision = 10,
 
 		combat_armor = 2, combat_def = 4,
-		combat = { dam=self:getTalentLevel(t) * 10 + rng.avg(12,25), atk=10, apr=10, dammod={str=0.8}, damtype=DamageType.MATTER, sound="creatures/wolves/wolf_attack_1" },
+		combat = { dam=self:getTalentLevel(t) * 10 + rng.avg(12,25), atk=10, apr=10, dammod={str=0.8, mag=0.8}, damtype=DamageType.WARP, sound="creatures/wolves/wolf_attack_1" },
 		
 		summoner = self, summoner_gain_exp=true,
+		resolvers.sustains_at_birth(),
 	}
 	
 	m:resolve()
@@ -130,6 +131,7 @@ summonTemporalHound = function(self, t)
 		})
 	end
 	
+	self:attr("summoned_times", 1)
 end
 
 newTalent{
@@ -187,7 +189,7 @@ newTalent{
 		
 		-- unsummon the hounds :(
 		for _, e in pairs(game.level.entities) do
-			if e.summoner and e.summoner == self and e.subtype == "hounds" then
+			if e.summoner and e.summoner == self and e.name == "temporal hound" then
 				e.summon_time = 0
 			end
 		end
@@ -217,7 +219,7 @@ newTalent{
 	requires_target = true,
 	on_pre_use = function(self, t, silent)
 		local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS)
-		if not p then
+		if not p or p.hounds < 1 then
 			if not silent then
 				game.logPlayer(self, "You must have temporal hounds to use this talent.")
 			end
@@ -230,7 +232,7 @@ newTalent{
 	end,
 	direct_hit = true,
 	getDefense = function(self, t)
-		return self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self))
+		return self:combatTalentSpellDamage(t, 10, 40, getParadoxSpellpower(self, t))
 	end,
 	action = function(self, t)
 		-- Pick our target
@@ -244,17 +246,19 @@ newTalent{
 		local __, x, y = self:canProject(tg, x, y)
 	
 		-- Summon a new Hound
-		local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS)
-		local talent = self:getTalentFromId(self.T_TEMPORAL_HOUNDS)
-		if p.hounds < p.max_hounds then
-			summonTemporalHound(self, talent)
-			p.hounds = p.hounds + 1
-		end		
+		if self:getTalentLevel(t) >=5 then
+			local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS)
+			local talent = self:getTalentFromId(self.T_TEMPORAL_HOUNDS)
+			if p.hounds < p.max_hounds then
+				summonTemporalHound(self, talent)
+				p.hounds = p.hounds + 1
+			end
+		end
 	
 		-- Find our hounds
 		local hnds = {}
 		for _, e in pairs(game.level.entities) do
-			if e.summoner and e.summoner == self and e.subtype == "hounds" then
+			if e.summoner and e.summoner == self and e.name == "temporal hound" then
 				hnds[#hnds+1] = e
 			end
 		end
@@ -290,7 +294,7 @@ newTalent{
 		local defense = t.getDefense(self, t)
 		return ([[Command your Temporal Hounds to teleport to the targeted location.  If you target a creature with this effect your hounds will set that creature as their target.
 		When you learn this talent, your hounds gain %d defense and %d%% resist all after any teleport.
-		If you're not at your maximum number of hounds when you cast this spell a new one will be summoned.
+		At talent level five, if you're not at your maximum number of hounds when you cast this spell a new one will be summoned.
 		The teleportation bonuses scale with your Spellpower.]]):format(defense, defense, defense/2, defense/2)
 	end,
 }
@@ -304,9 +308,9 @@ newTalent{
 	getImmunities = function(self, t)
 		return self:combatTalentLimit(t, 1, 0.15, 0.50) -- Limit <100%
 	end,
-	getRegen = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self)) end,
-	getHaste = function(self, t) return self:combatScale(self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)), 0, 0, 0.57, 57, 0.75) end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end,
+	getRegen = function(self, t) return self:combatTalentSpellDamage(t, 10, 50, getParadoxSpellpower(self, t)) end,
+	getHaste = function(self, t) return paradoxTalentScale(self, t, 20, 50, 80)/100 end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 6))) end,
 	doBlink = function(self, t, hound)  -- Triggered when the hounds is hit
 		local regen, haste = t.getRegen(self, t), t.getHaste(self, t)
 		if hound:hasEffect(hound.EFF_UNRAVEL) then
@@ -348,7 +352,7 @@ newTalent{
 	direct_hit = true,
 	on_pre_use = function(self, t, silent)
 		local p = self:isTalentActive(self.T_TEMPORAL_HOUNDS)
-		if not p then
+		if not p or p.hounds < 1 then
 			if not silent then
 				game.logPlayer(self, "You must have temporal hounds to use this talent.")
 			end
@@ -359,7 +363,7 @@ newTalent{
 	getResists = function(self, t)
 		return self:combatTalentLimit(t, 100, 15, 50) -- Limit <100%
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end,
 	getDamageStat = function(self, t) return 2 + math.ceil(t.getDamage(self, t) / 15) end,
 	target = function(self, t)
 		return {type="cone", range=0, radius=self:getTalentRadius(t), selffire=false, talent=t}
@@ -371,7 +375,7 @@ newTalent{
 		local grids = core.fov.circle_grids(self.x, self.y, self:getTalentRange(t), true)
 		for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
 			local a = game.level.map(x, y, Map.ACTOR)
-			if a and a.summoner == self and a.subtype == "hounds" then
+			if a and a.summoner == self and a.name == "temporal hound" then
 				hounds[#hounds+1] = a
 				tg[#tg+1] = {type="cone", range=0, radius=self:getTalentRadius(t), start_x=a.x, start_y=a.y, selffire=false, talent=t}
 			end
@@ -397,7 +401,7 @@ newTalent{
 				DamageType:get(DamageType.TEMPORAL).projector(a, px, py, DamageType.TEMPORAL, dam)
 				-- Don't turn back the clock other hounds
 				local target = game.level.map(px, py, Map.ACTOR)
-				if target and target.subtype ~= "hounds" then
+				if target and target.name ~= "temporal hound" then
 					target:setEffect(target.EFF_TURN_BACK_THE_CLOCK, 3, {power=t.getDamageStat(self, t), apply_power=a:combatSpellpower(), min_dur=1})
 				end	
 			end)
diff --git a/game/modules/tome/data/talents/chronomancy/threaded-combat.lua b/game/modules/tome/data/talents/chronomancy/threaded-combat.lua
index 482b4bb921..6501ddbac6 100644
--- a/game/modules/tome/data/talents/chronomancy/threaded-combat.lua
+++ b/game/modules/tome/data/talents/chronomancy/threaded-combat.lua
@@ -17,7 +17,7 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Talents, Icons, Particles, Timed Effect Particles
+-- EDGE TODO: Particles, Timed Effect Particles
 
 newTalent{
 	name = "Frayed Threads",
@@ -25,12 +25,12 @@ newTalent{
 	require = chrono_req_high1,
 	mode = "passive",
 	points = 5,
-	getPercent = function(self, t) return math.min(100, self:combatTalentSpellDamage(t, 20, 80, getParadoxSpellpower(self)))/100 end,
+	getPercent = function(self, t) return paradoxTalentScale(self, t, 40, 80, 100)/100 end,
 	getRadius = function(self, t) return self:getTalentLevel(t) > 4 and 2 or 1 end,
 	info = function(self, t)
 		local percent = t.getPercent(self, t) * 100
 		local radius = t.getRadius(self, t)
-		return ([[Your Weapon Folding and Impact spells now deal %d%% of their damage in a radius of %d.
+		return ([[Your Weapon Folding and Impact spells now deal an additional %d%% damage in a radius of %d.
 		The damage percent will scale with your Spellpower.]])
 		:format(percent, radius)
 	end
@@ -46,7 +46,7 @@ newTalent{
 	tactical = { ATTACKAREA = { weapon = 3 } , DISABLE = 3 },
 	requires_target = true,
 	range = archery_range,
-	no_energy = "fake",
+	speed = function(self, t) return self:hasArcheryWeapon("bow") and "archery" or "weapon" end,
 	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 1.9) end,
 	getCooldown = function(self, t) return self:getTalentLevel(t) >= 5 and 2 or 1 end,
 	on_pre_use = function(self, t, silent) if self:attr("disarmed") then if not silent then game.logPlayer(self, "You require a weapon to use this talent.") end return false end return true end,
@@ -62,7 +62,7 @@ newTalent{
 		for tid, cd in pairs(self.talents_cd) do
 			local tt = self:getTalentFromId(tid)
 			if tt.type[1]:find("^chronomancy/blade") then
-				self.talents_cd[tid] = cd - t.getCooldown(self, t)
+				self:alterTalentCoolingdown(tt, - t.getCooldown(self, t))
 			end
 		end
 	end,
@@ -73,7 +73,7 @@ newTalent{
 				
 		if self:hasArcheryWeapon("bow") then
 			-- Ranged attack
-			local targets = self:archeryAcquireTargets(tg, {one_shot=true})
+			local targets = self:archeryAcquireTargets(tg, {one_shot=true, no_energy = true})
 			if not targets then return end
 			self:archeryShoot(targets, t, tg, {mult=dam})
 		elseif mainhand then
@@ -81,13 +81,13 @@ newTalent{
 			self:project(tg, self.x, self.y, function(px, py, tg, self)
 				local target = game.level.map(px, py, Map.ACTOR)
 				if target and target ~= self then
-					local hit = self:attackTarget(target, nil, dam)
+					local hit = self:attackTarget(target, nil, dam, true)
 					-- Refresh bow talents
 					if hit then
 						for tid, cd in pairs(self.talents_cd) do
 							local tt = self:getTalentFromId(tid)
 							if tt.type[1]:find("^chronomancy/bow") then
-								self.talents_cd[tid] = cd - t.getCooldown(self, t)
+								self:alterTalentCoolingdown(tt, - t.getCooldown(self, t))
 							end
 						end
 					end
@@ -118,7 +118,7 @@ newTalent{
 	require = chrono_req_high3,
 	mode = "passive",
 	points = 5,
-	getPercent = function(self, t) return math.min(50, 10 + self:combatTalentSpellDamage(t, 0, 30, getParadoxSpellpower(self)))/100 end,
+	getPercent = function(self, t) return paradoxTalentScale(self, t, 10, 30, 50)/100 end,
 	info = function(self, t)
 		local percent = t.getPercent(self, t) * 100
 		return ([[Your Bow Threading and Blade Threading spells now deal %d%% more weapon damage if you did not have the appropriate weapon equipped when you initated the attack.
@@ -136,8 +136,8 @@ newTalent{
 	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 15, 45, 25)) end, -- Limit >15
 	tactical = { ATTACK = {weapon = 4} },
 	range = 10,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 6, 12)) end,
-	getDamagePenalty = function(self, t) return 60 - math.min(self:combatTalentSpellDamage(t, 0, 20, getParadoxSpellpower(self)), 30) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 6, 12))) end,
+	getDamagePenalty = function(self, t) return 60 - paradoxTalentScale(self, t, 0, 20, 30) end,
 	requires_target = true,
 	target = function(self, t)
 		return {type="hit", range=self:getTalentRange(t)}
@@ -168,7 +168,6 @@ newTalent{
 			local tids = {}
 			for tid, _ in pairs(m.talents) do
 				local t = m:getTalentFromId(tid)
-				if t.remove_on_clone then tids[#tids+1] = t end
 				local tt = self:getTalentFromId(tid)
 				if not tt.type[1]:find("^chronomancy/blade") and not tt.type[1]:find("^chronomancy/threaded") and not tt.type[1]:find("^chronomancy/guardian") then
 					tids[#tids+1] = t 
@@ -181,11 +180,12 @@ newTalent{
 			
 			m.ai_state = { talent_in=2, ally_compassion=10 }	
 			m.generic_damage_penalty = t.getDamagePenalty(self, t)
-			m:setTarget(target or nil)
 			m.remove_from_party_on_death = true
 			
 			game.zone:addEntity(game.level, m, "actor", tx, ty)
 			
+			m:setTarget(target or nil)
+			
 			if game.party:hasMember(self) then
 				game.party:addMember(m, {
 					control="no",
@@ -234,7 +234,6 @@ newTalent{
 			local tids = {}
 			for tid, _ in pairs(m.talents) do
 				local t = m:getTalentFromId(tid)
-				if t.remove_on_clone then tids[#tids+1] = t end
 				local tt = self:getTalentFromId(tid)
 				if not tt.type[1]:find("^chronomancy/bow") and not tt.type[1]:find("^chronomancy/threaded") and not tt.type[1]:find("^chronomancy/guardian") and not t.innate then
 					tids[#tids+1] = t 
@@ -248,11 +247,12 @@ newTalent{
 			m.ai_state = { talent_in=2, ally_compassion=10 }
 			m.generic_damage_penalty = t.getDamagePenalty(self, t)
 			m:attr("archery_pass_friendly", 1)
-			m:setTarget(target or nil)
 			m.remove_from_party_on_death = true
 			
 			game.zone:addEntity(game.level, m, "actor", tx, ty)
 			
+			m:setTarget(target or nil)
+			
 			if game.party:hasMember(self) then
 				game.party:addMember(m, {
 					control="no",
@@ -283,6 +283,6 @@ newTalent{
 		local damage_penalty = t.getDamagePenalty(self, t)
 		return ([[Summons a blade warden and a bow warden from an alternate timeline for %d turns.  The wardens are out of phase with this reality and deal %d%% less damage but the bow warden's arrows will pass through friendly targets.
 		Each warden knows all Threaded Combat, Temporal Guardian, and Blade Threading or Bow Threading spells you know.
-		The damage reduction penalty will be lessened by your Spellpower.]]):format(duration, damage_penalty)
+		The damage penalty will be lessened by your Spellpower.]]):format(duration, damage_penalty)
 	end,
 }
diff --git a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
index a2d943c2fa..609beb7d15 100644
--- a/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
+++ b/game/modules/tome/data/talents/chronomancy/timeline-threading.lua
@@ -17,157 +17,453 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
+-- EDGE TODO: Particles, Timed Effect Particles
+
 newTalent{
-	name = "Gather the Threads",
+	name = "Rethread",
 	type = {"chronomancy/timeline-threading", 1},
-	require = chrono_req_high1,
+	require = chrono_req1,
 	points = 5,
+	cooldown = 4,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	cooldown = 12,
-	tactical = { BUFF = 2 },
-	getThread = function(self, t) return self:combatTalentScale(t, 7, 30, 0.75) end,
-	getReduction = function(self, t) return self:combatTalentScale(t, 3.6, 15, 0.75) end,
+	tactical = { ATTACKAREA = {TEMPORAL = 2}, PARADOX = 2 },
+	range = 10,
+	direct_hit = true,
+	reflectable = true,
+	requires_target = true,
+	target = function (self, t)
+		return {type="bolt", range=self:getTalentRange(t), talent=t}
+	end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 230, getParadoxSpellpower(self, t)) end,
+	getTargetCount = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6, "log")) end,
 	action = function(self, t)
-		self:setEffect(self.EFF_GATHER_THE_THREADS, 5, {power=t.getThread(self, t), reduction=t.getReduction(self, t)})
-		game:playSoundNear(self, "talents/spell_generic2")
+		local tg = self:getTalentTarget(t)
+		local fx, fy = self:getTarget(tg)
+		if not fx or not fy then return nil end
+
+		local nb = t.getTargetCount(self, t)
+		local affected = {}
+		local braid_targets = {}
+		local first = nil
+		
+		self:project(tg, fx, fy, function(dx, dy)
+			local actor = game.level.map(dx, dy, Map.ACTOR)
+			if actor and not affected[actor] then
+				affected[actor] = true
+				first = actor
+
+				self:project({type="ball", selffire=false, x=dx, y=dy, radius=10, range=0}, dx, dy, function(bx, by)
+					local actor = game.level.map(bx, by, Map.ACTOR)
+					if actor and not affected[actor] and self:reactionToward(actor) < 0 then
+						affected[actor] = true
+					end
+				end)
+				return true
+			end
+		end)
+
+		if not first then return end
+		local targets = { first }
+		affected[first] = nil
+		local possible_targets = table.listify(affected)
+
+		for i = 2, nb do
+			if #possible_targets == 0 then break end
+			local act = rng.tableRemove(possible_targets)
+			targets[#targets+1] = act[1]
+		end
+
+		local sx, sy = self.x, self.y
+		local damage = self:spellCrit(t.getDamage(self, t))
+		for i, actor in ipairs(targets) do
+			local tgr = {type="beam", range=self:getTalentRange(t), selffire=false, talent=t, x=sx, y=sy}
+			self:project(tgr, actor.x, actor.y, function(px, py)
+				DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, damage)
+
+				-- Get our braid targets
+				local target = game.level.map(px, py, Map.ACTOR)
+				if target and not target.dead and self:knowTalent(self.T_BRAID_LIFELINES) then
+					braid_targets[#braid_targets+1] = target
+				end
+			end)
+
+			game.level.map:particleEmitter(sx, sy, math.max(math.abs(actor.x-sx), math.abs(actor.y-sy)), "temporalbeam", {tx=actor.x-sx, ty=actor.y-sy})
+			sx, sy = actor.x, actor.y
+		end
+		
+		-- Braid them
+		if #braid_targets > 1 then
+			for i = 1, #braid_targets do
+				local target = braid_targets[i]
+				local t = self:getTalentFromId(self.T_BRAID_LIFELINES)
+				target:setEffect(target.EFF_BRAIDED, t.getDuration(self, t), {power=t.getBraid(self, t), src=self, targets=braid_targets})
+			end
+		end
+		
+		game:playSoundNear(self, "talents/heal")
 		return true
 	end,
 	info = function(self, t)
-		local primary = t.getThread(self, t)
-		local reduction = t.getReduction(self, t)
-		return ([[You begin to gather energy from other timelines. Your Spellpower will increase by %0.2f on the first turn and %0.2f more each additional turn.
-		The effect ends either when you cast a spell, or after five turns.
-		Eacn turn the effect is active, your Paradox will be reduced by %d.
-		This spell will not break Spacetime Tuning, nor will it be broken by activating Spacetime Tuning.]]):format(primary + (primary/5), primary/5, reduction)
+		local damage = t.getDamage(self, t)
+		local targets = t.getTargetCount(self, t)
+		return ([[Rethread the timeline, dealing %0.2f temporal damage to the target before moving on to a second target.
+		Rethread can hit up to %d targets up to 10 grids apart, and will never hit the same one twice; nor will it hit the caster.
+		The damage will increase with your Spellpower.]]):
+		format(damDesc(self, DamageType.TEMPORAL, damage), targets)
 	end,
 }
 
 newTalent{
-	name = "Rethread",
+	name = "Temporal Fugue",
 	type = {"chronomancy/timeline-threading", 2},
-	require = chrono_req_high2,
+	require = chrono_req2,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	cooldown = 4,
-	tactical = { ATTACK = {TEMPORAL = 2} },
-	range = 10,
-	direct_hit = true,
-	reflectable = true,
-	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 200, getParadoxSpellpower(self)) end,
-	getReduction = function(self, t) return self:combatTalentScale(t, 1.2, 5, 0.75) end,
+	cooldown = 24,
+	paradox = function(self, t) return getParadoxCost(self, t, 20) end,
+	tactical = { ATTACK = 2, DISABLE = 2 },
+	remove_on_clone = true,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 8))) end,
+	on_pre_use = function(self, t, silent) if self:hasEffect(self.EFF_TEMPORAL_FUGUE) then return false end return true end,
 	action = function(self, t)
-		local tg = {type="beam", range=self:getTalentRange(t), talent=t}
-		local x, y = self:getTarget(tg)
-		if not x or not y then return nil end
-		local _ _, x, y = self:canProject(tg, x, y, t.paradox)
-		self:project(tg, x, y, DamageType.RETHREAD, {dam=self:spellCrit(t.getDamage(self, t)), reduction = t.getReduction(self, t)})
-		game.level.map:particleEmitter(self.x, self.y, tg.radius, "temporalbeam", {tx=x-self.x, ty=y-self.y})
-		game:playSoundNear(self, "talents/heal")
+		local clones = {self}
+		
+		 -- Clone the caster
+		local function makeFugueClone(self, t)
+			local sex = game.player.female and "she" or "he"
+			local m = makeParadoxClone(self, self, t.getDuration(self, t))
+			-- Add and change some values
+			m.name = self.name
+			m.desc = [[The real you... or so ]]..sex..[[ says.]]
+			m.shader = nil
+			m.shader_args = nil
+			m.faction = self.faction
+			m.summoner = self
+			m.remove_from_party_on_death = true
+			
+			-- Handle some AI stuff
+			m.ai_state = { talent_in=1, ally_compassion=10 }
+			m.ai_tactic = { closein=0, defend=4, disable=4, escape=4, heal=2, safe_range=3}
+			
+			return m
+		end
+		
+		-- Add our clones
+		for i = 1, 2 do
+			local tx, ty = util.findFreeGrid(self.x, self.y, 5, true, {[Map.ACTOR]=true})
+			if tx and ty then
+				-- Make our clone and add to the party
+				local m = makeFugueClone(self, t)
+				if game.party:hasMember(self) then
+					game.party:addMember(m, {
+						control="full",
+						type="fugue clone",
+						title="Fugue Clone",
+						orders = {target=true},
+					})
+				end
+				
+				-- and the level
+				game.zone:addEntity(game.level, m, "actor", tx, ty)
+				game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport")
+				clones[#clones+1] = m
+			end
+		end
+		
+		-- No clones?  Exit the spell
+		if #clones < 2 then
+			game.logPlayer(self, "Not enough space to summon!")
+			return
+		end
+		
+		-- Link them
+		for i = 1, #clones do
+			local target = clones[i]
+			target:setEffect(target.EFF_TEMPORAL_FUGUE, 10, {targets=clones})
+		end
+		
+		game:playSoundNear(self, "talents/spell_generic")
+		
 		return true
 	end,
 	info = function(self, t)
-		local damage = t.getDamage(self, t)
-		local reduction = t.getReduction(self, t)
-		return ([[Creates a wake of temporal energy that deals %0.2f damage in a beam, as you attempt to rethread the timeline.  Affected targets may be stunned, blinded, pinned, or confused for 3 turns.
-		Each target you hit with Rethread will reduce your Paradox by %0.1f.
-		The damage will increase with your Spellpower.]]):
-		format(damDesc(self, DamageType.TEMPORAL, damage), reduction)
+		local duration = t.getDuration(self, t)
+		return ([[For the next %d turns two alternate versions of you enter your timeline.  While the effect is active all damage done by you or your copies is reduced by two thirds and all damage recieved is split between the three of you.
+		Temporal Fugue does not normally cooldown while active.  You may take direct control of your clones.]]):
+		format(duration)
 	end,
 }
 
 newTalent{
-	name = "Temporal Clone",
+	name = "Braid Lifelines",
 	type = {"chronomancy/timeline-threading", 3},
-	require = chrono_req_high3,
+	require = chrono_req3,
+	mode = "passive",
 	points = 5,
-	cooldown = 30,
-	paradox = function (self, t) return getParadoxCost(self, t, 30) end,
-	tactical = { ATTACK = 2, DISABLE = 2 },
+	getBraid = function(self, t) return self:combatTalentSpellDamage(t, 25, 40, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 3, 7))) end,
+	info = function(self, t)
+		local braid = t.getBraid(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[Your Rethread now braids the lifelines of all targets it hits for %d turns.  Braided targets take %d%% of all damage dealt to other braided targets.
+		The amount of damage shared will scale with your Spellpower.]])
+		:format(duration, braid)
+	end
+}
+
+newTalent{
+	name = "Cease to Exist",
+	type = {"chronomancy/timeline-threading", 4},
+	require = chrono_req4,
+	points = 5,
+	cooldown = 24,
+	paradox = function (self, t) return getParadoxCost(self, t, 25) end,
+	range = 10,
+	tactical = { ATTACK = 2 },
 	requires_target = true,
-	range = 6,
-	no_npc_use = true,
-	getDuration = function(self, t) -- limit < cooldown (30)
-		return math.floor(self:combatTalentLimit(self:getTalentLevel(t), t.cooldown, 4, 8))
+	direct_hit = true,
+	no_npc_use = true,  -- so rares don't learn useless talents
+	allow_temporal_clones = true,  -- let clones copy it anyway so they can benefit from the effects
+	on_pre_use = function(self, t, silent) if self ~= game.player then return false end return true end,  -- but don't let them cast it
+	getDuration = function(self, t) return math.floor(self:combatTalentScale(self:getTalentLevel(t), 5, 9)) end,
+	getPower = function(self, t) return paradoxTalentScale(self, t, 20, 50, 100) end,
+	target = function(self, t)
+		return {type="hit", range=self:getTalentRange(t), talent=t}
+	end,
+	on_pre_use = function(self, t, silent)
+		if checkTimeline(self) then
+			if not silent then
+				game.logPlayer(self, "The timeline is too fractured to do this now.")
+			end
+			return false
+		end
+		return true
+	end,
+	do_instakill = function(self, t)
+		-- search for target because it's ID will change when the chrono restore takes place
+		local tg = false
+		local grids = core.fov.circle_grids(self.x, self.y, 10, true)
+		for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do
+			local a = game.level.map(x, y, Map.ACTOR)
+			if a and a:hasEffect(a.EFF_CEASE_TO_EXIST) then
+				tg = a
+			end
+		end end
+		
+		if tg then
+			game:onTickEnd(function()
+				tg:removeEffect(tg.EFF_CEASE_TO_EXIST)
+				game.logSeen(tg, "#LIGHT_BLUE#%s never existed, this never happened!", tg.name:capitalize())
+				tg:die(self)
+			end)
+		end
 	end,
-	getSize = function(self, t) return 2 + math.ceil(self:getTalentLevelRaw(t) / 2 ) end,
 	action = function(self, t)
-		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
-		local tx, ty, target = self:getTarget(tg)
-		if not tx or not ty then return nil end
-		local _ _, _, _, tx, ty = self:canProject(tg, tx, ty)
+		-- get our target
+		local tg = self:getTalentTarget(t)
+		local tx, ty = self:getTarget(tg)
 		if not tx or not ty then return nil end
+		local _ _, tx, ty = self:canProject(tg, tx, ty)
+		
 		local target = game.level.map(tx, ty, Map.ACTOR)
-		if not target or self:reactionToward(target) >= 0 then return end
+		if not target then return end
 
-		-- Find space
-		local x, y = util.findFreeGrid(tx, ty, 1, true, {[Map.ACTOR]=true})
-		if not x then
-			game.logPlayer(self, "Not enough space to summon!")
-			return
+		if target == self then
+			game.logSeen(self, "#LIGHT_STEEL_BLUE#%s tries to remove %sself from existance!", self.name, string.his_her(self))
+			self:incParadox(400)
+			game.level.map:particleEmitter(self.x, self.y, 1, "ball_temporal", {radius=1, tx=self.x, ty=self.y})
+			return true
 		end
-
-		local allowed = t.getSize(self, t)
-
-		if target.rank >= 3.5 or -- No boss
-			target:reactionToward(self) >= 0 or -- No friends
-			target.size_category > allowed
-			then
+		
+		-- does the spell hit?  if not nothing happens
+		if not self:checkHit(getParadoxSpellpower(self, t), target:combatSpellResist()) then
 			game.logSeen(target, "%s resists!", target.name:capitalize())
 			return true
 		end
+	
+		-- Manualy start cooldown before the chronoworld is made
+		game.player:startTalentCooldown(t)
+		
+		-- set up chronoworld next, we'll load it when the target dies in class\actor
+		game:onTickEnd(function()
+			game:chronoClone("cease_to_exist")
+		end)
+		
+		-- Set our effect
+		target:setEffect(target.EFF_CEASE_TO_EXIST, t.getDuration(self,t), {src=self, power=t.getPower(self,t)})
+				
+		return true
+	end,
+	info = function(self, t)
+		local duration = t.getDuration(self, t)
+		local power = t.getPower(self, t)
+		return ([[Over the next %d turns, you attempt to remove the target from the timeline, lowering all its resistance by %d%%.
+		If you manage to kill the target while the spell is in effect, you'll be returned to the point in time you cast this spell and the target will be slain.
+		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
+		The resistance penalty will scale with your Spellpower.]])
+		:format(duration, power)
+	end,
+}
 
-		local m = target:cloneFull{
-			no_drops = true,
-			faction = self.faction,
-			summoner = self, summoner_gain_exp=true,
-			exp_worth = 0, -- bug fix
-			summon_time = t.getDuration(self, t),
-			ai_target = {actor=target},
-			ai = "summoned", ai_real = target.ai,
-		}
-		m:removeAllMOs()
-		m.make_escort = nil
-		m.on_added_to_level = nil
-		
-		m.energy.value = 0
-		m.life = m.life
-		m.forceLevelup = function() end
-		-- Handle special things
-		m.on_die = nil
-		m.on_acquire_target = nil
-		m.seen_by = nil
-		m.can_talk = nil
-		m.clone_on_hit = nil
-		if m.talents.T_SUMMON then m.talents.T_SUMMON = nil end
-		if m.talents.T_MULTIPLY then m.talents.T_MULTIPLY = nil end
-
+-- This was a really cool affect but the game really assumes that the player is on the map
+-- I suspect there's a lot of unforseen bugs in this code but I'm leaving it here incase someone else wants to attempt to do something similar in the future
+--[=[newTalent{
+	name = "Temporal Fugue",
+	type = {"chronomancy/timeline-threading", 2},
+	require = chrono_req2,
+	points = 5,
+	cooldown = 12,
+	paradox = function (self, t) return getParadoxCost(self, t, 15) end,
+	tactical = { DISABLE = 3 },
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 4, 8))) end,
+	getDamagePenalty = function(self, t) return 80 - paradoxTalentScale(self, t, 0, 20, 40) end,
+	getClones = function(self, t) return 3 end,
+	on_pre_use = function(self, t, silent) if self ~= game.player and self.fugue_clones then return false end return true end,
+	action = function(self, t)
+		-- If the spell is active cancel the effect	
+		if self.fugue_clones then
+			for _, e in pairs(game.level.entities) do
+				if e.summoner and e.summoner == self.summoner and e.fugue_clones and e ~= self then
+					e:die()
+				end
+			end
+			return true
+		end
+		
+		-- Remove the player
+		local x, y = self.x, self.y
+		game.level.map:particleEmitter(self.x, self.y, 1, "temporal_teleport")
+		game.level:removeEntity(self, true)
+		
+		-- Setup our Fugue Clones
+		local fugue_count = 0
+		local function makeFugueClone(self, t, x, y)
+			local m = makeParadoxClone(self, self, t.getDuration(self, t))
+			
+			-- Flavor :)
+			local sex = self.female and "she" or "he"
+			m.name = self.name
+			m.desc = [[The real ]]..self.name:capitalize()..[[... or so ]]..sex..[[ says.]]
+			m.shader = nil
+			m.shader_args = nil
+			 
+			-- Add and change some values
+			m.generic_damage_penalty = t.getDamagePenalty(self, t)
+			m.max_life = m.max_life * (100 - t.getDamagePenalty(self, t))/100
+			m.life = m.max_life
+			m.remove_from_party_on_death = true
+			m.timetravel_immune = 1
+			
+			-- Handle some AI stuff
+			m.ai_state = { talent_in=2, ally_compassion=10 }
+			
+			-- Track clones when we die
+			m.on_die = function(self)
+				-- If we're the last return the caster
+				if self.fugue_clones <= 1 then
+					-- don't level up on return
+					local old_levelup = self.summoner.forceLevelup
+					local old_check = self.summoner.check
+					self.summoner.forceLevelup = function() end
+					self.summoner.check = function() end
+					game.zone:addEntity(game.level, self.summoner, "actor", self.x, self.y)
+					self.summoner.forceLevelup = old_levelup
+					self.summoner.check = old_check
+					if game.party:hasMember(self) then
+						game.party:setPlayer(self.summoner)
+					end
+				else
+					-- find fellow clones and update the clone count
+					for _, e in pairs(game.level.entities) do
+						if e.summoner and e.summoner == self.summoner and e.fugue_clones then
+							e.fugue_clones = e.fugue_clones - 1
+							if e.fugue_clones <= 1 then
+								e.summon_time = 0
+							end
+						end
+					end
+				end
+				local add_paradox = math.max(0, self:getParadox() - self.summoner:getParadox())
+				self.summoner:incParadox(add_paradox/3)
+			end
+	
+			return m
+		end
+		
+		-- Add the primary clone to the game
+		local m = makeFugueClone(self, t, x, y)
+		if game.party:hasMember(self) then
+			game.party:addMember(m, {
+				control="full",
+				type="fugue clone",
+				title="Fugue Clone",
+				orders = {target=true},
+			})
+		end
 		game.zone:addEntity(game.level, m, "actor", x, y)
-		game.level.map:particleEmitter(x, y, 1, "temporal_teleport")
-
-		-- force target to attack double
-		local a = game.level.map(tx, ty, Map.ACTOR)
-		if a and self:reactionToward(a) < 0 then
-			a:setTarget(m)
+		local fugue_count = 1
+		
+		-- Swap control to the primary clone
+		if game.party:hasMember(self) then
+			game.party:setPlayer(m)
+			m.summon_time = m.summon_time + 1
 		end
+		
+		m:resetCanSeeCache()
+		
+		-- Make the rest of our clones
+		for i = 1, t.getClones(self, t)-1 do
+			local m = makeFugueClone(self, t, x, y)
+			
+			local poss = {}
+			local range = t.getClones(self, t)
+			for i = x - range, x + range do
+				for j = y - range, y + range do
+					if game.level.map:isBound(i, j) and
+						core.fov.distance(x, y, i, j) <= range and -- make sure they're within range
+						self:canMove(i, j) and self:hasLOS(i, j) then  -- keep them in line of sight
+						poss[#poss+1] = {i,j}
+					end
+				end
+			end
+			if #poss == 0 then break  end
+			local pos = poss[rng.range(1, #poss)]
+			tx, ty = pos[1], pos[2]
 
-		game:playSoundNear(self, "talents/spell_generic")
+			-- And add to the party
+			if game.party:hasMember(self) then
+				game.party:addMember(m, {
+					control="full",
+					type="fugue clone",
+					title="Fugue Clone",
+					orders = {target=true},
+				})
+			end
+			
+			-- Add us to the level
+			game.zone:addEntity(game.level, m, "actor", tx, ty)
+			game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport")
+			fugue_count = fugue_count + 1
+		end
+		
+		-- Add the fugue counter
+		for _, e in pairs(game.level.entities) do
+			if e.summoner and e.summoner == self then
+				e.fugue_clones = fugue_count
+			end
+		end
+		
+		game.level.map:particleEmitter(m.x, m.y, 1, "temporal_teleport")
+		game:playSoundNear(m, "talents/teleport")
+		
 		return true
 	end,
 	info = function(self, t)
 		local duration = t.getDuration(self, t)
-		local allowed = t.getSize(self, t)
-		local size = "gargantuan"
-		if allowed < 4 then
-			size = "medium"
-		elseif allowed < 5 then
-			size = "big"
-		elseif allowed < 6 then
-			size = "huge"
-		end
-		return ([[Pulls a %s size or smaller copy of the target from another timeline; the copy stays for %d turns. The copy and the target will be compelled to attack each other immediately.]]):
-		format(size, duration)
+		local damage_penalty = t.getDamagePenalty(self, t)
+		return ([[Split yourself into three fugue clones.  The clones have %d%% of your maximum life, deal %d%% less damage, and last %d turns.
+		Each clone that dies will increase your Paradox by 33%% of the difference between its Paradox and your own.  This will never reduce your Paradox.
+		When only one clone is left, or if you cast the spell while in the fugue state, the spell will end, returning you to the position of the last active clone.
+		The life and damage penalties will be reduced by your Spellpower.]]):
+		format(100 - damage_penalty, damage_penalty, duration)
 	end,
-}
-
-
+}]=]--
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/chronomancy/timetravel.lua b/game/modules/tome/data/talents/chronomancy/timetravel.lua
index e416f07b35..b0b3538d09 100644
--- a/game/modules/tome/data/talents/chronomancy/timetravel.lua
+++ b/game/modules/tome/data/talents/chronomancy/timetravel.lua
@@ -17,101 +17,146 @@
 -- Nicolas Casalini "DarkGod"
 -- darkgod@te4.org
 
--- EDGE TODO: Icons, Particles, Timed Effect Particles
+-- EDGE TODO:Particles, Timed Effect Particles
 
 newTalent{
-	name = "Time Skip",
+	name = "Temporal Bolt",
 	type = {"chronomancy/timetravel",1},
-	require = chrono_req_high1,
+	require = chrono_req1,
 	points = 5,
-	cooldown = 4,
+	cooldown = 3,
+	fixed_cooldown = true,
 	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
-	tactical = { ATTACK = {TEMPORAL = 1}, DISABLE = 2 },
+	tactical = { ATTACK = {TEMPORAL = 2}, DISABLE = 1 },
 	range = 10,
+	reflectable = true,
+	proj_speed = 3,
 	direct_hit = true,
 	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 15, 150, getParadoxSpellpower(self, t)) end,
 	target = function(self, t)
-		return {type="hit", range=self:getTalentRange(t), talent=t}
+		return {type="hit", range=self:getTalentRange(t), friendlyfire=false, talent=t}
 	end,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 250, getParadoxSpellpower(self)) end,
-	getDuration = function(self, t) return 2 + math.ceil(self:combatTalentScale(self:getTalentLevel(t), 0.3, 2.3)) 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
-		local _ _, x, y = self:canProject(tg, x, y)
-		local target = game.level.map(x, y, Map.ACTOR)
-		if not target then return end
+		
+		local dam = self:spellCrit(t.getDamage(self, t))
+		
+		-- Hit our initial target; quality of life hack
+		self:project(tg, x, y, function(px, py)
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target then return end
+			-- Refresh talent
+			for tid, cd in pairs(self.talents_cd) do
+				local tt = self:getTalentFromId(tid)
+				if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then
+					self:alterTalentCoolingdown(tt, - 1)
+				end
+			end
+			DamageType:get(DamageType.TEMPORAL).projector(self, x, y, DamageType.TEMPORAL, dam)
+		end)
+		
+		-- Make our homing missile
+		self:project(tg, x, y, function(x, y)
+			local proj = require("mod.class.Projectile"):makeHoming(
+				self,
+				{particle="arrow", particle_args={tile="particles_images/temporal_bolt", proj_x=self.x, proj_y=self.y, src_x=x, src_y=y},  trail="trail_paradox"},
+				{speed=3, name="Temporal Bolt", dam=dam, apply=getParadoxSpellpower(self, t), start_x=x, start_y=y},
+				self, self:getTalentRange(t),
+				function(self, src)
+					local target = game.level.map(self.x, self.y, engine.Map.ACTOR)
+					if target and not target.dead and src:reactionToward(target) < 0 then
+						local DT = require("engine.DamageType")
+						local multi = (10 - self.homing.count)/20
+						local dam = self.def.dam * (1 + multi)
+						src:project({type="hit", friendlyfire=false, talent=t}, self.x, self.y, DT.TEMPORAL, dam)
+						
+						-- Refresh talent
+						for tid, cd in pairs(src.talents_cd) do
+							local tt = src:getTalentFromId(tid)
+							if tt.type[1]:find("^chronomancy/") and not tt.fixed_cooldown then
+								src:alterTalentCoolingdown(tt, - 1)
+							end
+						end
+					end
+				end,
+				function(self, src)
+				end
+			)
+			game.zone:addEntity(game.level, proj, "projectile", x, y)
+		end)
+			
+		game:playSoundNear({x=x, y=y}, "talents/distortion")
 
-		if target:attr("timetravel_immune") then
-			game.logSeen(target, "%s is immune!", target.name:capitalize())
-			return
-		end
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		return ([[Pull a bolt of temporal energy back through time.  The bolt will home in on your location, dealing %0.2f temporal damage to enemies, and reducing the cooldown of one chronomancy talent on cooldown by one turn per enemy hit.
+		The bolt gains 5%% damage each time it moves and the damage will scale with your Spellpower.]]):
+		format(damDesc(self, DamageType.TEMPORAL, damage))
+	end,
+}
 
-		local power = self:combatSpellpower() * (1 + self:callTalent(self.T_SPACETIME_MASTERY, "getPower"))
-		local hit = self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0))
-		if not hit then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end
-		self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t)))
-		game.level.map:particleEmitter(x, y, 1, "temporal_thrust")
-		game:playSoundNear(self, "talents/arcane")
-		if target.dead or target.player then return true end
-		target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)})
+newTalent{
+	name = "Echoes From The Past",
+	type = {"chronomancy/timetravel", 2},
+	require = chrono_req2,
+	points = 5,
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 10,
+	tactical = { ATTACKAREA = {TEMPORAL = 2} },
+	range = 0,
+	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end,
+	target = function(self, t)
+		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
+	end,
+	direct_hit = true,
+	requires_target = true,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 18, 160, getParadoxSpellpower(self, t)) end,
+	getPercent = function(self, t) return paradoxTalentScale(self, t, 20, 40, 60)/100 end,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
 		
-		-- Replace the target with a temporal instability for a few turns
-		local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN)
-		if not oe or oe:attr("temporary") then return true end
-		local e = mod.class.Object.new{
-			old_feat = oe, type = oe.type, subtype = oe.subtype,
-			name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}},
-			display = '&', color=colors.LIGHT_BLUE,
-			temporary = t.getDuration(self, t),
-			canAct = false,
-			target = target,
-			act = function(self)
-				self:useEnergy()
-				self.temporary = self.temporary - 1
-				-- return the rifted actor
-				if self.temporary <= 0 then
-					game.level.map(self.target.x, self.target.y, engine.Map.TERRAIN, self.old_feat)
-					game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y)
-					game.level:removeEntity(self)
-					local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true})
-					local old_levelup = self.target.forceLevelup
-					self.target.forceLevelup = function() end
-					game.zone:addEntity(game.level, self.target, "actor", mx, my)
-					self.target.forceLevelup = old_levelup
-				end
-			end,
-			summoner_gain_exp = true, summoner = self,
-		}
+		local damage = self:spellCrit(t.getDamage(self, t))
+		self:project(tg, self.x, self.y, function(px, py)
+			DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, damage)
+			
+			-- Echo
+			local target = game.level.map(px, py, Map.ACTOR)
+			if not target then return end
+			local percent = t.getPercent(self, t)/target.rank
+			local dam = (target.max_life - target.life) * percent
+			DamageType:get(DamageType.TEMPORAL).projector(self, px, py, DamageType.TEMPORAL, dam)
+		end)
 		
-		game.logSeen(target, "%s has moved forward in time!", target.name:capitalize())
-		game.level:removeEntity(target, true)
-		game.level:addEntity(e)
-		game.level.map(x, y, Map.TERRAIN, e)
-		game.nicer_tiles:updateAround(game.level, x, y)
-		game.level.map:updateMap(x, y)
+		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_temporal", {radius=tg.radius})
+		game:playSoundNear(self, "talents/teleport")
 		return true
 	end,
 	info = function(self, t)
+		local percent = t.getPercent(self, t) * 100
+		local radius = self:getTalentRadius(t)
 		local damage = t.getDamage(self, t)
-		local duration = t.getDuration(self, t)
-		return ([[Inflicts %0.2f temporal damage, if the target fails a spell save.  If your target survives, it will be removed from time for %d turns.
-		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration)
+		return ([[Creates a temporal echo in a radius of %d around you.  Affected targets will take %0.2f temporal damage, as well as up to %d%% of the difference between their current life and max life as additional temporal damage.
+		The additional damage will be divided by the target's rank and the damage scales with your Spellpower.]]):
+		format(radius, damDesc(self, DamageType.TEMPORAL, damage), percent)
 	end,
 }
 
 newTalent{
 	name = "Temporal Reprieve",
-	type = {"chronomancy/timetravel", 2},
-	require = chrono_req_high2,
+	type = {"chronomancy/timetravel", 3},
+	require = chrono_req3,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 36) end,
-	cooldown = function(self, t) return math.ceil(self:combatTalentLimit(t, 10, 45, 25)) end, -- Limit >10
+	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
+	cooldown = 40,
 	no_npc_use = true,
-	on_pre_use = function(self, t) return self:canBe("planechange") end,
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end,
 	fixed_cooldown = true,
+	on_pre_use = function(self, t) return self:canBe("planechange") end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, math.floor(self:combatTalentScale(t, 2, 6))) end,
 	action = function(self, t)
 		if game.zone.is_temporal_reprieve then
 			game.logPlayer(self, "This talent cannot be used from within the reprieve.")
@@ -157,7 +202,7 @@ newTalent{
 
 			self.temporal_reprieve_on_die = self.on_die
 			self.on_die = function(self, ...)
-				self:removeEffect(self.EFF_DREAMSCAPE)
+				self:removeEffect(self.EFF_TEMPORAL_REPRIEVE)
 				local args = {...}
 				game:onTickEnd(function()
 					if self.temporal_reprieve_on_die then self:temporal_reprieve_on_die(unpack(args)) end
@@ -182,175 +227,96 @@ newTalent{
 }
 
 newTalent{
-	name = "Echoes From The Past",
-	type = {"chronomancy/timetravel", 3},
-	require = chrono_req_high3,
+	name = "Time Skip",
+	type = {"chronomancy/timetravel",4},
+	require = chrono_req4,
 	points = 5,
-	paradox = function (self, t) return getParadoxCost(self, t, 20) end,
-	cooldown = 10,
-	tactical = { ATTACKAREA = {TEMPORAL = 2} },
-	range = 0,
-	radius = function(self, t) return math.floor(self:combatTalentScale(t, 2, 6)) end,
+	cooldown = 4,
+	paradox = function (self, t) return getParadoxCost(self, t, 10) end,
+	tactical = { ATTACK = {TEMPORAL = 1}, DISABLE = 2 },
+	range = 10,
+	direct_hit = true,
+	requires_target = true,
 	target = function(self, t)
-		return {type="ball", range=self:getTalentRange(t), radius=self:getTalentRadius(t), selffire=false, talent=t}
+		return {type="hit", range=self:getTalentRange(t), talent=t}
 	end,
-	direct_hit = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 18, 160, getParadoxSpellpower(self)) end,
-	getPercent = function(self, t) return self:combatLimit(self:combatTalentSpellDamage(t, 1, 10, getParadoxSpellpower(self)), 0.5, .1, 0, 0.1575, 5.75) end, -- Limit to <50%
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 25, 250, getParadoxSpellpower(self, t)) end,
+	getDuration = function(self, t) return getExtensionModifier(self, t, 2 + math.ceil(self:combatTalentScale(self:getTalentLevel(t), 0.3, 2.3))) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
-		self:project(tg, self.x, self.y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t)))
-		self:project(tg, self.x, self.y, DamageType.TEMPORAL_ECHO, t.getPercent(self, t))
-		game.level.map:particleEmitter(self.x, self.y, tg.radius, "ball_temporal", {radius=tg.radius})
-		game:playSoundNear(self, "talents/teleport")
-		return true
-	end,
-	info = function(self, t)
-		local percent = t.getPercent(self, t) * 100
-		local radius = self:getTalentRadius(t)
-		local damage = t.getDamage(self, t)
-		return ([[Creates a temporal echo in a nova around you, in a radius of %d.  Affected targets will take %0.2f temporal damage, as well as %d%% of the difference between their current life and max life as additional temporal damage.
-		The percentage and damage scales with your Spellpower.]]):
-		format(radius, damDesc(self, DamageType.TEMPORAL, damage), percent)
-	end,
-}
-
-newTalent{
-	name = "Damage Smearing",
-	type = {"chronomancy/timetravel", 4},
-	mode = "sustained",
-	require = chrono_req_high4,
-	sustain_paradox = 84,
-	cooldown = 24,
-	tactical = { DEFEND = 2 },
-	points = 5,
-	-- called in damage_types to split the damage
-	getPercent = function(self, t) return self:combatTalentLimit(t, 50, 10, 30)/100 end, -- Limit < 50%
-	getDuration = function(self, t) return math.floor(self:combatTalentScale(t, 3, 6)) end,
-	activate = function(self, t)
-		game:playSoundNear(self, "talents/spell_generic")
-		return {}
-	end,
-	deactivate = function(self, t, p)
-		return true
-	end,
-	info = function(self, t)
-		local percent = t.getPercent(self, t) * 100
-		local duration = t.getDuration(self, t)
-		return ([[You convert %d%% of all non-temporal damage you receive into temporal damage spread out over %d turns.
-		]]):format(percent, duration)
-	end,
-}
+		local x, y = self:getTarget(tg)
+		if not x or not y then return nil end
+		local _ _, x, y = self:canProject(tg, x, y)
+		local target = game.level.map(x, y, Map.ACTOR)
+		if not target then return end
 
---[=[
-newTalent{
-	name = "Door to the Past",
-	type = {"chronomancy/timetravel", 4},
-	require = chrono_req_high4, no_sustain_autoreset = true,
-	points = 5,
-	mode = "sustained",
-	sustain_paradox = 150,
-	cooldown = 25,
-	no_npc_use = true,
-	getAnomalyCount = function(self, t) return math.ceil(self:getTalentLevel(t)) end,
-	on_learn = function(self, t)
-		if not self:knowTalent(self.T_REVISION) then
-			self:learnTalent(self.T_REVISION, nil, nil, {no_unlearn=true})
-		end
-	end,
-	on_unlearn = function(self, t)
-		if not self:knowTalent(t) then
-			self:unlearnTalent(self.T_REVISION)
-		end
-	end,
-	do_anomalyCount = function(self, t)
-		if self.dttp_anomaly_count == 0 then
-			-- check for anomaly
-			if not game.zone.no_anomalies and not self:attr("no_paradox_fail") and self:paradoxFailChance() then
-				-- Random anomaly
-				local ts = {}
-				for id, t in pairs(self.talents_def) do
-					if t.type[1] == "chronomancy/anomalies" then ts[#ts+1] = id end
-				end
-				if not silent then game.logPlayer(self, "Your Door to the Past has caused an anomaly!") end
-				self:forceUseTalent(rng.table(ts), {ignore_energy=true})
-			end
-			-- reset count
-			self.dttp_anomaly_count = t.getAnomalyCount(self, t)
-		else
-			self.dttp_anomaly_count = self.dttp_anomaly_count - 1
-		end
-	end,
-	activate = function(self, t)
-		if checkTimeline(self) == true then
-			return
+		if target:attr("timetravel_immune") then
+			game.logSeen(target, "%s is immune!", target.name:capitalize())
+			return true
 		end
 
-		-- set the counter
-		self.dttp_anomaly_count = t.getAnomalyCount(self, t)
-
+		-- Project our damage
+		self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t)))
+		
+		game.level.map:particleEmitter(x, y, 1, "temporal_thrust")
 		game:playSoundNear(self, "talents/arcane")
-		return {
-			game:onTickEnd(function()
-				game:chronoClone("revision")
-			end),
-			particle = self:addParticles(Particles.new("temporal_aura", 1)),
+		
+		-- If they're dead don't remove them from time
+		if target.dead or target.player then return true end
+		
+		-- Check hit
+		local power = getParadoxSpellpower(self, t)
+		local hit = self:checkHit(power, target:combatSpellResist() + (target:attr("continuum_destabilization") or 0))
+		if not hit then game.logSeen(target, "%s resists!", target.name:capitalize()) return true end
+		
+		-- Apply spellshock and destabilization
+		target:crossTierEffect(target.EFF_SPELLSHOCKED, getParadoxSpellpower(self, t))
+		target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=getParadoxSpellpower(self, t, 0.3)})
+		
+		-- Placeholder for the actor
+		local oe = game.level.map(target.x, target.y, engine.Map.TERRAIN)
+		if not oe or oe:attr("temporary") then return true end
+		local e = mod.class.Object.new{
+			old_feat = oe, type = oe.type, subtype = oe.subtype,
+			name = "temporal instability", image = oe.image, add_mos = {{image="object/temporal_instability.png"}},
+			display = '&', color=colors.LIGHT_BLUE,
+			temporary = t.getDuration(self, t),
+			canAct = false,
+			target = target,
+			act = function(self)
+				self:useEnergy()
+				self.temporary = self.temporary - 1
+				-- return the rifted actor
+				if self.temporary <= 0 then
+					game.level.map(self.target.x, self.target.y, engine.Map.TERRAIN, self.old_feat)
+					game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y)
+					game.level:removeEntity(self)
+					local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true})
+					local old_levelup = self.target.forceLevelup
+					local old_check = self.target.check
+					self.target.forceLevelup = function() end
+					self.target.check = function() end
+					game.zone:addEntity(game.level, self.target, "actor", mx, my)
+					self.target.forceLevelup = old_levelup
+					self.target.check = old_check
+				end
+			end,
+			summoner_gain_exp = true, summoner = self,
 		}
-	end,
-	deactivate = function(self, t, p)
-		if game._chronoworlds then game._chronoworlds = nil end
-		self.dttp_anomaly_count = nil
-		self:removeParticles(p.particle)
-		return true
-	end,
-	info = function(self, t)
-		local count = t.getAnomalyCount(self, t)
-		return ([[This powerful spell allows you to mark a point in time that you can later return to by casting Revision (which you'll automatically learn upon learning this spell).  Maintaining such a doorway causes constant strain on the spacetime continuum and can possibly trigger an anomaly (using your current anomaly chance) once every %d turns.
-		This spell splits the timeline.  Attempting to use another spell that also splits the timeline while this effect is active will be unsuccessful.
-		Additional talent points will increase the time between anomaly checks.]]):
-		format(count)
-	end,
-}
-
-newTalent{
-	name = "Revision",
-	type = {"chronomancy/other", 1},
-	type_no_req = true,
-	points = 1,
-	message = "@Source@ revises history.",
-	cooldown = 50,
-	paradox = 25,
-	no_npc_use = true,
-	on_pre_use = function(self, t, silent) if not self:isTalentActive(self.T_DOOR_TO_THE_PAST) then if not silent then game.logPlayer(self, "Door to the Past must be active to use this talent.") end return false end return true end,
-	no_unlearn_last = true,
-	action = function(self, t)
-
-		-- Prevent Revision After Death
-		if game._chronoworlds == nil then
-			game.logPlayer(game.player, "#LIGHT_RED#Your spell fizzles.")
-			return
-		end
-
-		game:onTickEnd(function()
-			if not game:chronoRestore("revision", true) then
-				game.logSeen(self, "#LIGHT_RED#The spell fizzles.")
-				return
-			end
-			game.logPlayer(game.player, "#LIGHT_BLUE#You unfold the spacetime continuum to a previous state!")
-
-			-- Manualy start the cooldown of the "old player"
-			game.player:startTalentCooldown(t)
-			game.player:incParadox(t.paradox * (1 + (game.player.paradox / 300)))
-			game.player:forceUseTalent(game.player.T_DOOR_TO_THE_PAST, {ignore_energy=true})
-			-- remove anomaly count
-			if self.dttp_anomaly_count then self.dttp_anomaly_count = nil end
-			if game._chronoworlds then game._chronoworlds = nil end
-		end)
-
+		
+		-- Replace the target with the instability and update the map
+		game.logSeen(target, "%s has moved forward in time!", target.name:capitalize())
+		game.level:removeEntity(target, true)
+		game.level:addEntity(e)
+		game.level.map(x, y, Map.TERRAIN, e)
+		game.nicer_tiles:updateAround(game.level, x, y)
+		game.level.map:updateMap(x, y)
 		return true
 	end,
 	info = function(self, t)
-		return ([[Casting Revision will return you to the point in time you created a temporal marker using Door to the Past.]])
-		:format()
+		local damage = t.getDamage(self, t)
+		local duration = t.getDuration(self, t)
+		return ([[Inflicts %0.2f temporal damage.  If your target survives, it may be removed from time for %d turns.
+		The damage will scale with your Spellpower.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration)
 	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 2851df5e6f..1fdda0c562 100644
--- a/game/modules/tome/data/talents/misc/inscriptions.lua
+++ b/game/modules/tome/data/talents/misc/inscriptions.lua
@@ -1012,7 +1012,7 @@ newInscription{
 
 		if target:attr("timetravel_immune") then
 			game.logSeen(target, "%s is immune!", target.name:capitalize())
-			return
+			return true
 		end
 
 		local hit = self:checkHit(self:combatSpellpower(), target:combatSpellResist() + (target:attr("continuum_destabilization") or 0))
@@ -1021,6 +1021,7 @@ newInscription{
 		self:project(tg, x, y, DamageType.TEMPORAL, self:spellCrit(t.getDamage(self, t)))
 		game.level.map:particleEmitter(x, y, 1, "temporal_thrust")
 		game:playSoundNear(self, "talents/arcane")
+		self:incParadox(-25)
 		if target.dead or target.player then return true end
 		target:setEffect(target.EFF_CONTINUUM_DESTABILIZATION, 100, {power=self:combatSpellpower(0.3)})
 		
@@ -1044,9 +1045,12 @@ newInscription{
 					game.nicer_tiles:updateAround(game.level, self.target.x, self.target.y)
 					local mx, my = util.findFreeGrid(self.target.x, self.target.y, 20, true, {[engine.Map.ACTOR]=true})
 					local old_levelup = self.target.forceLevelup
+					local old_check = self.target.check
 					self.target.forceLevelup = function() end
+					self.target.check = function() end
 					game.zone:addEntity(game.level, self.target, "actor", mx, my)
 					self.target.forceLevelup = old_levelup
+					self.target.check = old_check
 				end
 			end,
 			summoner_gain_exp = true, summoner = self,
@@ -1064,6 +1068,7 @@ newInscription{
 		local damage = t.getDamage(self, t)
 		local duration = t.getDuration(self, t)
 		return ([[Inflicts %0.2f temporal damage.  If your target survives, it will be sent %d turns into the future.
+		It will also lower your paradox by 25 (if you have any).
 		Note that messing with the spacetime continuum may have unforeseen consequences.]]):format(damDesc(self, DamageType.TEMPORAL, damage), duration)
 	end,
 	short_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 dd5d107c2a..954bb1faf6 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -1550,7 +1550,7 @@ newTalent{
 	direct_hit = true,
 	reflectable = true,
 	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self)) end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self, t)) end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
@@ -1637,7 +1637,7 @@ newTalent{
 	range = 10,
 	direct_hit = true,
 	requires_target = true,
-	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self)) * 10000 end,
+	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 20, 220, getParadoxSpellpower(self, t)) * 10000 end,
 	action = function(self, t)
 		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
diff --git a/game/modules/tome/data/talents/uber/mag.lua b/game/modules/tome/data/talents/uber/mag.lua
index 0f1d0971c6..4d8ea5aa17 100644
--- a/game/modules/tome/data/talents/uber/mag.lua
+++ b/game/modules/tome/data/talents/uber/mag.lua
@@ -108,8 +108,7 @@ uberTalent{
 	info = function(self, t)
 		return ([[You can wrap temporal threads around you, assuming the form of a telugoroth for 10 turns.
 		While in this form you gain pinning, bleeding, blindness and stun immunity, 30%% temporal resistance, your temporal damage bonus is set to your current highest damage bonus + 30%%, 50%% of the damage you deal becomes temporal, and you gain 20%% temporal resistance penetration.
-		You also are able to cast two anomalies: Anomaly Rearrange and Anomaly Temporal Storm.
-		Transforming to this form will increase your paradox by 400 but also grant the equivalent of +200 willpower to control paradoxes and failures. This reverts back at the end of the effect.]])
+		You also are able to cast two anomalies: Anomaly Rearrange and Anomaly Temporal Storm.]])
 		:format()
 	end,
 }
@@ -182,6 +181,8 @@ uberTalent{
 			who:learnTalent(who.T_BONE_SHIELD,true,math.ceil(tlevel*2/3))
 		elseif who.name == "mucus ooze" then
 			who:learnTalent(who.T_VIRULENT_DISEASE,true,tlevel)
+		elseif who.name == "temporal hound" then
+			who:learnTalent(who.T_ELEMENTAL_DISCORD,true,tlevel)
 		else
 --			print("Error: attempting to apply talent Blighted Summoning to incorrect creature type")
 			return false
@@ -214,6 +215,7 @@ uberTalent{
 		- Yeek Wayists: Dark Portal
 		- Bloated Oozes: Bone Shield (level %d)
 		- Mucus Oozes: Virulent Disease
+		- Temporal Hounds: Elemental Discord
 		Your necrotic minions and wild-summons get a bonus to Magic equal to yours.
 		The talent levels increase with your level, and other race- or object-based summons may also be affected.
 		]]):format(tl,math.ceil(tl*2/3))
diff --git a/game/modules/tome/data/timed_effects/magical.lua b/game/modules/tome/data/timed_effects/magical.lua
index 0392f2f86f..f2bba636a0 100644
--- a/game/modules/tome/data/timed_effects/magical.lua
+++ b/game/modules/tome/data/timed_effects/magical.lua
@@ -1479,15 +1479,11 @@ newEffect{
 newEffect{
 	name = "REDUX", image = "talents/redux.png",
 	desc = "Redux",
-	long_desc = function(self, eff) return "The next activated chronomancy talent that the target uses will be cast twice." end,
+	long_desc = function(self, eff) return ("Chronomancy spells with cooldown less than %d will not go on cooldown when cast."):format(eff.max_cd) end,
 	type = "magical",
 	subtype = { temporal=true },
 	status = "beneficial",
-	parameters = { power=1},
-	activate = function(self, eff)
-	end,
-	deactivate = function(self, eff)
-	end,
+	parameters = { max_cd=1},
 }
 
 newEffect{
@@ -1533,18 +1529,18 @@ newEffect{
 newEffect{
 	name = "HASTE", image = "talents/haste.png",
 	desc = "Haste",
-	long_desc = function(self, eff) return ("Increases global action speed by %d%%."):format(eff.power * 100) end,
+	long_desc = function(self, eff) return ("Increases movement speed by %d%% and attack, spell, and mind speed by %d%%."):format(eff.move * 100, eff.speed * 100) end,
 	type = "magical",
 	subtype = { temporal=true },
 	status = "beneficial",
-	parameters = { power=0.1 },
+	parameters = { move=0.1, speed=0.1 },
 	on_gain = function(self, err) return "#Target# speeds up.", "+Haste" end,
 	on_lose = function(self, err) return "#Target# slows down.", "-Haste" end,
-	damageOnAct = function(self, eff)
-		DamageType:get(DamageType.MATTER).projector(eff.src or self, self.x, self.y, DamageType.MATTER, eff.src:spellCrit(eff.dam))
-	end,
 	activate = function(self, eff)
-		eff.glbid = self:addTemporaryValue("global_speed_add", eff.power)
+		self:effectTemporaryValue(eff, "movement_speed", eff.move)
+		self:effectTemporaryValue(eff, "combat_physspeed", eff.speed)
+		self:effectTemporaryValue(eff, "combat_spellspeed", eff.speed)
+		self:effectTemporaryValue(eff, "combat_mindspeed", eff.speed)
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("global_speed_add", eff.glbid)
@@ -1554,11 +1550,11 @@ newEffect{
 newEffect{
 	name = "CEASE_TO_EXIST", image = "talents/cease_to_exist.png",
 	desc = "Cease to Exist",
-	long_desc = function(self, eff) return ("The target is being removed from the timeline, reducing all resistances by %d%%."):format(eff.power) end,
+	long_desc = function(self, eff) return ("The target is being removed from the timeline, all its resistances have been lowered by %d%%."):format(eff.power) end,
 	type = "magical",
 	subtype = { temporal=true },
 	status = "detrimental",
-	parameters = { power = 1 },
+	parameters = { power = 1, damage=1 },
 	on_gain = function(self, err) return "#Target# is being removed from the timeline.", "+Cease to Exist" end,
 	activate = function(self, eff)
 		eff.resists = self:addTemporaryValue("resists", { all = -eff.power})
@@ -1634,13 +1630,13 @@ newEffect{
 newEffect{
 	name = "SPIN_FATE", image = "talents/spin_fate.png",
 	desc = "Spin Fate",
-	long_desc = function(self, eff) return ("The target's defense and saves have been increased by %d and it's resist all by %d%%."):format(eff.save_bonus * eff.spin, eff.resists * eff.spin) end,
+	long_desc = function(self, eff) return ("The target's defense and saves have been increased by %d."):format(eff.save_bonus * eff.spin) end,
 	display_desc = function(self, eff) return eff.spin.." Spin" end,
 	charges = function(self, eff) return eff.spin end,
 	type = "magical",
 	subtype = { temporal=true },
 	status = "beneficial",
-	parameters = { save_bonus=0, spin=0, resists=0, max_spin=3},
+	parameters = { save_bonus=0, spin=0, max_spin=3},
 	on_gain = function(self, err) return "#Target# spins fate.", "+Spin Fate" end,
 	on_lose = function(self, err) return "#Target#'s fate is no longer being spun.", "-Spin Fate" end,
 	on_merge = function(self, old_eff, new_eff)
@@ -1649,7 +1645,6 @@ newEffect{
 		self:removeTemporaryValue("combat_physresist", old_eff.physid)
 		self:removeTemporaryValue("combat_spellresist", old_eff.spellid)
 		self:removeTemporaryValue("combat_mentalresist", old_eff.mentalid)
-		self:removeTemporaryValue("resists", old_eff.resid)
 		
 		-- add some spin
 		old_eff.spin = math.min(old_eff.spin + 1, new_eff.max_spin)
@@ -1659,7 +1654,6 @@ newEffect{
 		old_eff.physid = self:addTemporaryValue("combat_physresist", old_eff.save_bonus * old_eff.spin)
 		old_eff.spellid = self:addTemporaryValue("combat_spellresist", old_eff.save_bonus * old_eff.spin)
 		old_eff.mentalid = self:addTemporaryValue("combat_mentalresist", old_eff.save_bonus * old_eff.spin)
-		old_eff.resid = self:addTemporaryValue("resists", {all =  old_eff.resists * old_eff.spin})
 
 		old_eff.dur = new_eff.dur
 		
@@ -1671,7 +1665,6 @@ newEffect{
 		eff.physid = self:addTemporaryValue("combat_physresist", eff.save_bonus * eff.spin)
 		eff.spellid = self:addTemporaryValue("combat_spellresist", eff.save_bonus * eff.spin)
 		eff.mentalid = self:addTemporaryValue("combat_mentalresist", eff.save_bonus * eff.spin)
-		eff.resid = self:addTemporaryValue("resists", {all = eff.resists *eff.spin})
 		eff.particle = self:addParticles(Particles.new("arcane_power", 1))
 	end,
 	deactivate = function(self, eff)
@@ -1679,7 +1672,6 @@ newEffect{
 		self:removeTemporaryValue("combat_physresist", eff.physid)
 		self:removeTemporaryValue("combat_spellresist", eff.spellid)
 		self:removeTemporaryValue("combat_mentalresist", eff.mentalid)
-		self:removeTemporaryValue("resists", eff.resid)
 		self:removeParticles(eff.particle)
 	end,
 }
@@ -2311,10 +2303,8 @@ newEffect{
 		self:effectTemporaryValue(eff, "resists", {[DamageType.TEMPORAL] = 30})
 		self:effectTemporaryValue(eff, "resists_pen", {[DamageType.TEMPORAL] = 20})
 		self:effectTemporaryValue(eff, "talent_cd_reduction", {[self.T_ANOMALY_REARRANGE] = -4, [self.T_ANOMALY_TEMPORAL_STORM] = -4})
-		self:effectTemporaryValue(eff, "paradox_reduce_anomalies", 200)
 		self:learnTalent(self.T_ANOMALY_REARRANGE, true)
 		self:learnTalent(self.T_ANOMALY_TEMPORAL_STORM, true)
-		self:incParadox(400)
 
 		self.replace_display = mod.class.Actor.new{
 			image = "npc/elemental_temporal_telugoroth.png",
@@ -2325,7 +2315,6 @@ newEffect{
 		game.level.map:updateMap(self.x, self.y)
 	end,
 	deactivate = function(self, eff)
-		self:incParadox(-400)
 		self:unlearnTalent(self.T_ANOMALY_REARRANGE)
 		self:unlearnTalent(self.T_ANOMALY_TEMPORAL_STORM)
 		self.replace_display = nil
@@ -2870,28 +2859,10 @@ newEffect{
 	end,
 }
 
-newEffect{
-	name = "TIME_DILATION", image = "talents/time_dilation.png",
-	desc = "Time Dilation",
-	long_desc = function(self, eff) return ("Reduces global action speed by %d%%."):format(eff.slow * 100) end,
-	type = "magical",
-	subtype = { temporal=true, slow=true },
-	status = "detrimental",
-	parameters = { slow=0.1},
-	on_gain = function(self, err) return "#Target# slows down.", "+Time Dilation" end,
-	on_lose = function(self, err) return "#Target# speeds up.", "-Time Dilation" end,
-	activate = function(self, eff)
-		eff.tmpid = self:addTemporaryValue("global_speed_add", -eff.slow)
-	end,
-	deactivate = function(self, eff)
-		self:removeTemporaryValue("global_speed_add", eff.tmpid)
-	end,
-}
-
 newEffect{
 	name = "DIMENSIONAL_ANCHOR", image = "talents/dimensional_anchor.png",
 	desc = "Dimensional Anchor",
-	long_desc = function(self, eff) return ("The target is unable to teleport and takes %0.2f temporal and %0.2f physical damage if they try."):format(eff.slow * 100) end,
+	long_desc = function(self, eff) return ("The target is unable to teleport and takes %0.2f temporal and %0.2f physical damage if they try."):format(eff.damage, eff.damage) end,
 	type = "magical",
 	subtype = { temporal=true, slow=true },
 	status = "detrimental",
@@ -2941,15 +2912,27 @@ newEffect{
 	parameters = { power=0 },
 	on_gain = function(self, err) return "#Target#'s lifeline has been braided.", "+Braided" end,
 	on_lose = function(self, err) return "#Target#'s lifeline is no longer braided.", "-Braided" end,
-	on_timeout = function(self, eff)
-		local braids = 0
-		if eff.braid_one and eff.braid_one:hasEffect(eff.braid_one.EFF_BRAIDED) and not eff.braid_one.dead then
-			braids = braids + 1
+	doBraid = function(self, eff, dam)
+		local braid_damage = dam * eff.power/ 100
+		for i = 1, #eff.targets do
+			local target = eff.targets[i]
+			if target ~= self and not target.dead then
+				game:delayedLogMessage(eff.src, target, "braided", "#CRIMSON##Source# damages #Target# through the Braid!")
+				game:delayedLogDamage(eff.src, target, braid_damage, ("#PINK#%d braided #LAST#"):format(braid_damage), false)
+				target:takeHit(braid_damage, eff.src)
+			end
 		end
-		if eff.braid_two and eff.braid_two:hasEffect(eff.braid_two.EFF_BRAIDED) and not eff.braid_two.dead then
-			braids = braids + 1
+	end,
+	on_timeout = function(self, eff)
+		local alive = false
+		for i = 1, #eff.targets do
+			local target = eff.targets[i]
+			if target ~=self and not target.dead then
+				alive = true
+				break
+			end
 		end
-		if braids == 0 then		
+		if not alive then
 			self:removeEffect(self.EFF_BRAIDED)
 		end
 	end,
@@ -2980,16 +2963,16 @@ newEffect{
 newEffect{
 	name = "WEBS_OF_FATE", image = "talents/webs_of_fate.png",
 	desc = "Webs of Fate",
-	long_desc = function(self, eff) return ("Moving along the webs of fate, increasing move speed by %d%% and pin immunity by %d%%."):format(eff.move*100, eff.pin*100) end,
+	long_desc = function(self, eff) return ("Moving along the webs of fate, increasing stun and pin immunity by %d%%."):format(eff.imm*100) end,
 	type = "magical",
 	subtype = { temporal=true, speed=true },
 	status = "beneficial",
 	on_gain = function(self, err) return "#Target# moves along the webs of fate.", "+Fate Webs" end,
 	on_lose = function(self, err) return "#Target# is no longer moving along the webs of fate.", "-Fate Webs" end,
-	parameters = { move=0.1, pin=0.1 },
+	parameters = { imm=0.1 },
 	activate = function(self, eff)
-		self:effectTemporaryValue(eff, "pin_immune", eff.pin)
-		self:effectTemporaryValue(eff, "movement_speed", eff.move)
+		self:effectTemporaryValue(eff, "pin_immune", eff.imm)
+		self:effectTemporaryValue(eff, "stun_immune", eff.imm)
 	end,
 	deactivate = function(self, eff)
 	end,
@@ -2998,18 +2981,45 @@ newEffect{
 newEffect{
 	name = "SEAL_FATE", image = "talents/seal_fate.png",
 	desc = "Seal Fate",
-	long_desc = function(self, eff) return ("The target is sealing fate, increasing critical chance and critical power by %d%%."):format(eff.crit) end,
-	type = "mental",
+	long_desc = function(self, eff) return ("The target is sealing fate, increasing the duration of detrimental status effects on targets it damages by one."):format() end,
+	type = "magical",
 	subtype = { focus=true },
 	status = "beneficial",
-	parameters = { crit=10 },
+	parameters = { procs=1 },
 	on_gain = function(self, err) return "#Target# seals fate.", "+Seal Fate" end,
 	on_lose = function(self, err) return "#Target# is no longer sealing fate.", "-Seal Fate" end,
+	doDamage = function(self, eff, target)
+		if self.turn_procs and target.tmp then
+			if self.turn_procs.seal_fate and self.turn_procs.seal_fate >= eff.procs then return end
+			local chance = 50
+			local spin = self:hasEffect(self.EFF_SPIN_FATE)
+			if spin then
+				chance = chance * (1 + spin.spin/3)
+			end
+			
+			if rng.percent(chance) 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.status == "detrimental" and e.type ~= "other" then
+						effs[#effs+1] = p
+					end
+				end
+				
+				if #effs > 0 then
+					local p = rng.table(effs)
+					game.logPlayer(self, "%s", p.name)
+					game.logPlayer(self, "%s", p.dur)
+					p.dur = p.dur + 1
+				end
+			
+				self.turn_procs.seal_fate = (self.turn_procs.seal_fate or 0) + 1
+			end
+			
+		end
+	end,
 	activate = function(self, eff)
-		self:effectTemporaryValue(eff, "combat_physcrit", eff.crit)
-		self:effectTemporaryValue(eff, "combat_spellcrit", eff.crit)
-		self:effectTemporaryValue(eff, "combat_mindcrit", eff.crit)
-		self:effectTemporaryValue(eff, "combat_critical_power", eff.crit)
 	end,
 }
 
@@ -3045,6 +3055,80 @@ newEffect{
 	end,
 }
 
+newEffect{
+	name = "ENTROPY", image = "talents/entropy.png",
+	desc = "Entropy",
+	long_desc = function(self, eff) return ("The target's timed effects are ticking twice as fast and it's taking %d temporal damage per turn, per timed effect."):format(eff.power) end,
+	on_gain = function(self, err) return "#Target# is caught in an entropic field!", "+Entropy" end,
+	on_lose = function(self, err) return "#Target# is free from the entropy.", "-Entropy" end,
+	type = "magical",
+	subtype = { temporal=true },
+	status = "detrimental",
+	parameters = {power=10},
+	on_timeout = function(self, eff)
+		local count = 0
+		local todel = {}
+		
+		-- Go through all spell effects
+		for eff_id, p in pairs(self.tmp) do
+			local e = self.tempeffect_def[eff_id]
+			if e.type ~= "other" and e.status == "beneficial" then
+				if p.dur <= 0 then 
+					todel[#todel+1] = eff 
+				else
+					if e.on_timeout then
+						if p.src then p.src.__project_source = p end -- intermediate projector source
+						if e.on_timeout(self, p) then
+							todel[#todel+1] = eff
+						end
+						if p.src then p.src.__project_source = nil end
+					end
+				end
+				count = count + 1
+				p.dur = p.dur - e.decrease
+			end
+		end
+
+		DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power*count)
+				
+		while #todel > 0 do
+			self:removeEffect(table.remove(todel))
+		end
+	end,
+}
+
+newEffect{
+	name = "PHASE_SHIFT", image = "talents/phase_shift.png",
+	desc = "Phase Shift",
+	long_desc = function(self, eff) return ("When hit for more than 10%% of your maximum life you teleport and reappear near where you were, reducuing the damage by 50%%.") end,
+	type = "magical",
+	subtype = { arcane=true },
+	status = "beneficial",
+	parameters = { },
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "phase_shift_chrono", 1)
+	end,
+}
+
+newEffect{
+	name = "REGRESSION", image = "talents/temporal_bolt.png",
+	desc = "Regression",
+	long_desc = function(self, eff)	return ("Reduces your three highest stats by %d."):format(eff.power) end,
+	on_gain = function(self, err) return "#Target# has regressed.", "+Regression" end,
+	on_lose = function(self, err) return "#Target# has returned to its natural state.", "-Regression" end,
+	type = "physical",
+	subtype = { temporal=true },
+	status = "detrimental",
+	parameters = { power=1},
+	activate = function(self, eff)
+		local l = { {Stats.STAT_STR, self:getStat("str")}, {Stats.STAT_DEX, self:getStat("dex")}, {Stats.STAT_CON, self:getStat("con")}, {Stats.STAT_MAG, self:getStat("mag")}, {Stats.STAT_WIL, self:getStat("wil")}, {Stats.STAT_CUN, self:getStat("cun")}, }
+		table.sort(l, function(a,b) return a[2] > b[2] end)
+		local inc = {}
+		for i = 1, 3 do inc[l[i][1]] = -eff.power end
+		self:effectTemporaryValue(eff, "inc_stats", inc)
+	end,
+}
+
 newEffect{
 	name = "TRIM_THREADS", image = "talents/trim_threads.png",
 	desc = "Trim Threads",
@@ -3067,4 +3151,4 @@ newEffect{
 	on_timeout = function(self, eff)
 		DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power)
 	end,
-}
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/timed_effects/other.lua b/game/modules/tome/data/timed_effects/other.lua
index ed2708d9d8..68aa850bba 100644
--- a/game/modules/tome/data/timed_effects/other.lua
+++ b/game/modules/tome/data/timed_effects/other.lua
@@ -396,48 +396,24 @@ newEffect{
 newEffect{
 	name = "DAMAGE_SMEARING", image = "talents/damage_smearing.png",
 	desc = "Damage Smearing",
-	long_desc = function(self, eff) return ("Passes damage received in the present onto the future self."):format(eff.power) end,
-	type = "other",
-	subtype = { time=true },
-	status = "beneficial",
-	parameters = { power=10 },
-	on_gain = function(self, err) return "The fabric of time alters around #target#.", "+Damage Smearing" end,
-	on_lose = function(self, err) return "The fabric of time around #target# stabilizes.", "-Damage Smearing" end,
-	activate = function(self, eff)
-		eff.particle = self:addParticles(Particles.new("time_shield", 1))
-	end,
-	deactivate = function(self, eff)
-		self:removeParticles(eff.particle)
-	end,
-}
-
-newEffect{
-	name = "SMEARED",
-	desc = "Smeared",
-	long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f temporal damage per turn."):format(eff.power) end,
+	long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f temporal damage per turn."):format(eff.dam) end,
 	type = "other",
 	subtype = { time=true },
 	status = "detrimental",
-	parameters = { power=10 },
+	parameters = { dam=10 },
 	on_gain = function(self, err) return "#Target# is taking damage received in the past!", "+Smeared" end,
 	on_lose = function(self, err) return "#Target# stops taking damage received in the past.", "-Smeared" end,
 	on_merge = function(self, old_eff, new_eff)
 		-- Merge the flames!
-		local olddam = old_eff.power * old_eff.dur
-		local newdam = new_eff.power * new_eff.dur
-		local dur = math.ceil((old_eff.dur + new_eff.dur) / 2)
-		old_eff.dur = dur
-		old_eff.power = (olddam + newdam) / dur
-		return old_eff
+		local olddam = old_eff.dam * old_eff.dur
+		local newdam = new_eff.dam * new_eff.dur
+		new_eff.dam = (olddam + newdam) / new_eff.dur
+		return new_eff
 	end,
 	on_timeout = function(self, eff)
-		DamageType:get(DamageType.TEMPORAL).projector(eff.src, self.x, self.y, DamageType.TEMPORAL, eff.power)
-	end,
-	activate = function(self, eff)
-		eff.particle = self:addParticles(Particles.new("time_shield", 1))
-	end,
-	deactivate = function(self, eff)
-		self:removeParticles(eff.particle)
+		local dead, val = self:takeHit(eff.dam, self, {special_death_msg="was smeared across all space and time"})
+
+		game:delayedLogDamage(eff, self, val, ("%s%d %s#LAST#"):format(DamageType:get(DamageType.TEMPORAL).text_color or "#aaaaaa#", math.ceil(val), DamageType:get(DamageType.TEMPORAL).name), false)
 	end,
 }
 
@@ -2469,13 +2445,9 @@ newEffect{
 	subtype = { time=true },
 	status = "beneficial",
 	parameters = { power=10},
-	on_gain = function(self, err) return "#Target# retunes the fabric of spaceime.", "+Spacetime Tuning" end,
+	on_gain = function(self, err) return "#Target# retunes the fabric of spacetime.", "+Spacetime Tuning" end,
 	on_timeout = function(self, eff)
-		if not self.resting then
-			self:removeEffect(self.EFF_SPACETIME_TUNING)
-		else
-			self:incParadox(eff.power)
-		end
+		self:incParadox(eff.power)
 	end,
 }
 
@@ -2486,17 +2458,17 @@ newEffect{
 		return ("The target has stopped time and is dealing %d%% less damage."):format(eff.power)
 	end,
 	charges = function(self, eff)
-		local energy = self.energy.value
-		if energy < 2000 then
+		local charges = math.floor(self.energy.value/1000) - 1
+		if charges <= 0 then
 			self:removeEffect(self.EFF_TIME_STOP)
 		end
-		return math.floor(energy/1000) 
+		return charges
 	end,
 	type = "other",
 	subtype = {time=true},
 	status = "detrimental",
-	decrease = 0,
-	no_stop_enter_worlmap = true, no_stop_resting = true,
+	--decrease = 0,
+	--no_stop_enter_worlmap = true, no_stop_resting = true,
 	parameters = {power=50},
 	activate = function(self, eff)
 		self:effectTemporaryValue(eff, "generic_damage_penalty", eff.power)
@@ -2516,18 +2488,8 @@ newEffect{
 	on_timeout = function(self, eff)
 		-- Clone protection
 		if not self.on_die then return end
-		-- Certain talents don't cooldown in the reprieve
-		if not self:attr("no_talents_cooldown") then
-			for tid, _ in pairs(self.talents_cd) do
-				local t = self:getTalentFromId(tid)
-				if t and t.fixed_cooldown then
-					self.talents_cd[tid] = self.talents_cd[tid] + 1
-				end
-			end
-		end
 	end,
 	activate = function(self, eff)
-
 	end,
 	deactivate = function(self, eff)
 		-- Clone protection
@@ -2590,6 +2552,71 @@ newEffect{
 	end,
 }
 
+newEffect{
+	name = "TEMPORAL_FUGUE", image = "talents/temporal_fugue.png",
+	desc = "Temporal Fugue",
+	long_desc = function(self, eff) return "This target is splitting all damage with its fugue clones." end,
+	type = "other",
+	subtype = { time=true },
+	status = "beneficial",
+	parameters = { power=10 },
+	decrease = 0,
+	callbackOnHit = function(self, eff, cb, src)
+		local clones = {}
+		-- Find our clones
+		for i = 1, #eff.targets do
+			local target = eff.targets[i]
+			if target ~= self and not target.dead and game.level:hasEntity(target) then
+				clones[#clones+1] = target
+			end
+		end
+		
+		-- Split the damage
+		if #clones > 0 and not src.turn_procs.temporal_fugue_damage then
+			self.turn_procs.temporal_fugue_damage = true
+			cb.value = cb.value/#clones
+			game:delayedLogMessage(self, nil, "fugue_damage", "#STEEL_BLUE##Source# shares damage with %s fugue clones!", string.his_her(self))
+			for i = 1, #clones do
+				local target = clones[i]
+				if target ~= self then
+					target:takeHit(cb.value, self)
+					game:delayedLogDamage(src or self, self, 0, ("#STEEL_BLUE#(%d shared)#LAST#"):format(cb.value), nil)
+				end
+			end
+			
+			self.turn_procs.temporal_fugue_damage = nil
+		end
+		
+		-- If we're the last clone remove the effect
+		if #clones <= 0 then
+			self:removeEffect(self.EFF_TEMPORAL_FUGUE)
+		end
+		
+		return cb.value
+	end,
+	on_timeout = function(self, eff)
+		-- Temporal Fugue does not cooldown while active
+		if self.talents_cd[self.T_TEMPORAL_FUGUE] then
+			self.talents_cd[self.T_TEMPORAL_FUGUE] = self.talents_cd[self.T_TEMPORAL_FUGUE] + 1
+		end
+	
+		local alive = false
+		for i = 1, #eff.targets do
+			local target = eff.targets[i]
+			if target ~=self and not target.dead then
+				alive = true
+				break
+			end
+		end
+		if not alive then
+			self:removeEffect(self.EFF_TEMPORAL_FUGUE)
+		end
+	end,
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "generic_damage_penalty", 66)
+	end,
+}
+
 newEffect{
 	name = "DRACONIC_WILL", image = "talents/draconic_will.png",
 	desc = "Draconic Will",
@@ -2604,3 +2631,25 @@ newEffect{
 		self:effectTemporaryValue(eff, "negative_status_effect_immune", 1)
 	end,
 }
+
+newEffect{
+	name = "PRESERVE_PATTERN", image = "talents/preserve_pattern.png",
+	desc = "Preserve Pattern",
+	long_desc = function(self, eff) return ("Damage received in the past is returned as %0.2f paradox damage per turn."):format(eff.paradox) end,
+	type = "other",
+	subtype = { time=true },
+	status = "detrimental",
+	parameters = { paradox=10 },
+	on_gain = function(self, err) return "#Target# converts damage into paradox.", "+Preserve" end,
+	on_lose = function(self, err) return "#Target# stops converting damage to paradox..", "-Preserve" end,
+	on_merge = function(self, old_eff, new_eff)
+		-- Merge the flames!
+		local oldparadox = old_eff.paradox * old_eff.dur
+		local newparadox = new_eff.paradox * new_eff.dur
+		new_eff.paradox = (oldparadox + newparadox) / new_eff.dur
+		return new_eff
+	end,
+	on_timeout = function(self, eff)
+		self:incParadox(eff.paradox)
+	end,
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index 62518ff327..ea966eb9b2 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -2825,30 +2825,68 @@ newEffect {
 newEffect{
 	name = "CELERITY", image = "talents/celerity.png",
 	desc = "Celerity",
-	long_desc = function(self, eff) return ("The target is moving is %d%% faster."):format(eff.speed * 100 * eff.stack) end,
+	long_desc = function(self, eff) return ("The target is moving is %d%% faster."):format(eff.speed * 100 * eff.charges) end,
 	type = "physical",
-	display_desc = function(self, eff) return eff.stack.." Celerity" end,
-	charges = function(self, eff) return eff.stack end,
+	display_desc = function(self, eff) return eff.charges.." Celerity" end,
+	charges = function(self, eff) return eff.charges end,
 	subtype = { speed=true, temporal=true },
 	status = "beneficial",
-	parameters = {speed=0.1, stack=1, max_stack=3},
+	parameters = {speed=0.1, charges=1, max_charges=3},
 	on_merge = function(self, old_eff, new_eff)
 		-- remove the old value
 		self:removeTemporaryValue("movement_speed", old_eff.tmpid)
 		
 		-- add a charge
-		old_eff.stack = math.min(old_eff.stack + 1, new_eff.max_stack)
+		old_eff.charges = math.min(old_eff.charges + 1, new_eff.max_charges)
 		
 		-- and apply the current values	
-		old_eff.tmpid = self:addTemporaryValue("movement_speed", old_eff.speed * old_eff.stack)
+		old_eff.tmpid = self:addTemporaryValue("movement_speed", old_eff.speed * old_eff.charges)
 		
 		old_eff.dur = new_eff.dur
 		return old_eff
 	end,
 	activate = function(self, eff)
-		eff.tmpid = self:addTemporaryValue("movement_speed", eff.speed * eff.stack)
+		eff.tmpid = self:addTemporaryValue("movement_speed", eff.speed * eff.charges)
 	end,
 	deactivate = function(self, eff)
 		self:removeTemporaryValue("movement_speed", eff.tmpid)
 	end,
 }
+
+newEffect{
+	name = "GRAVITY_SLOW", image = "talents/gravity_well.png",
+	desc = "Gravity Slow",
+	long_desc = function(self, eff) return ("The target is caught in a gravity well, reducing movement speed by %d%%."):format(eff.slow* 100) end,
+	type = "physical",
+	subtype = { speed=true },
+	status = "detrimental",
+	parameters = { slow=0.15 },
+	on_gain = function(self, err) return "#Target# is slowed by gravity.", "+Gravity Slow" end,
+	on_lose = function(self, err) return "#Target# is free from the gravity well.", "-Gravity Slow" end,
+	activate = function(self, eff)
+		eff.slowid = self:addTemporaryValue("movement_speed", -eff.slow)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("movement_speed", eff.slowid)
+	end,
+}
+
+newEffect{
+	name = "ANTI_GRAVITY", image = "talents/gravity_locus.png",
+	desc = "Anti-Gravity",
+	long_desc = function(self, eff) return ("Target is caught in an anti-gravity field, halving its knockback resistance."):format() end,
+	type = "physical",
+	subtype = { spacetime=true },
+	status = "detrimental",
+	on_gain = function(self, err) return nil, "+Anti-Gravity" end,
+	on_lose = function(self, err) return nil, "-Anti-Gravity" end,
+	on_merge = function(self, old_eff, new_eff)
+		old_eff.dur = new_eff.dur
+		return old_eff
+	end,
+	activate = function(self, eff)
+		if self:attr("knockback_immune") then
+			self:effectTemporaryValue(eff, "knockback_immune", -self:attr("knockback_immune") / 2)
+		end
+	end,
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/zones/town-point-zero/npcs.lua b/game/modules/tome/data/zones/town-point-zero/npcs.lua
index 733eac9649..2884c41c47 100644
--- a/game/modules/tome/data/zones/town-point-zero/npcs.lua
+++ b/game/modules/tome/data/zones/town-point-zero/npcs.lua
@@ -188,7 +188,7 @@ newEntity{ base = "BASE_NPC_POINT_ZERO_TOWN", define_as = "ZEMEKKYS",
 		[Talents.T_GRAVITY_SPIKE]=5,
 		[Talents.T_REPULSION_FIELD]=5,
 		[Talents.T_GRAVITY_WELL]=5,
-		[Talents.T_ENERGY_DECOMPOSITION]=5,
+		[Talents.T_ENTROPY]=5,
 		[Talents.T_ENERGY_ABSORPTION]=5,
 		[Talents.T_REDUX]=5,
 		[Talents.T_TEMPORAL_FUGUE]=5,
diff --git a/game/modules/tome/data/zones/unhallowed-morass/npcs.lua b/game/modules/tome/data/zones/unhallowed-morass/npcs.lua
index 341a568b64..822c713a85 100644
--- a/game/modules/tome/data/zones/unhallowed-morass/npcs.lua
+++ b/game/modules/tome/data/zones/unhallowed-morass/npcs.lua
@@ -33,7 +33,6 @@ newEntity{
 
 	autolevel = "spider",
 	ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=2, },
-	global_speed_base = 1.2,
 	stats = { str=10, dex=17, mag=3, con=7 },
 	combat = { dammod={dex=0.8} },
 	combat_armor = 1, combat_def = 1,
diff --git a/game/modules/tome/dialogs/DeathDialog.lua b/game/modules/tome/dialogs/DeathDialog.lua
index 6ee772a12d..d6b1c6caba 100644
--- a/game/modules/tome/dialogs/DeathDialog.lua
+++ b/game/modules/tome/dialogs/DeathDialog.lua
@@ -263,6 +263,10 @@ function _M:use(item)
 		self.actor:updateModdableTile()
 		self.actor:check("on_resurrect", "lichform")
 		game:saveGame()
+	elseif act == "threads" then
+		game:chronoRestore("see_threads_base", true)
+		game:onTickEnd(function()game.player:removeEffect(game.player.EFF_SEE_THREADS)end)
+		game:saveGame()
 	elseif act == "easy_mode" then
 		self:eidolonPlane()
 	elseif act == "skeleton" then
@@ -308,6 +312,11 @@ function _M:generateList()
 
 	if config.settings.cheat then list[#list+1] = {name="Resurrect by cheating", action="cheat"} end
 	if not self.actor.no_resurrect and allow_res then
+		if self.actor:hasEffect(self.actor.EFF_SEE_THREADS) and game._chronoworlds then
+			self:use{action="threads"}
+			self.dont_show =true
+			return
+		end
 		if self.actor:isTalentActive(self.actor.T_LICHFORM) then
 			self:use{action="lichform"}
 			self.dont_show = true
diff --git a/game/modules/tome/dialogs/talents/ChronomancyContingency.lua b/game/modules/tome/dialogs/talents/ChronomancyContingency.lua
index ebb807e82f..cbe55e7965 100644
--- a/game/modules/tome/dialogs/talents/ChronomancyContingency.lua
+++ b/game/modules/tome/dialogs/talents/ChronomancyContingency.lua
@@ -43,7 +43,7 @@ function _M:init(actor)
 	Dialog.init(self, "Contingency", game.w * 0.6, game.h * 0.8)
 
 	self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[
-You may select a spell for Contingency to automatically use when your life falls below 25%.  Only active spells that do not require a target may be chosen.
+You may select a spell for Contingency to automatically use when your life falls below a percentage.  Only active spells that do not require a target may be chosen.
 ]]}
 	self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true}
 
@@ -104,7 +104,7 @@ function _M:generateList()
 
 	-- Generate lists of all talents by category
 	for j, t in pairs(self.actor.talents_def) do
-		if self.actor:knowTalent(t.id) and t.mode == "activated" and t.is_spell and not t.requires_target and not t.hide then
+		if self.actor:knowTalent(t.id) and t.mode == "activated" and t.is_spell and not t.requires_target and not t.hide and not t.fixed_cooldown then
 			local nodes = talents
 			local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"}
 			
diff --git a/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua b/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua
new file mode 100644
index 0000000000..6ce9532190
--- /dev/null
+++ b/game/modules/tome/dialogs/talents/ChronomancyEmpower.lua
@@ -0,0 +1,133 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Dialog = require "engine.ui.Dialog"
+local TreeList = require "engine.ui.TreeList"
+local ListColumns = require "engine.ui.ListColumns"
+local Textzone = require "engine.ui.Textzone"
+local TextzoneList = require "engine.ui.TextzoneList"
+local Separator = require "engine.ui.Separator"
+
+module(..., package.seeall, class.inherit(Dialog))
+-- Could use better icons when available
+--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"})
+--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"})
+
+-- generate talent status separately to enable quicker refresh of Dialog
+local function TalentStatus(who,t) 
+	local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} 
+
+	return tostring(status) 
+end
+
+function _M:init(actor)
+	self.actor = actor
+	actor.hotkey = actor.hotkey or {}
+	Dialog.init(self, "Empower", game.w * 0.6, game.h * 0.8)
+
+	self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[
+You may select a chronomancy spell to Empower, increasing your effective spellpower when casting that spell.
+]]}
+	self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true}
+
+	self:generateList()
+
+	local cols = {
+		{name="", width={40,"fixed"}, display_prop="char"},
+		{name="Talent", width=80, display_prop="name"},
+	}
+	self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end}
+	self.c_list.cur_col = 2
+
+	self:loadUI{
+		{left=0, top=0, ui=self.c_list},
+		{right=0, top=self.c_tut.h + 20, ui=self.c_desc},
+		{right=0, top=0, ui=self.c_tut},
+		{hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}},
+	}
+	self:setFocus(self.c_list)
+	self:setupUI()
+
+	self.key:addBinds{
+		EXIT = function() game:unregisterDialog(self) end,
+	}
+end
+
+function _M:on_register()
+	game:onTickEnd(function() self.key:unicodeInput(true) end)
+end
+
+function _M:select(item)
+	if item then
+		self.c_desc:switchItem(item, item.desc)
+		self.cur_item = item
+	end
+end
+
+function _M:use(item)
+	if not item or not item.talent then return end
+	self.actor:talentDialogReturn(item.talent)
+	game:unregisterDialog(self)
+end
+
+-- Display the player tile
+function _M:innerDisplay(x, y, nb_keyframes)
+	if self.cur_item and self.cur_item.entity then
+		self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64)
+	end
+end
+
+function _M:generateList()
+	-- Makes up the list
+	local list = {}
+	local letter = 1
+
+	local talents = {}
+	local chars = {}
+
+	-- Generate lists of all talents by category
+	for j, t in pairs(self.actor.talents_def) do
+		if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.mode ~= "passive" then
+			local nodes = talents
+			local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"}
+			
+			-- Pregenerate icon with the Tiles instance that allows images
+			if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end
+
+			nodes[#nodes+1] = {
+				name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(),
+				cname=t.name,
+				status=status,
+				entity=t.display_entity,
+				talent=t.id,
+				desc=self.actor:getTalentFullDescription(t),
+				color=function() return {0xFF, 0xFF, 0xFF} end
+			}
+		end
+	end
+	table.sort(talents, function(a,b) return a.cname < b.cname end)
+	for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end
+
+	list = {
+		{ char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Empower.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true },
+		chars = chars,
+	}
+	self.list = list
+end
diff --git a/game/modules/tome/dialogs/talents/ChronomancyExtension.lua b/game/modules/tome/dialogs/talents/ChronomancyExtension.lua
new file mode 100644
index 0000000000..aaed588ea8
--- /dev/null
+++ b/game/modules/tome/dialogs/talents/ChronomancyExtension.lua
@@ -0,0 +1,133 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Dialog = require "engine.ui.Dialog"
+local TreeList = require "engine.ui.TreeList"
+local ListColumns = require "engine.ui.ListColumns"
+local Textzone = require "engine.ui.Textzone"
+local TextzoneList = require "engine.ui.TextzoneList"
+local Separator = require "engine.ui.Separator"
+
+module(..., package.seeall, class.inherit(Dialog))
+-- Could use better icons when available
+--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"})
+--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"})
+
+-- generate talent status separately to enable quicker refresh of Dialog
+local function TalentStatus(who,t) 
+	local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} 
+
+	return tostring(status) 
+end
+
+function _M:init(actor)
+	self.actor = actor
+	actor.hotkey = actor.hotkey or {}
+	Dialog.init(self, "Extension", game.w * 0.6, game.h * 0.8)
+
+	self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[
+You may select a chronomancy spell to Extend, increasing the duration of that spell.
+]]}
+	self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true}
+
+	self:generateList()
+
+	local cols = {
+		{name="", width={40,"fixed"}, display_prop="char"},
+		{name="Talent", width=80, display_prop="name"},
+	}
+	self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end}
+	self.c_list.cur_col = 2
+
+	self:loadUI{
+		{left=0, top=0, ui=self.c_list},
+		{right=0, top=self.c_tut.h + 20, ui=self.c_desc},
+		{right=0, top=0, ui=self.c_tut},
+		{hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}},
+	}
+	self:setFocus(self.c_list)
+	self:setupUI()
+
+	self.key:addBinds{
+		EXIT = function() game:unregisterDialog(self) end,
+	}
+end
+
+function _M:on_register()
+	game:onTickEnd(function() self.key:unicodeInput(true) end)
+end
+
+function _M:select(item)
+	if item then
+		self.c_desc:switchItem(item, item.desc)
+		self.cur_item = item
+	end
+end
+
+function _M:use(item)
+	if not item or not item.talent then return end
+	self.actor:talentDialogReturn(item.talent)
+	game:unregisterDialog(self)
+end
+
+-- Display the player tile
+function _M:innerDisplay(x, y, nb_keyframes)
+	if self.cur_item and self.cur_item.entity then
+		self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64)
+	end
+end
+
+function _M:generateList()
+	-- Makes up the list
+	local list = {}
+	local letter = 1
+
+	local talents = {}
+	local chars = {}
+
+	-- Generate lists of all talents by category
+	for j, t in pairs(self.actor.talents_def) do
+		if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.getDuration and t.mode ~= "passive" then
+			local nodes = talents
+			local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"}
+			
+			-- Pregenerate icon with the Tiles instance that allows images
+			if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end
+
+			nodes[#nodes+1] = {
+				name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(),
+				cname=t.name,
+				status=status,
+				entity=t.display_entity,
+				talent=t.id,
+				desc=self.actor:getTalentFullDescription(t),
+				color=function() return {0xFF, 0xFF, 0xFF} end
+			}
+		end
+	end
+	table.sort(talents, function(a,b) return a.cname < b.cname end)
+	for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end
+
+	list = {
+		{ char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Extension.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true },
+		chars = chars,
+	}
+	self.list = list
+end
diff --git a/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua b/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua
new file mode 100644
index 0000000000..9a1d579cc5
--- /dev/null
+++ b/game/modules/tome/dialogs/talents/ChronomancyMatrix.lua
@@ -0,0 +1,133 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Dialog = require "engine.ui.Dialog"
+local TreeList = require "engine.ui.TreeList"
+local ListColumns = require "engine.ui.ListColumns"
+local Textzone = require "engine.ui.Textzone"
+local TextzoneList = require "engine.ui.TextzoneList"
+local Separator = require "engine.ui.Separator"
+
+module(..., package.seeall, class.inherit(Dialog))
+-- Could use better icons when available
+--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"})
+--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"})
+
+-- generate talent status separately to enable quicker refresh of Dialog
+local function TalentStatus(who,t) 
+	local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} 
+
+	return tostring(status) 
+end
+
+function _M:init(actor)
+	self.actor = actor
+	actor.hotkey = actor.hotkey or {}
+	Dialog.init(self, "Matrix", game.w * 0.6, game.h * 0.8)
+
+	self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[
+You may select a chronomancy spell to Matrix, reducing the cooldown of that spell.
+]]}
+	self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true}
+
+	self:generateList()
+
+	local cols = {
+		{name="", width={40,"fixed"}, display_prop="char"},
+		{name="Talent", width=80, display_prop="name"},
+	}
+	self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end}
+	self.c_list.cur_col = 2
+
+	self:loadUI{
+		{left=0, top=0, ui=self.c_list},
+		{right=0, top=self.c_tut.h + 20, ui=self.c_desc},
+		{right=0, top=0, ui=self.c_tut},
+		{hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}},
+	}
+	self:setFocus(self.c_list)
+	self:setupUI()
+
+	self.key:addBinds{
+		EXIT = function() game:unregisterDialog(self) end,
+	}
+end
+
+function _M:on_register()
+	game:onTickEnd(function() self.key:unicodeInput(true) end)
+end
+
+function _M:select(item)
+	if item then
+		self.c_desc:switchItem(item, item.desc)
+		self.cur_item = item
+	end
+end
+
+function _M:use(item)
+	if not item or not item.talent then return end
+	self.actor:talentDialogReturn(item.talent)
+	game:unregisterDialog(self)
+end
+
+-- Display the player tile
+function _M:innerDisplay(x, y, nb_keyframes)
+	if self.cur_item and self.cur_item.entity then
+		self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64)
+	end
+end
+
+function _M:generateList()
+	-- Makes up the list
+	local list = {}
+	local letter = 1
+
+	local talents = {}
+	local chars = {}
+
+	-- Generate lists of all talents by category
+	for j, t in pairs(self.actor.talents_def) do
+		if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and t.cooldown and t.mode ~= "passive" and not t.fixed_cooldown then
+			local nodes = talents
+			local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"}
+			
+			-- Pregenerate icon with the Tiles instance that allows images
+			if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end
+
+			nodes[#nodes+1] = {
+				name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(),
+				cname=t.name,
+				status=status,
+				entity=t.display_entity,
+				talent=t.id,
+				desc=self.actor:getTalentFullDescription(t),
+				color=function() return {0xFF, 0xFF, 0xFF} end
+			}
+		end
+	end
+	table.sort(talents, function(a,b) return a.cname < b.cname end)
+	for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end
+
+	list = {
+		{ char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Matrix.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true },
+		chars = chars,
+	}
+	self.list = list
+end
diff --git a/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua b/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua
new file mode 100644
index 0000000000..a0b19f6f78
--- /dev/null
+++ b/game/modules/tome/dialogs/talents/ChronomancyQuicken.lua
@@ -0,0 +1,133 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009 - 2014 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Dialog = require "engine.ui.Dialog"
+local TreeList = require "engine.ui.TreeList"
+local ListColumns = require "engine.ui.ListColumns"
+local Textzone = require "engine.ui.Textzone"
+local TextzoneList = require "engine.ui.TextzoneList"
+local Separator = require "engine.ui.Separator"
+
+module(..., package.seeall, class.inherit(Dialog))
+-- Could use better icons when available
+--local confirmMark = require("engine.Entity").new({image="ui/chat-icon.png"})
+--local autoMark = require("engine.Entity").new({image = "/ui/hotkeys/mainmenu.png"})
+
+-- generate talent status separately to enable quicker refresh of Dialog
+local function TalentStatus(who,t) 
+	local status = tstring{{"color", "LIGHT_GREEN"}, "Active"} 
+
+	return tostring(status) 
+end
+
+function _M:init(actor)
+	self.actor = actor
+	actor.hotkey = actor.hotkey or {}
+	Dialog.init(self, "Quicken", game.w * 0.6, game.h * 0.8)
+
+	self.c_tut = Textzone.new{width=math.floor(self.iw / 2 - 10), height=1, auto_height=true, no_color_bleed=true, text=[[
+You may select a chronomancy spell to Quicken, reducing the time it takes you to cast that spell.
+]]}
+	self.c_desc = TextzoneList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - self.c_tut.h - 20, scrollbar=true, no_color_bleed=true}
+
+	self:generateList()
+
+	local cols = {
+		{name="", width={40,"fixed"}, display_prop="char"},
+		{name="Talent", width=80, display_prop="name"},
+	}
+	self.c_list = TreeList.new{width=math.floor(self.iw / 2 - 10), height=self.ih - 10, all_clicks=true, scrollbar=true, columns=cols, tree=self.list, fct=function(item, sel, button) self:use(item, button) end, select=function(item, sel) self:select(item) end}
+	self.c_list.cur_col = 2
+
+	self:loadUI{
+		{left=0, top=0, ui=self.c_list},
+		{right=0, top=self.c_tut.h + 20, ui=self.c_desc},
+		{right=0, top=0, ui=self.c_tut},
+		{hcenter=0, top=5, ui=Separator.new{dir="horizontal", size=self.ih - 10}},
+	}
+	self:setFocus(self.c_list)
+	self:setupUI()
+
+	self.key:addBinds{
+		EXIT = function() game:unregisterDialog(self) end,
+	}
+end
+
+function _M:on_register()
+	game:onTickEnd(function() self.key:unicodeInput(true) end)
+end
+
+function _M:select(item)
+	if item then
+		self.c_desc:switchItem(item, item.desc)
+		self.cur_item = item
+	end
+end
+
+function _M:use(item)
+	if not item or not item.talent then return end
+	self.actor:talentDialogReturn(item.talent)
+	game:unregisterDialog(self)
+end
+
+-- Display the player tile
+function _M:innerDisplay(x, y, nb_keyframes)
+	if self.cur_item and self.cur_item.entity then
+		self.cur_item.entity:toScreen(game.uiset.hotkeys_display_icons.tiles, x + self.iw - 64, y + self.iy + self.c_tut.h - 32 + 10, 64, 64)
+	end
+end
+
+function _M:generateList()
+	-- Makes up the list
+	local list = {}
+	local letter = 1
+
+	local talents = {}
+	local chars = {}
+
+	-- Generate lists of all talents by category
+	for j, t in pairs(self.actor.talents_def) do
+		if self.actor:knowTalent(t.id) and t.type[1]:find("^chronomancy/") and not t.type[1]:find("^chronomancy/spellbinding") and not t.hide and not t.no_energy and t.mode ~= "passive" then
+			local nodes = talents
+			local status = tstring{{"color", "LIGHT_GREEN"}, "Talents"}
+			
+			-- Pregenerate icon with the Tiles instance that allows images
+			if t.display_entity then t.display_entity:getMapObjects(game.uiset.hotkeys_display_icons.tiles, {}, 1) end
+
+			nodes[#nodes+1] = {
+				name=((t.display_entity and t.display_entity:getDisplayString() or "")..t.name):toTString(),
+				cname=t.name,
+				status=status,
+				entity=t.display_entity,
+				talent=t.id,
+				desc=self.actor:getTalentFullDescription(t),
+				color=function() return {0xFF, 0xFF, 0xFF} end
+			}
+		end
+	end
+	table.sort(talents, function(a,b) return a.cname < b.cname end)
+	for i, node in ipairs(talents) do node.char = self:makeKeyChar(letter) chars[node.char] = node letter = letter + 1 end
+
+	list = {
+		{ char='', name=('#{bold}#Choose a talent#{normal}#'):toTString(), status='', hotkey='', desc="All talents that can be used with Quicken.", color=function() return colors.simple(colors.LIGHT_GREEN) end, nodes=talents, shown=true },
+		chars = chars,
+	}
+	self.list = list
+end
-- 
GitLab