From f0f6b333ecf11e7c23cc6271a927837bb8daf444 Mon Sep 17 00:00:00 2001
From: Ben Pope <b.pope1988@gmail.com>
Date: Tue, 20 Dec 2016 19:31:45 +0000
Subject: [PATCH] - Removed the Dual Weapon Training, Acrobatics and Field
 Control trees from players. These are still present for backwards
 compatibility. Escorts no longer grant these trees or talents from them -
 Heightened Senses now grants see invis/stealth and damage reduction against
 unseen. Trap effects have been removed - Track is now present in Tier 2
 Survival - Charm Mastery has been renamed Device Mastery, and grants the Trap
 effects of the old Heightened Senses - Danger Sense has been added to T4
 Survival. Grants a large damage reduction effect on falling below a life
 threshold. Has a cooldown - Piercing Sight and Evasion have been removed from
 Survival - Mobility has been restructured with the following talents (in
 order): Disengage, Tumble, Trained Reacions, Evasion - Disengage now also
 grants a movespeed boost and reload effect, as well as 1 turn of evasion -
 Tumble now has a shorter cooldown and no cost, but causes the cost to rapidly
 increase if used repeatedly - Trained Reactions costs less and scales off
 Defense - Evasion has a small stamina cost and scales off Dexterity only -
 Parry has been renamed to Dual Weapon Mastery, and also grants offhand damage
 and slightly increase parry chance - Duelist's Focus and Feint have had their
 effects increased - Marauder now gains Duelist - Total Thuggery now drains 6
 stamina each turn rather than 12-6 stamina each hit - Lethality grants
 critical strike damage bonus - Coup de Grace resets the cooldown on Stealth
 on kill - Increased the effect of Soothing Darkness - Fixed a few typos -
 Added Light Armour Training to Combat Training. This grants defense and armor
 hardiness when wearing light armor, and on moving into a tile adjacent to an
 enemy will grant a brief boost to % defense and stamina regeneration

---
 game/modules/tome/class/Actor.lua             |   6 +-
 game/modules/tome/class/Trap.lua              |   6 +-
 game/modules/tome/class/interface/Combat.lua  |  16 +-
 .../modules/tome/data/birth/classes/rogue.lua |  15 +-
 .../tome/data/birth/classes/warrior.lua       |   7 +-
 game/modules/tome/data/chats/escort-quest.lua |  14 +-
 .../tome/data/general/npcs/skeleton.lua       |   2 +-
 .../modules/tome/data/general/npcs/thieve.lua |   6 +-
 .../tome/data/gfx/talents/danger_sense.png    | Bin 0 -> 7091 bytes
 .../tome/data/gfx/talents/device_mastery.png  | Bin 0 -> 4719 bytes
 .../tome/data/gfx/talents/disengage.png       | Bin 2839 -> 2491 bytes
 .../{parry.png => dual_weapon_mastery.png}    | Bin
 .../modules/tome/data/gfx/talents/evasion.png | Bin 5944 -> 3032 bytes
 .../gfx/talents/light_armour_training.png     | Bin 0 -> 7884 bytes
 game/modules/tome/data/gfx/talents/track.png  | Bin 3946 -> 5919 bytes
 .../data/gfx/talents/trained_reactions.png    | Bin 0 -> 3413 bytes
 game/modules/tome/data/gfx/talents/tumble.png | Bin 0 -> 2175 bytes
 .../tome/data/talents/cunning/lethality.lua   |  14 +-
 .../tome/data/talents/cunning/stealth.lua     |  12 +-
 .../tome/data/talents/cunning/survival.lua    | 170 ++++++++-------
 game/modules/tome/data/talents/misc/npcs.lua  | 132 ++++++++++++
 .../data/talents/techniques/assassination.lua |   7 +-
 .../talents/techniques/combat-training.lua    |  40 +++-
 .../tome/data/talents/techniques/duelist.lua  |  20 +-
 .../data/talents/techniques/field-control.lua | 112 +++++-----
 .../tome/data/talents/techniques/mobility.lua | 195 +++++++++++++-----
 .../tome/data/talents/techniques/pugilism.lua |   8 +-
 .../talents/techniques/throwing-knives.lua    |   2 +-
 .../tome/data/talents/techniques/thuggery.lua |   6 +-
 .../talents/techniques/unarmed-training.lua   |  26 +--
 .../tome/data/timed_effects/physical.lua      |  71 ++++++-
 31 files changed, 621 insertions(+), 266 deletions(-)
 create mode 100644 game/modules/tome/data/gfx/talents/danger_sense.png
 create mode 100644 game/modules/tome/data/gfx/talents/device_mastery.png
 rename game/modules/tome/data/gfx/talents/{parry.png => dual_weapon_mastery.png} (100%)
 create mode 100644 game/modules/tome/data/gfx/talents/light_armour_training.png
 create mode 100644 game/modules/tome/data/gfx/talents/trained_reactions.png
 create mode 100644 game/modules/tome/data/gfx/talents/tumble.png

diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index f6cd2e4cf5..e56ad76d10 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -1324,8 +1324,8 @@ function _M:move(x, y, force)
 	self.did_energy = nil
 
 	-- Try to detect traps
-	if not force and self:knowTalent(self.T_HEIGHTENED_SENSES) then
-		local power = self:callTalent(self.T_HEIGHTENED_SENSES,"trapPower")
+	if not force and self:knowTalent(self.T_DEVICE_MASTERY) then
+		local power = self:callTalent(self.T_DEVICE_MASTERY,"trapPower")
 		local grids = core.fov.circle_grids(self.x, self.y, 1, true)
 		for x, yy in pairs(grids) do for y, _ in pairs(yy) do
 			local trap = game.level.map(x, y, Map.TRAP)
@@ -1572,7 +1572,7 @@ end
 -- param power detection power (optional)
 -- @return the trap @ x, y if present and detected
 function _M:detectTrap(trap, x, y, power)
-	power = power or self:callTalent(self.T_HEIGHTENED_SENSES, "trapPower")
+	power = power or self:callTalent(self.T_DEVICE_MASTERY, "trapPower")
 	if power <= 0 then return end
 	trap = trap or game.level.map(x, y, Map.TRAP)
 	if trap then
diff --git a/game/modules/tome/class/Trap.lua b/game/modules/tome/class/Trap.lua
index 0b73ba07b3..a16508dacb 100644
--- a/game/modules/tome/class/Trap.lua
+++ b/game/modules/tome/class/Trap.lua
@@ -164,8 +164,8 @@ function _M:canDisarm(x, y, who)
 	if not engine.Trap.canDisarm(self, x, y, who) then return false end
 
 	-- do we know how to disarm?
-	if (who:getTalentLevel(who.T_HEIGHTENED_SENSES) >= 3) or who:attr("can_disarm") then
-		local th = who:getTalentFromId(who.T_HEIGHTENED_SENSES)
+	if (who:getTalentLevel(who.T_DEVICE_MASTERY) >= 1) or who:attr("can_disarm") then
+		local th = who:getTalentFromId(who.T_DEVICE_MASTERY)
 		local power = th.trapPower(who, th) + (who:attr("disarm_bonus") or 0)
 		if who:checkHitOld(power, self.disarm_power) and (not self.faction or who:reactionToward(self) < 0) then
 			return true
@@ -193,7 +193,7 @@ function _M:onDisarm(x, y, who)
 	--table.set(game, "debug", "last_trap_disarmed", self) -- debugging
 	-- The player may unlock a trap talent when disarming a (similar) trap (uses Trap Mastery)
 	if self.unlock_talent_on_disarm and who.player and who:knowTalent(who.T_TRAP_MASTERY) and core.fov.distance(x, y, who.x, who.y) <= 1 and not game.state:unlockTalentCheck(self.unlock_talent_on_disarm.tid, who) then
-		local hit, chance = who:checkHit(who:callTalent(who.T_TRAP_MASTERY, "getPower") + who:callTalent(who.T_HEIGHTENED_SENSES, "trapPower")*.25, self.disarm_power)
+		local hit, chance = who:checkHit(who:callTalent(who.T_TRAP_MASTERY, "getPower") + who:callTalent(who.T_DEVICE_MASTERY, "trapPower")*.25, self.disarm_power)
 		local t = who:getTalentFromId(self.unlock_talent_on_disarm.tid)
 		if t and hit and chance > 20 and (not self.unlock_talent_on_disarm.chance or rng.percent(self.unlock_talent_on_disarm.chance)) and next(who:spotHostiles()) == nil then
 			local diff_level = (t.trap_mastery_level or 5)
diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index bb6d952fe2..2d996679c5 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -1173,6 +1173,9 @@ function _M:combatDefenseBase(fake)
 		if self:hasDualWeapon() and self:knowTalent(self.T_DUAL_WEAPON_DEFENSE) then
 			add = add + self:callTalent(self.T_DUAL_WEAPON_DEFENSE,"getDefense")
 		end
+		if self:hasLightArmor() and self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then
+			add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING,"getDefense")
+		end
 		if not fake then
 			add = add + (self:checkOnDefenseCall("defense") or 0)
 		end
@@ -1198,6 +1201,11 @@ function _M:combatDefenseBase(fake)
 	if self:hasLightArmor() and self:knowTalent(self.T_MOBILE_DEFENCE) then
 		mult = mult + self:callTalent(self.T_MOBILE_DEFENCE,"getDef")
 	end
+	
+	if self:hasLightArmor() and self:hasEffect(self.EFF_MOBILE_DEFENCE) then
+		local eff = self:hasEffect(self.EFF_MOBILE_DEFENCE)
+		mult = mult + (eff.power/100)
+	end
 
 	return math.max(0, d * mult + add) -- Add bonuses last to avoid compounding defense multipliers from talents
 end
@@ -1261,6 +1269,9 @@ function _M:combatArmorHardiness()
 	if self:hasLightArmor() and self:knowTalent(self.T_MOBILE_DEFENCE) then
 		add = add + self:callTalent(self.T_MOBILE_DEFENCE, "getHardiness")
 	end
+	if self:hasLightArmor() and self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then
+		add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING, "getArmorHardiness")
+	end
 	if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then
 		add = add + 50
 	end
@@ -1719,10 +1730,13 @@ end
 function _M:getOffHandMult(combat, mult)
 	if combat and combat.range and not combat.dam then return mult or 1 end --no penalty for ranged shooters
 	local offmult = 1/2
-	-- Take the bigger multiplier from Dual weapon training and Corrupted Strength
+	-- Take the bigger multiplier from Dual weapon training, Dual Weapon Mastery and Corrupted Strength
 	if self:knowTalent(Talents.T_DUAL_WEAPON_TRAINING) then
 		offmult = math.max(offmult,self:callTalent(Talents.T_DUAL_WEAPON_TRAINING,"getoffmult"))
 	end
+	if self:knowTalent(Talents.T_DUAL_WEAPON_MASTERY) then
+		offmult = math.max(offmult,self:callTalent(Talents.T_DUAL_WEAPON_MASTERY,"getoffmult"))
+	end
 	if self:knowTalent(Talents.T_CORRUPTED_STRENGTH) then
 		offmult = math.max(offmult,self:callTalent(Talents.T_CORRUPTED_STRENGTH,"getoffmult"))
 	end
diff --git a/game/modules/tome/data/birth/classes/rogue.lua b/game/modules/tome/data/birth/classes/rogue.lua
index 9937140199..62b9bc26b2 100644
--- a/game/modules/tome/data/birth/classes/rogue.lua
+++ b/game/modules/tome/data/birth/classes/rogue.lua
@@ -55,12 +55,10 @@ newBirthDescriptor{
 	stats = { dex=3, str=1, cun=5, },
 	talents_types = {
 		["technique/dualweapon-attack"]={true, 0.3},
-		["technique/dualweapon-training"]={true, 0.3},
 		["technique/duelist"]={true, 0.3},
 		["technique/combat-techniques-active"]={false, 0.3},
 		["technique/combat-training"]={true, 0.3},
-		["technique/field-control"]={false, 0},
-		["technique/acrobatics"]={true, 0.3},
+		["technique/mobility"]={true, 0.3},
 		["technique/throwing-knives"]={true, 0.3},
 		["technique/assassination"]={false, 0.3},
 		["cunning/stealth"]={true, 0.3},
@@ -77,7 +75,7 @@ newBirthDescriptor{
 	talents = {
 		[ActorTalents.T_SHOOT] = 1,
 		[ActorTalents.T_STEALTH] = 1,
-		[ActorTalents.T_PARRY] = 1,
+		[ActorTalents.T_DUAL_WEAPON_MASTERY] = 1,
 		[ActorTalents.T_LETHALITY] = 1,
 		[ActorTalents.T_DUAL_STRIKE] = 1,
 		[ActorTalents.T_KNIFE_MASTERY] = 1,
@@ -119,7 +117,7 @@ newBirthDescriptor{
 		["spell/divination"]={false, 0},
 		["spell/conveyance"]={true, 0},
 		["technique/dualweapon-attack"]={true, 0.2},
-		["technique/dualweapon-training"]={true, 0.2},
+		["technique/duelist"]={true, 0.2},
 		["technique/combat-techniques-active"]={true, 0.3},
 		["technique/combat-techniques-passive"]={false, 0.3},
 		["technique/combat-training"]={true, 0.2},
@@ -165,12 +163,10 @@ newBirthDescriptor{
 	stats = { dex=4, str=4, cun=1, },
 	talents_types = {
 		["technique/dualweapon-attack"]={true, 0.2},
-		["technique/dualweapon-training"]={true, 0.2},
-		["technique/duelist"]={false, 0.2},
+		["technique/duelist"]={true, 0.2},
 		["technique/combat-techniques-active"]={true, 0.3},
 		["technique/combat-techniques-passive"]={true, 0.0},
 		["technique/combat-training"]={true, 0.3},
-		["technique/field-control"]={true, 0.3},
 		["technique/battle-tactics"]={false, 0.2},
 		["technique/mobility"]={true, 0.3},
 		["technique/thuggery"]={true, 0.3},
@@ -225,10 +221,9 @@ newBirthDescriptor{
 		["cunning/called-shots"]={true, 0.3},
 		["technique/tireless-combatant"]={true, 0.3},
 		["cunning/trapping"]={false, 0.1},
-		["technique/mobility"]={true, 0.3},
 		
 		-- generic
-		["technique/acrobatics"]={true, 0.3},
+		["technique/mobility"]={true, 0.3},
 		["cunning/survival"]={true, 0.3},
 		["technique/combat-training"]={true, 0.3},
 		["technique/field-control"]={false, 0.1},
diff --git a/game/modules/tome/data/birth/classes/warrior.lua b/game/modules/tome/data/birth/classes/warrior.lua
index ac9253f8b3..31239bc6ec 100644
--- a/game/modules/tome/data/birth/classes/warrior.lua
+++ b/game/modules/tome/data/birth/classes/warrior.lua
@@ -67,7 +67,6 @@ newBirthDescriptor{
 		["technique/conditioning"]={true, 0.3},
 		["technique/superiority"]={false, 0.3},
 		["technique/warcries"]={false, 0.3},
-		["technique/field-control"]={false, 0},
 		["technique/bloodthirst"]={false, 0.2},
 		["cunning/survival"]={true, 0},
 		["cunning/dirty"]={false, 0},
@@ -115,7 +114,6 @@ newBirthDescriptor{
 		["technique/superiority"]={false, 0.3},
 		["technique/warcries"]={false, 0.3},
 		["technique/battle-tactics"]={false, 0.3},
-		["technique/field-control"]={false, 0},
 		["cunning/survival"]={true, 0},
 		["cunning/dirty"]={false, 0},
 	},
@@ -162,7 +160,7 @@ newBirthDescriptor{
 		["technique/combat-techniques-active"]={false, -0.1},
 		["technique/combat-techniques-passive"]={true, -0.1},
 		["technique/combat-training"]={true, 0.3},
-		["technique/field-control"]={true, 0},
+		["technique/mobility"]={true, 0},
 		["cunning/trapping"]={false, 0.2},
 		["cunning/survival"]={true, 0},
 		["cunning/dirty"]={false, 0},
@@ -288,9 +286,8 @@ newBirthDescriptor{
 	talents_types = {
 		["cunning/dirty"]={false, 0},
 		["cunning/tactical"]={true, 0.3},
-		["cunning/survival"]={false, 0},
+		["cunning/survival"]={true, 0},
 		["technique/combat-training"]={true, 0.1},
-		["technique/field-control"]={true, 0},
 		["technique/combat-techniques-active"]={true, 0.1},
 		["technique/combat-techniques-passive"]={true, 0.1},
 		["technique/pugilism"]={true, 0.3},
diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua
index c53c87f661..58bb33975f 100644
--- a/game/modules/tome/data/chats/escort-quest.lua
+++ b/game/modules/tome/data/chats/escort-quest.lua
@@ -98,8 +98,8 @@ local reward_types = {
 		},
 		talents = {
 			[Talents.T_HEIGHTENED_SENSES] = 1,
-			[Talents.T_CHARM_MASTERY] = 1,
-			[Talents.T_PIERCING_SIGHT] = 1,
+			[Talents.T_DEVICE_MASTERY] = 1,
+			[Talents.T_TRACK] = 1,
 		},
 		stats = {
 			[Stats.STAT_DEX] = 2,
@@ -123,8 +123,8 @@ local reward_types = {
 				["technique/mobility"] = 0.8,
 			},
 			talents = {
-				[Talents.T_HACK_N_BACK] = 1,
-				[Talents.T_LIGHT_OF_FOOT] = 1,
+				[Talents.T_DISENGAGE] = 1,
+				[Talents.T_EVASION] = 1,
 			},
 			saves = { spell = 4, phys = 4 },
 			stats = {
@@ -147,11 +147,11 @@ local reward_types = {
 		},
 		antimagic = {
 			types = {
-				["technique/field-control"] = 0.8,
+				["technique/feedback"] = 0.8,
 			},
 			talents = {
-				[Talents.T_TRACK] = 1,
-				[Talents.T_HEAVE] = 1,
+				[Talents.T_BIOFEEDBACK] = 1,
+				[Talents.T_CONVERSION] = 1,
 			},
 			saves = { spell = 4, mental = 4 },
 			stats = {
diff --git a/game/modules/tome/data/general/npcs/skeleton.lua b/game/modules/tome/data/general/npcs/skeleton.lua
index 55c8b5b49d..707cd8f47a 100644
--- a/game/modules/tome/data/general/npcs/skeleton.lua
+++ b/game/modules/tome/data/general/npcs/skeleton.lua
@@ -205,7 +205,7 @@ newEntity{ base = "BASE_NPC_SKELETON",
 	
 	resolvers.inscriptions(1, "rune"),
 	resolvers.talents{
-		[Talents.T_PARRY]={base=1, every=10, max=7},
+		[Talents.T_DUAL_WEAPON_MASTERY]={base=1, every=10, max=7},
 		[Talents.T_TEMPO]={base=1, every=10, max=7},
 		[Talents.T_FLURRY]={base=1, every=10, max=7},
 		[Talents.T_DIRTY_FIGHTING]={base=1, every=10, max=7},
diff --git a/game/modules/tome/data/general/npcs/thieve.lua b/game/modules/tome/data/general/npcs/thieve.lua
index c2ae15b8e6..b734542b47 100644
--- a/game/modules/tome/data/general/npcs/thieve.lua
+++ b/game/modules/tome/data/general/npcs/thieve.lua
@@ -145,7 +145,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_ASSASSIN",
 	resolvers.talents{
 		[Talents.T_STEALTH]={base=3, every=6, max=7},
 		[Talents.T_EXPOSE_WEAKNESS]={base=3, every=6, max=7},
-		[Talents.T_PARRY]={base=2, every=6, max=6},
+		[Talents.T_DUAL_WEAPON_MASTERY]={base=2, every=6, max=6},
 		[Talents.T_TEMPO]={base=2, every=6, max=6},
 		[Talents.T_DUAL_STRIKE]={base=1, every=6, max=6},
 		[Talents.T_COUP_DE_GRACE]={base=1, every=6, max=6},
@@ -167,7 +167,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_ASSASSIN",
 	combat_armor = 3, combat_def = 10,
 	resolvers.talents{
 		[Talents.T_STEALTH]={base=3, every=5, max=8},
-		[Talents.T_PARRY]={base=2, every=6, max=6},
+		[Talents.T_DUAL_WEAPON_MASTERY]={base=2, every=6, max=6},
 		[Talents.T_TEMPO]={base=2, every=6, max=6},
 		[Talents.T_DUAL_STRIKE]={base=1, every=6, max=6},
 		[Talents.T_SHADOWSTRIKE]={base=2, every=6, max=6},
@@ -204,7 +204,7 @@ newEntity{ base = "BASE_NPC_THIEF", define_as = "THIEF_SAPPER",
 		[Talents.T_TRAP_MASTERY]={base=3, every=6, max=7},
 		[Talents.T_TRAP_LAUNCHER]={base=1, every=8, max=5},
 		[Talents.T_TRAP_PRIMING]={base=-1, every=8, max=5},
-		[Talents.T_PARRY]={base=1, every=8, max=5},
+		[Talents.T_DUAL_WEAPON_MASTERY]={base=1, every=8, max=5},
 		[Talents.T_TEMPO]={base=1, every=8, max=5},
 		[Talents.T_DUAL_STRIKE]={base=1, every=6, max=6},
 		[Talents.T_DISARM]={base=1, every=6, max=6},
diff --git a/game/modules/tome/data/gfx/talents/danger_sense.png b/game/modules/tome/data/gfx/talents/danger_sense.png
new file mode 100644
index 0000000000000000000000000000000000000000..a11e3ce5395355f6f1b7e1815e17129d386e5990
GIT binary patch
literal 7091
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/device_mastery.png b/game/modules/tome/data/gfx/talents/device_mastery.png
new file mode 100644
index 0000000000000000000000000000000000000000..11d580f17759704383d5c93d931afdd4873a5c20
GIT binary patch
literal 4719
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/disengage.png b/game/modules/tome/data/gfx/talents/disengage.png
index aad8af98ebd6fa65a42341e059cfa02d505cf076..e78d2f3cf111e62a1534148d83ca634a99371e57 100644
GIT binary patch
delta 2465
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

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

diff --git a/game/modules/tome/data/gfx/talents/parry.png b/game/modules/tome/data/gfx/talents/dual_weapon_mastery.png
similarity index 100%
rename from game/modules/tome/data/gfx/talents/parry.png
rename to game/modules/tome/data/gfx/talents/dual_weapon_mastery.png
diff --git a/game/modules/tome/data/gfx/talents/evasion.png b/game/modules/tome/data/gfx/talents/evasion.png
index 7eb5e78002e8d5e32599b3f5427a7406dc6ab293..1b3c6cae47c248e90e7d1934f6c0e8aa479c75a4 100644
GIT binary patch
delta 3026
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
Ujfg)FSpWb407*qoM6N<$g6$-Du>b%7

literal 5944
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
a@&5r(5FNWpasO!m0000<MNUMnLSTY~yiOnh

diff --git a/game/modules/tome/data/gfx/talents/light_armour_training.png b/game/modules/tome/data/gfx/talents/light_armour_training.png
new file mode 100644
index 0000000000000000000000000000000000000000..385f270aeb40bdc96be5617df29ef40004dec90d
GIT binary patch
literal 7884
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/track.png b/game/modules/tome/data/gfx/talents/track.png
index 6f0351a17bf4aa1e36b2cf040d74052ec897fe8d..78b1ae58807f9c43e4ed9daae278f1e57dbd260d 100644
GIT binary patch
literal 5919
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
B^u7Q9

literal 3946
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
Ef*%}VW&i*H

diff --git a/game/modules/tome/data/gfx/talents/trained_reactions.png b/game/modules/tome/data/gfx/talents/trained_reactions.png
new file mode 100644
index 0000000000000000000000000000000000000000..3932fe977a5244c45cb0ffa65311379292fa2038
GIT binary patch
literal 3413
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

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/talents/tumble.png b/game/modules/tome/data/gfx/talents/tumble.png
new file mode 100644
index 0000000000000000000000000000000000000000..f8cd3bdc06794e0dbc0690fe462d394d7a8aecd1
GIT binary patch
literal 2175
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
B8Lj{T

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/talents/cunning/lethality.lua b/game/modules/tome/data/talents/cunning/lethality.lua
index 8d0a2e82c5..60f6081595 100644
--- a/game/modules/tome/data/talents/cunning/lethality.lua
+++ b/game/modules/tome/data/talents/cunning/lethality.lua
@@ -23,12 +23,18 @@ newTalent{
 	mode = "passive",
 	points = 5,
 	require = cuns_req1,
+	critpower = function(self, t) return self:combatTalentScale(t, 7.5, 20, 0.75) end,
+	-- called by _M:combatCrit in mod.class.interface.Combat.lua
 	getCriticalChance = function(self, t) return self:combatTalentScale(t, 2.3, 7.5, 0.75) end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "combat_critical_power", t.critpower(self, t))
+	end,
 	info = function(self, t)
 		local critchance = t.getCriticalChance(self, t)
-		return ([[You are trained to strike critical areas when fighting, and have a %d%% increased critical strike chance.
-		Also, when using knives, you use your Cunning instead of your Strength for bonus damage.]]):
-		format(critchance)
+		local power = t.critpower(self, t)
+		return ([[You have learned to find and hit weak spots. All your strikes have a %0.2f%% greater chance to be critical hits, and your critical hits do %0.1f%% more damage.
+		Also, when using knives, you now use your Cunning instead of your Strength for bonus damage.]]):
+		format(critchance, power)
 	end,
 }
 
@@ -118,7 +124,7 @@ newTalent{
 	end,
 	info = function(self, t)
 		return ([[Become a whirling storm of blades, increasing attack speed by %d%% and causing melee attacks to strike an additional adjacent target other than your primary target for %d%% weapon damage. 
-This talent is exhausting to use, draining -6 stamina each turn.]]):format(t.getSpeed(self, t)*100, t.getDamage(self,t)*100)
+This talent is exhausting to use, draining 6 stamina each turn.]]):format(t.getSpeed(self, t)*100, t.getDamage(self,t)*100)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/stealth.lua b/game/modules/tome/data/talents/cunning/stealth.lua
index 1b8c704311..ae3fe4af87 100644
--- a/game/modules/tome/data/talents/cunning/stealth.lua
+++ b/game/modules/tome/data/talents/cunning/stealth.lua
@@ -152,7 +152,7 @@ newTalent{
 	info = function(self, t)
 	local multiplier = t.getMultiplier(self, t)
 	return ([[When striking from stealth, the attack is automatically critical if the target does not notice you just before you land it. Spell and mind crits always critically strike, regardless of whether the target can see you.
-In addition, the surprise caused by your assault increases your critical multiplier by %d%%. This effect persists for 3 turns after exiting stealth, or 4 turns at talent level 3 and above.]]):
+In addition, the surprise caused by your assault increases your critical multiplier by %d%%. This effect persists for 2 turns after exiting stealth, or 3 turns at talent level 3 and above.]]):
 		format(multiplier)
 	end,
 }
@@ -163,15 +163,15 @@ newTalent{
 	require = cuns_req3,
 	points = 5,
 	mode = "passive",
-	getLife = function(self, t) return self:combatTalentScale(t, 1, 3) end,
-	getStamina = function(self, t) return self:combatTalentScale(t, 0.5, 2) end,
-	getReduction = function(self, t) return self:combatTalentStatDamage(t, "cun", 5, 25) end,
+	getLife = function(self, t) return self:combatTalentScale(t, 2, 10) end, --12 @TL5, mostly useful for out of combat as this won't do much in a fight
+	getStamina = function(self, t) return self:combatTalentScale(t, 1, 2.5) end, --2.9 @TL5
+	getReduction = function(self, t) return self:combatTalentStatDamage(t, "cun", 10, 35) end, --29 @100 Cun, effectively about 40% weaker than Automated Cloak Tesselation with less uptime
 	getDuration = function(self,t) if self:getTalentLevel(t) >= 3 then return 3 else return 2 end end,
 	info = function(self, t)
 		return ([[You have a special affinity for darkness.
 		When standing in an unlit grid, enemies observing you will not prevent you from entering stealth.
-		While stealted, and for %d turns thereafter, all damage against you is reduced by %d, your life regeneration is increased by %0.1f, and your stamina regeneration is increased %0.1f]]):
-		format(t.getDuration(self, t), t.getReduction(self,t), t.getLife(self,t), t.getStamina(self,t))
+		While stealthed, all damage against you is reduced by %d, your life regeneration is increased by %0.1f, and your stamina regeneration is increased %0.1f. This effect persists for 2 turns after exiting stealth, or 3 turns at talent level 3 and above.]]):
+		format(t.getReduction(self,t), t.getLife(self,t), t.getStamina(self,t))
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/cunning/survival.lua b/game/modules/tome/data/talents/cunning/survival.lua
index 9db5e8c9cc..0d9ccf049c 100644
--- a/game/modules/tome/data/talents/cunning/survival.lua
+++ b/game/modules/tome/data/talents/cunning/survival.lua
@@ -24,27 +24,108 @@ newTalent{
 	mode = "passive",
 	points = 5,
 	sense = function(self, t) return math.floor(self:combatTalentScale(t, 5, 9)) end,
-	trapPower = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getCun(25, true), 0, 0, 90, 125) end, -- ~90 at TL5, 100 cunning
+	seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5
+	getResists = function(self, t) return self:combatTalentLimit(t, 40, 5, 25) end,
 	passives = function(self, t, p)
 		self:talentTemporaryValue(p, "heightened_senses", t.sense(self, t))
+		self:talentTemporaryValue(p, "see_invisible", t.seePower(self, t))
+		self:talentTemporaryValue(p, "see_stealth", t.seePower(self, t))
+		if self:getTalentLevel(t) >= 3 then
+			self:talentTemporaryValue(p, "resist_unseen", t.getResists(self, t))
+		end
+	end,
+	info = function(self, t)
+		return ([[You notice the small things others do not notice, allowing you to "see" creatures in a %d radius even outside of light radius.
+		This is not telepathy, however, and it is still limited to line of sight.
+		Also, your attention to detail increases stealth detection and invisibility detection by %d.
+		At level 3, you are able to react quickly to stealthed and invisible enemies attacking you, reducing the damage they deal by %d%%.
+		The detection power improves with your Cunning.]]):
+		format(t.sense(self,t), t.seePower(self,t), t.getResists(self,t))
+	end,
+}
+
+newTalent{
+	name = "Track",
+	type = {"cunning/survival", 2},
+	require = cuns_req2,
+	points = 5,
+	random_ego = "utility",
+	cooldown = 20,
+	radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end,
+	no_npc_use = true,
+	action = function(self, t)
+		local rad = self:getTalentRadius(t)
+		self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), {
+			range = rad,
+			actor = 1,
+		})
+		return true
+	end,
+	info = function(self, t)
+		local rad = self:getTalentRadius(t)
+		return ([[Sense foes around you in a radius of %d for %d turns.
+		The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t))
+	end,
+}
+
+newTalent{
+	name = "Device Mastery",
+	type = {"cunning/survival", 3},
+	require = cuns_req3,
+	mode = "passive",
+	points = 5,
+	cdReduc = function(tl)
+		if tl <=0 then return 0 end
+		return math.floor(100*tl/(tl+7.5)) -- Limit < 100%
+	end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t)))
 	end,
 	on_learn = function(self, t)
-		if self:getTalentLevel(t) >= 3 and not self:knowTalent(self.T_DISARM_TRAP) then
+		if not self:knowTalent(self.T_DISARM_TRAP) then
 			self:learnTalent(self.T_DISARM_TRAP, true, 1)
 		end
 	end,
 	on_unlearn = function(self, t)
-		if self:getTalentLevel(t) < 3 and self:knowTalent(self.T_DISARM_TRAP) then
+		if self:getTalentLevel(t) < 1 and self:knowTalent(self.T_DISARM_TRAP) then
 			self:unlearnTalent(self.T_DISARM_TRAP, 1)
 		end
 	end,
+	trapPower = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getCun(25, true), 0, 0, 125, 125) end,
 	info = function(self, t)
-		return ([[You notice the small things others do not notice, allowing you to "see" creatures in a %d radius even outside of light radius.
-		This is not telepathy, however, and it is still limited to line of sight.
-		Also, your attention to detail allows you to detect traps around you (%d detection 'power').
-		At level 3, you learn to disarm known traps (%d disarm 'power').
-		The trap detection and disarming ability improves with your Cunning.]]):
-		format(t.sense(self,t),t.trapPower(self,t),t.trapPower(self,t))
+		return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns and the power cost of all usable items by %d%%.
+In addition, your knowledge of devices allows you to detect traps around you and disarm known traps (%d detection and disarm 'power').
+The trap detection and disarming ability improves with your Cunning. ]]):
+		format(t.cdReduc(self:getTalentLevel(t)), t.trapPower(self,t)) --I5
+	end,
+}
+
+newTalent{
+	name = "Danger Sense",
+	type = {"cunning/survival", 4},
+	require = cuns_req4,
+	points = 5,
+	mode = "passive",
+	getTrigger = function(self, t) return self:combatTalentScale(t, 0.15, 0.40, 0.5) end,
+	cooldown = function(self, t) return 30 end,
+	no_npc_use = true,
+	getReduction = function(self, t)
+		return self:combatTalentLimit(t, 75, 25, 65)
+	end,
+	callbackOnHit = function(self, t, cb, src)
+		if self.life > self.max_life*t.getTrigger(self,t) and self.life - cb.value <= self.max_life*t.getTrigger(self,t) and not self:isTalentCoolingDown(t) then
+			self:setEffect("EFF_DANGER_SENSE", 1, {reduce = t.getReduction(self, t)})
+			local eff = self:hasEffect("EFF_DANGER_SENSE")
+			eff.dur = eff.dur - 1
+			cb.value = cb.value * (100-t.getReduction(self, t)) / 100
+			self:startTalentCooldown(t)
+		end
+		return cb.value
+	end,
+	info = function(self, t)
+		return ([[You react quickly when in danger - on falling below %d%% life, all damage you take from the attack and all further damage that turn is reduced by %d%%.
+This talent has a cooldown.]]):
+		format(t.getTrigger(self,t)*100, t.getReduction(self,t) )
 	end,
 }
 
@@ -88,77 +169,10 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		local ths = self:getTalentFromId(self.T_HEIGHTENED_SENSES)
+		local ths = self:getTalentFromId(self.T_DEVICE_MASTERY)
 		local power = ths.trapPower(self,ths)
 		return ([[You search an adjacent grid for a hidden trap (%d detection 'power') and attempt to disarm it (%d disarm 'power').
 		To disarm a trap, you must be able to enter its grid to manipulate it, even though you stay in your current location.
 		Success depends on your skill in the %s talent and your Cunning, and failing to disarm a trap may trigger it.]]):format(power, power + (self:attr("disarm_bonus") or 0), ths.name)
 	end,
-}
-
-newTalent{
-	name = "Charm Mastery",
-	type = {"cunning/survival", 2},
-	require = cuns_req2,
-	mode = "passive",
-	points = 5,
-	cdReduc = function(tl)
-		if tl <=0 then return 0 end
-		return math.floor(100*tl/(tl+7.5)) -- Limit < 100%
-	end,
-	passives = function(self, t, p)
-		self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t)))
-	end,
---	on_unlearn = function(self, t)
---	end,
-	info = function(self, t)
-		return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns by %d%%.]]):
-		format(t.cdReduc(self:getTalentLevel(t)))
-	end,
-}
-
-newTalent{
-	name = "Piercing Sight",
-	type = {"cunning/survival", 3},
-	require = cuns_req3,
-	mode = "passive",
-	points = 5,
-	--  called by functions _M:combatSeeStealth and _M:combatSeeInvisible functions mod\class\interface\Combat.lua
-	seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5
-	info = function(self, t)
-		return ([[You look at your surroundings with more intensity than most people, allowing you to see stealthed or invisible creatures.
-		Increases stealth detection by %d and invisibility detection by %d.
-		The detection power increases with your Cunning.]]):
-		format(t.seePower(self,t), t.seePower(self,t))
-	end,
-}
-
-newTalent{
-	name = "Evasion",
-	type = {"cunning/survival", 4},
-	points = 5,
-	require = cuns_req4,
-	random_ego = "defensive",
-	tactical = { ESCAPE = 2, DEFEND = 2 },
-	cooldown = 30,
-	getDur = function(self) return math.floor(self:combatStatLimit("wil", 30, 6, 15)) end, -- Limit < 30
-	getChanceDef = function(self, t)
-		if self.perfect_evasion then return 100, 0 end
-		return self:combatLimit(5*self:getTalentLevel(t) + self:getCun(25,true) + self:getDex(25,true), 50, 10, 10, 37.5, 75),
-		self:combatScale(self:getTalentLevel(t) * (self:getCun(25, true) + self:getDex(25, true)), 0, 0, 55, 250, 0.75)
-		-- Limit evasion chance < 50%, defense bonus ~= 55 at level 50
-	end,
-	speed = "combat",
-	action = function(self, t)
-		local dur = t.getDur(self)
-		local chance, def = t.getChanceDef(self,t)
-		self:setEffect(self.EFF_EVASION, dur, {chance=chance, defense = def})
-		return true
-	end,
-	info = function(self, t)
-		local chance, def = t.getChanceDef(self,t)
-		return ([[Your quick wit allows you to see attacks before they land, granting you a %d%% chance to completely evade them and granting you %d defense for %d turns.
-		Duration increases with Willpower, and chance to evade and defense with Cunning and Dexterity.]]):
-		format(chance, def,t.getDur(self))
-	end,
-}
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 91bfd6b387..7e9a476bf0 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -3117,4 +3117,136 @@ newTalent{
 		You estimate your current chance to maintain stealth as %0.1f%%.]]):
 		format(t.stealthMult(self, t), t.getChance(self, t, true), t.getChance(self, t, false, true))
 	end,
+}
+
+newTalent{
+	name = "Hack'n'Back",
+	type = {"other/other", 1},
+	points = 5,
+	cooldown = 14,
+	stamina = 30,
+	tactical = { ESCAPE = 1, ATTACK = { weapon = 0.5 } },
+--	require = techs_dex_req1,
+	requires_target = true,
+	is_melee = true,
+	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
+	range = 1,
+	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1) end,
+	getDist = function(self, t) return math.ceil(self:combatTalentScale(t, 1.2, 3.3)) end,
+	on_pre_use = function(self, t)
+		if self:attr("never_move") then return false end
+		return true
+	end,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local x, y, target = self:getTarget(tg)
+		if not target or not self:canProject(tg, x, y) then return nil end
+		local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true)
+
+		if hitted then
+			self:knockback(target.x, target.y, t.getDist(self, t))
+		end
+
+		return true
+	end,
+	info = function(self, t)
+		local damage = t.getDamage(self, t)
+		local dist = t.getDist(self, t)
+		return ([[You hit your target, doing %d%% damage, distracting it while you jump back %d squares away.]]):
+		format(100 * damage, dist)
+	end,
+}
+
+newTalent{
+	name = "Mobile Defence",
+	type = {"other/other", 1},
+	mode = "passive",
+	points = 5,
+--	require = techs_dex_req2,
+	getDef = function(self, t) return self:getTalentLevel(t) * 0.08 end,
+	getHardiness = function(self, t) return self:getTalentLevel(t) * 0.06 end,
+	-- called by _M:combatDefenseBase function in mod\class\interface\Combat.lua
+	getDef = function(self, t) return self:combatTalentLimit(t, 1, 0.10, 0.40) end, -- Limit to <100% defense bonus
+	-- called by _M:combatArmorHardiness function in mod\class\interface\Combat.lua
+	getHardiness = function(self, t) return self:combatTalentLimit(t, 100, 6, 30) end, -- Limit < 100%
+	info = function(self, t)
+		return ([[Whilst wearing leather or lighter armour, you gain %d%% Defense and %d%% Armour hardiness.]]):
+		format(t.getDef(self, t) * 100, t.getHardiness(self, t))
+	end,
+}
+
+newTalent{
+	name = "Light of Foot",
+	type = {"other/other", 1},
+	mode = "passive",
+	points = 5,
+--	require = techs_dex_req3,
+	getFatigue = function(self, t) return self:combatTalentLimit(t, 100, 1.5, 7.5) end, -- Limit < 50%
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "fatigue", -t.getFatigue(self, t))
+	end,
+	info = function(self, t)
+		return ([[You are light on your feet, handling your armour better. Each step you take regenerates %0.2f stamina, and your fatigue is permanently reduced by %0.1f%%.
+		At level 3 you are able to walk so lightly that you never trigger traps that require pressure.]]):
+		format(self:getTalentLevelRaw(t) * 0.2, t.getFatigue(self, t))
+	end,
+
+}
+
+newTalent{
+	name = "Strider",
+	type = {"other/other", 1},
+	mode = "passive",
+	points = 5,
+--	require = techs_dex_req4,
+	incspeed = function(self, t) return self:combatTalentScale(t, 0.02, 0.10, 0.75) end,
+	CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 5)) end, -- Limit < 8
+	passives = function(self, t, p)
+		local cdr = t.CDreduce(self, t)
+		self:talentTemporaryValue(p, "movement_speed", t.incspeed(self, t))
+		self:talentTemporaryValue(p, "talent_cd_reduction",
+			{[Talents.T_RUSH]=cdr, [Talents.T_HACK_N_BACK]=cdr, [Talents.T_DISENGAGE]=cdr, [Talents.T_EVASION]=cdr})
+	end,
+	info = function(self, t)
+		return ([[You literally dance around your foes, increasing your movement speed by %d%% and reducing the cooldown of Hack'n'Back, Rush, Disengage and Evasion by %d turns.]]):
+		format(t.incspeed(self, t)*100,t.CDreduce(self, t))
+	end,
+}
+
+
+newTalent{
+	name = "Charm Mastery",
+	type = {"other/other", 1},
+--	require = cuns_req2,
+	mode = "passive",
+	points = 5,
+	cdReduc = function(tl)
+		if tl <=0 then return 0 end
+		return math.floor(100*tl/(tl+7.5)) -- Limit < 100%
+	end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "use_object_cooldown_reduce", t.cdReduc(self:getTalentLevel(t)))
+	end,
+--	on_unlearn = function(self, t)
+--	end,
+	info = function(self, t)
+		return ([[Your cunning manipulations allow you to use charms (wands, totems and torques) more efficiently, reducing their cooldowns by %d%%.]]):
+		format(t.cdReduc(self:getTalentLevel(t)))
+	end,
+}
+
+newTalent{
+	name = "Piercing Sight",
+	type = {"other/other", 1},
+--	require = cuns_req3,
+	mode = "passive",
+	points = 5,
+	--  called by functions _M:combatSeeStealth and _M:combatSeeInvisible functions mod\class\interface\Combat.lua
+	seePower = function(self, t) return self:combatScale(self:getCun(15, true)*self:getTalentLevel(t), 5, 0, 80, 75) end, --I5
+	info = function(self, t)
+		return ([[You look at your surroundings with more intensity than most people, allowing you to see stealthed or invisible creatures.
+		Increases stealth detection by %d and invisibility detection by %d.
+		The detection power increases with your Cunning.]]):
+		format(t.seePower(self,t), t.seePower(self,t))
+	end,
 }
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/techniques/assassination.lua b/game/modules/tome/data/talents/techniques/assassination.lua
index eb8ba2af48..ee5ac70ae6 100644
--- a/game/modules/tome/data/talents/techniques/assassination.lua
+++ b/game/modules/tome/data/talents/techniques/assassination.lua
@@ -66,9 +66,10 @@ newTalent{
 			end
 		end
 
-		if target.dead and self:knowTalent(self.T_STEALTH) and not self:isTalentActive(self.T_STEALTH) and not self:isTalentCoolingDown(self.T_STEALTH) then
+		if target.dead and self:knowTalent(self.T_STEALTH) and not self:isTalentActive(self.T_STEALTH) then
 			game:onTickEnd(function()
 				self.hide_chance = 1000
+				self.talents_cd["T_STEALTH"] = 0
 				self:forceUseTalent(self.T_STEALTH, {ignore_energy=true, silent = true})
 				self.hide_chance = nil
 			end)
@@ -81,7 +82,7 @@ newTalent{
 		dam = t.getDamage(self,t)*100
 		perc = t.getPercent(self,t)*100
 		return ([[Attempt to finish off a wounded enemy, striking them with both weapons for %d%% weapon damage, plus additional physical damage for each hit that lands equal to %d%% of their missing life (divided by rank: from 1 (critter) to 5 (elite boss)). 
-		A target brought below 20%% of its maximum life may be instantly slain, which you may take advantage of to slip back into stealth if it's not on cooldown.]]):
+		A target brought below 20%% of its maximum life may be instantly slain, which you may take advantage of to slip back into stealth.]]):
 		format(dam, perc)
 	end,
 }
@@ -105,7 +106,7 @@ newTalent{
 	info = function(self, t)
 		local radius = self:getTalentRadius(t)
 		local duration = t.getDuration(self,t)
-		return ([[When you exit stealth, you reveal yourself dramatically, intimitading foes around you. 
+		return ([[When you exit stealth, you reveal yourself dramatically, intimidating foes around you. 
 		All enemies that witness you leaving stealth within radius %d will be stricken with terror, which randomly inflicts stun, slow (40%% power), or confusion (50%% power) for %d turns.]])
 		:format(radius, duration)
 	end,
diff --git a/game/modules/tome/data/talents/techniques/combat-training.lua b/game/modules/tome/data/talents/techniques/combat-training.lua
index 8c71ed0df2..f320d77568 100644
--- a/game/modules/tome/data/talents/techniques/combat-training.lua
+++ b/game/modules/tome/data/talents/techniques/combat-training.lua
@@ -99,11 +99,49 @@ newTalent{
 	end,
 }
 
+newTalent{
+	name = "Light Armour Training",
+	type = {"technique/combat-training", 1},
+	mode = "passive",
+	levelup_screen_break_line = true,
+	no_unlearn_last = true,
+	points = 5,
+	require = {stat = {dex = function(level) return 16 + (level + 2) * (level - 1) end}},
+	getArmorHardiness = function(self, t)
+		return math.max(0, self:combatLimit(self:getTalentLevel(t) * 4, 100, 5, 3.75, 50, 37.5))
+	end,
+	getDefense = function(self, t) return self:combatScale(self:getTalentLevel(t) * self:getDex(), 4, 0, 45.7, 500) end,
+	getPercentageDefense = function(self, t) return self:combatTalentLimit(t, 75, 15, 45) end,
+	getStamina = function(self, t) return self:combatTalentLimit(t, 5, 1.5, 3.5) end,
+	callbackOnMove = function(self, t, moved, force, ox, oy)
+		if not moved or force or (ox == self.x and oy == self.y) then return end
+
+		local nb_foes = 0
+		local add_if_visible_enemy = function(x, y)
+			local target = game.level.map(x, y, game.level.map.ACTOR)
+			if target and self:reactionToward(target) < 0 and self:canSee(target) then
+				nb_foes = nb_foes + 1
+			end
+		end
+		local adjacent_tg = {type = "ball", range = 0, radius = 1, selffire = false}
+		self:project(adjacent_tg, self.x, self.y, add_if_visible_enemy)
+
+		if nb_foes > 0 then
+			self:setEffect(self.EFF_MOBILE_DEFENCE, 2, {power=t.getDefense(self,t), stamina=t.getStamina(self,t)})
+		end
+	end,
+	info = function(self, t)
+		return ([[Whilst wearing leather or lighter armour, you gain %d Defense and %d%% Armour hardiness.
+		In addition, stepping into a tile adjacent to a visible enemy will increase your stamina regeneration by %0.1f and total Defense by %d%% for 2 turns.
+		The Defense bonus scales with your Dexterity.]]):
+		format(t.getDefense(self,t), t.getArmorHardiness(self,t), t.getStamina(self,t), t.getPercentageDefense(self,t))
+	end,
+}
+
 newTalent{
 	name = "Combat Accuracy", short_name = "WEAPON_COMBAT",
 	type = {"technique/combat-training", 1},
 	points = 5,
-	levelup_screen_break_line = true,
 	require = { level=function(level) return (level - 1) * 4 end },
 	mode = "passive",
 	--getAttack = function(self, t) return self:getTalentLevel(t) * 10 end,
diff --git a/game/modules/tome/data/talents/techniques/duelist.lua b/game/modules/tome/data/talents/techniques/duelist.lua
index 4da20bbefb..587b19d2a4 100644
--- a/game/modules/tome/data/talents/techniques/duelist.lua
+++ b/game/modules/tome/data/talents/techniques/duelist.lua
@@ -22,13 +22,13 @@ local Object = require "engine.Object"
 local Map = require "engine.Map"
 
 newTalent{
-	name = "Parry",
+	name = "Dual Weapon Mastery",
 	type = {"technique/duelist", 1},
 	points = 5,
 	require = techs_dex_req1,
 	mode = "passive",
-	getDeflectChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 61) end, -- ~67% at TL 6.5
-	getDeflectPercent = function(self, t) return self:combatTalentLimit(t, 100, 20, 40) end,
+	getDeflectChance = function(self, t) return self:combatTalentLimit(t, 100, 20, 65) end,
+	getDeflectPercent = function(self, t) return self:combatTalentLimit(t, 100, 20, 50) end,
 	getDeflect = function(self, t, fake)
 		local dam,_,weapon = 0,self:hasDualWeapon()
 		if not weapon or weapon.subtype=="mindstar" and not fake then return 0 end
@@ -48,6 +48,9 @@ newTalent{
 		end
 		return t.getDeflectPercent(self, t) * dam/100
 	end,
+	getoffmult = function(self,t)
+		return	self:combatTalentLimit(t, 1, 0.65, 0.85)-- limit <100%
+	end,
 	callbackOnActBase = function(self, t)
 		local mh, oh = self:hasDualWeapon()
 --		if self:hasDualWeapon() then
@@ -60,10 +63,11 @@ newTalent{
 		block = t.getDeflect(self,t)
 		chance = t.getDeflectChance(self,t)
 		perc = t.getDeflectPercent(self,t)
+		mult = t.getoffmult(self,t)*100
 		return ([[Up to %d times a turn, you have a %d%% chance to parry up to %d damage (%d%% of your offhand weapon damage) from a melee or ranged attack.
 		A successful parry reduces damage like armour (before any attack multipliers) and prevents critical strikes.  It is difficult to parry attacks from unseen attackers and you cannot parry with a mindstar.
-		The number of attacks you can parry and their chance partially stacks with those of Dual Weapon Defense.]]):
-		format(t.getDeflects(self, t, true), chance, block, perc)
+		In addition, the damage dealt by your offhand weapon is increased to %d%%.]]):
+		format(t.getDeflects(self, t, true), chance, block, perc, mult)
 	end,
 }
 
@@ -126,7 +130,7 @@ newTalent{
 	cooldown = 30,
 	no_energy = true,
 	getChance = function(self, t) return self:combatTalentLimit(t, 25, 5, 15) end,
-	critResist = function(self, t) return self:combatTalentScale(t, 3, 8, 0.75) end,
+	critResist = function(self, t) return self:combatTalentScale(t, 15, 50, 0.75) end,
 	on_pre_use = function(self, t, silent, fake)
 		local armor = self:getInven("BODY") and self:getInven("BODY")[1]
 		if armor and (armor.subtype == "heavy" or armor.subtype == "massive") then
@@ -168,8 +172,8 @@ newTalent{
 	range = 1,
 	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
 	getDuration = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 3, 5)) end,
-	getSpeedPenalty = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 5, 50), 50, 10, 0, 30, 35.7) end, -- Limit < 50%
-	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 1.5) end,
+	getSpeedPenalty = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "dex", 5, 50), 100, 10, 0, 50, 35.7) end, -- Limit < 100%
+	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 1.2, 2.5) end,
 	on_pre_use = function(self, t, silent)
 		if self:attr("never_move") then
 			if not silent then game.logPlayer(self, "You must be able to move to use this talent.") end
diff --git a/game/modules/tome/data/talents/techniques/field-control.lua b/game/modules/tome/data/talents/techniques/field-control.lua
index 535ff39fa4..5a073d5416 100644
--- a/game/modules/tome/data/talents/techniques/field-control.lua
+++ b/game/modules/tome/data/talents/techniques/field-control.lua
@@ -18,64 +18,64 @@
 -- darkgod@te4.org
 
 
-newTalent{
-	name = "Disengage",
-	type = {"technique/field-control", 1},
-	require = techs_dex_req1,
-	points = 5,
-	random_ego = "utility",
-	cooldown = 12,
-	stamina = 20,
-	range = 7,
-	tactical = { ESCAPE = 2 },
-	requires_target = true,
-	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
-	on_pre_use = function(self, t)
-		if self:attr("never_move") then return false end
-		return true
-	end,
-	getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
-	action = function(self, t)
-		local tg = self:getTalentTarget(t)
-		local x, y, target = self:getTarget(tg)
-		if not target or not self:canProject(tg, x, y) then return nil end
-
-		self:knockback(target.x, target.y, t.getDist(self, t))
-		return true
-	end,
-	info = function(self, t)
-		return ([[Jump away %d grids from your target.]]):format(t.getDist(self, t))
-	end,
-}
-
-newTalent{
-	name = "Track",
-	type = {"technique/field-control", 2},
-	require = techs_dex_req2,
-	points = 5,
-	random_ego = "utility",
-	stamina = 20,
-	cooldown = 20,
-	radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end,
-	no_npc_use = true,
-	action = function(self, t)
-		local rad = self:getTalentRadius(t)
-		self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), {
-			range = rad,
-			actor = 1,
-		})
-		return true
-	end,
-	info = function(self, t)
-		local rad = self:getTalentRadius(t)
-		return ([[Sense foes around you in a radius of %d for %d turns.
-		The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t))
-	end,
-}
+--newTalent{
+--	name = "Disengage",
+--	type = {"technique/field-control", 1},
+--	require = techs_dex_req1,
+--	points = 5,
+--	random_ego = "utility",
+--	cooldown = 12,
+--	stamina = 20,
+--	range = 7,
+--	tactical = { ESCAPE = 2 },
+--	requires_target = true,
+--	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
+--	on_pre_use = function(self, t)
+--		if self:attr("never_move") then return false end
+--		return true
+--	end,
+--	getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
+--	action = function(self, t)
+--		local tg = self:getTalentTarget(t)
+--		local x, y, target = self:getTarget(tg)
+--		if not target or not self:canProject(tg, x, y) then return nil end
+--
+--		self:knockback(target.x, target.y, t.getDist(self, t))
+--		return true
+--	end,
+--	info = function(self, t)
+--		return ([[Jump away %d grids from your target.]]):format(t.getDist(self, t))
+--	end,
+--}
+--
+--newTalent{
+--	name = "Track",
+--	type = {"technique/field-control", 2},
+--	require = techs_dex_req2,
+--	points = 5,
+--	random_ego = "utility",
+--	stamina = 20,
+--	cooldown = 20,
+--	radius = function(self, t) return math.floor(self:combatScale(self:getCun(10, true) * self:getTalentLevel(t), 5, 0, 55, 50)) end,
+--	no_npc_use = true,
+--	action = function(self, t)
+--		local rad = self:getTalentRadius(t)
+--		self:setEffect(self.EFF_SENSE, 3 + self:getTalentLevel(t), {
+--			range = rad,
+--			actor = 1,
+--		})
+--		return true
+--	end,
+--	info = function(self, t)
+--		local rad = self:getTalentRadius(t)
+--		return ([[Sense foes around you in a radius of %d for %d turns.
+--		The radius will increase with your Cunning.]]):format(rad, 3 + self:getTalentLevel(t))
+--	end,
+--}
 
 newTalent{
 	name = "Heave",
-	type = {"technique/field-control", 3},
+	type = {"technique/field-control", 1},
 	require = techs_dex_req3,
 	points = 5,
 	random_ego = "defensive",
@@ -117,7 +117,7 @@ newTalent{
 
 newTalent{
 	name = "Slow Motion",
-	type = {"technique/field-control", 4},
+	type = {"technique/field-control", 2},
 	require = techs_dex_req4,
 	mode = "sustained",
 	points = 5,
diff --git a/game/modules/tome/data/talents/techniques/mobility.lua b/game/modules/tome/data/talents/techniques/mobility.lua
index f3376127ab..69b383e2d0 100644
--- a/game/modules/tome/data/talents/techniques/mobility.lua
+++ b/game/modules/tome/data/talents/techniques/mobility.lua
@@ -1,5 +1,5 @@
 -- ToME - Tales of Maj'Eyal
--- Copyright (C) 2009 - 2016 Nicolas Casalini
+-- 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
@@ -20,95 +20,186 @@
 local Map = require "engine.Map"
 
 newTalent{
-	name = "Hack'n'Back",
+	name = "Disengage",
 	type = {"technique/mobility", 1},
-	points = 5,
-	cooldown = 14,
-	stamina = 30,
-	tactical = { ESCAPE = 1, ATTACK = { weapon = 0.5 } },
 	require = techs_dex_req1,
+	points = 5,
+	random_ego = "utility",
+	cooldown = 10,
+	stamina = 12,
+	range = 7,
+	getSpeed = function(self, t) return self:combatTalentScale(t, 100, 250, 0.75) end,
+	getReload = function(self, t) return math.floor(self:combatTalentScale(t, 2, 10)) end,
+	tactical = { ESCAPE = 2 },
 	requires_target = true,
-	is_melee = true,
 	target = function(self, t) return {type="hit", range=self:getTalentRange(t)} end,
-	range = 1,
-	getDamage = function(self, t) return self:combatTalentWeaponDamage(t, 0.4, 1) end,
-	getDist = function(self, t) return math.ceil(self:combatTalentScale(t, 1.2, 3.3)) end,
 	on_pre_use = function(self, t)
 		if self:attr("never_move") then return false end
 		return true
 	end,
+	getDist = function(self, t) return math.floor(self:combatTalentScale(t, 3, 7)) end,
 	action = function(self, t)
 		local tg = self:getTalentTarget(t)
 		local x, y, target = self:getTarget(tg)
 		if not target or not self:canProject(tg, x, y) then return nil end
-		local hitted = self:attackTarget(target, nil, t.getDamage(self, t), true)
 
-		if hitted then
-			self:knockback(target.x, target.y, t.getDist(self, t))
+		self:knockback(target.x, target.y, t.getDist(self, t))
+		
+		if self:getTalentLevel(t) >= 4 then
+			self:setEffect("EFF_AVOIDANCE", 1, {power=100})
+			local eff = self:hasEffect("EFF_AVOIDANCE")
+			eff.dur = eff.dur - 1
+		end
+		
+		game:onTickEnd(function()
+			self:setEffect(self.EFF_WILD_SPEED, 3, {power=t.getSpeed(self,t)}) 
+		end)
+		
+		local weapon, ammo, offweapon = self:hasArcheryWeapon()	
+		if weapon and ammo and not ammo.infinite then
+			ammo.combat.shots_left = math.min(ammo.combat.shots_left + t.getReload(self, t), ammo.combat.capacity)
+			game.logSeen(self, "%s reloads.", self.name:capitalize())
 		end
 
 		return true
 	end,
 	info = function(self, t)
-		local damage = t.getDamage(self, t)
-		local dist = t.getDist(self, t)
-		return ([[You hit your target, doing %d%% damage, distracting it while you jump back %d squares away.]]):
-		format(100 * damage, dist)
+		return ([[Jump away %d grids from your target and gain a burst of speed on landing, increasing you movement speed by %d%% for 3 turns.
+		Any actions other than movement will end the speed boost.
+		At talent level 4 you avoid all attacks against you while disengaging.
+		If you have a quiver equip, you also take the time to reload %d shots.]]):
+		format(t.getDist(self, t), t.getSpeed(self,t), t.getReload(self,t))
 	end,
 }
 
-newTalent{
-	name = "Mobile Defence",
+newTalent {
+	name = "Tumble",
 	type = {"technique/mobility", 2},
-	mode = "passive",
-	points = 5,
 	require = techs_dex_req2,
-	getDef = function(self, t) return self:getTalentLevel(t) * 0.08 end,
-	getHardiness = function(self, t) return self:getTalentLevel(t) * 0.06 end,
-	-- called by _M:combatDefenseBase function in mod\class\interface\Combat.lua
-	getDef = function(self, t) return self:combatTalentLimit(t, 1, 0.10, 0.40) end, -- Limit to <100% defense bonus
-	-- called by _M:combatArmorHardiness function in mod\class\interface\Combat.lua
-	getHardiness = function(self, t) return self:combatTalentLimit(t, 100, 6, 30) end, -- Limit < 100%
-	info = function(self, t)
-		return ([[Whilst wearing leather or lighter armour, you gain %d%% Defense and %d%% Armour hardiness.]]):
-		format(t.getDef(self, t) * 100, t.getHardiness(self, t))
+	points = 5,
+	random_ego = "attack",
+	cooldown = function(self, t) 
+		return math.max(10 - self:getTalentLevel(t), 1) 
+	end,
+	no_energy = true,
+	no_break_stealth = true,
+	tactical = { ESCAPE = 2 },
+	stamina = function(self, t)
+		local eff = self:hasEffect(self.EFF_EXHAUSTION)
+		if eff and eff.charges then
+			return 15 + eff.charges*15
+		else
+			return 15
+		end
+	end,
+	range = function(self, t)
+		return math.floor(self:combatTalentScale(t, 2, 4))
+	end,
+	getDuration = function(self, t)
+		return math.max(20 - self:getTalentLevel(t), 5)
+	end,
+	target = function(self, t)
+		return {type="beam", range=self:getTalentRange(t), talent=t}
+	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 end
+		if self.x == x and self.y == y then return end
+		if core.fov.distance(self.x, self.y, x, y) > self:getTalentRange(t) or not self:hasLOS(x, y) then return end
+
+		if target or game.level.map:checkEntity(x, y, Map.TERRAIN, "block_move", self) then
+			game.logPlayer(self, "You must have an empty space to roll to.")
+			return false
+		end
+
+		self:move(x, y, true)
+		
+		game:onTickEnd(function()
+			self:setEffect(self.EFF_EXHAUSTION, t.getDuration(self,t), { max_stacks=5 })
+		end)
+		
+		return true
 	end,
+	info = function(self, t)
+		return ([[Move to a spot within range, bounding around, over, or through any enemies in the way. This can be used while pinned, and does not break stealth.
+		This quickly becomes exhausting to use, increasing the stamina cost by 15 for %d turns after use.]]):format(t.getDuration(self,t))
+	end
 }
 
-newTalent{
-	name = "Light of Foot",
+newTalent {
+	name = "Trained Reactions",
 	type = {"technique/mobility", 3},
-	mode = "passive",
+	mode = "sustained",
 	points = 5,
+	cooldown = function(self, t) return 10 end,
+	sustain_stamina = 10,
+	no_energy = true,
 	require = techs_dex_req3,
-	getFatigue = function(self, t) return self:combatTalentLimit(t, 100, 1.5, 7.5) end, -- Limit < 50%
-	passives = function(self, t, p)
-		self:talentTemporaryValue(p, "fatigue", -t.getFatigue(self, t))
+	tactical = { BUFF = 2 },
+	activate = function(self, t)
+		return {}
 	end,
-	info = function(self, t)
-		return ([[You are light on your feet, handling your armour better. Each step you take regenerates %0.2f stamina, and your fatigue is permanently reduced by %0.1f%%.
-		At level 3 you are able to walk so lightly that you never trigger traps that require pressure.]]):
-		format(self:getTalentLevelRaw(t) * 0.2, t.getFatigue(self, t))
+	deactivate = function(self, t, p)
+		return true
+	end,
+	getLifeTrigger = function(self, t)
+		return self:combatTalentLimit(t, 10, 40, 22)
+	end,
+	getReduction = function(self, t) 
+		return (0.05 + (self:combatTalentLimit(t, 1, 0.15, 0.50) * self:combatLimit(self:combatDefense(), 1, 0.20, 10, 0.50, 50)))*100
 	end,
+	callbackOnHit = function(self, t, cb, src)
+		if cb.value >= self.max_life * t.getLifeTrigger(self, t) * 0.01 and use_stamina(self, 10) then
+				-- Apply effect with duration 0.
+				self:setEffect("EFF_SKIRMISHER_DEFENSIVE_ROLL", 1, {reduce = t.getReduction(self, t)})
+				local eff = self:hasEffect("EFF_SKIRMISHER_DEFENSIVE_ROLL")
+				eff.dur = eff.dur - 1
 
+				cb.value = cb.value * (100-t.getReduction(self, t)) / 100
+		end
+		return cb.value
+	end,
+	info = function(self, t)
+		local trigger = t.getLifeTrigger(self, t)
+		local reduce = t.getReduction(self, t)
+		return ([[While this talent is sustained, you anticipate deadly attacks against you.
+		Any time you would lose more than %d%% of your life in a single hit, you instead duck out of the way and assume a defensive posture.
+		This reduces the triggering damage and all further damage in the same turn by %d%%.
+		This costs 10 stamina each time it triggers.
+		The damage reduction increases based on your Defense.]])
+		:format(trigger, reduce, cost)
+	end,
 }
 
 newTalent{
-	name = "Strider",
+	name = "Evasion",
 	type = {"technique/mobility", 4},
-	mode = "passive",
 	points = 5,
 	require = techs_dex_req4,
-	incspeed = function(self, t) return self:combatTalentScale(t, 0.02, 0.10, 0.75) end,
-	CDreduce = function(self, t) return math.floor(self:combatTalentLimit(t, 8, 1, 5)) end, -- Limit < 8
-	passives = function(self, t, p)
-		local cdr = t.CDreduce(self, t)
-		self:talentTemporaryValue(p, "movement_speed", t.incspeed(self, t))
-		self:talentTemporaryValue(p, "talent_cd_reduction",
-			{[Talents.T_RUSH]=cdr, [Talents.T_HACK_N_BACK]=cdr, [Talents.T_DISENGAGE]=cdr, [Talents.T_EVASION]=cdr})
+	random_ego = "defensive",
+	tactical = { ESCAPE = 2, DEFEND = 2 },
+	cooldown = 30,
+	stamina = 20,
+	no_energy = true,
+	getDur = function(self, t) return math.floor(self:combatTalentLimit(t, 30, 5, 9)) end, -- Limit < 30
+	getChanceDef = function(self, t)
+		if self.perfect_evasion then return 100, 0 end
+		return self:combatLimit(5*self:getTalentLevel(t) + self:getDex(50,true), 50, 10, 10, 37.5, 75),
+		self:combatScale(self:getTalentLevel(t) * (self:getDex(50, true)), 0, 0, 55, 250, 0.75)
+		-- Limit evasion chance < 50%, defense bonus ~= 55 at level 50
+	end,
+	speed = "combat",
+	action = function(self, t)
+		local dur = t.getDur(self,t)
+		local chance, def = t.getChanceDef(self,t)
+		self:setEffect(self.EFF_EVASION, dur, {chance=chance, defense = def})
+		return true
 	end,
 	info = function(self, t)
-		return ([[You literally dance around your foes, increasing your movement speed by %d%% and reducing the cooldown of Hack'n'Back, Rush, Disengage and Evasion by %d turns.]]):
-		format(t.incspeed(self, t)*100,t.CDreduce(self, t))
+		local chance, def = t.getChanceDef(self,t)
+		return ([[Your quick wit allows you to see melee attacks before they land, granting you a %d%% chance to completely evade them and granting you %d defense for %d turns.
+		The chance to evade and defense increases with your Dexterity.]]):
+		format(chance, def,t.getDur(self,t))
 	end,
-}
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/talents/techniques/pugilism.lua b/game/modules/tome/data/talents/techniques/pugilism.lua
index 4cd2ef1951..e1546a01ed 100644
--- a/game/modules/tome/data/talents/techniques/pugilism.lua
+++ b/game/modules/tome/data/talents/techniques/pugilism.lua
@@ -39,7 +39,13 @@ newTalent{
 	no_unlearn_last = true,
 	getAttack = function(self, t) return self:getDex(25, true) end,
 	getDamage = function(self, t) return self:combatStatScale("dex", 5, 35) end,
-	getFlatReduction = function(self, t) return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) end,
+	getFlatReduction = function(self, t) 
+		if self:knowTalent(self.T_REFLEX_DEFENSE) then
+			return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) * (1 + (self:callTalent(self.T_REFLEX_DEFENSE, "getFlatReduction")/100) )
+		else
+			return math.min(35, self:combatStatScale("str", 1, 30, 0.75)) 
+		end	
+	end,
 	-- 13 Strength = 2, 20 = 5, 30 = 9, 40 = 12, 50 = 16, 55 = 17, 70 = 22, 80 = 25
 	activate = function(self, t)
 		cancelStances(self)
diff --git a/game/modules/tome/data/talents/techniques/throwing-knives.lua b/game/modules/tome/data/talents/techniques/throwing-knives.lua
index 21c9509419..2dcd2b8dc9 100644
--- a/game/modules/tome/data/talents/techniques/throwing-knives.lua
+++ b/game/modules/tome/data/talents/techniques/throwing-knives.lua
@@ -273,7 +273,7 @@ newTalent{
 		local power = t.getCritPower(self,t)
 		local chance = t.getChance(self,t)
 		return ([[You are able to target your throwing knives with pinpoint accuracy, increasing their critical strike chance by %d%% and critical strike damage by %d%%. 
-In addition, your critical strikes with throwing knives have a %d%% chance will to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns.]])
+In addition, your critical strikes with throwing knives have a %d%% chance to randomly disable your target, possibly disarming, silencing or pinning them for 2 turns.]])
 		:format(crit, power, chance)
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/thuggery.lua b/game/modules/tome/data/talents/techniques/thuggery.lua
index 3901e32cd5..12fd4df033 100644
--- a/game/modules/tome/data/talents/techniques/thuggery.lua
+++ b/game/modules/tome/data/talents/techniques/thuggery.lua
@@ -127,24 +127,22 @@ newTalent{
 	tactical = { BUFF = 2 },
 	getCrit = function(self, t) return self:combatTalentStatDamage(t, "dex", 10, 50) / 1.5 end,
 	getPen = function(self, t) return self:combatLimit(self:combatTalentStatDamage(t, "str", 10, 50), 100, 0, 0, 35.7, 35.7) end, -- Limit to <100%
-	getDrain = function(self, t) return self:combatTalentLimit(t, 0, 11, 6) end, -- Limit to >0 stam
+	drain_stamina = 6,
 	activate = function(self, t)
 		local ret = {
 			crit = self:addTemporaryValue("combat_physcrit", t.getCrit(self, t)),
 			pen = self:addTemporaryValue("resists_pen", {[DamageType.PHYSICAL] = t.getPen(self, t)}),
-			drain = self:addTemporaryValue("stamina_regen_on_hit", - t.getDrain(self, t)),
 		}
 		return ret
 	end,
 	deactivate = function(self, t, p)
 		self:removeTemporaryValue("combat_physcrit", p.crit)
 		self:removeTemporaryValue("resists_pen", p.pen)
-		self:removeTemporaryValue("stamina_regen_on_hit", p.drain)
 		return true
 	end,
 	info = function(self, t)
 		return ([[You go all out, trying to burn down your foes as fast as possible.
-		Every hit in battle has +%d%% critical chance and +%d%% physical resistance penetration, but each strike drains %0.1f stamina.]]):
+		Every hit in battle has +%d%% critical chance and +%d%% physical resistance penetration, but this talent drains 6 stamina each turn.]]):
 		format(t.getCrit(self, t), t.getPen(self, t), t.getDrain(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/unarmed-training.lua b/game/modules/tome/data/talents/techniques/unarmed-training.lua
index a859bc9140..5e018dfd87 100644
--- a/game/modules/tome/data/talents/techniques/unarmed-training.lua
+++ b/game/modules/tome/data/talents/techniques/unarmed-training.lua
@@ -112,30 +112,20 @@ newTalent{
 	end,
 }
 
--- It's a bit wierd that this works against mind attacks
 newTalent{
 	name = "Reflex Defense",
 	type = {"technique/unarmed-training", 4},
-	require = techs_cun_req4, -- bit icky since this is clearly dex, but whatever, cun turns defense special *handwave*
+	require = techs_cun_req4,
 	points = 5,
 	mode = "passive",
-	getDamageReduction = function(self, t) 
-		return self:combatTalentLimit(t, 1, 0.15, 0.50) * self:combatLimit(self:combatDefense(), 1, 0.15, 10, 0.5, 50) -- Limit < 100%, 25% for TL 5.0 and 50 defense
+	getFlatReduction = function(self, t) return self:combatTalentScale(t, 30, 70, 0.75) end,
+	critResist = function(self, t) return self:combatTalentScale(t, 15, 50, 0.75) end,
+	passives = function(self, t, p)
+		self:talentTemporaryValue(p, "ignore_direct_crits", t.critResist(self, t))
 	end,
-	getDamagePct = function(self, t)
-		return self:combatTalentLimit(t, 0.1, 0.3, 0.15) -- Limit trigger > 10% life
-	end,
-	callbackOnHit = function(self, t, cb)
-		if ( cb.value > (t.getDamagePct(self, t) * self.max_life) ) then
-			local damageReduction = cb.value * t.getDamageReduction(self, t)
-			cb.value = cb.value - damageReduction
-			game.logPlayer(self, "#GREEN#You twist your body in complex ways mitigating the blow by #ORCHID#" .. math.ceil(damageReduction) .. "#LAST#.")
-		end
-		return cb.value
-	end, 
 	info = function(self, t)
-		return ([[Your understanding of physiology allows you to apply your reflexes in new ways.  Whenever you would receive damage (from any source) greater than %d%% of your maximum life you reduce that damage by %0.1f%% (based on your Defense).]]):
-		format(t.getDamagePct(self, t)*100, t.getDamageReduction(self, t)*100 )
-	end,
+		return ([[Your understanding of physiology allows you to apply your reflexes in new ways, increasing the flat damage reduction granted by Striking Stance by %d%% and causing direct critical hits (physical, mental, spells) against you to have a %d%% lower Critical multiplier (but always do at least normal damage).]]):
+		format(t.getFlatReduction(self,t), t.critResist(self,t) )
+	end
 }
 
diff --git a/game/modules/tome/data/timed_effects/physical.lua b/game/modules/tome/data/timed_effects/physical.lua
index afbf99b4f6..19e6367ab6 100644
--- a/game/modules/tome/data/timed_effects/physical.lua
+++ b/game/modules/tome/data/timed_effects/physical.lua
@@ -2069,7 +2069,7 @@ newEffect{ -- Note: This effect is cancelled by EFF_DISARMED
 }
 
 newEffect{ -- Note: This effect is cancelled by EFF_DISARMED
-	name = "PARRY", image = "talents/parry.png",
+	name = "PARRY", image = "talents/dual_weapon_mastery.png",
 	desc = "Parrying",
 	deflectchance = function(self, eff, adj) -- The last partial deflect has a reduced chance to happen
 		adj = adj or 1
@@ -3507,3 +3507,72 @@ newEffect{
 	deactivate = function(self, eff)
 	end,
 }
+
+newEffect{
+	name = "AVOIDANCE", image = "talents/disengage.png",
+	desc = "Avoidance",
+	long_desc = function(self, eff) return ("%d%% chance to fully evade any damaging actions."):format(eff.power) end,
+	type = "physical",
+	subtype = { evade=true },
+	status = "beneficial",
+	parameters = { power=10 },
+	activate = function(self, eff)
+		eff.tmpid = self:addTemporaryValue("cancel_damage_chance", eff.power)
+	end,
+	deactivate = function(self, eff)
+		self:removeTemporaryValue("cancel_damage_chance", eff.tmpid)
+	end,
+}
+
+newEffect{
+	name = "EXHAUSTION", image = "talents/slumber.png",
+	desc = "Exhaustion",
+	long_desc = function(self, eff) return ("The target is exhausted, increasing the stamina cost of Tumble by %d."):format(eff.charges*30) end,
+	type = "other",
+	subtype = {  },
+	status = "detrimental",
+	parameters = {  },
+	charges = function(self, eff) return eff.charges end,
+	on_merge = function(self, old_eff, new_eff)
+		new_eff.charges = math.min(old_eff.charges + 1, 5)
+		return new_eff
+	end,
+	activate = function(self, eff)
+		eff.charges = 1
+	end,
+	deactivate = function(self, eff)
+	end,
+}
+
+newEffect {
+	name = "DANGER_SENSE", image = "talents/danger_sense.png",
+	desc = "Danger Sense",
+	type = "physical",
+	subtype = {tactic = true},
+	status = "beneficial",
+	parameters = {
+		-- percent of all damage to ignore
+		reduce = 50
+	},
+	on_gain = function(self, eff) return "#Target# danger sense lets them narrowly avoid the blow!" end,
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "incoming_reduce", eff.reduce)
+	end,
+	long_desc = function(self, eff)
+		return ([[The target is avoiding damage, ignoring %d%% of all incoming damage.]])
+		:format(eff.reduce)
+	end,
+}
+
+newEffect{
+	name = "MOBILE_DEFENCE", image = "talents/light_armour_training.png",
+	desc = "Mobile Defense",
+	long_desc = function(self, eff) return ("Increases stamina regeneration by %d and total defense by %d%%."):format(eff.stamina, eff.power) end,
+	type = "physical",
+	subtype = { tactic=true },
+	status = "beneficial",
+	parameters = {stamina=1, power=10},
+	activate = function(self, eff)
+		self:effectTemporaryValue(eff, "stamina_regen", eff.stamina)
+	end,
+}
-- 
GitLab