diff --git a/game/engines/default/data/gfx/ui/selector1.png b/game/engines/default/data/gfx/ui/selector1.png index b0ddd760d866b7ebd5804f3bdeb22bda476ff6e5..25a5e54ebdb06a045384ae90ac5b1953da781ed9 100644 Binary files a/game/engines/default/data/gfx/ui/selector1.png and b/game/engines/default/data/gfx/ui/selector1.png differ diff --git a/game/engines/default/data/gfx/ui/selector2.png b/game/engines/default/data/gfx/ui/selector2.png index 8c1f15423cdb0b46346114be54bfebdd8a8ba1d2..4a12ebaaa81c6f9b60f5afd666aa6de479c6d705 100644 Binary files a/game/engines/default/data/gfx/ui/selector2.png and b/game/engines/default/data/gfx/ui/selector2.png differ diff --git a/game/engines/default/data/gfx/ui/selector3.png b/game/engines/default/data/gfx/ui/selector3.png index a18adda6ba5476883fe44f56357d440dd6ab279c..0de31a631046eef42e8fe1e6ec33923c6067167b 100644 Binary files a/game/engines/default/data/gfx/ui/selector3.png and b/game/engines/default/data/gfx/ui/selector3.png differ diff --git a/game/engines/default/data/gfx/ui/selector4.png b/game/engines/default/data/gfx/ui/selector4.png index 164fd1ef9bcd9824a77bce82e476856dd0cc7e13..38e47209b7015e0f2ef7bcb3b9706ad8c9b39d86 100644 Binary files a/game/engines/default/data/gfx/ui/selector4.png and b/game/engines/default/data/gfx/ui/selector4.png differ diff --git a/game/engines/default/data/gfx/ui/selector5.png b/game/engines/default/data/gfx/ui/selector5.png index 7d804e9fa0edcee3aa360c99d033cc4270b75746..16f5fc7e9183234e039d8996e91488aa439cf1c9 100644 Binary files a/game/engines/default/data/gfx/ui/selector5.png and b/game/engines/default/data/gfx/ui/selector5.png differ diff --git a/game/engines/default/data/gfx/ui/selector6.png b/game/engines/default/data/gfx/ui/selector6.png index 4d20de19463dd780848e002029e49ed78b4caec9..7587e5f74ea1c104b55abb09368755f566ebae01 100644 Binary files a/game/engines/default/data/gfx/ui/selector6.png and b/game/engines/default/data/gfx/ui/selector6.png differ diff --git a/game/engines/default/data/gfx/ui/selector7.png b/game/engines/default/data/gfx/ui/selector7.png index 3dbb01ff4dd216cc0e90e6513c2c8dfb6dee8e34..11108f1aaed0e879f04ee735b4bfa2c524072a95 100644 Binary files a/game/engines/default/data/gfx/ui/selector7.png and b/game/engines/default/data/gfx/ui/selector7.png differ diff --git a/game/engines/default/data/gfx/ui/selector8.png b/game/engines/default/data/gfx/ui/selector8.png index 48ad10102b61e0e4cc2d1cb21ac626d4e58d541f..3647fe8aefd9da4a26ce8f4f3a1feb6477dac577 100644 Binary files a/game/engines/default/data/gfx/ui/selector8.png and b/game/engines/default/data/gfx/ui/selector8.png differ diff --git a/game/engines/default/data/gfx/ui/selector9.png b/game/engines/default/data/gfx/ui/selector9.png index 36ed869166a5d341cc23b90b8be6353a618e3e8a..f69da4db3ba5f79ca083f64d190c6a4ffaddb284 100644 Binary files a/game/engines/default/data/gfx/ui/selector9.png and b/game/engines/default/data/gfx/ui/selector9.png differ diff --git a/game/modules/tome/data/damage_types.lua b/game/modules/tome/data/damage_types.lua index a6367ab9773c5db237905cef03a0efd564047e21..7fc8cf8191a78a8b7a23a892d0d525bb17d177cd 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 12651ce7ff7bdc2c96df27130a57c1f15d5f3831..35b2b582074442891bc31118ea6a21608d88ab44 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 b7b29f1b3625bec275273dbf1f59db8e31efb785..eb674e6e54e59465d10ec993aac67b54d889580a 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 558b386e7cfa8da423f75f9feb45359afb72c412..055f6b15920c5804f88611054da50168ef3c7d67 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 d771f5c4162f453e30b476ffd29fd5b2055edcad..3b440613d63f8b24b8c82b0e098103658337eb63 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 4c9c9d1e3863ef45220d87f3464a6d54a3e564c3..aba34896f37418b2b71e7cb5f5b8b2e6bb832dd6 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 c229c6bc797c4c08a44951d03696f5d3a72741da..54eb46ede89bdfdd9cf979db510f0dc16c5e84ef 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, }