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