From 979875dafd8f8326801f873d2fb8c6a08acc6f43 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Thu, 19 Aug 2010 16:15:23 +0000 Subject: [PATCH] New zone: the Slime Tunnels Updated quests, the awy into the High Peak is now open ! git-svn-id: http://svn.net-core.org/repos/t-engine4@1030 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/modules/tome/class/Actor.lua | 16 ++++ game/modules/tome/class/Game.lua | 5 + game/modules/tome/class/Player.lua | 14 +++ .../tome/class/generator/map/SlimeTunnels.lua | 86 ++++++++++++++++++ .../tome/data/chats/message-minas-tirith.lua | 10 +- .../modules/tome/data/general/grids/slime.lua | 36 ++++++++ game/modules/tome/data/general/npcs/ooze.lua | 71 ++++++++++++++- .../data/general/objects/quest-artifacts.lua | 20 ++++ .../tome/data/gfx/terrain/slime_floor.png | Bin 0 -> 1198 bytes .../tome/data/gfx/terrain/slime_wall.png | Bin 0 -> 1372 bytes .../tome/data/maps/zones/slime-tunnels.lua | 69 ++++++++++++++ game/modules/tome/data/quests/orb-command.lua | 22 ++++- .../data/talents/techniques/superiority.lua | 4 +- .../data/texts/unlock-mage_cryomancer.lua | 2 +- .../tome/data/zones/slime-tunnels/grids.lua | 63 +++++++++++++ .../tome/data/zones/slime-tunnels/npcs.lua | 23 +++++ .../tome/data/zones/slime-tunnels/objects.lua | 37 ++++++++ .../tome/data/zones/slime-tunnels/traps.lua | 20 ++++ .../tome/data/zones/slime-tunnels/zone.lua | 55 +++++++++++ ideas/zones.ods | Bin 18354 -> 18468 bytes 20 files changed, 542 insertions(+), 11 deletions(-) create mode 100644 game/modules/tome/class/generator/map/SlimeTunnels.lua create mode 100644 game/modules/tome/data/general/grids/slime.lua create mode 100644 game/modules/tome/data/gfx/terrain/slime_floor.png create mode 100644 game/modules/tome/data/gfx/terrain/slime_wall.png create mode 100644 game/modules/tome/data/maps/zones/slime-tunnels.lua create mode 100644 game/modules/tome/data/zones/slime-tunnels/grids.lua create mode 100644 game/modules/tome/data/zones/slime-tunnels/npcs.lua create mode 100644 game/modules/tome/data/zones/slime-tunnels/objects.lua create mode 100644 game/modules/tome/data/zones/slime-tunnels/traps.lua create mode 100644 game/modules/tome/data/zones/slime-tunnels/zone.lua diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 4c1a9b99f7..a2a2a174b9 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -573,6 +573,22 @@ function _M:onTakeHit(value, src) game.logSeen(self, "%s shatters into pieces!", self.name:capitalize()) end + -- Split ? + if self.clone_on_hit and value >= self.clone_on_hit.min_dam_pct * self.max_life / 100 and rng.percent(self.clone_on_hit.chance) then + -- Find space + local x, y = util.findFreeGrid(self.x, self.y, 1, true, {[Map.ACTOR]=true}) + if x then + -- Find a place around to clone + local a = self:clone() + a.energy.val = 0 + a.exp_worth = 0.1 + a.inven = {} + a.x, a.y = nil, nil + game.zone:addEntity(game.level, a, "actor", x, y) + game.logSeen(self, "%s is split in two!", self.name:capitalize()) + end + end + return value end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index 1313097630..ed7ee572ef 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -501,6 +501,11 @@ function _M:setupCommands() self.logPlayer(self.player, "All world artifacts created.") end end, + [{"_g","ctrl"}] = function() + if config.settings.tome.cheat then + self:changeLevel(1, "slime-tunnels") + end + end, } self.key:addBinds { diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua index 62afc1482c..791f498a43 100644 --- a/game/modules/tome/class/Player.lua +++ b/game/modules/tome/class/Player.lua @@ -555,6 +555,20 @@ function _M:useOrbPortal(portal) if portal.on_use then portal:on_use(self) end end +--- Use the orbs of command +function _M:useCommandOrb(o) + local g = game.level.map(self.x, self.y, Map.TERRAIN) + if not g then return end + if not g.define_as or not o.define_as or o.define_as ~= g.define_as then + game.logPlayer(self, "This does not seem to have any effect.") + return + end + + game.logPlayer(self, "You use the %s on the pedestral. There is a distant 'clonk' sound.", o:getName{do_colour=true}) + self:grantQuest("orb-command") + self:setQuestStatus("orb-command", engine.Quest.COMPLETED, o.define_as) +end + --- Tell us when we are targetted function _M:on_targeted(act) if self:attr("invisible") or self:attr("stealth") then diff --git a/game/modules/tome/class/generator/map/SlimeTunnels.lua b/game/modules/tome/class/generator/map/SlimeTunnels.lua new file mode 100644 index 0000000000..1b41ec43af --- /dev/null +++ b/game/modules/tome/class/generator/map/SlimeTunnels.lua @@ -0,0 +1,86 @@ +-- TE4 - T-Engine 4 +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +require "engine.class" +local Map = require "engine.Map" +require "engine.Generator" +module(..., package.seeall, class.inherit(engine.Generator)) + +function _M:init(zone, map, level, data) + engine.Generator.init(self, zone, map, level) + self.data = data + self.grid_list = zone.grid_list +end + +function _M:makePath(sx, sy, ex, ey, wd, excentricity, points) + local ln = 0 + local path = core.noise.new(1) + + local j = sy + local dir = true + for i = sx, ex do + for jj = j - wd, j + wd do if self.map:isBound(i, jj) then self.map(i, jj, Map.TERRAIN, self:resolve(".")) end end + points[#points+1] = {x=i, y=j} + + if i < ex - 10 then + local n = path:fbm_perlin(150 * i / self.map.w, 4) + if ln < -excentricity or ln > excentricity then + if (ln > 0 and n < 0) or (ln < 0 and n > 0) then dir = not dir end + j = util.bound(j + (dir and -1 or 1), 0, self.map.h - 1) + end + ln = n + else + -- Close in on the exit + if j < ey then j = j + 1 + elseif j > ey then j = j - 1 + end + end + end +end + +function _M:generate(lev, old_lev) + for i = 0, self.map.w - 1 do for j = 0, self.map.h - 1 do + self.map(i, j, Map.TERRAIN, self:resolve("#")) + end end + + local points = {} + self:makePath(0, self.data.start, self.map.w - 1, self.data.stop, 1, 0.35, points) + for i = 1, 10 do + local sp, ep + repeat + sp = rng.table(points) + ep = rng.table(points) + until ep.x - sp.x > 80 + self:makePath(sp.x, sp.y, ep.x, ep.y, 0, 0.25, points) + end + + -- Place pedestrals + local orbs = {"ORB_UNDEATH", "ORB_DRAGON", "ORB_ELEMENTS", "ORB_DESTRUCTION"} + for i = 1, 4 do + local orb = rng.tableRemove(orbs) + local p = rng.tableRemove(points) + self.map(p.x, p.y, Map.TERRAIN, self:resolve(orb, nil, true)) + end + + self.level.slime_points = points + + -- Make stairs + local spots = {} + return 1,1,1,1, spots +end diff --git a/game/modules/tome/data/chats/message-minas-tirith.lua b/game/modules/tome/data/chats/message-minas-tirith.lua index 113eb79e90..edd30bd353 100644 --- a/game/modules/tome/data/chats/message-minas-tirith.lua +++ b/game/modules/tome/data/chats/message-minas-tirith.lua @@ -25,10 +25,12 @@ But enough talk, take this message, now I must go. answers = { {"Thank you for your courrage.", action=function(npc, player) local o, item, inven_id = npc:findInAllInventories("Sealed Scroll of Minas Tirith") - npc:removeObject(inven_id, item, true) - player:addObject(player.INVEN_INVEN, o) - player:sortInven() - game.logPlayer(player, "The herald gives you %s.", o:getName{do_color=true}) + if o then + npc:removeObject(inven_id, item, true) + player:addObject(player.INVEN_INVEN, o) + player:sortInven() + game.logPlayer(player, "The herald gives you %s.", o:getName{do_color=true}) + end if game.level:hasEntity(npc) then game.level:removeEntity(npc) end end}, diff --git a/game/modules/tome/data/general/grids/slime.lua b/game/modules/tome/data/general/grids/slime.lua new file mode 100644 index 0000000000..671cd21e59 --- /dev/null +++ b/game/modules/tome/data/general/grids/slime.lua @@ -0,0 +1,36 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +newEntity{ + define_as = "SLIME_FLOOR", + name = "slimy floor", image = "terrain/slime_floor.png", + display = '.', color=colors.LIGHT_GREEN, back_color=colors.GREEN, +} + +newEntity{ + define_as = "SLIME_WALL", + name = "slimy wall", image = "terrain/slime_wall.png", + display = '#', color=colors.LIGHT_GREEN, back_color=colors.GREEN, + always_remember = true, + does_block_move = true, + can_pass = {pass_wall=1}, + block_sight = true, + air_level = -20, + dig = "FLOOR", +} diff --git a/game/modules/tome/data/general/npcs/ooze.lua b/game/modules/tome/data/general/npcs/ooze.lua index a0af025998..47b95b7849 100644 --- a/game/modules/tome/data/general/npcs/ooze.lua +++ b/game/modules/tome/data/general/npcs/ooze.lua @@ -36,10 +36,12 @@ newEntity{ size_category = 3, infravision = 20, + clone_on_hit = {min_dam_pct=15, chance=30}, + resolvers.drops{chance=90, nb=1, {} }, resolvers.drops{chance=60, nb=1, {type="money"} }, - resists = { [DamageType.LIGHT] = -50 }, + resists = { [DamageType.LIGHT] = -50, [DamageType.COLD] = -50 }, fear_immune = 1, } @@ -104,6 +106,69 @@ Through its transparent jelly structure you can see treasures it has engulfed, a level_range = {12, nil}, exp_worth = 1, rarity = 3, max_life = resolvers.rngavg(50,100), - combat = { dam=7, atk=15, apr=6, damtype=DamageType.ACID }, + combat = { dam=resolvers.mbonus(80, 15), atk=15, apr=6, damtype=DamageType.ACID }, drops = resolvers.drops{chance=90, nb=3, {} }, -} \ No newline at end of file +} + +newEntity{ base = "BASE_NPC_OOZE", + name = "crimson ooze", color=colors.CRIMSON, + desc = "It's reddish and it's oozing.", + level_range = {25, nil}, exp_worth = 1, + rarity = 1, + rank = 2, + max_life = resolvers.rngavg(80,90), life_rating = 11, + combat = { dam=resolvers.mbonus(110, 15), atk=15, apr=5, damtype=DamageType.FIREBURN }, + clone_on_hit = {min_dam_pct=15, chance=50}, +} + +newEntity{ base = "BASE_NPC_OOZE", + name = "brittle clear ooze", color=colors.WHITE, + desc = "It's translucent and it's oozing.", + level_range = {25, nil}, exp_worth = 1, + rarity = 1, + rank = 2, + max_life = resolvers.rngavg(80,90), life_rating = 8, + combat = { dam=resolvers.mbonus(40, 15), atk=15, apr=5, }, + clone_on_hit = {min_dam_pct=1, chance=50}, +} + +newEntity{ base = "BASE_NPC_OOZE", + name = "slimy ooze", color=colors.GREEN, + desc = "It's very slimy and it's oozing.", + level_range = {25, nil}, exp_worth = 1, + rarity = 1, + rank = 2, + max_life = resolvers.rngavg(80,90), life_rating = 11, + combat = { dam=resolvers.mbonus(110, 15), atk=15, apr=5, damtype=DamageType.SLIME }, + clone_on_hit = {min_dam_pct=15, chance=50}, + + resolvers.talents{ [Talents.T_SLIME_SPIT]=5 }, +} + +newEntity{ base = "BASE_NPC_OOZE", + name = "poison ooze", color=colors.LIGHT_GREEN, + desc = "It's very slimy and it's oozing.", + level_range = {25, nil}, exp_worth = 1, + rarity = 1, + rank = 2, + max_life = resolvers.rngavg(80,90), life_rating = 11, + combat = { dam=resolvers.mbonus(110, 15), atk=15, apr=5, damtype=DamageType.POISON }, + clone_on_hit = {min_dam_pct=15, chance=50}, + + resolvers.talents{ [Talents.T_POISONOUS_SPORES]=5 }, +} + +--[[ +newEntity{ base = "BASE_NPC_OOZE", + name = "morphic ooze", color=colors.GREY, + desc = "Its shape change every few seconds.", + level_range = {25, nil}, exp_worth = 1, + rarity = 1, + rank = 3, + max_life = resolvers.rngavg(140,170), life_rating = 11, + combat = { dam=resolvers.mbonus(110, 15), atk=15, apr=5, damtype=DamageType.ACID }, + clone_on_hit = {min_dam_pct=40, chance=100}, + + resolvers.talents{ [Talents.T_OOZE_MERGE]=5 }, +} +]] diff --git a/game/modules/tome/data/general/objects/quest-artifacts.lua b/game/modules/tome/data/general/objects/quest-artifacts.lua index 2678e45658..4a0c5c3550 100644 --- a/game/modules/tome/data/general/objects/quest-artifacts.lua +++ b/game/modules/tome/data/general/objects/quest-artifacts.lua @@ -117,6 +117,11 @@ newEntity{ define_as = "ORB_UNDEATH", end end, + max_power = 1, power_regen = 1, + use_power = { name = "use the orb", power = 1, + use = function(self, who) who:useCommandOrb(self) end + }, + carrier = { inc_stats = { [Stats.STAT_DEX] = 6, }, }, @@ -140,6 +145,11 @@ newEntity{ define_as = "ORB_DRAGON", end end, + max_power = 1, power_regen = 1, + use_power = { name = "use the orb", power = 1, + use = function(self, who) who:useCommandOrb(self) end + }, + carrier = { inc_stats = { [Stats.STAT_CUN] = 6, }, }, @@ -163,6 +173,11 @@ newEntity{ define_as = "ORB_ELEMENTS", end end, + max_power = 1, power_regen = 1, + use_power = { name = "use the orb", power = 1, + use = function(self, who) who:useCommandOrb(self) end + }, + carrier = { inc_stats = { [Stats.STAT_MAG] = 6, }, }, @@ -186,6 +201,11 @@ newEntity{ define_as = "ORB_DESTRUCTION", end end, + max_power = 1, power_regen = 1, + use_power = { name = "use the orb", power = 1, + use = function(self, who) who:useCommandOrb(self) end + }, + carrier = { inc_stats = { [Stats.STAT_STR] = 6, }, }, diff --git a/game/modules/tome/data/gfx/terrain/slime_floor.png b/game/modules/tome/data/gfx/terrain/slime_floor.png new file mode 100644 index 0000000000000000000000000000000000000000..5889332a260f6f0b1cc6e9f20a3319b8fd53b20e GIT binary patch literal 1198 zcmV;f1X25mP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2onu6EW^gU*#H0pKuJVFR7l5N zmQAiJyA6cDqT~y_dFI(i_P?m)xK)(_sXloD45JOJC9+sQ(m((8kF}*Gm1+s){P_8g z6RJd!lk;PrtUt9rLIC|ODT%*{nb#ek1b{e__WDRm0u{9sAjG`}qMV$s<J4A=gw$(@ zBB>S>wW_uP<;3w5Ct7Thm_Uh;7>5KB1IhE_^X<p<zKGlcDUeiXO`#DMoB)LF6M{sR zk|aP>#7e*cRCkNwb_StWBZ#6TqW5s<t-`h=pae+-XsNdPV5C*jLZ$tuYHRj%rqPBJ zY;=O~lk@fYIwxAS{Y`BoV&#McCk;hVp`uh0DowQzNt$N*Nqw9-Uw{97{0&L%hN#<A zdbV+Ll9QyTC_;o!6ma)RoSugYN-9ZmGOypQ_N_#N?E6eWn24!(aKC>?NlH@92hokz zDk%s_TO}=OYwbdVs05OqkU4fBstbu!3Q?_|(k)EXQhgND2ktoCok~(q8!8Dt_OV_T z6-ZR(jFLnxX(8^wb^GtSob4wPagxlTMeA<(Aym>TEsegMXu5m>?e3epadK#;ZY^o6 zmVlAg3@|tlRn=B4sgxmD5b9SLHN5sPE+7yJ`}0?=Ppv-%jR_p$oF_I3uW7_np%Y1i zMzC-B#!uo<s+#sT2+<n$`5RMlODHpKC5fLTsa4U4IhR;nR$93d5n`XOg|OxTGAwD@ z1W?@KBaR;@uq{d=iQ7)V=RS`e2G|!z{KB_rdO&5oXaF6Bn^eD^{)tF~t_#;`BhYS# z0c4ymn3?3b^Cf6dO-QU=%?o-_p#>SIiem*-OS?Ym+!#_4pIOw+zMeC3TT*HLsoJs= zC`Ie?u%~i*vZ`G>=a(reP^sJ3-A-+M-Q6UYwkU9SFpYMK^k%xH?GBSRliD4eQ%DOK z@Dm><?TChgBj0yfqdHOH^pQJn@1pt3)I1*dh6<Y4yP0{NXRDSHWTuL|`p$0bRB9KB ziG99KQd`-T#3#59PJ%K8#MGkNN>5r@6LWz=rTyk#zZ~P^^W!9O#lGS~_kg7Bi5J@| z!X{{1&mAP&Pk`bc{%a4@(0S7FG>+eq4@gziE|v0{pvjr_A%vY1tzScoP*J;CuU|82 z@~q)P?V*X5B;^E?gHO&k=f^<VwX_ooS}F0kgf=t{eE%)guef@~eHr<McqI13Clm6o zRSZoEL|6AZvuXfs68o{A1XNnPuS-gc|IV_C`gAqgO%g4t1k`%1pE&+|m2Gy<PbAi- z7=6XIPkii?7I*DhANgeGgovPY3XTHXTzzs*a$2JT#*nvaYkefijt{+c2hOB#-|YTo zG<RRXkI(nsU!0MU_|?}(T1w)_IT;n||B^WyQFU3}@zS&UX8L_oT+M}MrzBx~r#k-g zKNz$X>{?ZyYW}sGzscA42_~B}cb>l2m10cXvN{u@TB=W}CZ>S@0(Bk?&@0?sXaE2J M07*qoM6N<$f-JH!MF0Q* literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/gfx/terrain/slime_wall.png b/game/modules/tome/data/gfx/terrain/slime_wall.png new file mode 100644 index 0000000000000000000000000000000000000000..c5a56aeb6ff4b51f2d71b641a96c377e94fda02b GIT binary patch literal 1372 zcmV-i1*7_jP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00001b5ch_0Itp) z=>Px#32;bRa{vGf6951U69E94oEQKA00(qQO+^RV2onu6EwsUmPXGV}?ny*JR7l57 zR#~#-I1U3qI`egP$HZJ>&NTPGMAgf*2=s@P)$I?3!`4EPSjhkV|G&?_`uU&h`B&9L z0M>i%?^)l@gkn8d53xZZ0FXGIte4l%S>N`JDqUZ7{pk7<1ux&<bN^iTPj^36Pt}9E zsEbJyYFK6lEbRl-fB*!c9j?U5LorlPssE_{L-iDyDLVAXPM@utEJ7eaLj@Nps#urm zBAXO|1fT=DB2RW4YSlyaP(K(lN}01*W<vlI*dfCJNdkaD00K-%G9W<gkK|_*7)oG) zI`ct<*)Q#}7w0A$iNJWp%O1l>2qH*AiWHF8@QPPF$pDTWk3Ga<kXfGFd!P30Y3fZ1 zaX@%7%X>XZPqe5-6)El_&z<%1ygYYcA{m9U%ph~myu4nXw>w4#8yFBsWD+BjtT-{j zrCO&>Bs}r$d3oN+0*LHOEC)<7x91hVJ+E}Ns-;quD1uNDIU<-$9LPolKp==66AXkT zR8&hvhyV~EOb`=cKYm>OrTS7m!~y`1L2ksvhJ#%^Qo9U5L`u~m_<;~v*cpyfrF62? zk3YM=R8Q$5g(MzO2AMFS7bvP(t-5xpgN?R=#J&4o4q(Qh62w5<{iFIJJ*Yw$7zAms z$N~!rD6pxf`ooo?Iti;-57txrR}zsi)zn2qEddMwXG1Wy^Ldcq^K7u<{B)3=@ZZ=6 z@$dNnK=is@po4vW4x%$}|3*3u%GTM?lez5$A^>LrC6F+Zcx9Gn*~`Au_pk9H8{mm7 z#>SlQcp;Nra>QJR2VThlWU|9|ObBs&d%e8AJ>Qu-J>Sld4Iuv4)nmk9h)w0eBs-Z$ zOac-xFv)@gFmYyO-kG=Ooq46>WIpiq$sr}_NKL%AOMrbm36d09RDrcs>69$HNQNhN zS}ipx*a^dsf{JW$^Twaq;|!65+CyxC+Dc9)22_-&qKYYWKgA{qjya0MVqH4xv6&IC z%#Ex7P)Qf7&q6Stv;qc5nPtWT+}jKQ9QKM7bWpz&z9|}jCJ?At7dLf4<fFGRh;zR* zbpcUBTm2Cx+XGG&;}FCr^Z$?{%mLOX`PlILj7UIGV4>%2)&?KEl7wR5<QPbROpXDp z?GM~}*N0rYo|(;?`16uMzke+iw^hYJ041j9m~evZWeb^rtQKT&Uja$7GRp@DTj~d1 z@u2UYql+r>*db|z0gyrRPh1%wpb#d*Ov0nyUYU1%+rP6p@xUuRcQ(Y>I%>>420qT? z`*4LMODw7=iQGj3LYNuCTY)xaLZksutX4gw+MabT?g?NIcr=!}wm9pw8X^EQb|hLn zK@b2&0njQ|OApmkbxDPT3}bE}&>&43D%Ml=R6lfxwzWtoGZ!n0Ls4P?mPzy$?rPRW zT_0$Nn9zW5xXRO+)g@h2ivqc)9`jHmrbHG`17$Q0nX)^XgY>Pcu|N1eN{!811V(sF zW447Hn*1KN?X{P^n3b%U-VJD+Sz8W0Z+n3ZAeMP=)!ET+v>fg93P1@QCh_umyVtkL z(>GT1vE|I|d3)aW`!q<IE!T<3IuzgRoBQJs0JYDKSJvCTewq9<RSAjMvvyFYLCbCd zEYJWvXYv+7-}Zth@R9M|Db4b{-Sdhnb448@)N#ahlJjwktvx!TOdemGx93hKFhPi* eKJDS{dFOA!K^vijjbpU{0000<MNUMnLSTYKbZs{P literal 0 HcmV?d00001 diff --git a/game/modules/tome/data/maps/zones/slime-tunnels.lua b/game/modules/tome/data/maps/zones/slime-tunnels.lua new file mode 100644 index 0000000000..e821004f91 --- /dev/null +++ b/game/modules/tome/data/maps/zones/slime-tunnels.lua @@ -0,0 +1,69 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +defineTile('#', "SLIME_WALL") +defineTile('.', "SLIME_FLOOR") +defineTile('<', "UP_WILDERNESS_FAR_EAST") +defineTile('+', "PEAK_DOOR") + +subGenerator{ + x = 2, y = 0, w = 241, h = 30, + generator = "mod.class.generator.map.SlimeTunnels", + data = { + start = 15, + stop = 15, + ['.'] = "SLIME_FLOOR", + ['#'] = "SLIME_WALL", + }, +} + +startx = 0 +starty = 15 + +return [[ +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +####################################################################################################################################################################################################################################################.....+ +###################################################################################################################################################################################################################################################......+ +##.################################################################################################################################################################################################################################################......+ +...################################################################################################################################################################################################################################################......+ +<..################################################################################################################################################################################################################################################......+ +...################################################################################################################################################################################################################################################......+ +##.################################################################################################################################################################################################################################################......+ +####################################################################################################################################################################################################################################################.....+ +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +########################################################################################################################################################################################################################################################## +##########################################################################################################################################################################################################################################################]] diff --git a/game/modules/tome/data/quests/orb-command.lua b/game/modules/tome/data/quests/orb-command.lua index 51a7e438d9..4c239d6723 100644 --- a/game/modules/tome/data/quests/orb-command.lua +++ b/game/modules/tome/data/quests/orb-command.lua @@ -20,7 +20,27 @@ name = "The Orbs of Command" desc = function(self, who) local desc = {} - desc[#desc+1] = "You have found an orb of command that seems to be used to open the shield protecting the High Peek." + desc[#desc+1] = "You have found an orb of command that seems to be used to open the shield protecting the High Peak." desc[#desc+1] = "There seems to be a total of four of them, the more you have the weaker the shield will be." return table.concat(desc, "\n") end + +on_status_change = function(self, who, status, sub) + if sub then + if self:isCompleted("ORB_DESTRUCTION") and + self:isCompleted("ORB_UNDEATH") and + self:isCompleted("ORB_DRAGON") and + self:isCompleted("ORB_ELEMENTS") then + who:setQuestStatus(self.id, engine.Quest.DONE) + self:open_high_peak(who) + end + end +end + +open_high_peak = function(self, who) + local g = game.zone:makeEntityByName(game.level, "terrain", "PEAK_STAIR") + for j = 11, 18 do + game.level.map(249, j, engine.Map.TERRAIN, g) + end + game.logPlayer(who, "#LIGHT_BLUE#There is a loud crack. The way is open.") +end diff --git a/game/modules/tome/data/talents/techniques/superiority.lua b/game/modules/tome/data/talents/techniques/superiority.lua index d1e371e41f..b4ee96f2e8 100644 --- a/game/modules/tome/data/talents/techniques/superiority.lua +++ b/game/modules/tome/data/talents/techniques/superiority.lua @@ -72,7 +72,7 @@ newTalent{ cooldown = 10, stamina = 30, action = function(self, t) - local tg = {type="ball", range=0, friendlyfire=true, radius=2 + self:getTalentLevel(t), talent=t} + local tg = {type="ball", range=0, friendlyfire=false, radius=2 + self:getTalentLevel(t), talent=t} self:project(tg, self.x, self.y, function(px, py) local target = game.level.map(px, py, Map.ACTOR) if not target then return end @@ -84,7 +84,7 @@ newTalent{ end) return true end, - info = function(self, t) + info = function(self, t) return ([[Call all foes in a radius of %d around you into battle, getting them into melee range in an instant.]]):format(2+self:getTalentLevel(t)) end, } diff --git a/game/modules/tome/data/texts/unlock-mage_cryomancer.lua b/game/modules/tome/data/texts/unlock-mage_cryomancer.lua index c60d8e6ab3..b578851f39 100644 --- a/game/modules/tome/data/texts/unlock-mage_cryomancer.lua +++ b/game/modules/tome/data/texts/unlock-mage_cryomancer.lua @@ -26,7 +26,7 @@ This place is Angolwen, the City of Magic, and for over one hundred years has ta You have uncovered the secrets of the ice magic and can now create new characters with the #LIGHT_GREEN#Cryomancer class#WHITE#. -Pyromancers are specialized archmages, attuned to the magical properties of ice. +Cryomancers are specialized archmages, attuned to the magical properties of ice. Class features:#YELLOW# - Cast potent ice spells to freeze your foes. - Freeze your foes and make them shatter into pieces. diff --git a/game/modules/tome/data/zones/slime-tunnels/grids.lua b/game/modules/tome/data/zones/slime-tunnels/grids.lua new file mode 100644 index 0000000000..e4860a754f --- /dev/null +++ b/game/modules/tome/data/zones/slime-tunnels/grids.lua @@ -0,0 +1,63 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +load("/data/general/grids/basic.lua") +load("/data/general/grids/water.lua") +load("/data/general/grids/slime.lua") + +newEntity{ + define_as = "ORB_DRAGON", + name = "orb pedestral (dragon)", image = "terrain/orb_pedestral.png", + display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, +} +newEntity{ + define_as = "ORB_UNDEATH", + name = "orb pedestral (undeath)", image = "terrain/orb_pedestral.png", + display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, +} +newEntity{ + define_as = "ORB_ELEMENTS", + name = "orb pedestral (elements)", image = "terrain/orb_pedestral.png", + display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, +} +newEntity{ + define_as = "ORB_DESTRUCTION", + name = "orb pedestral (destruction)", image = "terrain/orb_pedestral.png", + display = '_', color_r=255, color_g=255, color_b=255, back_color=colors.LIGHT_RED, +} + +newEntity{ + define_as = "PEAK_DOOR", + name = "sealed door", image = "terrain/granite_door1.png", + display = '+', color_r=238, color_g=154, color_b=77, back_color=colors.DARK_UMBER, + notice = true, + always_remember = true, + does_block_move = true, + block_sight = true, +} + +newEntity{ + define_as = "PEAK_STAIR", + always_remember = true, + show_tooltip=true, + name="Entrance to the High Peak", + display='>', color=colors.VIOLET, + notice = true, + change_level=1, change_zone="high-peak", +} diff --git a/game/modules/tome/data/zones/slime-tunnels/npcs.lua b/game/modules/tome/data/zones/slime-tunnels/npcs.lua new file mode 100644 index 0000000000..c758ac3f59 --- /dev/null +++ b/game/modules/tome/data/zones/slime-tunnels/npcs.lua @@ -0,0 +1,23 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +load("/data/general/npcs/jelly.lua", rarity(0)) +load("/data/general/npcs/ooze.lua", rarity(0)) + +local Talents = require("engine.interface.ActorTalents") diff --git a/game/modules/tome/data/zones/slime-tunnels/objects.lua b/game/modules/tome/data/zones/slime-tunnels/objects.lua new file mode 100644 index 0000000000..cea7eb148c --- /dev/null +++ b/game/modules/tome/data/zones/slime-tunnels/objects.lua @@ -0,0 +1,37 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +load("/data/general/objects/objects.lua") + +newEntity{ base = "BASE_WAND", + define_as = "ROD_SPYDRIC_POISON", + name = "Rod of Spydric Poison", color=colors.LIGHT_GREEN, unique=true, + cost = 50, + elec_proof = true, + + max_power = 75, power_regen = 1, + use_power = { name = "shoot a bolt of spyric poison", power = 25, + use = function(self, who) + local tg = {type="bolt", range=12, talent=t} + local x, y = who:getTarget(tg) + if not x or not y then return nil end + who:project(tg, x, y, engine.DamageType.SPYDRIC_POISON, {dam=200 + who:getMag() * 4, dur=6}, {type="slime"}) + end + }, +} diff --git a/game/modules/tome/data/zones/slime-tunnels/traps.lua b/game/modules/tome/data/zones/slime-tunnels/traps.lua new file mode 100644 index 0000000000..4ee7b9dd16 --- /dev/null +++ b/game/modules/tome/data/zones/slime-tunnels/traps.lua @@ -0,0 +1,20 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +load("/data/general/traps/water.lua") diff --git a/game/modules/tome/data/zones/slime-tunnels/zone.lua b/game/modules/tome/data/zones/slime-tunnels/zone.lua new file mode 100644 index 0000000000..0f9e518827 --- /dev/null +++ b/game/modules/tome/data/zones/slime-tunnels/zone.lua @@ -0,0 +1,55 @@ +-- ToME - Tales of Middle-Earth +-- Copyright (C) 2009, 2010 Nicolas Casalini +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see <http://www.gnu.org/licenses/>. +-- +-- Nicolas Casalini "DarkGod" +-- darkgod@te4.org + +return { + name = "Slime Tunnels", + level_range = {45, 50}, + level_scheme = "player", + max_level = 1, + decay = {300, 800}, + actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end, + width = 250, height = 30, + all_remembered = true, + all_lited = true, + persistant = "zone", + no_level_connectivity = true, + generator = { + map = { + class = "engine.generator.map.Static", + map = "zones/slime-tunnels", + }, + actor = { + class = "engine.generator.actor.Random", +-- area = {x1=0, x2=11, y1=30, y2=410}, + nb_npc = {20, 30}, + }, + trap = { + class = "engine.generator.trap.Random", + nb_trap = {0, 0}, + }, + }, + levels = + { + [1] = { + generator = { map = { + up = "UP_WILDERNESS_FAR_EAST", + }, }, + }, + }, +} diff --git a/ideas/zones.ods b/ideas/zones.ods index e2a57fb1e34ba4e8a4563c05127263420b1d66b7..68bab0cb279a18d37b46be1650c906ab8a5d37b6 100644 GIT binary patch delta 9324 zcmY*<b8w|!vvoAFHL)?VZQHhHf|H!sm=oKWBoo`Vt%+^hw(bw_z2EzF)vmRk-d$bw z{IjZech|;%=f{F0Da%1ZVS@c_P)X=<NGgzjg9*n!kgEO<T(SM@Bu$V4$NZZn7=m;C zdqbMg0*?N_^zvVt00qJOPm~A*4NNb-iLCe0dV&LlAn0kkDhngnHcVap%EBw-{eg&# zADv~t&%&!qzYCag@qYi@^-cl}i5GXPEv_TlY%Ae!eT$J=)xtZuDY!aHA@o&S#bv@l zbgm_OLPGZGuI$$F)G2}vlzSJ*1G2?W?poNZbA88IVf2o8y+{G>-YnMin=QuVRG0vs zZ~g4wK~Ht26@JY6N~-0@gtUTef9x{Pqv{nWQIH3BuRofbnD(x+om^dAjW;J?qs`A} z<XKl~qmg0BedP(AANXKq8{wvxk_0XFsKP8{vZO5*jH5220JLGO3i56u%<EuDT{^K< zt2uSf>&RNwJa{I@^cIcRxy5&;ZYswE`*s-RASt@R$GfeW_WDl)!?Ar?s><f<bBHoB z8MQ;(gNo5j1XA<-UYM3zJ;%25hi#D$w~~8z;B8I*?_t$jOW-YRo#miI9KG3Zt3@7W z2Hibu@t=j_-LMTi0T&`4o(tLobRwUw9u8Ph(*B20#|MK9f072hCvf2cs%wj+VB+&d zK_|Fo&=-S?k(zG7ltf#&c(bbKdaw*nQ#-U`++YkszDk{GGI*3Wv<qxx2yc5%vJ^om zENtX3^k1*Lo#zmXr6=XUuz|Vqf_7gVsHO&*3Pvj09=&-J_T$Tt%~7DuC9RR{#dTT2 zQanGzY~##hR6e+rZ)`4u@>9-9&FBk}K<Iy{ZV&gBwiT?Un@QJUtMJqcuyym*r6fD- zYMvKT(mMj~i;Yw(>M6KIy3oU>u?_%mq@bP><xM85v@UI>9dWC88?jyM8?HC&#>__5 zG)c?WL2__ekC^o32w)9yd3^p3&qTdQzSUf<y*Zirr%^TsdIoN-zwD`3N@~~-5Zq?k zPo1AjvQfyWB{V9QBonXZOLn?GrgJ@DP;+Xb61OZ-CYr|=ZZS%^{WC^n7KFg{Ld(;0 zVqz`wibVn|i;g@%Jt3#W>h{mWW-_4E`1FE+V438qgHx%!`&@<Os*IDj^&{=ILM1Dy zYUCxVd1hkCAETZ=w4A;;2eFk`P>4Y_+9})wCd<!&LOAn^n?+soeE4;`F*&4GK1ms` zsOgU0hq>&wwoPkd4#`LOHuZ>2DJhG;-RAQ<kJnaCZ-yq5fa84`r!zy76F`{EVLgwN z<4N3lQO3d8NGeyWm!!NReqP(`gS7jq;;;g0<@L?8;|p_-IUI=|4G}1Q!8wkt8+X=? zSK~yPh%vH67B>^~4s(j6T;#brDRfELw6@^&QD!{A5|xm=;uY$1jSWwSJ++EHFp~7b z+#!iXzL0?dDnR9ml!QK0RQ>L`2L)zdsOS>C?l<oIr?+TzVCMSi7+zC&x$ZkEr=EV1 zwkW~MM~$oSR$iN8@;*qljHx~t2kmS69&2!3S`H>|OpgvmaLlH}!=~Xeog{SYo5F|s z0jt|%4K~eEl<R6Ji>m)Lj?ZG_=fS9k@ggC_IehIF$9&3kI>f8HeyE#Kb+dn&tY*cE z_q8*}rR+Mp0q)H&^whv}fADvHA37P?D;vF@_FnlUo|d?XU{?@-A~)fBj&(G4N;i;s znqRS+K-Cb@oX@Si3{mRKV3lqHw1sywV}<UY;AF~MR~yM?Jnzus9%8k`CNNUgI$@SI z$!CZg<N5d&4}1<B@#*DMVu3V3zv_=RyGzbSCl=oxji$;GeJl@H>I1=$o9*Wd)_^3l z(&q?lP0ZW*Die@fbll{8h?7S3Adou(yIQN|is-HSWkp}=_!lqkgUJ{3a&7D{Tt+Ah z+gPV1Q-p@Bde0VpFK|;yVr81PDBJ}+t?Pz`q?>h8hdG)o8#tO81H3tlIQK3#UV`p3 zHB)8aZiM7Rd+y9vC!C)8SeNB$OIAOxcb)QyGOzg#uv|e9Onaq_S{cX49lRyBGDIZO zntBmUdWbeT0~(>;->7{~NjDTi#%9rtA$9bJ_Y~2Wa^dvWjm`VRsWf`qaxxyPtaVF! zp9vps-FoI+#VX-DU6&DB(%tFXUCbByfO_TkPog7|M}*<wZS3G)FF26*DD^Wy`ycbb zjiHay2PF{E@HArkHyr?XdKd!Xz7dV120BD%%gLv|=d@S$4`K42OImN(%L_YPo>KvB z$%%`jtQj0d6wVgimd+{?=$=2-vNAkhC)XGRvrg`I;_CQ-<^Y5A`&Oyjo<HQe0}-8} z)VFm3B^2D6<f3=C#5eRxub{YV9!jpk3MKL51!@p{w8lpzy)x%MJ1AY2m-ysM%0NvV zW!9>gsYJ9D<L?$`#(GkLqjK{0O2~G#$t&IrUa(u6ncNb<KCRe}h1U?iisJkec-u6B z%%1E*VE4*$Xv3^+*1QD$fIFNf_p)<{Fr*!>N30aT092%oq^@T?dbN+_YA_gNxJdrw z=O}2*UWfn_lwx!t?Aq^AkG$x}Sc2(<EZ@rKUbtJ(l)+O{#TIQgHaR_{g1sxx8%qes zW)R=p5T<eN)z?{TH5pc6{2ICkJC^k<lem&Ol40gXtHk-oe35XeM#=aQc!cealHupV zWo_Nm6y2DVm65J}+r(Td87yG!v?y~X$P6OzP(C!H{?3HnGp#ZByVs53iy0trNYMFs z3TZzyTkfq5<`*v+JEJ~7=O~l2UrB`DZNR-i#Izo1)HncfpU$Ry_Z0Mz%Fgx6Kc^{W z`yl`DOU$>qFwZ_)I4NSbKWTkFGUNGXc)4;WzmUgsIOv3;3=y_X^xMwizip;sQD1;| zn?=AmE59_+|E!u5`m{v6)}s=aH-&<7H@-37^muP~htanqZ%)|Nowb>~r8w<AMsSql zAG4)a>{}7h&CUZXLHMm7Ik%7qg7;@sej*csZ`rO2ZK)w}ccbq4dJ)n0r(&FX0fm=t zHxnw83JoPT>{ywwUYw7<HW*}a*=m9quPyqAfspb9%zpPfX%=2mPO`tN5#+46X_mt( z3Y=+z>v)3em~lKQw-E!j?W4Du5rb8o3oxL?p5l;&kk{kCthv0_p_x5`6O?2LwToUA z?%WK4*S3;ITK056E}+_6A<xs}qMu}GYltJYLq;<fY3%kf8h?pUp}!tCiw^}+$f4u; z8k3TL3d5+QtE+PkjtRZx9MzTjpADe&gC>n5&?Vvl3g0VyWdk1EmqizIl4r`VJSvRW zew`uZUx}(m<?w<j;8y-2|N7c9euZoWJJlCgjK|>S`}-P)bFXjA*N=YI-SnVG*?dxw zK1q0SZl;7GT!!o<$klBVozfgsy77gpnCcnCc22c%e2Jm&;4}z+q+PuVb}_)9sG5hB zc^Ln@&qUoxTSp^3(p4jAv)q?(a<!F12itN)xv#Gnt=`Rv7sBPbE;h5`=G~ih(E|>H z#(NSq!`2=Ap0)F%p{@}e-t?Q|@2Ks$3vZ+lo+a)`hk1L6EeGxRKu#FY&lgKkAd|$r zI$LsiB3d-unRC}xABFGfZ9D{@6qJEg4_qrUx>sAizGYK=PxxBu!P%RIWay_AV!RV$ zjRNI&(=)<1DKiYoCC5*-P*l@Q(J#xfM>5+HA8l?FmlWSJ#FKU6<)?yTKNjgPp-wHt zMvE5v+c7bAj1o5#_r}#gcMF~fM^d~5Ic~VfQ@D9U+}QkU#YQ`%7&kPn%;YhZh*W0$ z8|Y&}pv-s2KJDB=GtYp`r2>$|^@`<SSF`|L3U}lI?59bU_ssAmk7}&{&=f|&wei*_ z@>1BIE_#X>t1T2+5AJQufmAPg>=Cg;JSq?C!zLd*U$VT%19=Z<=CirI>n+gG)PoJX zSLod?>dP!MCaGuwQ+y;E68RM#s(T2C^hr6DMnIBy-05WVs|V97Cl|&o+)E(!Pp#mF zj2k6a<c{32VrySTBRO~$n4>2qdNe-Uf`E!(uTVsRA&9k!e1du5Gq49{#H9pgV@Q@9 z=mw6YyRojP<`Ez$1ALih6Yz{i8?wQc1FU?kKKUuF;7z#2DSPG#joestP;u!#vc0&q zXy{jDW%kvFGM@o!D=DUd5}@i*XL0LGblx8=@u8-p>g`%}`kJ00ckr7bNX5*czJ*Iq z;&M@vE(Tv~;sOvEfqQ0a0rL~PHPexvjL%63pt}ur8aD(|E6HepDLRaxp&d6p86_qk zgEsnrGK2O@%K^U;@PBOxRksxOC_i&*Ym_usfd@JC2P%t`mS&MjWRHhZ#mZ&5^WwOw z2aPI*Q5T~0(#IByrjoHtg_A4TAvpm*w=V4R5)N42IJ(i%LRkg;h^VV`(GObG8+wHs zf``z5gn)x2$XMDrkHQL+6t_ZV$QtTZi}^*Tg~OptQlej=6{m}8o>vfUOqJ>e43Vca zaPgWlk&i2mi6lXjq1(;JzpqtnNe)<1dN~H~lj`?sq=cMp>VL0tR|~k69rH$`{J5b_ zq$&<x6hXDLMMgj(F#d!2`<dh*${|~XJ|)Wb4h{k&Pr^jTv4FP8Lfz!A8v%JuX+|0{ z_)EJ$QhDj<jo^p8Tx29+#c|9cY7Ow=nNEIeQ+!OLUmaT_FeTNQmc-1&#+8vWl~K== z-h>zWxbGV&fmHv*sEj$iCNX-wl_-z%C0b~_Q%QK0b|NQAH@4!#b`$tj&Zy^i0y+51 z0NE%IHaVQGj`nAJ_tspABzgIiUDtcCGc@&k&j5*LN0jDa@-<!+p0E|^+1<^z`sRz7 z>$FIYoV~Qc!=tP64*Z&?6`WBe>@7u+2|3u#o|xLetyc0Gd}d81v9AyZ<}^ZZzAjD` zJ%q(ZIR4T_vi?Oz5|lj`E4s#`%jzA8TVA-JjJ&eQ7*bq`@4Q%w1yuy2aISRn9=3W- zcJb;;Q$ad>PbK8dI%^PEcegr~m-g%R9ffaG*Sk!MO}2DyG(5H(p@n$Y8#?5iQO#yK z?6@(kf|x|%3_RFKuVFRva6BSaks&?5%Pt?$HZf%k$VsPRhC`Q$+$Jj~wan7<U8$Wx z-`oep9Q2%@quvfbcXYif8$96{$pi23#GZ2P#%fbvO`R38XI#xfH{q6tR+3S9q7SN~ zBF_0zOVEb66s!^Q;6xTvuL(;t{Wl=W#-Bfgt7CweL*N|HS@MNm;mNs%p5php{?-<k zcoJWHCQlfxa$Qa#ZBxUrvJ11)@K*#t@XDX#NG=_}UGbIMtfViC6_0t6$7B$mhK07s z5uTQWwv;uV6hApiuQGm?^)9*t8(l~EflODKUeoP+cKu8D8TYuAAFG2SwHMpFbKLPa zRKg>E()PFCBJRj(Fw9eAa8-_EC?qIMpWbO+x;{UMKcxz@#SMz%?fQwBejKENKud7Z zDv2x#Wx--=r8(;6Qp_2?`xE4GE6n%5@EZF^xs(YhS&7VWbG4`H-E%?1I7q`dU(iCV z?nl95Nee72#JSad3Y4k70PKRkrQmkkaDq@v8ealVP;|w5r2U~&b4mM;+~V%UBJ~YR zQE@-zX22NZ!SSNr;0JFI0m)$?r8gp9zqnXdIiw$!iInb#*2uwX5O6n_SzSKggv=s9 zoQ}WhUgm23avD(bkgTtq4*N^g^fCeS%1CRU4Iai8G3MvQg(Mn-(=cQ9@;sg*d;OoX zosrwR(wQ1-aSk;4kbD~&Owo?Z%x2m&cgXB3d}jmi)=Mlq6!E=d5-Rf`M``^02G@## z<P;f|Yn$L#+fyU^_@6N(LEMiG9lOsBTc>=g5oH>j>fqyY<qc?<_##%Of4q9C2WyS< zRG6XD4maAK00-3balzxk?=}7Kj8RSRq5uG%>g3C^l^fC4MZUd8Y4!}tnZJ?ndM<*> zy=@0P&IT(1+1!IlKiE5nHlsgY@+csi*4N|rug(_~#=*#bu}>S%5qswV!SK$_vE~)J z7A?u(XLg|-g`Wk3(c;=0-z3H`O$L4;zo85ip*6snT?P_S^4Uqam731x(Ms$=G=9^0 zKqybV8!r1cm$_l6_Z1O$M%1OLbE0jxdSAS5*y{)0C*@hd@)B<;NLj9!(;KrqR(G9N z`JDL=K{oVy<AXP_*-W7zkPyKQiXI2^O5J4lOu$i4dfIY;BxE;ZW0HK5R#`a+nr!#_ zj`>Dgn$zvLV~zQugCsImg$E)ZwNE`ak_~OW_$?~S<XYZMlv(R&l-THlC3s58&?7_) zRov%!C|T%`La7fML|`IghKV8Joz759fiG-8GxSBJQ~9}=1+cXs37q66;fAGVi+)Mi zd7#U$rKl+)8Ou|hiEJJEV_iI)tI)(Mqbv*MiyvdjE{b-bjAcd=R^^XVIgqyX-A~|r zlRB`EWcB5uktvw!j~$CmeJ}T3+GMc$;LW3iK5CxQgCg5^Q1^IO2sddtkrR}%Fj!ho z-9RSZsj&k>zG(auY13K<7uDsD@BOsL7QqKB^LfwnaXdATQh#-DLQ=PKOr(e=@Z(c) zyV2=&%zOxz#iP~?lt_HVaOUOO!UnZvX-^CYbd<W!(9ru~&nOY2n6VBzxKBj93GVIn zhFHHPJn-2#fUwJVTIwKz_AahZq{wT?W@igMMA9xVIlTHB0$D<q>5|N`qn&fOV5!9b zcTgp0l*T-gk_v@McKIxLO;gNFc_!jf(so!$`cT1xHPd&iZ&wJN1BoVLzmj~8Dx)9{ zSSoX-_4Ukbymma(CI@T|CHaysk6I^-*VRI5p*4J4KzlqmWodk9M~5wLeq>9_D?f1v zJnOw5N0egB8%7NK#%NM-@b+((n(PxnDPzG9Gag1GBfY~<SKWkzgX@r&>r7|WUpCG; z@7A^W4K<u(fDsJ)CfEE_OYglYs+Hx*kOea5cb{_~iiK?ba}OwQ&CpmB9fz7d{)&X5 zR&W!!phk*BObUlis=O{UTsplaptv^gEgGB_Vqauoq*nSbHH=KWp&M-TpJR#No`YQz z77^oJ@)(2m3=g`t9M23Pda4N8^!5y9UJ{178Hy?jd&TNZt$l{ui>c%hl%0~jgCY7b z;&kSxlxsGI-EGl{g4C;!Vg<rY)^KyG98!18K*qXJ?}6DO*SmRrvxGd5+W2PABM@se z!yXLH)+`6K(uB>sQArKni+-oTe(jD>?Wu4Z>&7<-(|e7&@q$j>qK6cAbt9y`O)>9& zV8ktkpM712GdrhHSWJOc(2dcvMrWn+DNxQXqN!JOwIF4=Rma+8IU&InGShof!5p9k zVk^^VI@lK_;A5_p`%@#jXm3-Zc_P<QY8gu`Sm~K}g$?^&CCL{;l*gmI0)(uF_mfUW zm%z&PWuy!Tw8VDOHHMT}@9E0ssRz{k^(evkBGOuL!mu8`ua_PXooMgQ=v5Cqd05dH z`HfHQ%Ai55tbty{eu6i|Wsu8GFRlRwk~>qB$<_nwDX`Antn$QcVJywSy$NAQ$rv&t zW`vD~B<N~I<;Ok>SSQ5|<Q};R9?;fQq;hqX#@!zzl@LOpK|kq{($@WO9PP`98Mxyg z0iwt<lYg8t2zX>T5SS6czu|KVL!!erb0pn&a|ynHD^&m+!?#ua7j3jIQ&KxYvNGbN z<I)H^4pikOE%t16cwy{HU-A6LWhsLQios1~agwN5@k}aBKDAdzgLnQUlQ%;hZwdO6 zJzmI~ef|{Yl6M~YOudxj&qteqlFB>L*n+4t8Je?MzE~}-7=vcJd_QF9=%opQS|Iat zIHL@hM0+e451%(AdzkoUmAMuHA}h7HZ-3tl;X7+>9a{3aRJU_lUHHvPOZs?E*U!HW z{TcMkKiS{dq`ZO<d@kVf`iSltan?7-t^I6A>Ag5;`I$eB^OaiV=By9`%DeX3np=ew zj#_M1g<IMWmR^a@4<`mH+$ypeOt!gWrRmRO_#Tg?aQH7BMM+cYP+DVn(3cmQuHiZ* zS|9%EuK|GG$FH5GEZBo?%1idU8L6i=*DYlZWbxv4BkXG9chou}%Er6ux-&Fsyf6L; zOL95o%`9GwHJj!0l?59uo8}E_W4cZXJ9)L|EojDM5Ks0Gqs6Z~*Fih{OLCBq2BJ5# znWf9@``A)wDgaMrav?i+5C|~b@eALUTh_%d9{yua9vU5PYGP(!#rbCnd0}ZYF0c#j z++~t{iN^1(u){=?rmehv@!?=A&R4D*=$+lHgOezqlPj-rk5_4wx>If-DimAHuh`)z zO=FO7`Ua~eivmxnQ4$EB^;i4l&BUlb;n}Drl$HAqQ0=hWdV2UtgrY1516!^BF-ndD z21Wu44)*Wt0TvAQ@7Y5F9Ucp~Zh`?GA!wwvJbt_Yt`<Dr(*2;9P0Vq)qrG(`rH))w zHPdd*c)JaGgq&!Wf4$kxQ0P|kLgT5AQVAU|&Sfl*mAvI9pO=}8P<dj%6>qJ%V0e*0 zj&_k}B2>T3avULEufPSrgR_!0jD=Hc-FI~*e66_U58mqZz~Zd{zP%nFw!4s)4#>=J zw$Zcqkako0fO0LuUDH@XDYw~#9n|E|B#UJo`0)B}`f1!F5$+!mf$&{2%{LEPE72cU zoq)7A)Rju58a8&oTztFb+RBD6zkRGSEJXoHvpIQQ6cr9NrLuC=BY1^3<7K6wuFN_) zdWry8lVV^2y~dCPbN#03f!gH41}bkPe>TWDWVZb9{CKUY6z5z_9&{}Zhhi{SsuOLx z=Q&g;*3Hp9qgpGt6cV3zL+Ho~y!@geUcWU>!QV>{z&Tt-wem$kCE>4~rL>zCRq~v> zA*Yb;2?9XK9N4*bPt;zcQ#U(6O1Cg$^H*4UH!zTNl*VfEIAwUw+5qR|KwR~0j=d&Q ziuU5|DdO_M$@2g}zv6wx?pkvfY<TLaaE_j^<ns16yRs8BCQ2SO%+O>n+8;0~%2*;+ z7tBY!jt<lHr$#05vZ(1ic46HUbm^mh!WY~AqtuW~0At?%0CkEsxk#mvtS2B3p&r7m zj;Uu<6MrA%Han!-ee@tLsN|Q{P)8Ii6&$0^I+XUPi}XS49a(RR^|n-;7HqM7&bNBx z1$A*YL`cN+KT&P`jw;4}YJL$wBLsSXCqs9ZB>2PDN8c~k+<&51Uh*&Lem}b`i1aQZ z9$JN|#Zvadk{KSzc7M<8a8|++(5~hds=x@SaitI3bIs?pgxP360j14{Ad_<y@c?Z& zcYVsnQJ3ah2&7frbqGi9N7hF4C5DJQy&xP<sv-}F#<65Xm<nmi<&0Ok@v4`XLS;#_ z<M<I<;NRvEHYZGna0wb)5!7-iE`0sOT*p(R4pQh90tZ$C!6CO}6pX2<Bo7vudX7_9 zr`4}&nSr%%?Gn;%pbIA&hauTTb&B07r3}h26rmL@pqiOj)wPXamnk$I1gkzfW#&*l z0NgDlX|L$@QT6`&EG7ygyyoq(OZaK!GIv*pun-o^xjHX#icUvdhB-E8-PLB-C+_6= zI_&Gw{_FVlt4jFm+r<Fk(`Ll00NktLT2@}Of{7xgTfy=qXlk}}-eE{jg}w4Ee%Q*O z$Vw_LgsJM(Etgw9KLB?vdFTmX{sHU(DF$&@9Y4KGIcfqel5yjk5FN+mhh0q}9j z$#Mp#&}2Up^nIX$@fzEl&hZy<zhbiX`|vDZana2Ue$NZq%`S!c4z%gF!2bLeY7d$_ z1F{^h1@5(15ZuD|Uc52CPAE1R+m<}AeW^TrE(i&-K|3miq^YhufrEDC3+??ihE$Hc z9vBtCEK7)LPZ<|CN+TxWN6;n;dd3?4sgl7O?l&pJ$3Hqpe5idehNTnfnO}9bkbPf7 zj*BQ#e3P$n?ozJi?pdhyQr55GXX7Z-#a<NA3!C=;YLq~MuAfxEw3Nt)$bv{E(FLZk z!tpke44n$@<dV9y1xqigEcx?!e=(s_={Lfdo(%?g>ZHVV>^CI}2sn;Qly7#v2X*O6 zq?)-pAC7SeL91*vzudzM`zLAiP4oGrAJ(i7Op+OWT0L2jX6s1HRH=J9y~6{JKmRP9 zCq+rRfyzBe`f6E7W02y}0CH*!@?H#xHqIJP+Xc@qnkt`kO@Zo1S0^VY=o#?VG7h4> zG8ZmH=Wz;@?D-)ZIa&_0?x37QRnSp&*#QG$dDpM<ul^kKq&}=rbGz4^0HXz^M~pE> zud$U`q4}W{<RgI**Po^K;j|0E>YI;V;?DdoAaQe~4EGT8@W=;^sR|B~$-52voGZx9 zTP?$C$3EkrH>{a>UU(!#kgH8M>idk5(B0yP2gaT9v-9q&DaU>`=ajy7Z$t!Vb-YjR zidbJ6A<}0r|Jy(6zrIHL`1u74%$^wRKkEOV$+N)Mw4}FdNHDO!P92bh00N#{ot2rF zg^ibmJ0XGWuf}o0JQ*`A2ZuB>n*uX?0up%uI9oy-`QG1?<~nx@6r6uZIKLz~sI{^z z$miOL=*lUS+a5flnI7lDuwWjirEAHNILc(n*%aW|vxlwxM<vfSwh+xyev&8_`&oLr zNeuD8cTHf6j7xlJ*^F8fa*)O=mjLb<HqStFk#UycSnueX@ko?~&^dthPBaXx`P7VJ zWzO$9$exDJv`&mF)`#{k<v|Yt^y9d^>Rt%E(*%J%gw7cw*2>@G&Us7ECjs{Cg<G2~ z%s_R;G$M^5&Q66+9rol0EPu}2sZ650n==$I7<Xu1<+GTQH6(KoT3lzu&kXeT)0yfC z<@9a_Sr#a98U*a_^<h54PGYVN%2Ohw5kaY7fzTIc{)!Bbm$BK9o4dF%klVpAo6@HU zzd+zJQR(A^88Y=Ln^soKi*Ti)hcma+eQFs9MvI!GDxB)Ib)hspUb)IckBjHGzl|hI zBbZ!yqJcqX)5^3S1G=&a>R2XDByF|K>IJTGX7%L*8k=8a<=tV(<*CmVaS1n;Gq1%P zERSe~s=N*&-t2G^`+I9P=v0fQjNNYG9!k>+j8OxH-*l!L+z)cuD$v;gHt2ggMmE>; zqp-2KvD>i@<}G7n$cB8NGu)NeTw*%xE<#3-MTK9Qx7w3XDinre%f`r|{kxMaba>yT zU<5JTCK5f&IGU2W5cw57Mi`Y*A3j2Vo1AG|B>Ei$XtTulcG|)X1cN;Av3bA11Oc7< zMQ{&tlgIXLXh#wuPG{52*LS4E`cL8qLHq>iF+uzXCFwD_j3kLAmN8#<JZ)_VDE_!K zeJIacdiXnCB>dM}{fOWeMKEUc(L8Y(E#w^u90YrJ9~}{>>H^h9-l(qIlfD_+6lYdI zxM7F3B@$r8z4<BwG&uG&`@y@CJqx-nYt&K~@u{}C|LSB>k~&d6*fZSjIqzbL0}Kce z%AyP2cHO`1ApdmfAY(n{a9QKP)=<^)-%g@EG&+k7X;E{liK=hZsFnb++gI>vnha&F z5)ERr7!*YxE}&GHVG*gXmOV#re^$d|fmi`wR|$<GrBK8{JL7|5Ms)~<Dbi;}nLVrX z%r@(|n}eQlqcwFS#ku}`F3*-vITcLRyGYGvkEK34G50@ffKM489Ud0PanTp=?%!MI zagomkh0jkNKiqx};HKVo3T`EA=K<zuFT{!Ox`&50EgnnLFMzTkS3d1$PQw?zU^?95 zHyxRHKd>D^1k$C9#@*N|Bmxh=ln`RAz<yQ?+O{LbC;srp6TiVweqB$b1aza4Tu-%$ zjDz?)A&NqW6BK)G9)+8!|LR-BJW)B_=?c`Tm1~T@WmV3HEH8$*u6tS~c?t&b!@r~^ zbEduFfA8O#Sx^G6kpOe`ZXC&1g*~vZ?o@oqP-odUFX9%eWQ)biGeq(H@REuo55&P4 z)u#>rK$$CrFctIm_YQ{`N*qC^<i60+8Os^D<kSjkb4;crzS}^H)8-%kbX4HZa`tQe zSFv=nkrn}eDV9IO|0>ph>eV_X(FpK=_FOu|{#lSoxD}K5=bKMl^&gBC7yAbn#Q*gZ zNl5+2kDm}A@$LWk$ba~qge>x3Y9{diO5_B2NjkW{UH|B2g0CbNPb?l7n3J=I%?~F= zcc6{395@6f*#GVC{I`n!RaO7D4JAxSekJ}p*HaNW<=9s+FvY(z{Z)wnmu)0KNm2h3 z^WT4s_+JrVU{?vUQuri)=MhnV6_Wu61G9ty1H=0NViH9Y1Vz6lq)VYflZgL)^FJ<w BtfBw_ delta 9201 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 -- GitLab