From 943e4b2d5eb5e835d0c5175fc8563dbed987e80b Mon Sep 17 00:00:00 2001
From: DarkGod <darkgod@net-core.org>
Date: Mon, 24 Mar 2014 12:36:52 +0100
Subject: [PATCH] Combat Accuracy now uses a non linear scaling, like most
 other talents Reduced Intuitive Shots power Many ego items changes & updates
 Changed Insane scaling to be closer to Nightmare talent scaling, the same
 rare scaling as Madness, and a 20% HP bonus. Marked all the forced starting
 areas that aren't optional as having no rare spawn.

---
 game/engines/default/engine/Shader.lua        |  4 +--
 game/modules/tome/class/Game.lua              |  4 +--
 game/modules/tome/class/NPC.lua               | 11 +++++++-
 game/modules/tome/data/birth/descriptors.lua  |  4 +++
 game/modules/tome/data/damage_types.lua       |  2 +-
 .../tome/data/general/objects/egos/ammo.lua   | 14 +---------
 .../tome/data/general/objects/egos/gloves.lua | 14 +++++-----
 .../tome/data/general/objects/egos/helm.lua   |  1 +
 .../tome/data/general/objects/egos/rings.lua  | 16 -----------
 .../tome/data/talents/celestial/radiance.lua  | 27 ++++++++++---------
 .../tome/data/talents/celestial/sun.lua       |  6 ++++-
 .../talents/techniques/combat-training.lua    |  3 ++-
 .../data/talents/techniques/excellence.lua    |  2 +-
 .../tome/data/timed_effects/mental.lua        |  6 ++---
 .../tome/data/zones/murgol-lair/zone.lua      |  1 +
 .../tome/data/zones/ritch-tunnels/zone.lua    |  1 +
 .../tome/data/zones/slazish-fen/zone.lua      |  1 +
 17 files changed, 56 insertions(+), 61 deletions(-)

diff --git a/game/engines/default/engine/Shader.lua b/game/engines/default/engine/Shader.lua
index 8755d53f8b..3d9ff0499a 100644
--- a/game/engines/default/engine/Shader.lua
+++ b/game/engines/default/engine/Shader.lua
@@ -150,10 +150,10 @@ end
 
 function _M:loaded()
 	if _M.progsperm[self.totalname] then
-		print("[SHADER] using permcached shader "..self.totalname)
+		-- print("[SHADER] using permcached shader "..self.totalname)
 		self.shad = _M.progsperm[self.totalname]
 	elseif _M.progs[self.totalname] and not _M.progsreset[self.totalname] then
-		print("[SHADER] using cached shader "..self.totalname)
+		-- print("[SHADER] using cached shader "..self.totalname)
 		self.shad = _M.progs[self.totalname].shad
 		_M.progs[self.totalname].dieat = os.time() + 60
 	else
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index c6e2337a50..e53bacc4d4 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -344,8 +344,8 @@ function _M:loaded()
 				elseif self.difficulty == self.DIFFICULTY_INSANE then
 					zone.base_level_range = table.clone(zone.level_range, true)
 					zone.specific_base_level.object = -10 -zone.level_range[1]
-					zone.level_range[1] = zone.level_range[1] * 2.2 + 5
-					zone.level_range[2] = zone.level_range[2] * 2.2 + 5
+					zone.level_range[1] = zone.level_range[1] * 1.7 + 5
+					zone.level_range[2] = zone.level_range[2] * 1.7 + 5
 				elseif self.difficulty == self.DIFFICULTY_MADNESS then
 					zone.base_level_range = table.clone(zone.level_range, true)
 					zone.specific_base_level.object = -10 -zone.level_range[1]
diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua
index ce9c9b563c..3edbc0fe77 100644
--- a/game/modules/tome/class/NPC.lua
+++ b/game/modules/tome/class/NPC.lua
@@ -433,8 +433,9 @@ function _M:addedToLevel(level, x, y)
 		elseif game.difficulty == game.DIFFICULTY_INSANE and not game.party:hasMember(self) then
 			-- Increase talent level
 			for tid, lev in pairs(self.talents) do
-				self:learnTalent(tid, true, lev)
+				self:learnTalent(tid, true, lev / 2)
 			end
+			-- Give unrand bosses extra classes
 			if not self.randboss and self.rank >= 3.5 then
 				local data = {}
 				if self.rank == 3.5 then data = {nb_classes=1}
@@ -446,6 +447,12 @@ function _M:addedToLevel(level, x, y)
 				data.forbid_equip = true
 				game.state:applyRandomClass(self, data, true)
 			end
+			-- Increase life
+			local lifeadd = self.max_life * 0.2
+			self.max_life = self.max_life + lifeadd
+			self.life = self.life + lifeadd
+			-- print("Insane increasing " .. self.name .. " life by " .. lifeadd)
+
 			self:attr("difficulty_boosted", 1)
 		elseif game.difficulty == game.DIFFICULTY_MADNESS and not game.party:hasMember(self) then
 			-- Increase talent level
@@ -463,9 +470,11 @@ function _M:addedToLevel(level, x, y)
 				data.forbid_equip = true
 				game.state:applyRandomClass(self, data, true)
 			end
+			-- Increase life
 			local lifeadd = self.max_life * self:getRankLifeAdjust(1) * self.level / 65 / 1.5
 			self.max_life = self.max_life + lifeadd
 			self.life = self.life + lifeadd
+			
 			self:attr("difficulty_boosted", 1)
 		end
 	end
diff --git a/game/modules/tome/data/birth/descriptors.lua b/game/modules/tome/data/birth/descriptors.lua
index 23e92c392b..1467261ca1 100644
--- a/game/modules/tome/data/birth/descriptors.lua
+++ b/game/modules/tome/data/birth/descriptors.lua
@@ -227,6 +227,10 @@ newBirthDescriptor{
 		__game_difficulty = 4,
 		rank = 2,
 	},
+	game_state = {
+		default_random_rare_chance = 3,
+		default_random_boss_chance = 20,
+	},
 }
 newBirthDescriptor{
 	type = "difficulty",
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index f5f3b922ca..6b5dff5d60 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -1643,7 +1643,7 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target and rng.percent(dam.dam) then
 			if target:canBe("blind") then
-				target:setEffect(target.EFF_BLINDED, 4, {apply_power=(dam.power_check or src.combatSpellpower)(src), no_ct_effect=true})
+				target:setEffect(target.EFF_BLINDED, 4, {apply_power=(dam.power_check or math.max(src:combatSpellpower(), src:combatPhysicalpower())), no_ct_effect=true})
 			else
 				game.logSeen(target, "%s resists!", target.name:capitalize())
 			end
diff --git a/game/modules/tome/data/general/objects/egos/ammo.lua b/game/modules/tome/data/general/objects/egos/ammo.lua
index b0027c5977..f7f04659d3 100644
--- a/game/modules/tome/data/general/objects/egos/ammo.lua
+++ b/game/modules/tome/data/general/objects/egos/ammo.lua
@@ -420,19 +420,6 @@ newEntity{
 	},
 }
 
-newEntity{
-	power_source = {nature=true},
-	name = "huntsman's ", prefix=true, instant_resolve=true,
-	keywords = {hunt=true},
-	level_range = {1, 50},
-	rarity = 10,
-	cost = 20,
-	combat = {
-		ranged_project={[DamageType.NATURE] = resolvers.mbonus_material(15, 5)},
-		inc_damage_type = {animal=resolvers.mbonus_material(25, 5)},
-	},
-}
-
 newEntity{
 	power_source = {nature=true},
 	name = "insidious ", prefix=true, instant_resolve=true,
@@ -710,6 +697,7 @@ newEntity{
 	combat = {
 		ranged_project={[DamageType.DARKNESS] = resolvers.mbonus_material(15, 5)},
 		inc_damage_type = {humanoid=resolvers.mbonus_material(25, 5)},
+		inc_damage_type = {animal=resolvers.mbonus_material(25, 5)},
 	},
 }
 
diff --git a/game/modules/tome/data/general/objects/egos/gloves.lua b/game/modules/tome/data/general/objects/egos/gloves.lua
index 972b990af8..e2492b7625 100644
--- a/game/modules/tome/data/general/objects/egos/gloves.lua
+++ b/game/modules/tome/data/general/objects/egos/gloves.lua
@@ -85,8 +85,7 @@ newEntity{
 		resists = { [DamageType.COLD] = resolvers.mbonus_material(5, 5), },
 		melee_project= { [DamageType.COLD] = resolvers.mbonus_material(10, 5) },
 		combat = {
-			burst_on_crit= { [DamageType.COLD] = resolvers.mbonus_material(10, 5) },
-			convert_damage = { [DamageType.COLD] = resolvers.mbonus_material(25, 25) },
+			burst_on_crit= { [DamageType.ICE] = resolvers.mbonus_material(10, 5) },
 			talent_on_hit = { [Talents.T_ICE_BREATH] = {level=resolvers.genericlast(function(e) return e.material_level end), chance=10} },
 		},
 	},
@@ -159,7 +158,6 @@ newEntity{
 		melee_project= { [DamageType.BLIGHT] = resolvers.mbonus_material(10, 5) },
 		combat = {
 			burst_on_crit= { [DamageType.BLIGHT] = resolvers.mbonus_material(10, 5) },
-			convert_damage = { [DamageType.BLIGHT] = resolvers.mbonus_material(25, 25) },
 			talent_on_hit = { [Talents.T_SOUL_ROT] = {level=resolvers.genericlast(function(e) return e.material_level end), chance=20} },
 		},
 	},
@@ -340,7 +338,7 @@ newEntity{
 		},
 		disarm_bonus = resolvers.mbonus_material(25, 5),
 		combat = {
-			talent_on_hit = { [Talents.T_MAIM] = {level=resolvers.genericlast(function(e) return e.material_level end), chance=20} },
+			talent_on_hit = { [Talents.T_DISARM] = {level=resolvers.genericlast(function(e) return e.material_level end), chance=10} },
 		},
 	},
 }
@@ -498,10 +496,10 @@ newEntity{
 		},
 		infravision = resolvers.mbonus_material(1, 1),
 		combat = {
-			talent_on_hit = { [Talents.T_CIRCLE_OF_BLAZING_LIGHT] = {level=resolvers.genericlast(function(e) return e.material_level end), chance=10} },
-			melee_project={
-				[DamageType.LIGHT] = resolvers.mbonus_material(10, 2),
-				[DamageType.DARKNESS] = resolvers.mbonus_material(10, 2),
+			burst_on_crit={
+				-- still an AoE effect, but not a weak one with poor stat scaling that wastes the proc registry
+				[DamageType.LIGHT] = resolvers.mbonus_material(40, 10),
+				[DamageType.DARKNESS] = resolvers.mbonus_material(40, 10),
 			},
 		},
 	},
diff --git a/game/modules/tome/data/general/objects/egos/helm.lua b/game/modules/tome/data/general/objects/egos/helm.lua
index abe4dd10cc..084f7f4162 100644
--- a/game/modules/tome/data/general/objects/egos/helm.lua
+++ b/game/modules/tome/data/general/objects/egos/helm.lua
@@ -348,6 +348,7 @@ newEntity{
 			[DamageType.MIND] = resolvers.mbonus_material(15, 10),
 		},
 		combat_mentalresist = resolvers.mbonus_material(20, 10),
+		confusion_immune = resolvers.mbonus_material(30, 20, function(e, v) v=v/100 return 0, v end),
 	},
 }
 
diff --git a/game/modules/tome/data/general/objects/egos/rings.lua b/game/modules/tome/data/general/objects/egos/rings.lua
index f2198c8c04..b240dc35f4 100644
--- a/game/modules/tome/data/general/objects/egos/rings.lua
+++ b/game/modules/tome/data/general/objects/egos/rings.lua
@@ -552,22 +552,6 @@ newEntity{
 	},
 }
 
-newEntity{
-	power_source = {technique=true},
-	name = " of focus", suffix=true, instant_resolve=true,
-	keywords = {focus=true},
-	level_range = {40, 50},
-	greater_ego = 1,
-	rarity = 30,
-	cost = 100,
-	resolvers.charmt(Talents.T_GREATER_WEAPON_FOCUS, {2,3,4}, 20),
-	wielder = {
-		resists_pen = {
-			[DamageType.PHYSICAL] = resolvers.mbonus_material(10, 5),
-		},
-	},
-}
-
 newEntity{
 	power_source = {technique=true},
 	name = " of pilfering", suffix=true, instant_resolve=true,
diff --git a/game/modules/tome/data/talents/celestial/radiance.lua b/game/modules/tome/data/talents/celestial/radiance.lua
index 9284ff378a..8e3937330a 100644
--- a/game/modules/tome/data/talents/celestial/radiance.lua
+++ b/game/modules/tome/data/talents/celestial/radiance.lua
@@ -54,20 +54,22 @@ newTalent{
 		local radius = radianceRadius(self)
 		local grids = core.fov.circle_grids(self.x, self.y, radius, true)
 		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
-			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.scale(radius - dist, 1, radius, 0.1, 1)
-				local realdam = 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()})
-				end
+			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.scale(radius - dist, 1, radius, 0.1, 1)
+					local realdam = 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()})
+					end
 
-				if realdam and realdam > 0 and self:hasEffect(self.EFF_LIGHT_BURST) then
-					self:setEffect(self.EFF_LIGHT_BURST_SPEED, 4, {})
+					if realdam and realdam > 0 and self:hasEffect(self.EFF_LIGHT_BURST) then
+						self:setEffect(self.EFF_LIGHT_BURST_SPEED, 4, {})
+					end
 				end
-			end
+		end
 		end end end		
 	end,
 	info = function(self, t)
@@ -97,6 +99,7 @@ newTalent{
 		return {dam=t.getDamage(self, t), daze=daze}
 	end,
 	deactivate = function(self, t, p)
+		return true
 	end,
 	info = function(self, t)
 		return ([[Your Radiance is so powerful it burns all foes caught in it, doing up to %0.2f light damage (reduced with distance) to all foes caught inside.
diff --git a/game/modules/tome/data/talents/celestial/sun.lua b/game/modules/tome/data/talents/celestial/sun.lua
index 5013eb8768..ec9584b5a9 100644
--- a/game/modules/tome/data/talents/celestial/sun.lua
+++ b/game/modules/tome/data/talents/celestial/sun.lua
@@ -47,7 +47,11 @@ newTalent{
 			local _ _, x, y = self:canProject(tg, x, y)
 			self:project({type="ball", x=x, y=y, radius=1, selffire=false}, x, y, DamageType.BLIND, t.getDuration(self, t), {type="light"})
 		end
-		self:removeEffect(self.EFF_SUN_VENGEANCE)
+
+		-- Delay removal of the effect so its still there when no_energy checks
+		game:onTickEnd(function()
+			self:removeEffect(self.EFF_SUN_VENGEANCE)
+		end)
 
 		game:playSoundNear(self, "talents/flame")
 		return true
diff --git a/game/modules/tome/data/talents/techniques/combat-training.lua b/game/modules/tome/data/talents/techniques/combat-training.lua
index d45993ff3d..e50c9f6a66 100644
--- a/game/modules/tome/data/talents/techniques/combat-training.lua
+++ b/game/modules/tome/data/talents/techniques/combat-training.lua
@@ -108,7 +108,8 @@ newTalent{
 	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,
+	--getAttack = function(self, t) return self:getTalentLevel(t) * 10 end,
+	getAttack = function(self, t) return self:combatTalentScale(t, 10, 50) end, -- match values at 1 and 5 for old formula
 	info = function(self, t)
 		local attack = t.getAttack(self, t)
 		return ([[Increases the accuracy of unarmed, melee and ranged weapons by %d.]]):
diff --git a/game/modules/tome/data/talents/techniques/excellence.lua b/game/modules/tome/data/talents/techniques/excellence.lua
index efd45bb71a..ce224a253c 100644
--- a/game/modules/tome/data/talents/techniques/excellence.lua
+++ b/game/modules/tome/data/talents/techniques/excellence.lua
@@ -143,7 +143,7 @@ newTalent{
 	require = techs_dex_req_high3,
 	tactical = { BUFF = 2 },
 	getDist = function(self, t) return math.floor(self:combatTalentLimit(t, 11, 1, 3)) end, -- Limit <=10
-	getChance = function(self, t) return math.floor(self:combatTalentLimit(t, 100, 20, 50)) end,
+	getChance = function(self, t) return math.floor(self:combatTalentLimit(t, 50, 5, 40)) end,
 	archery_onhit = function(self, t, target, x, y)
 		if not target or not target:canBe("knockback") then return end
 		target:knockback(self.x, self.y, t.getDist(self, t))
diff --git a/game/modules/tome/data/timed_effects/mental.lua b/game/modules/tome/data/timed_effects/mental.lua
index 843bb1a581..bf7e829369 100644
--- a/game/modules/tome/data/timed_effects/mental.lua
+++ b/game/modules/tome/data/timed_effects/mental.lua
@@ -192,9 +192,9 @@ newEffect{
 	on_gain = function(self, err) return "#Target#'s will is shattered.", "+Battle Cry" end,
 	on_lose = function(self, err) return "#Target# regains some of its will.", "-Battle Cry" end,
 	activate = function(self, eff)
-		self:effectTemporaryValue("combat_def", -eff.power)
-		self:effectTemporaryValue("no_evasion", 1)
-		self:effectTemporaryValue("blind_fighted", 1)
+		self:effectTemporaryValue(eff, "combat_def", -eff.power)
+		self:effectTemporaryValue(eff, "no_evasion", 1)
+		self:effectTemporaryValue(eff, "blind_fighted", 1)
 	end,
 }
 
diff --git a/game/modules/tome/data/zones/murgol-lair/zone.lua b/game/modules/tome/data/zones/murgol-lair/zone.lua
index 23b569e9bd..3c620a0f34 100644
--- a/game/modules/tome/data/zones/murgol-lair/zone.lua
+++ b/game/modules/tome/data/zones/murgol-lair/zone.lua
@@ -54,6 +54,7 @@ return {
 			nb_npc = {20, 30},
 			filters = { {max_ood=2}, },
 			guardian = is_invaded and "NASHVA" or "MURGOL",
+			randelite = 0,
 		},
 		object = {
 			class = "engine.generator.object.Random",
diff --git a/game/modules/tome/data/zones/ritch-tunnels/zone.lua b/game/modules/tome/data/zones/ritch-tunnels/zone.lua
index 2e4fc80c4d..317cade552 100644
--- a/game/modules/tome/data/zones/ritch-tunnels/zone.lua
+++ b/game/modules/tome/data/zones/ritch-tunnels/zone.lua
@@ -50,6 +50,7 @@ return {
 			class = "mod.class.generator.actor.Random",
 			nb_npc = {20, 30},
 			filters = { {max_ood=2}, },
+			randelite = 0,
 			guardian = "HIVE_MOTHER",
 		},
 		object = {
diff --git a/game/modules/tome/data/zones/slazish-fen/zone.lua b/game/modules/tome/data/zones/slazish-fen/zone.lua
index a07d6856a0..44c751ce6e 100644
--- a/game/modules/tome/data/zones/slazish-fen/zone.lua
+++ b/game/modules/tome/data/zones/slazish-fen/zone.lua
@@ -59,6 +59,7 @@ return {
 			class = "mod.class.generator.actor.Random",
 			nb_npc = {7, 10},
 			filters = { {max_ood=2}, },
+			randelite = 0,
 		},
 		object = {
 			class = "engine.generator.object.Random",
-- 
GitLab