From f28a7ea34c6d3ba75992bb834f1fefa247f1803c Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Tue, 16 Mar 2010 23:42:03 +0000
Subject: [PATCH] fix knockbacks fix actor talents, some monsters were proabbly
 robbed of some talents blood of life is no more permanent minotaur now wield
 battleaxe (greataxe does not exists) summoning update

git-svn-id: http://svn.net-core.org/repos/t-engine4@430 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/engine/Actor.lua                         |  2 +-
 game/engine/Entity.lua                        | 11 +++-
 game/engine/generator/map/Roomer.lua          |  4 ++
 game/engine/resolvers.lua                     |  2 +-
 game/modules/tome/class/Actor.lua             |  2 +-
 game/modules/tome/class/Player.lua            |  1 +
 game/modules/tome/data/autolevel_schemes.lua  |  3 +
 game/modules/tome/data/damage_types.lua       |  4 +-
 .../tome/data/general/npcs/minotaur.lua       |  2 +-
 .../tome/data/general/objects/egos/shield.lua |  2 +-
 .../data/general/objects/world-artifacts.lua  |  1 +
 .../data/talents/gifts/summon-distance.lua    | 15 ++---
 .../tome/data/talents/gifts/summon-melee.lua  | 63 +++++++++++--------
 .../tome/data/talents/techniques/sling.lua    |  2 +-
 .../data/talents/techniques/weaponshield.lua  |  4 +-
 game/modules/tome/init.lua                    |  2 +-
 16 files changed, 74 insertions(+), 46 deletions(-)

diff --git a/game/engine/Actor.lua b/game/engine/Actor.lua
index f85048b24d..3c65b1fc4f 100644
--- a/game/engine/Actor.lua
+++ b/game/engine/Actor.lua
@@ -107,7 +107,7 @@ function _M:teleportRandom(x, y, dist)
 end
 
 --- Knock back the actor
-function _M:knockBack(srcx, srcy, dist)
+function _M:knockback(srcx, srcy, dist)
 	local l = line.new(srcx, srcy, self.x, self.y, true)
 	local lx, ly = l(true)
 	dist = dist - 1
diff --git a/game/engine/Entity.lua b/game/engine/Entity.lua
index 607736f5a1..7e70cd7523 100644
--- a/game/engine/Entity.lua
+++ b/game/engine/Entity.lua
@@ -199,8 +199,17 @@ function _M:loadList(file, no_default, res, mod)
 		newEntity = function(t)
 			-- Do we inherit things ?
 			if t.base then
+				-- Append array part
+				for i = 1, #t.base do
+					local b = t.base[i]
+					if type(b) == "table" and not b.__CLASSNAME then b = table.clone(b, true)
+					elseif type(b) == "table" and b.__CLASSNAME then b = b:clone()
+					end
+					table.insert(t, b)
+				end
+
 				for k, e in pairs(res[t.base]) do
-					if k ~= "define_as" then
+					if k ~= "define_as" and type(k) ~= "number" then
 						if not t[k] then
 							t[k] = e
 						elseif type(t[k]) == "table" and type(e) == "table" then
diff --git a/game/engine/generator/map/Roomer.lua b/game/engine/generator/map/Roomer.lua
index 487f5b4009..46a2a24f19 100644
--- a/game/engine/generator/map/Roomer.lua
+++ b/game/engine/generator/map/Roomer.lua
@@ -142,6 +142,9 @@ local mark_dirs = {
 }
 --- Marks a tunnel as a tunnel and the space behind it
 function _M:markTunnel(x, y, xdir, ydir, id)
+	-- Disable the many prints of tunnelling
+	local print = function()end
+
 	x, y = x - xdir, y - ydir
 	local dir = coord_to_dir[xdir][ydir]
 	for i, d in ipairs(mark_dirs[dir]) do
@@ -155,6 +158,7 @@ end
 function _M:tunnel(x1, y1, x2, y2, id)
 	-- Disable the many prints of tunnelling
 	local print = function()end
+
 	local xdir, ydir = self:tunnelDir(x1, y1, x2, y2)
 	print("tunneling from",x1, y1, "to", x2, y2, "initial dir", xdir, ydir)
 
diff --git a/game/engine/resolvers.lua b/game/engine/resolvers.lua
index 7535de819c..db2fce38fa 100644
--- a/game/engine/resolvers.lua
+++ b/game/engine/resolvers.lua
@@ -31,7 +31,7 @@ function resolvers.talents(list)
 	return {__resolver="talents", list}
 end
 function resolvers.calc.talents(t, e)
-	for tid, level in pairs(t[1]) do print(level) e:learnTalent(tid, true, level) end
+	for tid, level in pairs(t[1]) do e:learnTalent(tid, true, level) end
 	return nil
 end
 
diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua
index 115a38d8c2..e1611ed52c 100644
--- a/game/modules/tome/class/Actor.lua
+++ b/game/modules/tome/class/Actor.lua
@@ -87,9 +87,9 @@ function _M:init(t, no_default)
 	engine.interface.ActorInventory.init(self, t)
 	engine.interface.ActorTemporaryEffects.init(self, t)
 	engine.interface.ActorLife.init(self, t)
-	engine.interface.ActorStats.init(self, t)
 	engine.interface.ActorTalents.init(self, t)
 	engine.interface.ActorResource.init(self, t)
+	engine.interface.ActorStats.init(self, t)
 	engine.interface.ActorLevel.init(self, t)
 	engine.interface.ActorFOV.init(self, t)
 end
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index c99f202e2c..bca75df3f1 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -111,6 +111,7 @@ function _M:onTakeHit(value, src)
 end
 
 function _M:die()
+	game.paused = true
 	game:registerDialog(DeathDialog.new(self))
 end
 
diff --git a/game/modules/tome/data/autolevel_schemes.lua b/game/modules/tome/data/autolevel_schemes.lua
index 2250c57074..f433eef58b 100644
--- a/game/modules/tome/data/autolevel_schemes.lua
+++ b/game/modules/tome/data/autolevel_schemes.lua
@@ -9,6 +9,9 @@ local function learnStats(self, statorder)
 	end
 end
 
+Autolevel:registerScheme{ name = "none", levelup = function(self)
+end}
+
 Autolevel:registerScheme{ name = "warrior", levelup = function(self)
 	learnStats(self, { self.STAT_STR, self.STAT_STR, self.STAT_DEX })
 end}
diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index 8d34bfebf9..7762a8a570 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -197,7 +197,7 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
 			if target:checkHit(src:combatSpellpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
-				target:knockBack(src.x, src.y, 1)
+				target:knockback(src.x, src.y, 1)
 				game.logSeen(target, "%s is knocked back!", target.name:capitalize())
 			else
 				game.logSeen(target, "%s resists the wave!", target.name:capitalize())
@@ -214,7 +214,7 @@ newDamageType{
 		local target = game.level.map(x, y, Map.ACTOR)
 		if target then
 			if target:checkHit(src:combatSpellpower(), target:combatPhysicalResist(), 0, 95, 15) and target:canBe("knockback") then
-				target:knockBack(src.x, src.y, 2)
+				target:knockback(src.x, src.y, 2)
 				game.logSeen(target, "%s is knocked back!", target.name:capitalize())
 			else
 				game.logSeen(target, "%s resists the punch!", target.name:capitalize())
diff --git a/game/modules/tome/data/general/npcs/minotaur.lua b/game/modules/tome/data/general/npcs/minotaur.lua
index d64d753bf8..c74e7450e6 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="greataxe"}, },
+	equipment = resolvers.equip{ {type="weapon", subtype="battleaxe"}, },
 	level_range = {10, 50}, exp_worth = 1,
 	rarity = 9,
 	combat_armor = 13, combat_def = 8,
diff --git a/game/modules/tome/data/general/objects/egos/shield.lua b/game/modules/tome/data/general/objects/egos/shield.lua
index acab141bbe..722a2ef643 100644
--- a/game/modules/tome/data/general/objects/egos/shield.lua
+++ b/game/modules/tome/data/general/objects/egos/shield.lua
@@ -51,7 +51,7 @@ newEntity{
 	rarity = 8,
 	cost = 8,
 	wielder = {
-		resists={[DamageType.FIRE] = resolvers.mbonus(7, 3)},
+		on_melee_hit={[DamageType.FIRE] = resolvers.mbonus(7, 3)},
 	},
 }
 newEntity{
diff --git a/game/modules/tome/data/general/objects/world-artifacts.lua b/game/modules/tome/data/general/objects/world-artifacts.lua
index 40971f4a94..a1f4f27920 100644
--- a/game/modules/tome/data/general/objects/world-artifacts.lua
+++ b/game/modules/tome/data/general/objects/world-artifacts.lua
@@ -172,5 +172,6 @@ newEntity{
 			game.logPlayer(who, "The Blood of Life seems to have no effect on you.")
 		end
 		game.logSeen(who, "%s quaffs the %s!", who.name:capitalize(), self:getName())
+		return "destroy", true
 	end},
 }
diff --git a/game/modules/tome/data/talents/gifts/summon-distance.lua b/game/modules/tome/data/talents/gifts/summon-distance.lua
index 0d2769a4fd..3e5455ef70 100644
--- a/game/modules/tome/data/talents/gifts/summon-distance.lua
+++ b/game/modules/tome/data/talents/gifts/summon-distance.lua
@@ -6,15 +6,15 @@ newTalent{ short_name = "FIRE_IMP_BOLT",
 	range = 20,
 	reflectable = true,
 	action = function(self, t)
-		local tg = {type="bolt", range=self:getTalentRange(t), talent=t}
+		local tg = {type="hit", range=self:getTalentRange(t), talent=t}
 		local x, y = self:getTarget(tg)
 		if not x or not y then return nil end
-		self:project(tg, x, y, DamageType.FIRE, self:spellCrit(12 + self:combatSpellpower(0.8) * self:getTalentLevel(t)), {type="flame"})
+		self:project(tg, x, y, DamageType.FIRE, self:spellCrit(12 + self:combatSpellpower(0.3) * self:getTalentLevel(t)), {type="flame"})
 		return true
 	end,
 	info = function(self, t)
 		return ([[Conjures up a bolt of fire doing %0.2f fire damage.
-		The damage will increase with the Magic stat]]):format(12 + self:combatSpellpower(0.8) * self:getTalentLevel(t))
+		The damage will increase with the Magic stat]]):format(12 + self:combatSpellpower(0.3) * self:getTalentLevel(t))
 	end,
 }
 
@@ -48,9 +48,9 @@ newTalent{
 			display = "u", color=colors.RED,
 			name = "fire imp", faction = self.faction,
 			desc = [[]],
-			autolevel = "caster",
+			autolevel = "none",
 			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=1, },
-			stats = { str=5, dex=5, mag=15, wil=15, con=7 },
+			stats = { mag=15 + self:getWil() * self:getTalentLevel(t) / 5, wil=18, con=10 + self:getTalentLevel(t) * 2, },
 			level_range = {self.level, self.level}, exp_worth = 0,
 
 			max_life = resolvers.rngavg(5,10),
@@ -62,7 +62,7 @@ newTalent{
 			max_mana = 150,
 			resolvers.talents{
 				[self.T_MANA_POOL]=1,
-				[self.T_FIRE_IMP_BOLT]=self:getTalentLevelRaw()
+				[self.T_FIRE_IMP_BOLT]=self:getTalentLevelRaw(t),
 			},
 
 			summoner = self, summoner_gain_exp=true,
@@ -78,6 +78,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Summon a Fire Imp to burn your foes to death.]])
+		return ([[Summon a Fire Imp to burn your foes to death. Fire Imps are really weak in melee and die easily, but they can burn your foes from afar.
+		It will get %d magic and %d willpower.]]):format(15 + self:getWil() * self:getTalentLevel(t) / 5, 10 + self:getTalentLevel(t) * 2)
 	end,
 }
diff --git a/game/modules/tome/data/talents/gifts/summon-melee.lua b/game/modules/tome/data/talents/gifts/summon-melee.lua
index 318b998cdb..8467d6cce0 100644
--- a/game/modules/tome/data/talents/gifts/summon-melee.lua
+++ b/game/modules/tome/data/talents/gifts/summon-melee.lua
@@ -4,8 +4,8 @@ newTalent{
 	require = gifts_req1,
 	points = 5,
 	message = "@Source@ summons a War Hound!",
-	equilibrium = 2,
-	cooldown = 10,
+	equilibrium = 3,
+	cooldown = 15,
 	range = 20,
 	action = function(self, t)
 		local tg = {type="bolt", range=self:getTalentRange(t), nolock=true, talent=t}
@@ -29,11 +29,11 @@ newTalent{
 			desc = [[]],
 			autolevel = "warrior",
 			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=5, },
-			stats = { str=18, dex=13, mag=5, con=15 },
+			stats = { str=10 + self:getWil() * self:getTalentLevel(t) / 5, dex=10 + self:getTalentLevel(t) * 2, mag=5, con=15 },
 			level_range = {self.level, self.level}, exp_worth = 0,
 
 			max_life = resolvers.rngavg(25,50),
-			life_rating = 10,
+			life_rating = 4,
 
 			combat_armor = 2, combat_def = 4,
 			combat = { dam=resolvers.rngavg(12,25), atk=10, apr=10, dammod={str=0.8} },
@@ -51,7 +51,8 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Summon a War Hound to attack your foes.]])
+		return ([[Summon a War Hound to attack your foes. War hounds are good basic melee attackers.
+		It will get %d strength and %d dexterity.]]):format(10 + self:getWil() * self:getTalentLevel(t) / 5, 10 + self:getTalentLevel(t) * 2)
 	end,
 }
 
@@ -61,7 +62,7 @@ newTalent{
 	require = gifts_req2,
 	points = 5,
 	message = "@Source@ summons a Jelly!",
-	equilibrium = 4,
+	equilibrium = 5,
 	cooldown = 10,
 	range = 20,
 	action = function(self, t)
@@ -84,8 +85,8 @@ newTalent{
 			display = "j", color=colors.BLACK,
 			desc = "A strange blob on the dungeon floor.",
 			name = "black jelly",
-			autolevel = "tank", faction=self.faction,
-			stats = { str=12, dex=15, mag=3, con=15 },
+			autolevel = "none", faction=self.faction,
+			stats = { con=10 + self:getWil() * self:getTalentLevel(t) / 5, str=10 + self:getTalentLevel(t) * 2 },
 			resists = { [DamageType.LIGHT] = -50 },
 			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=5, },
 			level_range = {self.level, self.level}, exp_worth = 0,
@@ -96,7 +97,7 @@ newTalent{
 			combat_armor = 1, combat_def = 1,
 			never_move = 1,
 
-			combat = { dam=8, atk=15, apr=5, damtype=DamageType.POISON, dammod={str=0.8} },
+			combat = { dam=8, atk=15, apr=5, damtype=DamageType.ACID, dammod={str=0.7} },
 
 			summoner = self, summoner_gain_exp=true,
 			summon_time = math.ceil(self:getTalentLevel(t)) + 5,
@@ -111,8 +112,9 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Summon a Jelly to attack your foes. Jellies do not move, but are great to block a passage.]])
-	end,
+		return ([[Summon a Jelly to attack your foes. Jellies do not move, but are great to block a passage.
+		It will get %d constitution and %d strength.]]):format(10 + self:getWil() * self:getTalentLevel(t) / 5, 10 + self:getTalentLevel(t) * 2)
+       end,
 }
 
 newTalent{
@@ -140,26 +142,32 @@ newTalent{
 
 		local NPC = require "mod.class.NPC"
 		local m = NPC.new{
-			type = "immovable", subtype = "jelly",
-			display = "j", color=colors.BLACK,
-			desc = "A strange blob on the dungeon floor.",
-			name = "black jelly",
-			autolevel = "tank", faction=self.faction,
-			stats = { str=12, dex=15, mag=3, con=15 },
-			resists = { [DamageType.LIGHT] = -50 },
-			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=5, },
-			level_range = {self.level, self.level}, exp_worth = 0,
+			type = "giant", subtype = "minotaur",
+			display = "H",
+			name = "minotaur", color=colors.UMBER,
 
-			max_life = resolvers.rngavg(25,50),
-			life_rating = 10,
+			body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
 
-			combat_armor = 1, combat_def = 1,
-			never_move = 1,
+			max_stamina = 100,
+			life_rating = 13,
+			max_life = resolvers.rngavg(50,80),
 
-			combat = { dam=8, atk=15, apr=5, damtype=DamageType.POISON, dammod={str=0.8} },
+			autolevel = "none",
+			ai = "summoned", ai_real = "dumb_talented_simple", ai_state = { talent_in=5, },
+			energy = { mod=1.2 },
+			stats = { str=25 + self:getWil() * self:getTalentLevel(t) / 5, dex=18, con=10 + self:getTalentLevel(t) * 2, },
 
+			resolvers.tmasteries{ ["technique/2hweapon-offense"]=0.3, ["technique/2hweapon-cripple"]=0.3, ["technique/combat-training"]=0.3, },
+			desc = [[It is a cross between a human and a bull.]],
+			equipment = resolvers.equip{ {type="weapon", subtype="battleaxe"}, },
+			level_range = {self.level, self.level}, exp_worth = 0,
+
+			combat_armor = 13, combat_def = 8,
+			resolvers.talents{ [Talents.T_WARSHOUT]=3, [Talents.T_STUNNING_BLOW]=3, [Talents.T_SUNDER_ARMOUR]=2, [Talents.T_SUNDER_ARMS]=2, },
+
+			faction = self.faction,
 			summoner = self, summoner_gain_exp=true,
-			summon_time = math.ceil(self:getTalentLevel(t)) + 5,
+			summon_time = math.ceil(self:getTalentLevel(t)) + 2,
 			ai_target = {actor=target}
 		}
 
@@ -171,6 +179,7 @@ newTalent{
 		return true
 	end,
 	info = function(self, t)
-		return ([[Summon a Minotaur to attack your foes. Minotaurs can not stay summoned for long but they deal lots of damage.]])
+		return ([[Summon a Minotaur to attack your foes. Minotaurs can not stay summoned for long but they deal lots of damage.
+		It will get %d strength and %d constitution.]]):format(25 + self:getWil() * self:getTalentLevel(t) / 5, 10 + self:getTalentLevel(t) * 2)
 	end,
 }
diff --git a/game/modules/tome/data/talents/techniques/sling.lua b/game/modules/tome/data/talents/techniques/sling.lua
index fd5c6e4b9e..f11efe8990 100644
--- a/game/modules/tome/data/talents/techniques/sling.lua
+++ b/game/modules/tome/data/talents/techniques/sling.lua
@@ -43,7 +43,7 @@ newTalent{
 	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
-				target:knockBack(self.x, self.y, 4)
+				target:knockback(self.x, self.y, 4)
 				game.logSeen(target, "%s is knocked back!", target.name:capitalize())
 			else
 				game.logSeen(target, "%s resists the wave!", target.name:capitalize())
diff --git a/game/modules/tome/data/talents/techniques/weaponshield.lua b/game/modules/tome/data/talents/techniques/weaponshield.lua
index ef1e13e204..98bb278ed7 100644
--- a/game/modules/tome/data/talents/techniques/weaponshield.lua
+++ b/game/modules/tome/data/talents/techniques/weaponshield.lua
@@ -80,7 +80,7 @@ newTalent{
 		-- Try to stun !
 		if hit then
 			if target:checkHit(self:combatAttack(shield.special_combat), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("knockback") then
-				target:knockBack(self.x, self.y, 4)
+				target:knockback(self.x, self.y, 4)
 			else
 				game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
 			end
@@ -202,7 +202,7 @@ newTalent{
 			if (self.x ~= x or self.y ~= y) and game.level.map:isBound(x, y) and game.level.map(x, y, Map.ACTOR) then
 				local target = game.level.map(x, y, Map.ACTOR)
 				if target:checkHit(self:combatAttack(shield.special_combat), target:combatPhysicalResist(), 0, 95, 5 - self:getTalentLevel(t) / 2) and target:canBe("knockback") then
-					target:knockBack(self.x, self.y, 1 + self:getTalentLevel(t))
+					target:knockback(self.x, self.y, 1 + self:getTalentLevel(t))
 				else
 					game.logSeen(target, "%s resists the knockback!", target.name:capitalize())
 				end
diff --git a/game/modules/tome/init.lua b/game/modules/tome/init.lua
index 970460e57d..b22187d415 100644
--- a/game/modules/tome/init.lua
+++ b/game/modules/tome/init.lua
@@ -1,7 +1,7 @@
 name = "T.o.M.E"
 long_name = "Tales of Middle Earth: The Fourth Age"
 short_name = "tome"
-author = { "DarkGod", "darkgod@t-o-m-e.net" }
+author = { "DarkGod", "darkgod@te4.org" }
 homepage = "http://tome.te4.org/"
 version = {4,0,0}
 engine = {1,0,0}
-- 
GitLab