From f343fdd3fbb040e35ae6ca855d644a499634ea2b Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sat, 26 Feb 2011 10:28:42 +0000
Subject: [PATCH] New dwarven starting zones and town

git-svn-id: http://svn.net-core.org/repos/t-engine4@2841 51575b47-30f0-44d4-a5cc-537603b46e54
---
 .../engines/default/data/gfx/ui/selector1.png | Bin 290 -> 270 bytes
 .../engines/default/data/gfx/ui/selector2.png | Bin 208 -> 194 bytes
 .../engines/default/data/gfx/ui/selector3.png | Bin 280 -> 260 bytes
 .../engines/default/data/gfx/ui/selector4.png | Bin 203 -> 197 bytes
 .../engines/default/data/gfx/ui/selector5.png | Bin 167 -> 166 bytes
 .../engines/default/data/gfx/ui/selector6.png | Bin 207 -> 196 bytes
 .../engines/default/data/gfx/ui/selector7.png | Bin 285 -> 258 bytes
 .../engines/default/data/gfx/ui/selector8.png | Bin 216 -> 196 bytes
 .../engines/default/data/gfx/ui/selector9.png | Bin 302 -> 279 bytes
 game/modules/tome/data/damage_types.lua       |   6 +-
 .../data/general/objects/boss-artifacts.lua   |  19 ++++-
 .../tome/data/maps/zones/deep-bellow-last.lua |   1 +
 game/modules/tome/data/talents/misc/npcs.lua  |  45 +++++++++++-
 .../tome/data/zones/deep-bellow/npcs.lua      |  68 ++++++++++++++++--
 .../tome/data/zones/deep-bellow/zone.lua      |   3 +
 .../tome/data/zones/reknor-escape/zone.lua    |   1 +
 16 files changed, 135 insertions(+), 8 deletions(-)

diff --git a/game/engines/default/data/gfx/ui/selector1.png b/game/engines/default/data/gfx/ui/selector1.png
index b0ddd760d866b7ebd5804f3bdeb22bda476ff6e5..25a5e54ebdb06a045384ae90ac5b1953da781ed9 100644
GIT binary patch
delta 161
zcmV;S0ABy10*(TZb$^6OL_t(|+H{Yx4Z=VSMc;Q41u2vWu?-S4q+kXbN>*SUCSV&H
zinJ-neTp2XfP^bs?|oa=aeulF!+3d&Pa-NJ0!c^$Aox?ZzlA(6npvtBnHfr?l*)-Z
zBWz>4KxerIRv0EHJh>#78*W|KoOfwM<m3lB3-`9I4%=qkOB#Cpe)ApxF^Dv&^9^oO
P00000NkvXXu0mjfufsm=

delta 181
zcmV;m080Ok0-^$tb$^&iL_t(|+H8-#5rI(@M9<#$jGx2^Br;7XKnX?xIuL3>J1UT>
zKnG$u-@7YdFvf;E=gjPCwekLZz3=Yx6TM!aQVOL8Awh`XPn?hjn-AbLew6?S+)VxQ
za7&D6m~eo20>(I#<^}?#NF@qUfk9fh+-R9(3nY+)EULs|HZH2$%VmKOwvqJSQ3c28
jP|I;QSqr+~M~?vj^a(yndtC;S00000NkvXXu0mjfMUYMW

diff --git a/game/engines/default/data/gfx/ui/selector2.png b/game/engines/default/data/gfx/ui/selector2.png
index 8c1f15423cdb0b46346114be54bfebdd8a8ba1d2..4a12ebaaa81c6f9b60f5afd666aa6de479c6d705 100644
GIT binary patch
delta 84
zcmcb>c!+UAsjr2ni(^Q|tt69coIlSuup1Z(FzEdM|9|<`Cj0uj$KeX6^o|?=fe!D+
j83N~3YSb8j;QxPShW$ExYc(IW>45m2u6{1-oD!M<Bn~3T

delta 98
zcmV-o0G<EB0nh=Ebz4SBL_t(|+F~@Qzwn=dfq~)we+I081(yUu!C(9;SpNP0hbn@m
zp5^cFzxYk~{r4MIoiHv7<70iS3K(Guv^WGN;j;oT0Q6}XRe0R%7XSbN07*qoM6N<$
Ef@gy*Q~&?~

diff --git a/game/engines/default/data/gfx/ui/selector3.png b/game/engines/default/data/gfx/ui/selector3.png
index a18adda6ba5476883fe44f56357d440dd6ab279c..0de31a631046eef42e8fe1e6ec33923c6067167b 100644
GIT binary patch
delta 151
zcmV;I0BHZ10)zsPb$@zEL_t(|+H{Vw4Z=VW1m|Cec*!KTWCzqh=2qMkDRq!g0fk}T
z5^#RmmbmD&vl?w0Z<7EdAqjWKec@Vq+P2*D3jbZ+!T7h4sfHp|szV`49y=t}ip}$f
z?G8yeS|!E$bN5q+IEATcP5>_(y36CZT$1ISp1}J%08HRUpb(_cr%eC=002ovPDHLk
FV1l{UMc@Dc

delta 171
zcmV;c095~k0+<4jb$^aYL_t(|+H8(74gp~pMBmT9A}U%(*oM;W)LQ4zIDsp;fx;am
zvip5cv9d%=GR0(GCR4WitE8k7eG(CL-IM0Fqg^$Js-R%<R}(`hL-@dsKur^R$V?0|
z68Hk53rx|$(FdCNhH4j&u~d+RX-`@J=C#~6lyOm@AhKRmN+jW2+xhbN`&_8A$_co<
Z1^|anT_P@!aGU@D002ovPDHLkV1k<uP7weA

diff --git a/game/engines/default/data/gfx/ui/selector4.png b/game/engines/default/data/gfx/ui/selector4.png
index 164fd1ef9bcd9824a77bce82e476856dd0cc7e13..38e47209b7015e0f2ef7bcb3b9706ad8c9b39d86 100644
GIT binary patch
delta 87
zcmV-d0I2`V0mT83bx=D=L_t(|+RVzK6#x(bMbY=a!K`5h3s}LVilAyV$vLW<uTso)
tj9J?3*a6!}LJ|Px5I5%Gv#_pV4*=QF2*UICK1=`r002ovPDHLkV1m=?CiMUS

delta 93
zcmV-j0HXiJ0m}i9byh)1L_t(|+F}e!_}_8u{qOSMiYFLYS=kwwnVA`wS(q4@m>3xt
z7#SIu7~p^rl?mk{DZmZ}RKb4?1^-c*P%dBq<#h{<s|A^y00000NkvXXu0mjfT%#oT

diff --git a/game/engines/default/data/gfx/ui/selector5.png b/game/engines/default/data/gfx/ui/selector5.png
index 7d804e9fa0edcee3aa360c99d033cc4270b75746..16f5fc7e9183234e039d8996e91488aa439cf1c9 100644
GIT binary patch
delta 56
zcmZ3^xQuZ^siBOgi(^Q|tt69coIlSuup1Z(FdTMfWME+U|DT!Ra0=t0z*W3CKrVx)
LtDnm{r-UW|E9?@Z

delta 57
zcmZ3+xSVl9sgbOwi(^Q|tt68b`#;QQ<WERaU}$S+VgQ2w|Ct#k?_ugoy;gS}#P@Xd
Kb6Mw<&;$Tbq!b4L

diff --git a/game/engines/default/data/gfx/ui/selector6.png b/game/engines/default/data/gfx/ui/selector6.png
index 4d20de19463dd780848e002029e49ed78b4caec9..7587e5f74ea1c104b55abb09368755f566ebae01 100644
GIT binary patch
delta 86
zcmX@lc!Y66slSz{i(^Q|tt+P%GBOA-uwGPN*_6a~R%@Ekmj9-mj4@RYo$?PeY}?qY
qvc%Q5b<X9U7;g9eMtL^*w~P!%3H&ps9~87_00K`}KbLh*2~7aiN+4nY

delta 97
zcmX@Yc%E@WX_Tv{i(^Q|tt68b`#;Qo_`klb{{KJYKYu^>KYV|GKhOU9|0xN3^A9di
zJ#p*gkpm#WakQY}fq|g_LrL(5`4X%eT>>%(7~Efqc|0qe$;JQ#p00i_>zopr04n`2
A`Tzg`

diff --git a/game/engines/default/data/gfx/ui/selector7.png b/game/engines/default/data/gfx/ui/selector7.png
index 3dbb01ff4dd216cc0e90e6513c2c8dfb6dee8e34..11108f1aaed0e879f04ee735b4bfa2c524072a95 100644
GIT binary patch
delta 149
zcmV;G0BZl80)hgNb$@tCL_t(|+Jug=4Z<)01n(_lOhd&!NLhe}f*IJ6nUVq%oM0!7
zZ6QG7+dKWgF2^fCm(y|v5+AWZ7h}3T;*8r^Bz*~|5N3KaaM<nf-ZiKqj0nO#@|p(x
z)<J2h0s@Q?IWLUQ38Xe<c`vNsm(acySOvqMtOEdOZyv`(F%HHf00000NkvXXu0mjf
Dd7?dF

delta 176
zcmV;h08jsd0-XYob$^pdL_t(|+I)>Y3c^qr1ZVd>v<O1b%F+{fhg`rW7x187!aJyq
zXh1YUqMt>;pT=#r*kMQYIsmHfP94D`_)QL|j%{ojbxcNMEJ1t&!Rm19nJu?0$~n`b
zc#jc~fmRB3rz_26PgxY$0trcE03mWp^aSUw#o5>%6d#*#PANDgoQ#v;`31;A!!tG*
eAZzG<c?|%SdnUg7?`@g@0000<MNUMnLSTZ;|4YmO

diff --git a/game/engines/default/data/gfx/ui/selector8.png b/game/engines/default/data/gfx/ui/selector8.png
index 48ad10102b61e0e4cc2d1cb21ac626d4e58d541f..3647fe8aefd9da4a26ce8f4f3a1feb6477dac577 100644
GIT binary patch
delta 86
zcmcb?c!Y66slSz{i(^Q|tt6h!C+D1LVBhfP$6tN+^-N-o|9L7z_f&ip+~4%xzW(u)
ql$3;ogv6ATBl%2<tUf#}3<(T73%Sn+Pn;9P00f?{elF{r5}E*Tr6Rxp

delta 106
zcmX@Yc!P05X|kWEi(^Q|t)wqqzwBo+@+bT}^vj-oJri?xIZuV?oa&E4`<wXp*FBi_
z_xynahmIU+@t@b&+Sxks;s5$KToRHJ5)l$0AXzx$!~8}@1BTNEf-|Lhc4jgFfv2mV
J%Q~loCIBvPEk*zU

diff --git a/game/engines/default/data/gfx/ui/selector9.png b/game/engines/default/data/gfx/ui/selector9.png
index 36ed869166a5d341cc23b90b8be6353a618e3e8a..f69da4db3ba5f79ca083f64d190c6a4ffaddb284 100644
GIT binary patch
delta 170
zcmV;b09F640+#}ib$^XXL_t(|+Jug~4Z<)KMbC>ZjD&<}*oKM)=&}QdZCHaHSO-x-
z5X8oxN0AhcD7eLK?pNB){=^h2f{{kfz{UDlj<uRnCVV2x#r)u$*;>0&bQE(gboVD+
zd}Cf~oHILny**GsfEW|K4=4&V0KDx(9EMdvmBtuK$;jAhMI&VLP%8d0=ukzSY50Th
Y069!F@-bO4#sB~S07*qoM6N<$f)x%+ng9R*

delta 193
zcmV;y06zbh0<Hp(b$_HuL_t(|+Juff4na{A0OuU{y-=t~Y(pv0DK&aa5WBGrd$0o=
zQ0N4SPyF(J=N`o?yw22<%*b@^D;lWaDzwssHLwY<#FqdFxI=Cwk0N7Gbr=1POu}$<
zMWhz8vSNQZ^L$)5?8fxk$t-M-C)^zzK1I&$^~S|%ivwigUOHp|#2B&CNYa2=L=XUi
vs)7PmcO)8S@|)HmD4<IH0*E#Q{_q_DG-Ez-pt&&W00000NkvXXu0mjfEg4nG

diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua
index a6367ab977..7fc8cf8191 100644
--- a/game/modules/tome/data/damage_types.lua
+++ b/game/modules/tome/data/damage_types.lua
@@ -87,7 +87,7 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 			local t = target:getTalentFromId(target.T_CHARGED_SHIELD)
 			dam = t.css_on_damage(target, t, type, dam)
 		end
-		
+
 		-- Reduce damage with resistance
 		if target.resists then
 			local pen = 0
@@ -110,12 +110,14 @@ setDefaultProjector(function(src, x, y, type, dam, tmp, no_martyr)
 
 		print("[PROJECTOR] final dam", dam)
 
+		local dead
+		dead, dam = target:takeHit(dam, src)
+
 		-- Log damage for later
 		if not DamageType:get(type).hideMessage then
 			local srcname = src.x and src.y and game.level.map.seens(src.x, src.y) and src.name:capitalize() or "Something"
 			game:delayedLogDamage(src, target, dam, ("%s%d %s#LAST#"):format(DamageType:get(type).text_color or "#aaaaaa#", math.ceil(dam), DamageType:get(type).name))
 		end
-		target:takeHit(dam, src)
 
 		if src.attr and src:attr("martyrdom") and not no_martyr then
 			DamageType.defaultProjector(target, src.x, src.y, type, dam * src.martyrdom / 100, tmp, true)
diff --git a/game/modules/tome/data/general/objects/boss-artifacts.lua b/game/modules/tome/data/general/objects/boss-artifacts.lua
index 12651ce7ff..35b2b58207 100644
--- a/game/modules/tome/data/general/objects/boss-artifacts.lua
+++ b/game/modules/tome/data/general/objects/boss-artifacts.lua
@@ -862,7 +862,7 @@ newEntity{ base = "BASE_WAND", define_as = "ROD_OF_ANNULMENT",
 
 newEntity{ base = "BASE_WARAXE",
 	power_source = {arcane=true},
-	define_as = "SKULLCLEAVER", rarity=false,
+	define_as = "SKULLCLEAVER",
 	unided_name = "crimson waraxe",
 	name = "Skullcleaver", unique=true,
 	desc = [[A small but sharp axe, with a handle made of polished bone.  The blade has chopped through the skulls of many, and has been stained a deep crimson.]],
@@ -881,3 +881,20 @@ newEntity{ base = "BASE_WARAXE",
 		inc_damage = { [DamageType.BLIGHT] = 8 },
 	},
 }
+
+newEntity{ base = "BASE_DIGGER",
+	power_source = {unknown=true},
+	define_as = "TOOTH_MOUTH",
+	unided_name = "a tooth", unique = true,
+	name = "Tooth of the Mouth",
+	desc = [[A huge tooth taken from the Mouth, in the Deep Bellow.]],
+	level_range = {5, 12},
+	cost = 50,
+	material_level = 3,
+	digspeed = 12,
+	wielder = {
+		inc_damage = { [DamageType.BLIGHT] = 4 },
+		on_melee_hit = {[DamageType.BLIGHT] = 15},
+		combat_apr = 5,
+	},
+}
diff --git a/game/modules/tome/data/maps/zones/deep-bellow-last.lua b/game/modules/tome/data/maps/zones/deep-bellow-last.lua
index b7b29f1b36..eb674e6e54 100644
--- a/game/modules/tome/data/maps/zones/deep-bellow-last.lua
+++ b/game/modules/tome/data/maps/zones/deep-bellow-last.lua
@@ -19,6 +19,7 @@
 
 defineTile("#", {"UNDERGROUND_TREE","UNDERGROUND_TREE2","UNDERGROUND_TREE3","UNDERGROUND_TREE4","UNDERGROUND_TREE5","UNDERGROUND_TREE6","UNDERGROUND_TREE7","UNDERGROUND_TREE8","UNDERGROUND_TREE9","UNDERGROUND_TREE10","UNDERGROUND_TREE11","UNDERGROUND_TREE12","UNDERGROUND_TREE13","UNDERGROUND_TREE14","UNDERGROUND_TREE15","UNDERGROUND_TREE16","UNDERGROUND_TREE17","UNDERGROUND_TREE18","UNDERGROUND_TREE19","UNDERGROUND_TREE20",})
 defineTile(".", "UNDERGROUND_FLOOR")
+defineTile("<", "UNDERGROUND_LADDER_UP")
 defineTile("M", "UNDERGROUND_FLOOR", nil, "THE_MOUTH")
 
 startx = 1
diff --git a/game/modules/tome/data/talents/misc/npcs.lua b/game/modules/tome/data/talents/misc/npcs.lua
index 558b386e7c..055f6b1592 100644
--- a/game/modules/tome/data/talents/misc/npcs.lua
+++ b/game/modules/tome/data/talents/misc/npcs.lua
@@ -1262,8 +1262,9 @@ newTalent{
 			if not target then return end
 			if self:reactionToward(target) < 0 and not tgts[target] then
 				tgts[target] = true
+				local ox, oy = target.x, target.y
 				target:pull(self.x, self.y, 1)
-				game.logSeen(target, "%s is pulled in!", target.name:capitalize())
+				if target.x ~= ox or target.y ~= oy then game.logSeen(target, "%s is pulled in!", target.name:capitalize()) end
 			end
 		end)
 		return true
@@ -1272,3 +1273,45 @@ newTalent{
 		return ([[Pull all foes toward you.]])
 	end,
 }
+
+newTalent{
+	name = "Gift of Amakthel",
+	type = {"technique/other", 1},
+	points = 5,
+	cooldown = 6,
+	tactical = { ATTACK = 2 },
+	range = 10,
+	target = function(self, t)
+		return {type="hit", range=self:getTalentRange(t), talent=t}
+	end,
+	action = function(self, t)
+		local tg = self:getTalentTarget(t)
+		local tx, ty = self.x, self.y
+		if not tx or not ty then return nil end
+
+		-- Find space
+		local x, y = util.findFreeGrid(tx, ty, 3, true, {[Map.ACTOR]=true})
+		if not x then
+			game.logPlayer(self, "Not enough space to invoke!")
+			return
+		end
+
+		-- Find an actor with that filter
+		local m = game.zone:makeEntityByName(game.level, "actor", "SLIMY_CRAWLER")
+		if m then
+			m.exp_worth = 0
+			m.summoner = self
+			m.summon_time = 10
+			game.zone:addEntity(game.level, m, "actor", x, y)
+			local target = game.level.map(tx, ty, Map.ACTOR)
+			m:setTarget(target)
+
+			game.logSeen(self, "%s spawns a slimy crawler!", self.name:capitalize())
+		end
+
+		return true
+	end,
+	info = function(self, t)
+		return ([[Invoke a slimy crawler.]])
+	end,
+}
diff --git a/game/modules/tome/data/zones/deep-bellow/npcs.lua b/game/modules/tome/data/zones/deep-bellow/npcs.lua
index d771f5c416..3b440613d6 100644
--- a/game/modules/tome/data/zones/deep-bellow/npcs.lua
+++ b/game/modules/tome/data/zones/deep-bellow/npcs.lua
@@ -30,7 +30,7 @@ newEntity{ base="BASE_NPC_CORRUPTED_HORROR", define_as = "THE_MOUTH",
 	color=colors.VIOLET,
 	desc = [["From bellow, it devours."]],
 	level_range = {7, nil}, exp_worth = 2,
-	max_life = 150, life_rating = 12, fixed_rating = true,
+	max_life = 10000, life_rating = 0, fixed_rating = true,
 	stats = { str=10, dex=10, cun=12, mag=20, con=10 },
 	rank = 4,
 	size_category = 4,
@@ -42,7 +42,7 @@ newEntity{ base="BASE_NPC_CORRUPTED_HORROR", define_as = "THE_MOUTH",
 	combat = {dam=100, atk=1000, apr=1000, physcrit=1000},
 
 	body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1 },
-	resolvers.drops{chance=100, nb=1, {defined="RING_OF_HORRORS", random_art_replace={chance=75}} },
+	resolvers.drops{chance=100, nb=1, {defined="TOOTH_MOUTH", random_art_replace={chance=35}} },
 	resolvers.drops{chance=100, nb=3, {ego_chance=100} },
 
 	resolvers.talents{
@@ -50,11 +50,71 @@ newEntity{ base="BASE_NPC_CORRUPTED_HORROR", define_as = "THE_MOUTH",
 		[Talents.T_DRAIN]=1,
 	},
 
-	autolevel = "caster",
-	ai = "tactical", ai_state = { talent_in=1, ai_move="move_astar", },
+	autolevel = "warriormage",
+	ai = "tactical", ai_state = { talent_in=1 },
 	ai_tactic = resolvers.tactic"ranged",
 
+	on_takehit = function(self, value)
+		if value <= 500 then
+			game.logSeen(self, "#CRIMSON#%s seems invulnerable, there must be an other way to kill it!", self.name:capitalize())
+			return 0
+		end
+		return value
+	end,
+
+	-- Invoke crawlers every few turns
+	on_act = function(self)
+		if not self.ai_target.actor or self.ai_target.actor.dead then return end
+		if not self:hasLOS(self.ai_target.actor.x, self.ai_target.actor.y) then return end
+
+		self.last_crawler = self.last_crawler or (game.turn - 100)
+		if game.turn - self.last_crawler >= 100 then -- Summon a crawler every 10 turns
+			self:forceUseTalent(self.T_GIFT_OF_AMAKTHEL, {no_energy=true})
+			self.last_crawler = game.turn
+		end
+	end,
+
 	on_die = function(self, who)
 		game.player:resolveSource():setQuestStatus("deep-bellow", engine.Quest.COMPLETED)
 	end,
 }
+
+newEntity{ base="BASE_NPC_CORRUPTED_HORROR", define_as = "SLIMY_CRAWLER",
+	name = "slimy crawlyer",
+	color = colors.GREEN,
+	desc = [[This disgusting... thing crawls on the floor toward you with great speed.
+It seems to come from the digestive system of the mouth.]],
+	level_range = {4, nil}, exp_worth = 0,
+	max_life = 40, life_rating = 5, fixed_rating = true,
+	movement_speed = -0.5,
+	size_category = 1,
+
+	combat = { dam=resolvers.mbonus(15, 15), damtype=DamageType.SLIME, dammod={str=1} },
+
+	autolevel = "warrior",
+	ai = "dumb_talented_simple", ai_state = { talent_in=4, ai_move="move_astar" },
+
+	resolvers.talents{
+		[Talents.T_KNOCKBACK]=1,
+	},
+
+	on_act = function(self)
+		local tgts = {}
+		for i, actor in ipairs(game.party.m_list) do
+			if not actor.dead then tgts[#tgts+1] = actor end
+		end
+		self:setTarget(rng.table(tgts))
+
+		if self.summoner.dead then
+			self:die()
+			game.logSeen(self, "#AQUAMARINE#With the Mouth death its crawler also falls lifeless on the ground!")
+		end
+	end,
+
+	on_die = function(self, who)
+		if self.summoner and not self.summoner.dead then
+			game.logSeen(self, "#AQUAMARINE#As %s falls you notice that %s seems to shudder in pain!", self.name, self.summoner.name)
+			self.summoner:takeHit(1000, who)
+		end
+	end,
+}
diff --git a/game/modules/tome/data/zones/deep-bellow/zone.lua b/game/modules/tome/data/zones/deep-bellow/zone.lua
index 4c9c9d1e38..aba34896f3 100644
--- a/game/modules/tome/data/zones/deep-bellow/zone.lua
+++ b/game/modules/tome/data/zones/deep-bellow/zone.lua
@@ -70,6 +70,9 @@ return {
 				actor = {
 					nb_npc = {0, 0},
 				},
+				object = {
+					nb_object = {1, 1},
+				},
 			},
 		},
 	},
diff --git a/game/modules/tome/data/zones/reknor-escape/zone.lua b/game/modules/tome/data/zones/reknor-escape/zone.lua
index c229c6bc79..54eb46ede8 100644
--- a/game/modules/tome/data/zones/reknor-escape/zone.lua
+++ b/game/modules/tome/data/zones/reknor-escape/zone.lua
@@ -101,5 +101,6 @@ return {
 			local chat = require("engine.Chat").new("norgan-saved", norgan, game.player)
 			chat:invoke()
 		end
+		if norgan then game.party:removeMember(norgan, true) end
 	end,
 }
-- 
GitLab