diff --git a/game/engine/Faction.lua b/game/engine/Faction.lua
index d9618ffb7fefab94b2df03b759eba681c557215a..d0816bf88c6ea29c3ac070f4dd526abbf09aed00 100644
--- a/game/engine/Faction.lua
+++ b/game/engine/Faction.lua
@@ -9,7 +9,7 @@ _M.factions = {}
 -- Static method
 function _M:add(t)
 	assert(t.name, "no faction name")
-	assert(t.short_name, "no faction short_name")
+	t.short_name = t.short_name or t.name:lower():gsub(" ", "-")
 	t.reaction = t.reaction or {}
 	self.factions[t.short_name] = t
 end
@@ -27,6 +27,5 @@ function _M:factionReaction(f1, f2)
 end
 
 -- Add a few default factions
-_M:add{ short_name="players", name="Players", reaction={enemies=-100} }
-_M:add{ short_name="enemies", name="Enemies", reaction={players=-100,poorsods=-100} }
-_M:add{ short_name="poorsods", name="Poor Sods", reaction={} }
+_M:add{ name="Players", reaction={enemies=-100} }
+_M:add{ name="Enemies", reaction={players=-100} }
diff --git a/game/engine/ai/talented.lua b/game/engine/ai/talented.lua
index cabdc8f611e8e97f3fb591322a5a384f8138ba5c..6b287370b84747f345f9bec1d55929b0798ab3c3 100644
--- a/game/engine/ai/talented.lua
+++ b/game/engine/ai/talented.lua
@@ -7,6 +7,7 @@ newAI("dumb_talented", function(self)
 	local target_dist = math.floor(core.fov.distance(self.x, self.y, self.ai_target.actor.x, self.ai_target.actor.y))
 	for tid, _ in pairs(self.talents) do
 		local t = self:getTalentFromId(tid)
+--		print(self.name, self.uid, "dumb ai talents can try use", t.name, tid, "::", t.mode, not self:isTalentCoolingDown(t), target_dist <= self:getTalentRange(t), self:preUseTalent(t, true), self:canProject({type="bolt"}, self.ai_target.actor.x, self.ai_target.actor.y))
 		if t.mode == "activated" and not self:isTalentCoolingDown(t) and target_dist <= self:getTalentRange(t) and self:preUseTalent(t, true) and self:canProject({type="bolt"}, self.ai_target.actor.x, self.ai_target.actor.y) then
 			avail[#avail+1] = tid
 			print(self.name, self.uid, "dumb ai talents can use", t.name, tid)
diff --git a/game/modules/tome/data/autolevel_schemes.lua b/game/modules/tome/data/autolevel_schemes.lua
index f433eef58b61669316dfd0bcd498bfb6d4ddff14..b332d5bc5a1572c9cb7539b79b323e403d7e4b5a 100644
--- a/game/modules/tome/data/autolevel_schemes.lua
+++ b/game/modules/tome/data/autolevel_schemes.lua
@@ -28,11 +28,11 @@ Autolevel:registerScheme{ name = "rogue", levelup = function(self)
 	learnStats(self, { self.STAT_DEX, self.STAT_CUN, self.STAT_CUN })
 end}
 
-Autolevel:registerScheme{ name = "archer", levelup = function(self)
+Autolevel:registerScheme{ name = "slinger", levelup = function(self)
 	learnStats(self, { self.STAT_DEX, self.STAT_DEX, self.STAT_CUN })
 end}
 
-Autolevel:registerScheme{ name = "slinger", levelup = function(self)
+Autolevel:registerScheme{ name = "archer", levelup = function(self)
 	learnStats(self, { self.STAT_DEX, self.STAT_DEX, self.STAT_STR })
 end}
 
diff --git a/game/modules/tome/data/general/npcs/minotaur.lua b/game/modules/tome/data/general/npcs/minotaur.lua
index c74e7450e6b072fdf875808262b4198f1fbfbfe4..3453abf8e993f1bbfcd112b1fc20f390be1e8291 100644
--- a/game/modules/tome/data/general/npcs/minotaur.lua
+++ b/game/modules/tome/data/general/npcs/minotaur.lua
@@ -26,7 +26,7 @@ newEntity{
 newEntity{ base = "BASE_NPC_MINOTAUR",
 	name = "minotaur", color=colors.UMBER,
 	desc = [[It is a cross between a human and a bull.]],
-	equipment = resolvers.equip{ {type="weapon", subtype="battleaxe"}, },
+	resolvers.equip{ {type="weapon", subtype="battleaxe", autoreq=true}, },
 	level_range = {10, 50}, exp_worth = 1,
 	rarity = 9,
 	combat_armor = 13, combat_def = 8,
@@ -39,7 +39,7 @@ newEntity{ base = "BASE_NPC_MINOTAUR",
 	level_range = {20, 50}, exp_worth = 1,
 	rarity = 15,
 	combat_armor = 15, combat_def = 7,
-	equipment = resolvers.equip{ {type="weapon", subtype="maul"} },
+	resolvers.equip{ {type="weapon", subtype="maul", autoreq=true} },
 
 	autolevel = "caster",
 	resists = { [DamageType.FIRE] = 100 },
diff --git a/game/modules/tome/data/general/npcs/skeleton.lua b/game/modules/tome/data/general/npcs/skeleton.lua
index d616695e22cce70158bec3d7a92b30c6590230e8..0fa35bd826edce9755af47f85326441d4db3fa52 100644
--- a/game/modules/tome/data/general/npcs/skeleton.lua
+++ b/game/modules/tome/data/general/npcs/skeleton.lua
@@ -7,8 +7,7 @@ newEntity{
 
 	combat = { dam=1, atk=1, apr=1 },
 
-	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
-	equipment = resolvers.equip{ {type="weapon", subtype="greatsword"} },
+	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1 },
 	resolvers.drops{chance=20, nb=1, {} },
 	resolvers.drops{chance=60, nb=1, {type="money"} },
 
@@ -27,18 +26,20 @@ newEntity{
 
 newEntity{ base = "BASE_NPC_SKELETON",
 	name = "degenerated skeleton warrior", color=colors.WHITE,
-	level_range = {1, 50}, exp_worth = 1,
+	level_range = {1, 18}, exp_worth = 1,
 	rarity = 4,
+	resolvers.equip{ {type="weapon", subtype="greatsword", autoreq=true} },
 	max_life = resolvers.rngavg(40,50),
 	combat_armor = 5, combat_def = 1,
 }
 
 newEntity{ base = "BASE_NPC_SKELETON",
 	name = "skeleton warrior", color=colors.SLATE,
-	level_range = {2, 50}, exp_worth = 1,
-	rarity = 3,
+	level_range = {3, 50}, exp_worth = 1,
+	rarity = 4,
 	max_life = resolvers.rngavg(90,100),
 	combat_armor = 5, combat_def = 1,
+	resolvers.equip{ {type="weapon", subtype="greatsword", autoreq=true} },
 	resolvers.talents{ [Talents.T_STAMINA_POOL]=1, [Talents.T_STUNNING_BLOW]=1, },
 	ai_state = { talent_in=1, },
 }
@@ -53,8 +54,50 @@ newEntity{ base = "BASE_NPC_SKELETON",
 	stats = { str=10, dex=12, cun=14, mag=14, con=10 },
 	resolvers.talents{ [Talents.T_MANA_POOL]=1, [Talents.T_FLAME]=2, [Talents.T_MANATHRUST]=3 },
 
-	equipment = resolvers.equip{ {type="weapon", subtype="staff"} },
+	resolvers.equip{ {type="weapon", subtype="staff", autoreq=true} },
 
 	autolevel = "caster",
 	ai = "dumb_talented_simple", ai_state = { talent_in=6, },
 }
+
+newEntity{ base = "BASE_NPC_SKELETON",
+	name = "skeleton archer", color=colors.UMBER,
+	level_range = {5, 50}, exp_worth = 1,
+	rarity = 6,
+	max_life = resolvers.rngavg(70,80),
+	combat_armor = 5, combat_def = 1,
+	resolvers.talents{ [Talents.T_STAMINA_POOL]=1, [Talents.T_SHOOT]=1, },
+	ai_state = { talent_in=1, },
+
+	autolevel = "archer",
+	resolvers.equip{ {type="weapon", subtype="longbow", autoreq=true}, {type="ammo", subtype="arrow", autoreq=true} },
+}
+
+newEntity{ base = "BASE_NPC_SKELETON",
+	name = "skeleton master archer", color=colors.LIGHT_UMBER,
+	level_range = {15, 50}, exp_worth = 1,
+	rarity = 7,
+	max_life = resolvers.rngavg(70,80),
+	combat_armor = 5, combat_def = 1,
+	resolvers.talents{ [Talents.T_STAMINA_POOL]=1, [Talents.T_SHOOT]=1, [Talents.T_PINNING_SHOT]=3, [Talents.T_CRIPPLING_SHOT]=3, },
+	ai_state = { talent_in=1, },
+
+	autolevel = "archer",
+	resolvers.equip{ {type="weapon", subtype="longbow", autoreq=true}, {type="ammo", subtype="arrow", autoreq=true} },
+}
+
+newEntity{ base = "BASE_NPC_SKELETON",
+	name = "armoured skeleton warrior", color=colors.STEEL_BLUE,
+	level_range = {10, 50}, exp_worth = 1,
+	rarity = 8,
+	max_life = resolvers.rngavg(90,100),
+	combat_armor = 5, combat_def = 1,
+	resolvers.talents{
+		[Talents.T_HEAVY_ARMOUR_TRAINING]=1,
+		[Talents.T_SHIELD_PUMMEL]=1,
+		[Talents.T_RIPOSTE]=3,
+		[Talents.T_OVERPOWER]=1,
+	},
+	resolvers.equip{ {type="weapon", subtype="longsword", autoreq=true}, {type="armor", subtype="shield", autoreq=true}, {type="armor", subtype="heavy", autoreq=true} },
+	ai_state = { talent_in=1, },
+}
diff --git a/game/modules/tome/data/general/npcs/thieve.lua b/game/modules/tome/data/general/npcs/thieve.lua
index 5d4f1b9e20f6a7a749e46cb992a6b26b1512b59d..ce834402d2c23b7161ab222179c35d448b83d2fd 100644
--- a/game/modules/tome/data/general/npcs/thieve.lua
+++ b/game/modules/tome/data/general/npcs/thieve.lua
@@ -9,7 +9,7 @@ newEntity{
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
 	drops = resolvers.drops{chance=20, nb=1, {} },
-	equipment = resolvers.equip{ {type="weapon", subtype="dagger"}, {type="weapon", subtype="dagger"}, {type="armor", subtype="light"} },
+	resolvers.equip{ {type="weapon", subtype="dagger", autoreq=true}, {type="weapon", subtype="dagger", autoreq=true}, {type="armor", subtype="light", autoreq=true} },
 	resolvers.drops{chance=100, nb=2, {type="money"} },
 
 	max_stamina = 100,
diff --git a/game/modules/tome/data/talents/techniques/archery.lua b/game/modules/tome/data/talents/techniques/archery.lua
index 66f99469f6b30727f16c218d91a6733ea08c6ba8..4518dbf8690db63742b2d3b589dc42c5b9994a09 100644
--- a/game/modules/tome/data/talents/techniques/archery.lua
+++ b/game/modules/tome/data/talents/techniques/archery.lua
@@ -24,6 +24,7 @@ newTalent{
 	cooldown = 3,
 	stamina = 8,
 	require = techs_dex_req1,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5)
 		return true
@@ -117,6 +118,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 35,
 	require = techs_dex_req4,
+	range = 20,
 	action = function(self, t)
 		self.combat_physcrit = self.combat_physcrit + 1000
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 4)
@@ -174,6 +176,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 15,
 	require = techs_dex_req2,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1 + self:getTalentLevel(t) / 6, function(target, x, y)
 			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) then
@@ -197,6 +200,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 15,
 	require = techs_dex_req3,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1 + self:getTalentLevel(t) / 6, function(target, x, y)
 			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) then
@@ -220,6 +224,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 15,
 	require = techs_dex_req4,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1 + self:getTalentLevel(t) / 6, function(target, x, y)
 			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) then
diff --git a/game/modules/tome/data/talents/techniques/bow.lua b/game/modules/tome/data/talents/techniques/bow.lua
index 1a26a0268d9d49ec08276b9b0123059b94392a75..e0c619672e32c888cbfd71ef48c62b3006b134af 100644
--- a/game/modules/tome/data/talents/techniques/bow.lua
+++ b/game/modules/tome/data/talents/techniques/bow.lua
@@ -17,6 +17,7 @@ newTalent{
 	cooldown = 8,
 	stamina = 15,
 	require = techs_dex_req2,
+	range = 20,
 	action = function(self, t)
 		self.combat_apr = self.combat_apr + 1000
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 7, nil, {type="beam"}, {one_shot=true})
@@ -36,6 +37,7 @@ newTalent{
 	cooldown = 8,
 	stamina = 15,
 	require = techs_dex_req3,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5, nil, {type="ball", radius=1}, {limit_shots=2})
 		return true
@@ -53,6 +55,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 35,
 	require = techs_dex_req4,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 0.7 + self:getTalentLevel(t) / 5, nil, {type="ball", radius=2 + self:getTalentLevel(t)/3, firendlyfire=false})
 		return true
diff --git a/game/modules/tome/data/talents/techniques/sling.lua b/game/modules/tome/data/talents/techniques/sling.lua
index f11efe8990aea8442a39d40857b26283434f59c7..811bf0b923bf2a38c39cba114522367301cd415a 100644
--- a/game/modules/tome/data/talents/techniques/sling.lua
+++ b/game/modules/tome/data/talents/techniques/sling.lua
@@ -17,6 +17,7 @@ newTalent{
 	cooldown = 8,
 	stamina = 15,
 	require = techs_dex_req2,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5, function(target, x, y)
 			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 10) and target:canBe("blind") then
@@ -40,6 +41,7 @@ newTalent{
 	cooldown = 8,
 	stamina = 15,
 	require = techs_dex_req3,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 1.2 + self:getTalentLevel(t) / 5, function(target, x, y)
 			if target:checkHit(self:combatAttackDex(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
@@ -64,6 +66,7 @@ newTalent{
 	cooldown = 20,
 	stamina = 35,
 	require = techs_dex_req4,
+	range = 20,
 	action = function(self, t)
 		self:archeryShoot(nil, 0.7 + self:getTalentLevel(t) / 5, nil, nil, {multishots=2+self:getTalentLevelRaw(t)/2})
 		return true
diff --git a/game/modules/tome/data/zones/tol-falas/npcs.lua b/game/modules/tome/data/zones/tol-falas/npcs.lua
index e32324380a5f93cac1319c9fac15221f94ce9f48..b208f02b164fe2719fd3042dedbc9e1136ae9fdb 100644
--- a/game/modules/tome/data/zones/tol-falas/npcs.lua
+++ b/game/modules/tome/data/zones/tol-falas/npcs.lua
@@ -9,8 +9,8 @@ newEntity{ define_as = "THE_MASTER",
 	name = "The Master",
 	display = "V", color=colors.VIOLET,
 	desc = [[This elder vampire seems to be in control here and does not seem very happy about you.]],
-	level_range = {18, 25}, exp_worth = 2,
-	max_life = 350, life_rating = 15, fixed_rating = true,
+	level_range = {23, 35}, exp_worth = 2,
+	max_life = 350, life_rating = 19, fixed_rating = true,
 	max_mana = 145,
 	max_stamina = 145,
 	stats = { str=19, dex=19, cun=34, mag=25, con=16 },
@@ -29,6 +29,7 @@ newEntity{ define_as = "THE_MASTER",
 	},
 
 	blind_immune = 1,
+	stun_immone = 0.7,
 	see_invisible = 20,
 	undead = 1,
 
diff --git a/ideas/gifts.ods b/ideas/gifts.ods
index 5045f174c699a38c0b893b64507905e4b802983c..e431bb84c8c68d8c33a5e253e6f31b48aaafc753 100644
Binary files a/ideas/gifts.ods and b/ideas/gifts.ods differ