diff --git a/game/modules/tome/class/interface/Combat.lua b/game/modules/tome/class/interface/Combat.lua
index 72fc581b499bad17ae41c09c5fbae941b49127c9..596ea974821dbd60cebf6469fbd0b25ac95f00ed 100644
--- a/game/modules/tome/class/interface/Combat.lua
+++ b/game/modules/tome/class/interface/Combat.lua
@@ -1281,6 +1281,12 @@ function _M:combatArmor()
 	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
+	local light_armor = self:hasLightArmor()
+	if light_armor then
+		if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then
+			add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getArmour")
+		end
+	end
 	if self:knowTalent(self.T_CORRUPTED_SHELL) then
 		add = add + self:getCon() / 3.5
 	end
@@ -1297,9 +1303,6 @@ end
 function _M:combatArmorHardiness()
 	local add = 0
 	local multi = 1
-	if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then
-		add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getHardiness")
-	end
 	if self:hasHeavyArmor() and self:knowTalent(self.T_ARMOUR_TRAINING) then
 		local at = Talents:getTalentFromId(Talents.T_ARMOUR_TRAINING)
 		add = add + at.getArmorHardiness(self, at)
@@ -1316,6 +1319,9 @@ function _M:combatArmorHardiness()
 		if self:knowTalent(self.T_LIGHT_ARMOUR_TRAINING) then
 			add = add + self:callTalent(self.T_LIGHT_ARMOUR_TRAINING, "getArmorHardiness")
 		end
+		if self:knowTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE) then
+			add = add + self:callTalent(self.T_SKIRMISHER_BUCKLER_EXPERTISE, "getArmorHardiness")
+		end
 	end
 	if self:knowTalent(self.T_ARMOUR_OF_SHADOWS) and not game.level.map.lites(self.x, self.y) then
 		add = add + 50
diff --git a/game/modules/tome/data/chats/escort-quest.lua b/game/modules/tome/data/chats/escort-quest.lua
index 503f4f9b9cd707247c22887213c797709955c10b..c3c268cbe5d81d0d5e0cd5171ef57c4b523a70d9 100644
--- a/game/modules/tome/data/chats/escort-quest.lua
+++ b/game/modules/tome/data/chats/escort-quest.lua
@@ -150,7 +150,7 @@ local reward_types = {
 				["psionic/feedback"] = 0.8,
 			},
 			talents = {
-				[Talents.T_BIOFEEDBACK] = 1,
+				[Talents.T_RESONANCE_FIELD] = 1,
 				[Talents.T_CONVERSION] = 1,
 			},
 			saves = { spell = 4, mental = 4 },
diff --git a/game/modules/tome/data/talents/celestial/combat.lua b/game/modules/tome/data/talents/celestial/combat.lua
index 1371f2de6daa6b0493be6bb2e27b0f11f4318c42..7dc2df3e52408a1f880ccf45c156de8ba407187f 100644
--- a/game/modules/tome/data/talents/celestial/combat.lua
+++ b/game/modules/tome/data/talents/celestial/combat.lua
@@ -31,7 +31,7 @@ newTalent{
 	range = 10,
 	getDamage = function(self, t) return 7 + self:combatSpellpower(0.092) * self:combatTalentScale(t, 1, 7) end,
 	getShieldFlat = function(self, t)
-		return t.getDamage(self, t) / 2
+		return t.getDamage(self, t)
 	end,
 	activate = function(self, t)
 		game:playSoundNear(self, "talents/spell_generic2")
@@ -45,7 +45,9 @@ newTalent{
 		return true
 	end,
 	callbackOnMeleeAttack = function(self, t, target, hitted, crit, weapon, damtype, mult, dam)
+		if self.turn_procs.weapon_of_light then return end
 		if hitted and self:hasEffect(self.EFF_DAMAGE_SHIELD) and (self:reactionToward(target) < 0) then
+			self.turn_procs.weapon_of_light = true
 			-- Shields can't usually merge, so change the parameters manually
 			local shield = self:hasEffect(self.EFF_DAMAGE_SHIELD)
 			local shield_power = t.getShieldFlat(self, t)
@@ -56,6 +58,7 @@ newTalent{
 			shield.dur = math.max(2, shield.dur)
 
 			-- Limit the number of times a shield can be extended, Bathe in Light also uses this code
+			-- The shield is removed instead of just blocking the extension to prevent scenarios such as maxing it out of combat then engaging, but there are likely better ways
 			if shield.dur_extended then
 				shield.dur_extended = shield.dur_extended + 1
 				if shield.dur_extended >= 20 then
@@ -64,13 +67,12 @@ newTalent{
 				end
 			else shield.dur_extended = 1 end
 		end
-
 	end,
 	info = function(self, t)
 		local damage = t.getDamage(self, t)
 		local shieldflat = t.getShieldFlat(self, t)
 		return ([[Infuse your weapon with the power of the Sun, adding %0.1f light damage on each melee hit.
-		Additionally, if you have a temporary damage shield active, melee attacks will increase its power by %d.
+		Additionally, if you have a temporary damage shield active, melee hits will increase its power by %d once per turn.
 		If the same shield is refreshed 20 times it will become unstable and explode, removing it.
 		The damage dealt and shield bonus will increase with your Spellpower.]]):
 		format(damDesc(self, DamageType.LIGHT, damage), shieldflat)
@@ -176,7 +178,8 @@ newTalent{
 		local damagepct = t.getLifeDamage(self, t)
 		local damage = t.getDamage(self, t)
 		return ([[Your weapon attacks burn with righteous fury, dealing %d%% of your lost HP as additional Fire damage (up to %d, Current:  %d).
-		Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns.]]):
+		Targets struck are also afflicted with a Martyrdom effect that causes them to take %d%% of all damage they deal for 4 turns.
+		The bonus damage can only occur once per turn.]]):
 		format(damagepct*100, t.getMaxDamage(self, t, 10, 400), damage, martyr)
 	end,
 }
diff --git a/game/modules/tome/data/talents/celestial/crusader.lua b/game/modules/tome/data/talents/celestial/crusader.lua
index 80823d242651752a39eb517ca036b07edbb1e62f..c3450289314a755f13a27b915c80acb0ea15df80 100644
--- a/game/modules/tome/data/talents/celestial/crusader.lua
+++ b/game/modules/tome/data/talents/celestial/crusader.lua
@@ -81,12 +81,12 @@ newTalent{
 		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) > 5 then return nil end
-		target:setEffect(target.EFF_MARK_OF_LIGHT, 5, {src=self, power=t.getPower(self, t)})
+		target:setEffect(target.EFF_MARK_OF_LIGHT, 3, {src=self, power=t.getPower(self, t)})
 		
 		return true
 	end,
 	info = function(self, t)
-		return ([[You mark a target with light for 5 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done.]]):
+		return ([[You mark a target with light for 3 turns, causing all melee hits you deal to it to heal you for %d%% of the damage done.]]):
 		format(t.getPower(self, t))
 	end,
 }
@@ -135,7 +135,7 @@ newTalent{
 	require = divi_req_high4,
 	random_ego = "attack",
 	points = 5,
-	cooldown = 9,
+	cooldown = 12,
 	positive = 15,
 	tactical = { ATTACKAREA = {LIGHT = 2} },
 	range = 0,
diff --git a/game/modules/tome/data/talents/celestial/radiance.lua b/game/modules/tome/data/talents/celestial/radiance.lua
index d8e5fefcfb698d05599100ec643da612bdab668c..c8bf8af99fefca60ea215c61cb15fbbb0053b5a6 100644
--- a/game/modules/tome/data/talents/celestial/radiance.lua
+++ b/game/modules/tome/data/talents/celestial/radiance.lua
@@ -18,11 +18,7 @@
 -- darkgod@te4.org
 
 function radianceRadius(self)
-	if self:hasEffect(self.EFF_RADIANCE_DIM) then
-		return 1
-	else
-		return self:getTalentRadius(self:getTalentFromId(self.T_RADIANCE))
-	end
+	return self:getTalentRadius(self:getTalentFromId(self.T_RADIANCE))
 end
 
 newTalent{
@@ -31,7 +27,7 @@ newTalent{
 	mode = "passive",
 	require = divi_req1,
 	points = 5,
-	radius = function(self, t) return self:combatTalentScale(t, 3, 7) end,
+	radius = function(self, t) return self:combatTalentLimit(t, 14, 3, 10) end,
 	getResist = function(self, t) return self:combatTalentLimit(t, 100, 25, 75) end,
 	passives = function(self, t, p)
 		self:talentTemporaryValue(p, "radiance_aura", radianceRadius(self))
@@ -57,20 +53,22 @@ newTalent{
 	callbackOnActBase = function(self, t)
 		local radius = radianceRadius(self)
 		local grids = core.fov.circle_grids(self.x, self.y, radius, true)
+		local ss = self:isTalentActive(self.T_SEARING_SIGHT)
+		local ss_talent = self:getTalentFromId(self.T_SEARING_SIGHT)
+		local damage = ss_talent.getDamage(self, ss_talent)
+		local daze = ss_talent.getDaze(self, ss_talent)
+
 		for x, yy in pairs(grids) do for y, _ in pairs(grids[x]) do local target = game.level.map(x, y, Map.ACTOR) if target and self ~= target then
 			if (self:reactionToward(target) < 0) then
 				target:setEffect(target.EFF_ILLUMINATION, 1, {power=t.getPower(self, t), def=t.getDef(self, t)})
-				local ss = self:isTalentActive(self.T_SEARING_SIGHT)
-				if ss then
-					local dist = core.fov.distance(self.x, self.y, target.x, target.y) - 1
-					local coeff = math.max(0.1, 1 - (0.1*dist)) -- 10% less damage per distance
-					DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, ss.dam * coeff)
-					if ss.daze and rng.percent(ss.daze) and target:canBe("stun") then
-						target:setEffect(target.EFF_DAZED, 3, {apply_power=self:combatSpellpower()})
+				if ss and not target:hasEffect(target.EFF_DAZED) then
+					DamageType:get(DamageType.LIGHT).projector(self, target.x, target.y, DamageType.LIGHT, damage)
+					if daze and rng.percent(ss.daze) and target:canBe("stun") then
+						target:setEffect(target.EFF_DAZED, 5, {apply_power=self:combatSpellpower()})
 					end
 				end
 		end
-		end end end		
+		end end end
 	end,
 	info = function(self, t)
 		return ([[The light of your Radiance allows you to see that which would normally be unseen.
@@ -81,8 +79,6 @@ newTalent{
 	end,
 }
 
--- This doesn't work well in practice.. Its powerful but it leads to cheesy gameplay, spams combat logs, maybe even lags
--- It can stay like this for now but may be worth making better
 newTalent{
 	name = "Searing Sight",
 	type = {"celestial/radiance",3},
@@ -94,7 +90,7 @@ newTalent{
 	tactical = { ATTACKAREA = {LIGHT=1} },
 	sustain_positive = 10,
 	getDamage = function(self, t) return self:combatTalentSpellDamage(t, 1, 35) end,
-	getDaze = function(self, t) return self:combatTalentLimit(t, 35, 5, 20) end,
+	getDaze = function(self, t) return self:combatTalentLimit(t, 35, 5, 25) end,
 	updateParticle = function(self, t)
 		local p = self:isTalentActive(self.T_SEARING_SIGHT)
 		if not p then return end
@@ -102,12 +98,9 @@ newTalent{
 		p.particle = self:addParticles(Particles.new("circle", 1, {toback=true, oversize=1, a=20, appear=4, speed=-0.2, img="radiance_circle", radius=self:getTalentRange(t)}))
 	end,
 	activate = function(self, t)
-		local daze = nil
-		if self:getTalentLevel(t) >= 4 then daze = t.getDaze(self, t) end
 		return {
 			particle = self:addParticles(Particles.new("circle", 1, {toback=true, oversize=1, a=20, appear=4, speed=-0.2, img="radiance_circle", radius=self:getTalentRange(t)})),
-			dam=t.getDamage(self, t),
-			daze=daze,
+			daze=t.getDaze(self, t),
 		}
 	end,
 	deactivate = function(self, t, p)
@@ -115,8 +108,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Your Radiance is so powerful it burns all foes caught in it, doing up to %0.1f light damage (reduced with distance) to all foes caught inside.
-		At level 4 the light is so bright it has %d%% chance to daze them for 3 turns.
+		return ([[Your Radiance is so powerful it burns all foes caught in it, doing %0.1f light damage to all non-dazed foes caught inside.
+		Each enemy effected has a %d%% chance of being dazed for 5 turns.
 		The damage increases with your Spellpower.]]):
 		format(damDesc(self, DamageType.LIGHT, t.getDamage(self, t)), t.getDaze(self, t))
 	end,
@@ -163,14 +156,11 @@ newTalent{
 			)
 			game.zone:addEntity(game.level, proj, "projectile", self.x, self.y)
 		end)
-		
-		-- EFF_RADIANCE_DIM does nothing by itself its just used by radianceRadius
-		self:setEffect(self.EFF_RADIANCE_DIM, 5, {})
 
 		return true
 	end,
 	info = function(self, t)
-		return ([[Fire a glowing orb of light at each enemy within your Radiance.  Each orb will slowly follow its target until it connects dealing %d light damage to anything else it contacts along the way.  When the target is reached the orb will explode dealing %d light damage and healing you for 50%% of the damage dealt.  This powerful ability will dim your Radiance, reducing its radius to 1 for 5 turns.]]):
+		return ([[Fire a glowing orb of light at each enemy within your Radiance.  Each orb will slowly follow its target until it connects dealing %d light damage to anything else it contacts along the way.  When the target is reached the orb will explode dealing %d light damage in radius 1 and healing you for 50%% of the damage dealt.]]):
 		format(t.getMoveDamage(self, t), t.getExplosionDamage(self, t))
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/buckler-training.lua b/game/modules/tome/data/talents/techniques/buckler-training.lua
index e9a835e13a34d39f8b8c86a25d6267a074bca95d..9c61bd1ed705726a66068c1b351a56e9158666e3 100644
--- a/game/modules/tome/data/talents/techniques/buckler-training.lua
+++ b/game/modules/tome/data/talents/techniques/buckler-training.lua
@@ -35,8 +35,11 @@ newTalent {
 		return self:combatLimit(self:getTalentLevel(t)*10+self:getCun()*0.5, 50, 5, 15, 25, 100)
 	end,
 	-- called by _M:combatArmorHardiness
-	getHardiness = function(self, t)
-		return 0 --self:getTalentLevel(t) * 4;
+	getArmorHardiness = function(self, t)
+		return self:combatTalentLimit(t, 30, 10, 25)
+	end,
+	getArmour = function(self, t)
+		return self:combatTalentLimit(t, 20, 3, 15)
 	end,
 	-- called by Combat.attackTargetWith
 	shouldEvade = function(self, t)
@@ -56,11 +59,13 @@ newTalent {
 	end,
 	info = function(self, t)
 		local block = t.chance(self, t)
-		local armor = t.getHardiness(self, t)
+		local armour = t.getArmour(self,t)
+		local hardiness = t.getArmorHardiness(self, t)
 		return ([[Allows shields to be equipped, using Cunning instead of strength as a requirement.
 			When you are attacked in melee, you have a %d%% chance to deflect the attack with your shield, completely evading it.
+			In addition, as long as you are wearing armour no heavier than leather, you gain %d Armour and %d%% Armour hardiness.
 			The chance to deflect increases with your Cunning.]])
-			:format(block, armor)
+			:format(block, armour, hardiness)
 	end,
 }
 
diff --git a/game/modules/tome/data/talents/techniques/skirmisher-slings.lua b/game/modules/tome/data/talents/techniques/skirmisher-slings.lua
index 346707eee4089d7ef0c8740b69bcacace8a356eb..ab50960e198677c75d0b9385b17e190f87799c70 100644
--- a/game/modules/tome/data/talents/techniques/skirmisher-slings.lua
+++ b/game/modules/tome/data/talents/techniques/skirmisher-slings.lua
@@ -117,11 +117,11 @@ newTalent {
 	end,
 	on_pre_use = function(self, t, silent) return archerPreUse(self, t, silent, "sling") end,
 	damage_multiplier = function(self, t)
-		return self:combatTalentWeaponDamage(t, 0.2, 0.8)
+		return self:combatTalentWeaponDamage(t, 0.4, 1.2)
 	end,
 	-- Maximum number of shots fired.
 	limit_shots = function(self, t)
-		return math.floor(self:combatTalentScale(t, 6, 11, "log"))
+		return math.floor(self:combatTalentScale(t, 9, 16, "log"))
 	end,
 	action = function(self, t)
 		-- Get list of possible targets, possibly doubled.
diff --git a/game/modules/tome/data/talents/techniques/tireless-combatant.lua b/game/modules/tome/data/talents/techniques/tireless-combatant.lua
index ffa54c972b010ac5fcc23956316726a83cda381f..f9d1e98262996d71dffe0372c64ed2357be877d6 100644
--- a/game/modules/tome/data/talents/techniques/tireless-combatant.lua
+++ b/game/modules/tome/data/talents/techniques/tireless-combatant.lua
@@ -19,7 +19,7 @@ newTalent {
 	short_name = "SKIRMISHER_BREATHING_ROOM",
 	name = "Breathing Room",
 	type = {"technique/tireless-combatant", 1},
-	require = techs_wil_req1,
+	require = techs_strdex_req1,
 	mode = "passive",
 	points = 5,
 	getRestoreRate = function(self, t)
@@ -81,7 +81,7 @@ newTalent {
 	cooldown = 10,
 	sustain_stamina = 0,
 	no_energy = true,
-	require = techs_wil_req2,
+	require = techs_strdex_req2,
 	tactical = { STAMINA = 2 },
 	random_ego = "utility",
 	activate = function(self, t)
@@ -113,7 +113,7 @@ newTalent {
 	short_name = "SKIRMISHER_DAUNTLESS_CHALLENGER",
 	name = "Dauntless Challenger",
 	type = {"technique/tireless-combatant", 3},
-	require = techs_wil_req3,
+	require = techs_strdex_req3,
 	mode = "passive",
 	points = 5,
 	getStaminaRate = function(self, t)
@@ -171,7 +171,7 @@ newTalent {
 	short_name = "SKIRMISHER_THE_ETERNAL_WARRIOR",
 	name = "The Eternal Warrior",
 	type = {"technique/tireless-combatant", 4},
-	require = techs_wil_req4,
+	require = techs_strdex_req4,
 	mode = "passive",
 	points = 5,
 	getResist = function(self, t)
diff --git a/game/modules/tome/data/talents/uber/dex.lua b/game/modules/tome/data/talents/uber/dex.lua
index 6b2a7c6997d3910f7c9373d73644c3f5ca33c04d..537b418508f619c57a9c37765172b539714af6ae 100644
--- a/game/modules/tome/data/talents/uber/dex.lua
+++ b/game/modules/tome/data/talents/uber/dex.lua
@@ -128,7 +128,7 @@ uberTalent{
 uberTalent{
 	name = "Windtouched Speed",
 	mode = "passive",
-	require = { special={desc="Know at least 20 talent levels of equilibrium-using talents", fct=function(self) return knowRessource(self, "equilibrium", 20) end} },
+	require = { special={desc="Know at least 10 talent levels of equilibrium-using talents", fct=function(self) return knowRessource(self, "equilibrium", 10) end} },
 	on_learn = function(self, t)
 		self:attr("global_speed_add", 0.2)
 		self:attr("avoid_pressure_traps", 1)