diff --git a/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua b/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua index c0b82948272eb270c9ad3c9796dddfc111fe8af3..ce11e654dba5746de6acde089e8a9b1e48613ebb 100644 --- a/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua +++ b/game/modules/tome/data/maps/vaults/amon-sul-crypt.lua @@ -18,36 +18,90 @@ -- darkgod@te4.org setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} ---setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {special=false, can_open=true}} + specialList("actor", { - "/data/general/npcs/skeleton.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/ghoul.lua", }) border = 0 defineTile('.', "FLOOR") +defineTile(',', data.floor or data['.'] or "FLOOR") defineTile('#', "WALL") defineTile('X', "HARDWALL") defineTile('!', "DOOR_VAULT") defineTile('D', "DOOR") -defineTile('^', "FLOOR", nil, nil, {random_filter={add_levels=4}}) -defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="degenerated skeleton warrior", add_levels=4}}) -defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault"}}, nil) -defineTile('G', "FLOOR", nil, {random_filter={name="armoured skeleton warrior", add_levels=4}}) + rotates = {"default", "90", "180", "270", "flipx", "flipy"} +startx = 4 +starty = 2 ---startx, starty = 4, 13 +local version = rng.range(1, 4) +if version == 1 then -- warriors(more or less the original) +defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton warrior", add_levels=2}}) +defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton warrior", add_levels=6}}) +defineTile('G', "FLOOR", nil, {random_filter={name="armoured skeleton warrior" , add_levels=4}}) +return { +[[,,,,,,,,,]], +[[,,,X.X,,,]], +[[,,XX!XX,,]], +[[,XXX.XXX,]], +[[,XSD.DSX,]], +[[,XXXGXXX,]], +[[,XSD.DAX,]], +[[,XXX.XXX,]], +[[,,XX!XX,,]], +[[,,,X.X,,,]], +[[,,,,,,,,,]], +} +elseif version == 2 then -- mages +defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton mage", add_levels=2}}) +defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton magus", add_levels=6}}) +defineTile('G', "FLOOR", nil, {random_filter={name="skeleton mage" , add_levels=4}}) +return { +[[,,,,,,,,,]], +[[,,,X.X,,,]], +[[,,XX!XX,,]], +[[,XXX.XXX,]], +[[,XSX.XSX,]], +[[,X.DAD.X,]], +[[,XSX.XGX,]], +[[,XXX.XXX,]], +[[,,XX!XX,,]], +[[,,,X.X,,,]], +[[,,,,,,,,,]], +} +elseif version == 3 then -- ghouls +defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="ghoul", add_levels=2}}) +defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="ghast", add_levels=6}}) +defineTile('G', "FLOOR", nil, {random_filter={name="ghoul" , add_levels=4}}) +return { +[[,,,,,,,,,]], +[[,,,X.X,,,]], +[[,,XX!XX,,]], +[[,XX..,XX,]], +[[,XS..XSX,]], +[[,X,.A,,X,]], +[[,XSX..GX,]], +[[,XX..,XX,]], +[[,,XX!XX,,]], +[[,,,X.X,,,]], +[[,,,,,,,,,]], +} +else -- archers +defineTile('S', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}, {random_filter={name="skeleton archer", add_levels=2}}) +defineTile('A', "FLOOR", {random_filter={type="armor", tome_mod="vault", add_levels=5}}, {random_filter={name="skeleton master archer", add_levels=6}}) +defineTile('G', "FLOOR", nil, {random_filter={name="skeleton archer" , add_levels=4}}) return { -[[.........]], -[[...X.X...]], -[[..XX!XX..]], -[[.XXX^XXX.]], -[[.XSD.DSX.]], -[[.XXXGXXX.]], -[[.XSD.DAX.]], -[[.XXX^XXX.]], -[[..XX!XX..]], -[[...X.X...]], -[[.........]], -[[.#..#..#.]], -[[.........]], -[[.........]], +[[,,,,,,,,,]], +[[,,,X.X,,,]], +[[,,XX!XX,,]], +[[,XX..XXX,]], +[[,X.SXXGX,]], +[[,XX.A.XX,]], +[[,XSXXS.X,]], +[[,XXX..XX,]], +[[,,XX!XX,,]], +[[,,,X.X,,,]], +[[,,,,,,,,,]], } +end \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua b/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua new file mode 100644 index 0000000000000000000000000000000000000000..2dadf192e6ebffa757348f33abec8115d39aeb47 --- /dev/null +++ b/game/modules/tome/data/maps/vaults/auto/greater/living-weapons.lua @@ -0,0 +1,243 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 +startx = 12 +starty = 10 + +setStatusAll{no_teleport=true} +rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +local Talents = require("engine.interface.ActorTalents") +--make other requirement equipment from Cursed Sentry +local make_req = function(el, o, subtype, slot) + local o2 = nil + if o.subtype == subtype then + o2 = o:clone() + o2.no_drop = true + else + local level = o.material_level or 1 + -- Code from cursed aura + local egos = o.egos_number or (o.ego_list and #o.ego_list) or (o.egoed and 1) or 0 + local greater = o.greater_ego or 0 + local double_greater = (o.unique and egos == 0) or greater > 1 -- artifact or purple + local greater_normal = (o.unique and egos > 2) or greater == 1 and egos > 1 -- randart or blue + local greater = (o.unique and egos > 0) or greater == 1 and egos == 1 -- rare or blue + local double_ego = not o.unique and greater == 0 and egos > 1 + local ego = not o.unique and greater == 0 and egos == 1 + local filter = {subtype=subtype, ignore_material_restriction=true, tome={double_greater=double_greater and 1, greater_normal=greater_normal and 1, + greater = greater and 1, double_ego = double_ego and 1, ego = ego and 1}, special = function(e) return not e.unique and e.material_level == level end} + o2 = game.zone:makeEntity(game.level, "object", filter, nil, true) + o2.no_drop = true + if slot == "QUIVER" then o2.infinite = true end + end + el[#el+1] = {o2, slot or "OFFHAND"} +end + +local imbueEgo = function(gem, object) + if not gem then return end + if not object then return end + local Entity = require("engine.Entity") + local ego = Entity.new{ + fake_ego = true, + name = "imbued_"..gem.name, + keywords = {[gem.name] = true}, + wielder = table.clone(gem.imbue_powers, true), + been_imbued = true, + egoed = true, + } + if gem.talent_on_spell then ego.talent_on_spell = table.clone(gem.talent_on_spell, true) end -- Its really weird that this table structure is different for one property + game.zone:applyEgo(object, ego, "object", true) +end +-- A lot of elseif +local make_poltergeist = function(type) + local o = nil + local filter = nil + local x_level = nil + if type == "greater" then + filter = {no_tome_drops=true, unique=true, special=function(o) return (o.slot == "MAINHAND") end} + x_level = math.max(15, resolvers.current_level + 10) + else + filter = {id=true, add_levels=5, force_tome_drops=true, tome_drops="store", tome_mod="gvault", special=function(o) return (o.slot == "MAINHAND") end} + x_level = math.max(10, resolvers.current_level + 5) + end + o = game.zone:makeEntity(game.level, "object", filter, nil, true) + o.no_drop = false + local e = mod.class.NPC.new{ + type = "construct", subtype = "weapon", + display = o.display, color=o.color, image = o.image, blood_color = colors.GREY, + faction = "enemies", + body = { INVEN = 10, MAINHAND=1, OFFHAND=1, QUIVER=1,PSIONIC_FOCUS=1}, + level_range = {x_level, nil}, + size_category = 1, + ai = "tactical", ai_state = { talent_in=2, ai_move="move_astar", }, + ai_tactic = resolvers.tactic"melee", + max_life = resolvers.rngavg(100,120), + stats = {wil= 20, cun = 20, mag = 20, con = 20}, + resolvers.sustains_at_birth(), + resolvers.talents{ + [Talents.T_WEAPON_COMBAT]={base=1, every=10, max=5}, + } + } + local class = nil + local req = nil + local el = {} + if o.subtype == "staff" then + class = "Archmage" + e.autolevel = "warriormage" + e[#e+1] = resolvers.talents{ + [Talents.T_CHANNEL_STAFF]={base=1, every=10, max=5}, + [Talents.T_FLAME]={base=1, every=10, max=5}, + } + elseif o.subtype == "dagger" then + class = "Rogue" + e.autolevel = "rogue" + e[#e+1] = resolvers.talents{ + [Talents.T_KNIFE_MASTERY]={base=1, every=10, max=5}, + } + make_req(el, o, "dagger") + elseif o.subtype == "longbow" then + class = "Archer" + e.autolevel = "warrior" + e.ai_tactic = resolvers.tactic"ranged" + e[#e+1] = resolvers.talents{ + [Talents.T_MASTER_MARKSMAN] = {base=1, every=10, max=5}, + } + make_req(el, o, "arrow", "QUIVER") + elseif o.subtype == "sling" then + class = "Skirmisher" + e.autolevel = "rogue" + e.ai_tactic = resolvers.tactic"ranged" + e[#e+1] = resolvers.talents{ + [Talents.T_SKIRMISHER_SLING_SUPREMACY] = {base=1, every=10, max=5}, + [Talents.T_SKIRMISHER_KNEECAPPER] = {base=1, every=10, max=5}, + [Talents.T_SHOOT] = 1 + } + make_req(el, o, "shield") + make_req(el, o, "shot", "QUIVER") + elseif o.subtype == "mindstar" then + class = "Mindslayer" + e.autolevel = "wildcaster" + e[#e+1] = resolvers.talents{ + [Talents.T_PSIBLADES] = {base=1, every=10, max=5}, + [Talents.T_TELEKINETIC_SMASH] = 1, + } + e[#e+1] = resolvers.equip{ + {type="weapon", subtype="greatsword", autoreq=true, force_inven = "PSIONIC_FOCUS", no_drops=true}, + } + make_req(el, o, "mindstar") + elseif o.type == "weapon" and o.slot_forbid == "OFFHAND" then + class = "Berserker" + e.autolevel = "warrior" + e[#e+1] = resolvers.talents{ + [Talents.T_WEAPONS_MASTERY]={base=1, every=10, max=5}, + } + elseif o.type == "weapon" and o.offslot == nil then + class = "Bulwark" + e.autolevel = "warrior" + e[#e+1] = resolvers.talents{ + [Talents.T_WEAPONS_MASTERY]={base=1, every=10, max=5}, + [Talents.T_ARMOUR_TRAINING]=2 + } + make_req(el, o, "shield") + end + e[#e+1] = resolvers.auto_equip_filters(class) + + if type == "greater" then + e.name = "Poltergeist " .. o.name + e.rank = 3.5 + e.auto_classes={ + {class=class, start_level=10, level_rate=80}, + {class="Cursed", start_level=20, level_rate=40} + } + else + e.name = "Animated " .. o.name + e.rank = 3 + e.auto_classes={ + {class=class, start_level=10, level_rate=50} + } + end + if type == "greater" then + local filter = {type="gem", ignore_material_restriction=true,special=function(ee) return ee.material_level == o.material_level end} + gem = game.zone:makeEntity(game.level, "object", filter, nil, true) + imbueEgo(gem, o) + o.name = "Poltergeist's " .. o.name + end + local qo = nil + --if class == + e:resolve() + e:resolve(nil, true) + e:wearObject(o, true, false, "MAINHAND") + for _, v in ipairs(el) do + e:wearObject(v[1], true, false, v[2]) + end + return e +end +specialList("actor", { + "/data/general/npcs/wight.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/horror.lua", +}) + + +-- Here I use a simple workaround to generate various different animated weapons. +-- Animated weapons at different spots ('p' or 'P') will be replaced to a, b, c, d, ... etc +-- So, I can't use characters at the start of the alphebet, and the number of animated wepons is limitted. +defineTile('#', "WALL") +defineTile('+', "DOOR") +defineTile('.', "FLOOR") +defineTile('X', "HARDWALL") +defineTile('!', "DOOR_VAULT") +defineTile('U', "FLOOR", {random_filter={type="armor", add_levels=5, tome_mod="gvault"}}, nil) +defineTile('V', "FLOOR", {random_filter={type="weapon", add_levels=5, tome_mod="gvault"}}, nil) +defineTile('Z', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, nil) +defineTile('w', "FLOOR", nil, {random_filter={name='blade horror', add_levels=10}}) +defineTile('x', "FLOOR", nil, {random_filter={subtype='wight', add_levels=5}}) +defineTile('y', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={subtype='eldritch', add_levels=10}}) +defineTile('z', "FLOOR", nil, {random_filter={subtype='skeleton', add_levels=5}}) + +local def = { + [[XXXXXXXXXXXXXXX]], + [[XU#.Vx.#....pZX]], + [[XP+.p..+.....pX]], + [[XV#.Ux.##z..y.X]], + [[X##+######z...X]], + [[Xp..#..P.##...X]], + [[X...#p...p##+#X]], + [[XU.p#.....#z.zX]], + [[XU..###+###.p.X]], + [[XpZZ+..w###...X]], + [[XXXXXXXXXXXX!XX]], + } +local pd_small = 'a' +local pd_big = 'A' +for x = 1, #(def[1]) do + for y = 1, #def do + if def[y]:sub(x, x) == "p" then + defineTile(pd_small, "FLOOR", nil, make_poltergeist("normal")) + def[y] = def[y]:sub(1, x-1)..pd_small..def[y]:sub(x+1, #def[y]) + pd_small = string.char(string.byte(pd_small) + 1) + print(def[y]) + elseif def[y]:sub(x, x) == "P" then + defineTile(pd_big, "FLOOR", nil, make_poltergeist("greater")) + def[y] = def[y]:sub(1, x-1)..pd_big..def[y]:sub(x+1, #def[y]) + pd_big = string.char(string.byte(pd_big) + 1) + print(def[y]) + end + end +end +return def \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua b/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua new file mode 100644 index 0000000000000000000000000000000000000000..093dd1702eb25ea5c404620173097b073864b2f2 --- /dev/null +++ b/game/modules/tome/data/maps/vaults/auto/greater/sleeping-dragons.lua @@ -0,0 +1,142 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +startx = 4 +starty = 7 + +setStatusAll{no_teleport=true} +rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +defineTile('o', "WALL") +defineTile('.', "FLOOR") +defineTile('#', "HARDWALL") +defineTile('X', "DOOR_VAULT") + +local Talents = require("engine.interface.ActorTalents") +specialList("actor", { + "/data/general/npcs/cold-drake.lua", + "/data/general/npcs/fire-drake.lua", + "/data/general/npcs/storm-drake.lua", + "/data/general/npcs/venom-drake.lua" +}, true) +local wyrm_types = { + cold={"cold drake", "ice wyrm"}, + fire={"fire drake", "fire wyrm"}, + storm={"storm drake", "storm wyrm"}, + venom={"venom drake", "venom wyrm"} +} +local wyrm_types_names = {"cold", "fire", "storm", "venom"} +roomCheck(function(room, zone, level, map) + local wyrm_types_name = rng.table(wyrm_types_names) + local wyrm_type = wyrm_types[wyrm_types_name] + local drake_name, wyrm_name = wyrm_type[1], wyrm_type[2] + for i, e in ipairs(room.npc_list) do -- set up special wyrm rarity + if not e.wyrm_rarity and e.name == wyrm_name then + e.wyrm_rarity = e.rarity; e.rarity = nil + elseif not e.drake_rarity and e.name == drake_name then + e.drake_rarity = e.rarity; e.rarity = nil + end + end + return true +end) +local check_sleep = function(self) + if game.level.wyrm_awoken == true then + return true + end + if not game.level.seen_wyrm_awoken then + game.level.seen_wyrm_awoken = true + game.log("The dragons here are asleep. You may try to steal their treasure... at your own risk.") + end + if not self:hasEffect(self.EFF_SLEEP) then + self:setEffect(self.EFF_SLEEP, 999, {src=self, power=1, waking=0, insomnia=0, contagious=0}) + end + return true +end +local aggro_wyrm = function() + if game.level.wyrm_awoken == true then + return false + end + game.level.wyrm_awoken = true + for uid, e in pairs(game.level.entities) do + if e.sleeping_wyrm == true then + e:removeEffect(e.EFF_SLEEP) + e:setTarget(game.player) + end + end + game.log("#CRIMSON#The dragons awaken from their slumber detecting their loot being stolen!") + return true +end +local aggro_wyrm_takehit = function(self, value, src) + aggro_wyrm() + return value +end +local aggro_wyrm_grid = function(chance) + local g = game.zone.grid_list.FLOOR:clone() + g.on_move = function(self, x, y, actor, forced) + if not actor.player then return end + if forced then return end + if game.level.wyrm_awoken then return end + if not rng.percent(chance) then return end + aggro_wyrm() + end + return g +end +defineTile('1', aggro_wyrm_grid(2), {random_filter={add_levels=25, type="money"}}) +defineTile('2', aggro_wyrm_grid(5), {random_filter={add_levels=10, tome_mod="uvault"}}) +defineTile('3', aggro_wyrm_grid(25), {random_filter={add_levels=15, tome_mod="gvault"}}) +defineTile('W', "FLOOR", nil, + {entity_mod=function(e) + e.make_escort = nil + e.on_seen = check_sleep + e.on_act = check_sleep + e.on_takehit = aggro_wyrm_takehit + e.sleeping_wyrm = true + return e + end, + random_filter={special_rarity="wyrm_rarity", + add_levels=15, + random_boss={name_scheme="Sleeping #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5} + } + } +) +defineTile('D', "FLOOR", nil, + {entity_mod=function(e) + e.make_escort = nil + e.on_seen = check_sleep + e.on_act = check_sleep + e.on_takehit = aggro_wyrm_takehit + e.sleeping_wyrm = true + return e + end, + random_filter={special_rarity="drake_rarity", + add_levels=15, + random_boss={name_scheme="Dozing #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5} + } + } +) +return { + [[#########]], + [[#...W...#]], + [[#..131..#]], + [[#..232..#]], + [[#D.121.D#]], + [[#..111..#]], + [[#..o.o..#]], + [[####X####]], +} \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua b/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua index 56ff336a09cc64e5fab064b93761d6db0fe9205f..1f81f194ac552b1a9fe88a4acc7280371f18277a 100644 --- a/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua +++ b/game/modules/tome/data/maps/vaults/auto/lesser/circle.lua @@ -30,9 +30,10 @@ defineTile('3', "FLOOR", {random_filter={add_levels=5}}, nil) rotates = {"default", "90", "180", "270", "flipx", "flipy"} ---startx = 5 ---starty = 0 - +startx = 5 +starty = 1 +local version = rng.range(1, 5) +if version == 1 then return { [[,,,,,,,,,,,]], [[,,,XX!XX,,,]], @@ -50,4 +51,81 @@ return { [[,,XX.1.XX,,]], [[,,,XXXXX,,,]], [[,,,,,,,,,,,]], -} \ No newline at end of file +} +elseif version == 2 then +return { +[[,,,,,,,,,,,]], +[[,,,XX!XX,,,]], +[[,,XX.2.XX,,]], +[[,XXXXDXXXX,]], +[[,X3X3.3X3X,]], +[[,X.X...X.X,]], +[[,XDXXDXXDX,]], +[[,X2D.2.D2X,]], +[[,XDXXDXXDX,]], +[[,X.X...X.X,]], +[[,X3X3.3X3X,]], +[[,XXXX.XXXX,]], +[[,XXXXDXXXX,]], +[[,,XX.1.XX,,]], +[[,,,XXXXX,,,]], +[[,,,,,,,,,,,]], +} +elseif version == 3 then +return { +[[,,,,,,,,,,,]], +[[,,,XX!XX,,,]], +[[,,XXX2XXX,,]], +[[,XX3D.D3XX,]], +[[,XXDXXXDXX,]], +[[,X..3X3..X,]], +[[,XXDXXXDXX,]], +[[,X..D2D..X,]], +[[,XXXXDXXXX,]], +[[,X32X2X23X,]], +[[,XXDXDXDXX,]], +[[,X3.....3X,]], +[[,XXXXDXXXX,]], +[[,,XX.1.XX,,]], +[[,,,XXXXX,,,]], +[[,,,,,,,,,,,]], +} +elseif version == 4 then +return { +[[,,,,,,,,,,,]], +[[,,,XX!XX,,,]], +[[,,XX...XX,,]], +[[,XXX.2.XXX,]], +[[,X2D...D2X,]], +[[,X.XXDXX.X,]], +[[,X.X...X.X,]], +[[,X.X.2.X.X,]], +[[,X3X...X3X,]], +[[,X3X...X3X,]], +[[,X3XXDXX3X,]], +[[,X3X...X3X,]], +[[,XXX.1.XXX,]], +[[,,XX...XX,,]], +[[,,,XXXXX,,,]], +[[,,,,,,,,,,,]], +} +else +return { +[[,,,,,,,,,,,]], +[[,,,XX!XX,,,]], +[[,,XXX2XXX,,]], +[[,XXXX.XXXX,]], +[[,X33X.X33X,]], +[[,XDXXDXXDX,]], +[[,X2D...D2X,]], +[[,XDXXDXXDX,]], +[[,X.X...X.X,]], +[[,X.X.2.X.X,]], +[[,X.XXDXX.X,]], +[[,X3.D1D.3X,]], +[[,XXXX.XXXX,]], +[[,,XX3.3XX,,]], +[[,,,XXXXX,,,]], +[[,,,,,,,,,,,]], +} +end diff --git a/game/modules/tome/data/maps/vaults/forest-snake-pit.lua b/game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua similarity index 61% rename from game/modules/tome/data/maps/vaults/forest-snake-pit.lua rename to game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua index 13024412378f64643cd6bc29e6fad4bcbcfae9c9..b50dd1ae5ec871ec1f113f29cfe8e0e93f2490d9 100644 --- a/game/modules/tome/data/maps/vaults/forest-snake-pit.lua +++ b/game/modules/tome/data/maps/vaults/auto/lesser/crystal-cabal.lua @@ -18,25 +18,33 @@ -- darkgod@te4.org setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} +roomCheck(function(room, zone, level, map) + return resolvers.current_level >= 5 and resolvers.current_level <= 25 +end) specialList("actor", { - "/data/general/npcs/snake.lua", + "/data/general/npcs/crystal.lua", }) -rotates = {"default", "90", "180", "270", "flipx", "flipy"} - -defineTile(',', "GRASS") -defineTile(';', "FLOWER") -defineTile('#', "WALL") -defineTile('X', "TREE") -defineTile('x', "DOOR_VAULT") +border = 0 +startx, starty = 4, 10 +defineTile('.', data.floor or "FLOOR") +defineTile(',', "FLOOR") +defineTile('!', "DOOR_VAULT") +defineTile('X', "HARDWALL") +defineTile('G', "FLOOR", {random_filter={type="gem"}}) +defineTile('C', "FLOOR", nil, {random_filter={subtype="crystal", add_levels=4}}) -defineTile('s', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="rattlesnake"}}) +rotates = {"default", "90", "180", "270", "flipx", "flipy"} return { -[[,,,,,,,,,]], -[[,#####,,,]], -[[;#sss#,X,]], -[[,#sssx,,,]], -[[,#sss#,,,]], -[[,#####;,,]], -[[,,,,,,,,,]], +[[.........]], +[[.XXXXXXX.]], +[[.XXXXXXX.]], +[[.X,C,C,X.]], +[[.XGG,GGX.]], +[[.XGG,GGX.]], +[[.X,C,C,X.]], +[[.XXX!XXX.]], +[[.XXX.XXX.]], +[[.XXX.XXX.]], +[[.........]], } \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua b/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua index feb0f8047736ab87cd6cfdd8ffa4a8d20f8dde5d..e0bc764ed483f3c29fd9c41380cb9d85fa7516f8 100644 --- a/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua +++ b/game/modules/tome/data/maps/vaults/auto/lesser/mage-hideout.lua @@ -20,23 +20,37 @@ setStatusAll{no_teleport=true, no_vaulted=true} border = 0 -- override normal vault border roomCheck(function(room, zone, level, map) - return resolvers.current_level <= 20 + return resolvers.current_level <= 20 end) specialList("actor", { - "/data/general/npcs/skeleton.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/troll.lua", + "/data/general/npcs/thieve.lua", + "/data/general/npcs/spider.lua", + "/data/general/npcs/ghoul.lua", }) specialList("terrain", { - "/data/general/grids/forest.lua", + "/data/general/grids/forest.lua", }, true) +local mobs = { + "skeleton mage", + "skeleton magus", + "cave troll", + "thief", + "spitting spider", + "weaver young", + "ghast", +} +local mob = rng.tableRemove(mobs) local Floor = data.floor or data['.'] or "GRASS" rotates = {"default", "90", "180", "270", "flipx", "flipy"} defineTile(',', Floor) defineTile('#', "HARDWALL") defineTile('X', data.wall or data['#'] or "TREE") defineTile('+', "DOOR") -defineTile('s', Floor, nil, {random_filter={name="skeleton mage", add_levels=6}}) -defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, nil) - +defineTile('s', Floor, nil, {random_filter={name=mob, add_levels=6}}) +defineTile('$', "FLOOR", {random_filter={type="scroll", add_levels=5, ego_chance=60}}, nil) +defineTile('*', "FLOOR", {random_filter={mod="vault", add_levels=5, ego_chance=30}}, nil) startx = 1 starty = 7 @@ -45,8 +59,8 @@ return { [[X,,X,,,X,X,]], [[X,X,,,,,,XX]], [[X,X,,s####X]], -[[X,X,,,#$$#X]], -[[X,XX,,+$$#X]], +[[X,X,,,#*$#X]], +[[X,XX,,+$*#X]], [[X,,XX,####X]], [[X,,,XXXXXXX]], } diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua b/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua index 5799fa76cedc9c3cc091b87077848743dad5f30c..09dbadd3aca861881adeb308678ed140958c6c96 100644 --- a/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua +++ b/game/modules/tome/data/maps/vaults/auto/lesser/skeleton-mage-cabal.lua @@ -19,11 +19,38 @@ setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} roomCheck(function(room, zone, level, map) - return resolvers.current_level >= 5 and resolvers.current_level <= 25 + return resolvers.current_level >= 5 and resolvers.current_level <= 25 end) specialList("actor", { - "/data/general/npcs/skeleton.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/thieve.lua", + "/data/general/npcs/horror.lua", }) +specialList("terrain", { + "/data/general/grids/forest.lua", +}, true) +local mobs = { + "skeleton mage", + "skeleton warrior", + "skeleton archer", + "thief", + "bloated horror", +} +local mob = rng.tableRemove(mobs) + +local weapon = "staff" +if mob == "skeleton warrior" then weapon = rng.percent(50) and "waraxe" or "battleaxe" +elseif mob == "skeleton archer" then weapon = "longbow" +elseif mob == "thief" then weapon = rng.percent(50) and "dagger" or "sling" +elseif mob == "bloated horror" then weapon = "mindstar" +end + +local armor = "cloth" +if mob == "skeleton warrior" then armor = rng.percent(50) and "shield" or "massive" +elseif mob == "skeleton archer" then armor = rng.percent(50) and "light" or "heavy" +elseif mob == "thief" then armor = "light" +end + border = 0 startx, starty = 4, 10 defineTile('.', data.floor or "FLOOR") @@ -31,22 +58,22 @@ defineTile(',', "FLOOR") defineTile('D', "DOOR") defineTile('!', "DOOR_VAULT") defineTile('X', "HARDWALL") -defineTile('W', "FLOOR", {random_filter={subtype="staff", tome_mod="vault", add_levels=4}}) -defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=25, add_levels=4}}) -defineTile('M', "FLOOR", nil, {random_filter={name="skeleton mage", add_levels=4}}) - +defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=50, add_levels=6}}) +defineTile('W', "FLOOR", {random_filter={subtype=weapon, tome_mod="vault", add_levels=6, ego_chance=100}}) +defineTile('A', "FLOOR", {random_filter={subtype=armor, tome_mod="vault", add_levels=6, ego_chance=100}}) +defineTile('M', "FLOOR", nil, {random_filter={name=mob, add_levels=8}}) rotates = {"default", "90", "180", "270", "flipx", "flipy"} return { [[.........]], [[.XXXXXXX.]], -[[.XSSSSSX.]], +[[.XASSSWX.]], [[.XXXDXXX.]], [[.X,,M,,X.]], [[.X,M,M,X.]], [[.X,,M,,X.]], [[.XDX!XDX.]], -[[.XWX.XWX.]], +[[.XWX.XAX.]], [[.XXX.XXX.]], [[.........]], } diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua b/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua index 34b419495a1c2a75be2a414ceb9bf8c5d6870925..4f51a272cbe09ae2436d9138dfd821257e40a2f4 100644 --- a/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua +++ b/game/modules/tome/data/maps/vaults/auto/lesser/thief-hideout.lua @@ -19,42 +19,92 @@ setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} specialList("actor", { - "/data/general/npcs/thieve.lua", + "/data/general/npcs/thieve.lua", }) specialList("terrain", { - "/data/general/grids/forest.lua", + "/data/general/grids/forest.lua", }, true) border = 0 rotates = {"default", "90", "180", "270", "flipx", "flipy"} defineTile('.', "FLOOR") defineTile(',', data.floor or data['.'] or "GRASS") -defineTile('#', "WALL") -defineTile('X', "HARDWALL") +defineTile('#', "HARDWALL") defineTile('+', "DOOR") defineTile('!', "DOOR_VAULT") +local mobs = { + "bandit", + "rogue", + "cutpurse", +} +local bosses = { + "rogue sapper", + "assassin", + "shadowblade" +} -defineTile('p', "FLOOR", nil, {random_filter={name="rogue", add_levels=3}}) -defineTile('P', "FLOOR", nil, {random_filter={name="bandit", add_levels=5}}) +local boss = rng.tableRemove(bosses) -defineTile('&', "FLOOR", {random_filter={type="scroll"}}) -defineTile('$', "FLOOR", "MONEY_SMALL") -defineTile('*', "FLOOR", {random_filter={type="gem"}}) +defineTile('1', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=4}}) +defineTile('2', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=5}}) +defineTile('3', "FLOOR", nil, {random_filter={name=mobs[rng.range(0, #mobs)], add_levels=6}}) +defineTile('B', "FLOOR", nil, {random_filter={name=boss, add_levels=boss=="shadowblade" and 0 or 12}}) +defineTile('T', "FLOOR", nil, {random_filter={name="thief", add_levels=10}}) +defineTile('&', "FLOOR", {random_filter={type="scroll", ego_chance=25}}) +defineTile('$', "FLOOR", {random_filter={add_levels=15, type="money"}}) +defineTile('*', "FLOOR", {random_filter={type="gem"}}) +defineTile('%', "FLOOR", {random_filter={mod="gvault", type="armor", add_levels=8}}) +defineTile('^', "FLOOR", {random_filter={mod="vault", type="weapon", add_levels=8}}) --startx, starty = 10, 0 +local version = rng.range(1, 3) +if version == 1 then +return { +[[,,,,,,,,,,,,,,]], +[[,#######,,,,,,]], +[[,#%#$$$#,,,,,,]], +[[,#^#$*$#,,,,,,]], +[[,#*#$$$#,,,,,,]], +[[,#+##+###!###,]], +[[,#B^#2#1...2#,]], +[[,#&3+1#.312.#,]], +[[,####.#..3..#,]], +[[,#13#.#.....#,]], +[[,#*2+.+..T..#,]], +[[,############,]], +[[,,,,,,,,,,,,,,]], +} +elseif version == 2 then +return { +[[,,,,,,,,,,,,,,]], +[[,,,,,,,,,,,,,,]], +[[,,,,,,,,,,,,,,]], +[[,###########,,]], +[[,.!..213$$.#,,]], +[[,##+######+#,,]], +[[,#..#*B*#12#,,]], +[[,#..#132#3$#,,]], +[[,#..#+#+####,,]], +[[,#12..#$$&^#,,]], +[[,#3T$*#$$%^#,,]], +[[,###########,,]], +[[,,,,,,,,,,,,,,]], +} +else return { [[,,,,,,,,,,,,,,]], -[[,XXXXXXX,,,,,,]], -[[,X*#$$$X,,,,,,]], -[[,X*#$$$X,,,,,,]], -[[,X*#$$$X,,,,,,]], -[[,XXXX+XX#!###,]], -[[,#..#.#.....#,]], -[[,#.p+.#.p.p.#,]], -[[,####.#..P..#,]], -[[,#P.#.#.p.p.#,]], -[[,#&.+.+.....#,]], +[[,#!#####,,,,,,]], +[[,#.#$*$#,,,,,,]], +[[,#.#2$3#,,,,,,]], +[[,#1#.1.#,,,,,,]], +[[,#+#+#+######,]], +[[,#...#.23...#,]], +[[,#.23##1..B2#,]], +[[,#.1T*#...3*#,]], +[[,####+###+###,]], +[[,#$$$$#%*^^&#,]], [[,############,]], [[,,,,,,,,,,,,,,]], -} \ No newline at end of file +} +end \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua b/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua new file mode 100644 index 0000000000000000000000000000000000000000..82cf484aed5f2c46c9824f51559b8a6f4f4ffa3f --- /dev/null +++ b/game/modules/tome/data/maps/vaults/auto/lesser/worms.lua @@ -0,0 +1,52 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +startx = 4 +starty = 7 + +specialList("actor", { + "/data/general/npcs/horror.lua", + "/data/general/npcs/vermin.lua", +}) + +setStatusAll{no_teleport=true} +rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +defineTile('o', "WALL") +defineTile('.', "FLOOR") +defineTile('#', "HARDWALL") +defineTile('!', "DOOR_VAULT") + +defineTile('$', "FLOOR", {random_filter={add_levels=20, type="money"}}) +defineTile('*', "FLOOR", {random_filter={add_levels=15, tome_mod="gvault"}}) +defineTile('~', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}}) + +defineTile('w', "FLOOR", nil, {random_filter={add_levels=10, name = "carrion worm mass"}} ) +defineTile('W', "FLOOR", nil, {random_filter={add_levels=5, name = "worm that walks"}} ) + +return { + [[#########]], + [[#~~w*w~~#]], + [[#..www..#]], + [[#..ooo..#]], + [[#.......#]], + [[#.Wo.oW.#]], + [[#$$o.o$$#]], + [[####!####]], +} \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/collapsed-tower.lua b/game/modules/tome/data/maps/vaults/collapsed-tower.lua new file mode 100644 index 0000000000000000000000000000000000000000..972ee11a61f28f4816a500acd6a191c269e2e6f4 --- /dev/null +++ b/game/modules/tome/data/maps/vaults/collapsed-tower.lua @@ -0,0 +1,189 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +local Talents = require("engine.interface.ActorTalents") + +setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} + +local turret = function(version) + local NPC = require "mod.class.NPC" + local m = NPC.new{ + type = "construct", subtype = "crystal", image="trap/trap_beam.png", + display = "t", + body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1 }, + life_rating = 20, + rank = 2, + inc_damage = { all = -75, }, + + open_door = true, + cut_immune = 1, + blind_immune = 1, + fear_immune = 1, + poison_immune = 1, + disease_immune = 1, + stone_immune = 1, + see_invisible = 30, + no_breath = 1, + infravision = 10, + never_move = 1, + + autolevel = "caster", + level_range = {1, nil}, exp_worth = 1, + stats = { mag=16, con=22 }, + size_category = 2, + name = "elemental crystal", color=colors.BLUE, + combat = { dam=resolvers.rngavg(1,2), atk=2, apr=0, dammod={str=0.4} }, + combat_armor = 10, combat_def = 0, + talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, }, + + resolvers.talents{ + [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=9}, + }, + + ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, }, + + } + return m +end + +local id = "collapsed-tower-"..game.turn + +local changer = function() + local npcs = mod.class.NPC:loadList{"/data/general/npcs/thieve.lua"} + local objects = mod.class.Object:loadList("/data/general/objects/objects.lua") + local terrains = mod.class.Grid:loadList("/data/general/grids/basic.lua") + terrains.DOWN.change_level_shift_back = true + terrains.DOWN.change_zone_auto_stairs = true + terrains.DOWN.name = "stairs back to "..game.zone.name + terrains.DOWN.change_zone = game.zone.short_name + local zone = mod.class.Zone.new(id, { + name = "collapsed tower", + level_range = {game.zone.base_level, game.zone.base_level}, + __applied_difficulty = true, -- Difficulty already applied to parent zone + level_scheme = "player", + max_level = 1, + width = 20, height = 20, + ambient_music = "Swashing the buck.ogg", + reload_lists = false, + persistent = "zone", + + no_worldport = game.zone.no_worldport, + min_material_level = util.getval(game.zone.min_material_level), + max_material_level = util.getval(game.zone.max_material_level), + generator = { + map = { + class = "engine.generator.map.Static", + map = "zones/collapsed-tower", + }, + trap = { nb_trap = {0, 0} }, + object = { nb_object = {0, 0} }, + actor = { nb_npc = {0, 0} }, + }, + npc_list = npcs, + grid_list = terrains, + object_list = objects, + trap_list = mod.class.Trap:loadList("/data/general/traps/natural_forest.lua"), + }) + return zone +end + +local stairs = function() + local terrains = mod.class.Grid:loadList("/data/general/grids/basic.lua") + local g = terrains.FLOOR:clone() + g.name = "collapsed tower" + g.always_remember = true + g.display='>' g.color_r=0 g.color_g=0 g.color_b=255 g.notice = true + g.change_level=1 g.change_zone=id g.glow=true + g:removeAllMOs() + if engine.Map.tiles.nicer_tiles then + g.add_displays = g.add_displays or {} + g.add_displays[#g.add_displays+1] = mod.class.Grid.new{image="terrain/stair_up.png", z=5} + end + g.nice_tiler = nil + g:altered() + g:initGlow() + g.real_change = changer + g.change_level_check = function(self) + game:changeLevel(1, self.real_change(self.change_zone), {temporary_zone_shift=true, direct_switch=true}) + self.change_level_check = nil + self.real_change = nil + self.special_minimap = colors.VIOLET + return true + end + return g +end + + +specialList("terrain", { + "/data/general/grids/water.lua", + "/data/general/grids/forest.lua", +}, true) +border = 0 +--rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +defineTile('.', "FLOOR") +defineTile(',', "GRASS") +defineTile('#', "HARDWALL") +defineTile('+', "DOOR") +defineTile('!', "DOOR_VAULT") +defineTile(';', "FLOWER") +defineTile('~', "DEEP_WATER") +defineTile('#', "WALL") +defineTile('X', "TREE") + +specialList("actor", { + "/data/general/npcs/construct.lua", + "/data/general/npcs/plant.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/bear.lua", +}) +specialList("trap", { + "/data/general/traps/natural_forest.lua", +}) + +defineTile('a', "FLOOR", {random_filter={add_levels=5, tome_mod="vault"}}, nil) +defineTile('S', "FLOOR", {random_filter={type="scroll", ego_chance=100}}, nil) +defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}}) +defineTile('g', "FLOOR", nil, {random_filter={add_levels=5, name="broken golem"}}) +defineTile('p', "GRASS", nil, {random_filter={add_levels=5, name="poison ivy"}}) +defineTile('v', "GRASS", nil, {random_filter={add_levels=5, name="giant venus flytrap"}}) +defineTile('s', "FLOOR", {random_filter={add_levels=5, tome_mod="vault"}}, {random_filter={add_levels=5, name="skeleton mage"}}) +defineTile('b', "FLOWER", nil, {random_filter={name="black bear"}}) +defineTile('t', "FLOOR", nil, turret(version)) +defineTile('^', "FLOOR", nil, nil, {random_filter={name="sliding rock"}}) +defineTile('<', stairs()) + +return { +[[,,,,,,,,;;;;;,,,,]], +[[,,X##,,#;~~~;,,,,]], +[[,.##,,##;~~~;##,,]], +[[,...XXX,b;;;b###,]], +[[,##.........####,]], +[[,######..####.##,]], +[[.#.#..#####...t#,]], +[[.!...^t#.<+sp;a#,]], +[[.#.#..##..#,;;.#,]], +[[,#.##+#####p...#,]], +[[,#g#p,,,^.#....#,]], +[[,###..;;^v##+###,]], +[[,,##.vp,,....##,,]], +[[,,,##$$SSS$$##,,,]], +[[,,,,#########,,,,]], +[[,,,,,,,,,,,,,,,,,]], +} diff --git a/game/modules/tome/data/maps/vaults/flooded-prison.lua b/game/modules/tome/data/maps/vaults/flooded-prison.lua new file mode 100644 index 0000000000000000000000000000000000000000..5d89a2e687abd0ed274b362e8b99d8d5ad62649b --- /dev/null +++ b/game/modules/tome/data/maps/vaults/flooded-prison.lua @@ -0,0 +1,53 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +startx = 1 +starty = 2 + +setStatusAll{no_teleport=true, vault_only_door_open=true} +rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +specialList("actor", { + "/data/general/npcs/aquatic_demon.lua", + "/data/general/npcs/horror_aquatic.lua", + "/data/general/npcs/naga.lua", +}) + +specialList("terrain", { + "/data/general/grids/water.lua", + "/data/general/grids/basic.lua", +}) + +defineTile('#', "HARDWALL") +defineTile('~', "WATER_FLOOR") +defineTile('X', "DOOR_VAULT") +defineTile('%', "DOOR") +defineTile('8', "WATER_FLOOR", {random_filter={add_levels=18, tome_mod="gvault"}}, {random_filter={add_levels=20}}) + +return { + [[~~~~~~~~~~~~~]], + [[~###########~]], + [[~X8%8%8%8%8#~]], + [[~#########%#~]], + [[~#8%8%8%8%8#~]], + [[~#%#########~]], + [[~#8%8%8%8%8X~]], + [[~###########~]], + [[~~~~~~~~~~~~~]], +} diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua index 01147d97f92009169b5d32e48afa5974707c6952..b9ad32c834d7280c31ae603165ff56dda7d3316f 100644 --- a/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua +++ b/game/modules/tome/data/maps/vaults/forest-ruined-building1.lua @@ -19,30 +19,79 @@ setStatusAll{no_teleport=true, room_map = {can_open=true}} specialList("actor", { - "/data/general/npcs/troll.lua", + "/data/general/npcs/troll.lua", + "/data/general/npcs/ghoul.lua", + "/data/general/npcs/thieve.lua", + "/data/general/npcs/skeleton.lua", }) border = 0 rotates = {"default", "90", "180", "270", "flipx", "flipy"} defineTile('.', "FLOOR") -defineTile(',', "GRASS") -defineTile('#', "WALL") -defineTile('X', "TREE") +defineTile(',', data.floor or data['.'] or "GRASS") +defineTile('#', "HARDWALL") +defineTile('X', "HARDTREE") defineTile('+', "DOOR") defineTile('x', "DOOR_VAULT") -defineTile('T', "FLOOR", {random_filter={type="scroll", tome_mod="vault"}}, {random_filter={name="forest troll", add_levels=4}}) +local mobs = { + "cave troll", + "thief", + "skeleton magus", + "ghast", +} +local mob = rng.tableRemove(mobs) +local moblet = "forest troll" +if mob == "thief" then moblet = "bandit" +elseif mob == "skeleton magus" then moblet = "skeleton warrior" +elseif mob == "ghast" then moblet = "ghoul" +end +defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance =50, add_levels=8}}, {random_filter={name=mob, add_levels=8}}) +defineTile('t', "FLOOR", {random_filter={tome_mod="vault", add_levels=5}}, {random_filter={name=moblet, add_levels=6}}) +defineTile('m', "FLOOR", nil, {random_filter={name=moblet, add_levels=4}}) + +local version = rng.range(1,3) +if version == 1 then return { [[,,,,,,,,,,,,,]], -[[,#####,,,X,,,]], -[[,#...#,,X,,X,]], -[[,#T..#,,,,X,,]], +[[,#####XXXX,,,]], +[[,#tTt#,,XX,X,]], +[[,#...#,,,XXX,]], [[,###x#X#X.,#,]], -[[,#.....XX,.#,]], -[[,X,.,...,..+,]], +[[,#,..,,XX,.#,]], +[[,X.m...m,..+,]], [[,X,,.X.,...+,]], -[[,,,X..,....#,]], -[[,##XX,##X#X#,]], +[[,X,X.m.,,..#,]], +[[,##XX#XXX#X#,]], +[[,,,,,,,,,,,,,]], +} +elseif version == 2 then +return { +[[,,,,,,,,,,,,,]], +[[,##X##XXXX#X,]], +[[,X,,,,.m.XX,,]], +[[,X,.,....,XX,]], +[[,X.###x###,#,]], +[[,Xm#t...t#,#,]], +[[,#.#..T..#,#,]], +[[,#,#######,X,]], +[[,X,,,.,.m.#X,]], +[[,X###++#####,]], +[[,,,,,,,,,,,,,]], +} +else +return { +[[,,,,,,,,,,,,,]], +[[,###++##X#X,,]], +[[,#,.m.,#XX#X,]], +[[,X,...,,,XXX,]], +[[,X.mXX,,,,,#,]], +[[,#...,,,.X.#,]], +[[,#####,,,,.X,]], +[[,#t,.x..mX.#,]], +[[,#Tt.#,.X..#,]], +[[,#########X#,]], [[,,,,,,,,,,,,,]], -} \ No newline at end of file +} +end \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua index bfd727a8c03a162ee2525b64b6a1e4e6e3629ca2..8c4561c81a273d1a2ac090d4b91c03e889328b65 100644 --- a/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua +++ b/game/modules/tome/data/maps/vaults/forest-ruined-building2.lua @@ -17,29 +17,132 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org +startx = 9 +starty = 1 + setStatusAll{no_teleport=true, room_map = {can_open=true}} + roomCheck(function(room, zone, level, map) - return zone.npc_list.__loaded_files["/data/general/npcs/plant.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] --make sure the honey tree can summon + return zone.npc_list.__loaded_files["/data/general/npcs/bear.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/plant.lua"] and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] --make sure the honey tree can summon end) + +specialList("actor", {"/data/general/npcs/aquatic_demon.lua"}, true) + +specialList("terrain", { + "/data/general/grids/underground_gloomy.lua", + "/data/general/grids/water.lua", + "/data/general/grids/forest.lua", +}, true) + border = 0 rotates = {"default", "90", "180", "270", "flipx", "flipy"} +local vaultvariations = rng.range(1,3) + defineTile('.', "FLOOR") defineTile(',', "GRASS") defineTile('#', "WALL") defineTile('X', "TREE") ---defineTile('+', "DOOR") defineTile('+', "DOOR", nil, nil, nil, {room_map = {can_open=true}}) -defineTile('T', "GRASS", nil, {random_filter={name="honey tree", add_levels=4}}) - -return { -[[,,,,,,,,,,,,,,,,,,,,,]], -[[,#################X,,]], -[[,#....#.,..,..#.X.,X,]], -[[,#....+..,,,..+..,.#,]], -[[,######..,T,,.######,]], -[[,#....+.,,,,..+....#,]], -[[,#....#....,,.#....#,]], -[[,########+#+########,]], -[[,,,,,,,,,,,,,,,,,,,,,]], -} + +if vaultvariations == 1 then -- Gloomy theme + defineTile('i', "FLOOR", {random_filter={add_levels=4, tome_mod="gvault"}}) + local Talents = require("engine.interface.ActorTalents") + defineTile('T', "FLOOR", nil, + {entity_mod=function(e) + e.make_escort = nil + e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name + e[#e+1] = resolvers.talents{ [Talents.T_GLOOM]=1, [Talents.T_HATEFUL_WHISPER]=1 } + e:resolve() + return e + end, + random_filter={name="honey tree", add_levels=4}} + ) + defineTile('P', "FLOOR", nil, + {entity_mod=function(e) + e.make_escort = nil + e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name + e[#e+1] = resolvers.talents{ [Talents.T_AGONY]=1, [Talents.T_GLOOM]=1 } + e:resolve() + return e + end, + random_filter={name="giant venus flytrap", add_levels=4}} + ) + defineTile('B', "FLOOR", nil, + {entity_mod=function(e) + e.make_escort = nil + e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name + e[#e+1] = resolvers.talents{ [Talents.T_REPROACH]=1, [Talents.T_GLOOM]=1 } + e:resolve() + return e + end, + random_filter={name="brown bear", add_levels=4}} + ) + return { + [[,,,,,,,,,,,,,,,,,,,,,]], + [[,#################X,,]], + [[,#....#.....,,#,X,,X,]], + [[,#P...+......,+,...#,]], + [[,######...T...######,]], + [[,#.,,,,.......+..i.#,]], + [[,#..,,#,,.....#B...#,]], + [[,########+#+########,]], + [[,,,,,,,,,,,,,,,,,,,,,]], + } + +elseif vaultvariations == 2 then -- FLooded theme + local Talents = require("engine.interface.ActorTalents") + defineTile('~', "DEEP_WATER") + defineTile('i', "GRASS", {random_filter={add_levels=4, tome_mod="gvault"}}) + defineTile('T', "DEEP_WATER", nil, + {entity_mod=function(e) + e.make_escort = nil + e.can_breath={water=1} + e.name = rng.table{"wet ", "soaked ", "drenched "}..e.name + e[#e+1] = resolvers.talents{ [Talents.T_TIDAL_WAVE]=2 } + e:resolve() + return e + end, + random_filter={name="honey tree", add_levels=4}} + ) + defineTile('B', "DEEP_WATER", nil, + {entity_mod=function(e) + e.make_escort = nil + e.can_breath={water=1} + e.name = rng.table{"wet ", "soaked ", "drenched "}..e.name + e[#e+1] = resolvers.talents{ [Talents.T_WATER_BOLT]=1 } + e:resolve() + return e + end, + random_filter={name="giant venus flytrap", add_levels=4}} + ) + defineTile('P', "DEEP_WATER", nil, {random_filter={name="water imp", add_levels=4}}) + return { + [[,,,,,,,,,,,,,,,,,,~~~]], + [[,#################X~~]], + [[,#~P~~#~~~~~~~#~~~~X~]], + [[,#~~~,+,~~~~~~X~~~~#,]], + [[,######,~~T~~~######,]], + [[,#~~i,+,~~~~~,+,~~~#,]], + [[,#~~~,#,,,,,,,#~~~B#,]], + [[,########+#+########,]], + [[,,,,,,,,,,,,,,,,,,,,,]], + } + +else -- Normal theme + defineTile('T', "GRASS", nil, {random_filter={name="honey tree", add_levels=4}}) + defineTile('P', "FLORR", nil, {random_filter={name="giant venus flytrap", add_levels=4}}) + defineTile('B', "FLOOR", nil, {random_filter={name="brown bear", add_levels=4}}) + defineTile('i', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}}) + return { + [[,,,,,,,,,,,,,,,,,,,,,]], + [[,#################X,,]], + [[,#....#.,..,..#.X.,X,]], + [[,#.i..+..,,,..+..,.#,]], + [[,######..,T,,.######,]], + [[,#....+.,,,,..+....#,]], + [[,#P...#....,,.#B...#,]], + [[,########+#+########,]], + [[,,,,,,,,,,,,,,,,,,,,,]], + } +end diff --git a/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua b/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua index d5f0b0cc78498c83a8abae167063b20a86331734..befc838356f9351be01d7e259c6ee6231f4816a4 100644 --- a/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua +++ b/game/modules/tome/data/maps/vaults/forest-ruined-building3.lua @@ -19,7 +19,17 @@ setStatusAll{no_teleport=true, room_map = {can_open=true}} specialList("actor", { - "/data/general/npcs/skeleton.lua", + "/data/general/npcs/skeleton.lua", + "/data/general/npcs/snake.lua", + "/data/general/npcs/molds.lua", + "/data/general/npcs/feline.lua", + "/data/general/npcs/ant.lua", + "/data/general/npcs/sandworm.lua", + "/data/general/npcs/spider.lua", + "/data/general/npcs/vermin.lua", + "/data/general/npcs/rodent.lua", + "/data/general/npcs/ooze.lua", + "/data/general/npcs/jelly.lua", }) border = 0 rotates = {"default", "90", "180", "270", "flipx", "flipy"} @@ -28,23 +38,63 @@ defineTile('.', "FLOOR") defineTile(',', "GRASS") defineTile(';', "FLOWER") defineTile('~', "DEEP_WATER") -defineTile('#', "WALL") -defineTile('X', "TREE") -defineTile('+', "DOOR") +defineTile('#', "HARDWALL") +defineTile('X', "HARDTREE") defineTile('x', "DOOR_VAULT") -defineTile('s', "FLOOR", nil, {random_filter={name="degenerated skeleton warrior"}}) +local mobs = { + "rattlesnake", + "green worm mass", + "giant brown ant", + "snow cat", + "green mold", + "giant grey rat", + "giant spider", + "sandworm", + "grey mold", + "giant brown rat", + "skeleton mage", + "skeleton archer", + "skeleton warrior", + "giant green ant", + "giant red ant", + "giant yellow ant", + "giant blue ant", + "brown mold", + "white worm mass", + "giant crystal rat", + "spitting spider", + "weaver young", + "green ooze", + "red ooze", + "yellow ooze", + "blue ooze", + "green jelly", + "red jelly", + "blue jelly", + "yellow jelly", +} + +defineTile('s', "FLOOR", "MONEY_SMALL", {random_filter={name="degenerated skeleton warrior"}}) -- retain closet skeleton for posterity; give it a little money to guard so he's not so sad + +--ALL OF THE VARIABILITY +defineTile('1', "FLOOR", rng.percent(66)and{random_filter={tome_mod="vault", add_levels=rng.range(1,3)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil) +defineTile('2', "FLOOR", rng.percent(50)and{random_filter={tome_mod="vault", add_levels=rng.range(2,5)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil) +defineTile('3', "FLOOR", rng.percent(66)and{random_filter={add_levels=rng.range(2,4), ego_chance=rng.range(75,100)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil) +defineTile('4', "FLOOR", rng.percent(50)and{random_filter={add_levels=rng.range(3,6), ego_chance=rng.range(66,100)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil) +defineTile('5', "FLOOR", rng.percent(66)and{random_filter={tome_mod="vault", add_levels=rng.range(1,3)}} or nil, rng.percent(50) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(5,10)}} or nil) +defineTile('6', "FLOOR", rng.percent(50)and{random_filter={tome_mod="vault", add_levels=rng.range(4,6)}} or nil, rng.percent(66) and {random_filter={name=rng.tableRemove(mobs), add_levels=rng.range(4,8)}} or nil) return { [[,,,,,,,,,,,,,,,,]], [[,#X#########X,,,]], -[[,,.+....+..,..X,]], -[[,###....#.###.,,]], -[[,#.+....#.....#,]], -[[,###....###+###,]], -[[,#sx....#,,,,,,,]], -[[,###...X#,;;;;;,]], -[[,#.+..,.,,;~~~;,]], -[[,#####X,,,;;;;;,]], -[[,,,,,,,,,,,,,,,,]], +[[,#2x.;,.x.6,X.X,]], +[[,###.,,.####XXX,]], +[[,#3x.;,.#.5.1.#,]], +[[,###.;;.###x###,]], +[[,#sx..,,#;;;;;;;]], +[[,###.,,X#;;~~~;;]], +[[,#4x..,.,;;~~~;;]], +[[,#####X,,;;~~~;;]], +[[,,,,,,,,,;;;;;;;]], } diff --git a/game/modules/tome/data/maps/vaults/honey_glade.lua b/game/modules/tome/data/maps/vaults/honey_glade.lua index 2d2318b9745ddf84c9ef44d4086a4e28c1f7fd70..0b15bc6e62138e630b48a69e061d9c4e34e8cb8e 100644 --- a/game/modules/tome/data/maps/vaults/honey_glade.lua +++ b/game/modules/tome/data/maps/vaults/honey_glade.lua @@ -17,42 +17,76 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -setStatusAll{no_teleport=true, vault_only_door_open=true} +setStatusAll{no_teleport=true} roomCheck(function(room, zone, level, map) - return resolvers.current_level <= 25 and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] -- make sure the honey trees can summon + return resolvers.current_level <= 25 and zone.npc_list.__loaded_files["/data/general/npcs/swarm.lua"] -- make sure the honey tree can summon end) specialList("actor", { - "/data/general/npcs/bear.lua", - "/data/general/npcs/plant.lua", + "/data/general/npcs/bear.lua", + "/data/general/npcs/plant.lua", + "/data/general/npcs/swarm.lua", }) + specialList("terrain", { - "/data/general/grids/forest.lua", + "/data/general/grids/forest.lua", }, true) + local Floor = data.floor or "GRASS" -defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}}) +defineTile('X', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=true, can_open=true}}) defineTile(' ', Floor) -defineTile('+', "DOOR") -defineTile('X', "HARDTREE") -defineTile('^', Floor, nil, nil, {random_filter={add_levels=5}}) -defineTile('#', Floor, nil, {random_filter={name="honey tree"}}) -defineTile('q', Floor, {random_filter={add_levels=10, tome_mod="vault"}}, {random_filter={name="brown bear", add_levels=10}}) -defineTile('Q', Floor, {random_filter={add_levels=20, tome_mod="vault"}}, {random_filter={name="grizzly bear", add_levels=20}}) +defineTile('#', "HARDTREE") +defineTile('*', Floor, {random_filter={add_levels=10, tome_mod="vault"}}) +defineTile('T', Floor, nil, {random_filter={name="honey tree", add_levels=15}}) +defineTile('t', Floor, nil, {random_filter={name="honey tree"}}) +defineTile('B', Floor, nil, {random_filter={name="bee swarm", add_levels=10}}) +defineTile('b', Floor, nil, {random_filter={name="bee swarm", add_levels=5}}) +defineTile('G', Floor, {random_filter={add_levels=20, tome_mod="vault"}}, {random_filter={name="grizzly bear", add_levels=20}}) +defineTile('g', Floor, nil, {random_filter={name="brown bear", add_levels=10}}) startx = 2 starty = 10 rotates = {"default", "90", "180", "270", "flipx", "flipy"} - -return { -[[XXXXXXXXXX]], -[[XXX XXXX]], -[[XX #q# XXX]], -[[XX qQq XXX]], -[[XX #q# XXX]], -[[XXX XXXX]], -[[XXXX XXXXX]], -[[XXXX XXX]], -[[XXXXXX!XXX]], -[[XX^^^^ XXX]], -[[XX XXXXXXX]], -} +--Introducing: Our Patented Alt-Vault System(R) +local version = rng.range(1,4) +if version == 4 then + return { -- more or less the original, 4 weak trees, 4 brown bears, 1 grizzly + [[#######]], + [[##*g*##]], + [[#tgGgt#]], + [[#t g t#]], + [[## ##]], + [[### ###]], + [[###X###]], + } +elseif version == 3 then + return { -- grizzly bear and a bunch of weak swarms + [[#######]], + [[## ##]], + [[#bb bb#]], + [[#*bTb*#]], + [[## G ##]], + [[### ###]], + [[###X###]], + } +elseif version == 2 then + return { -- 2 brown bears, 3 strong swarms, no narrow spot + [[#######]], + [[## t ##]], + [[# * * #]], + [[# gTg #]], + [[# B*B #]], + [[## B ##]], + [[###X###]], + } +else -- always return something + return { -- 2 grizzly bears, one strong swarm + [[#######]], + [[## * ##]], + [[# GTG #]], + [[# B #]], + [[## ##]], + [[### ###]], + [[###X###]], + } +end \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/mold-path.lua b/game/modules/tome/data/maps/vaults/mold-path.lua index c6801492093e994bc0a73796bde087513dfd0c77..bd89683fcebb27482d945e5d1d03be6e1a6138b1 100644 --- a/game/modules/tome/data/maps/vaults/mold-path.lua +++ b/game/modules/tome/data/maps/vaults/mold-path.lua @@ -19,16 +19,16 @@ setStatusAll{no_teleport=true} roomCheck(function(room, zone, level, map) - return resolvers.current_level <= 25 + return resolvers.current_level <= 25 end) rotates = {"default", "90", "180", "270", "flipx", "flipy"} specialList("terrain", { - "/data/general/grids/water.lua", - "/data/general/grids/forest.lua", + "/data/general/grids/water.lua", + "/data/general/grids/forest.lua", }) specialList("actor", { - "/data/general/npcs/ooze.lua", - "/data/general/npcs/molds.lua", + "/data/general/npcs/ooze.lua", + "/data/general/npcs/molds.lua", }) defineTile('.', "GRASS_SHORT") defineTile('#', "TREE") @@ -36,24 +36,57 @@ defineTile('X', "HARDTREE") defineTile('~', "POISON_DEEP_WATER") defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}}) -defineTile('m', "GRASS_SHORT", nil, {random_filter={subtype="molds", add_levels=2}}) -defineTile('j', "GRASS_SHORT", nil, {random_filter={subtype="oozes", add_levels=2}}) +defineTile('m', "GRASS_SHORT", nil, {random_filter={subtype="molds", add_levels=5}}) +defineTile('j', "GRASS_SHORT", nil, {random_filter={subtype="oozes", add_levels=5}}) defineTile('$', "GRASS_SHORT", {random_filter={add_levels=5, tome_mod="vault"}}) +defineTile('*', "GRASS_SHORT", {random_filter={add_levels=10, tome_mod="vault"}}) -startx = 19 +startx = 3 starty = 7 - -return { -[[#XXXXXXXXX#####XXXX#]], -[[XXm~~~~~~XXXX#XX$$XX]], -[[X~~~~.j..~~jXXXmmmmX]], -[[X~.~~mXX.j~~~j..jjXX]], -[[Xm.~~XXXXX~~~~.jXXX#]], -[[XX.mmXXXXXXXXXXXX###]], -[[XmmmXXXXXXXXXXXXXXXX]], -[[X~~~mXXXX~.mmXXm...!]], -[[XXm..~m~....~~~~~mXX]], -[[#XXXX~~~mXXXm~m~XXX#]], -[[####XXXXXX#XXXXXX###]], +local version = rng.range(1,4) +if version == 1 then +return { -- switchback, similar to original +[[XXXXXXXXXXXXXXXX]], +[[XXm~~.m....X$*$X]], +[[X~..j..jXX.mmmmX]], +[[X~..mXXXXXXXXXXX]], +[[Xm.jm......jm..X]], +[[XXXXXXXXXXXX~~.X]], +[[X~~...mm....mm.X]], +[[XXX!XXXXXXXXXXXX]], +} +elseif version == 2 then +return { -- big pond, you can go through the poison to the loot, the better loot is in sight of the mob pile though +[[XXXXXXXXXXXXXXXX]], +[[XX...XjmmmmX..*X]], +[[X..XmmjjmmmmmX$X]], +[[X..XXXXXmjmmjX$X]], +[[X..~~~~XXXXXXX~X]], +[[XX.~~~~~~~~~~~~X]], +[[XX...~~~~~~~~~XX]], +[[XXX!XXXXXXXXXXXX]], +} +elseif version == 3 then +return { -- small pond, lots of jellies +[[XXXXXXXXXXXXXXXX]], +[[XXmjmXXj..jXX$XX]], +[[Xj..j..jX..mjjmX]], +[[Xj.~mXXXXXX.jj$X]], +[[Xm.~~~~~~~XjX..X]], +[[XX.mXX~~~~XjXj*X]], +[[Xm..XXX~~~XX~~~X]], +[[XXX!XXXXXXXXXXXX]], +} +else +return { -- small pond, nearly all mold, token jelly +[[XXXXXXXXXXXXXXXX]], +[[XX...mmm..m.X$XX]], +[[Xmm...~~XXXmXmjX]], +[[X....m~~mmXX...X]], +[[X....~~~~~mXmmmX]], +[[XX....m~~~~XX$mX]], +[[XX......m~~X*mmX]], +[[XXX!XXXXXXXXXXXX]], } +end diff --git a/game/modules/tome/data/maps/vaults/snake-pit.lua b/game/modules/tome/data/maps/vaults/snake-pit.lua new file mode 100644 index 0000000000000000000000000000000000000000..5fc4debb7f4d2479a1d3398ff473d33671bd3873 --- /dev/null +++ b/game/modules/tome/data/maps/vaults/snake-pit.lua @@ -0,0 +1,59 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +startx = 3 +starty = 4 + +setStatusAll{no_teleport=true, room_map = {can_open=false}} +specialList("actor", { + "/data/general/npcs/snake.lua", + "/data/general/npcs/molds.lua", + "/data/general/npcs/feline.lua", + "/data/general/npcs/ant.lua", + "/data/general/npcs/sandworm.lua", + "/data/general/npcs/spider.lua", + "/data/general/npcs/vermin.lua", + "/data/general/npcs/rodent.lua", +}) +rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +defineTile('#', "HARDWALL") +defineTile('!', "DOOR_VAULT") + +local mobs = { + "rattlesnake", + "green worm mass", + "giant ice ant", + "snow cat", + "green mold", + "giant grey rat", + "giant spider", + "sandworm" +} +local mob = rng.tableRemove(mobs) + +defineTile('s', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name=mob}}) + +return { +[[#####]], +[[#sss#]], +[[#sss!]], +[[#sss#]], +[[#####]], +} \ No newline at end of file diff --git a/game/modules/tome/data/maps/vaults/troll-hideout.lua b/game/modules/tome/data/maps/vaults/troll-hideout.lua index f699ea0aa0882447ff5fd85b06289d9c76fca0d6..c20db7f6f0314f7afd528a0f9ee226307444ebf2 100644 --- a/game/modules/tome/data/maps/vaults/troll-hideout.lua +++ b/game/modules/tome/data/maps/vaults/troll-hideout.lua @@ -19,11 +19,11 @@ setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} specialList("actor", { - "/data/general/npcs/troll.lua", + "/data/general/npcs/troll.lua", }) specialList("terrain", { - "/data/general/grids/water.lua", - "/data/general/grids/forest.lua", + "/data/general/grids/water.lua", + "/data/general/grids/forest.lua", }, true) border = 0 rotates = {"default", "90", "180", "270", "flipx", "flipy"} @@ -35,29 +35,80 @@ defineTile('#', "HARDWALL") defineTile('X', "TREE") defineTile('+', "DOOR") -defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="forest troll"}}) +defineTile('T', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, {random_filter={name="forest troll", add_levels=10}}) defineTile('t', "FLOOR", nil, {random_filter={name="forest troll"}}) -defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}}, nil) ---startx, starty = 0, 9 -return { +defineTile('$', "FLOOR", {random_filter={type="scroll", ego_chance=25}}) +defineTile('*', "FLOOR", {random_filter={mod="vault", add_levels=5}}) +startx, starty = 0, 9 + +local version = rng.range(1, 3) +if version == 1 then +return { -- original [[,,,,,,,,,,,,,,,,,,,,,,]], [[,,,XX,,X,,,,,,,,,,X,,,]], [[,,X~~~~~~~,,~~~~~XXX,,]], [[,XX~#####~,,~#####~,,,]], -[[,XX~#...#~~~~#...#~,X,]], -[[,XX~#.t.######.t.#~,,,]], +[[,XX~#...#~~~~#..*#~,X,]], +[[,XX~#.t.######.T.#~,,,]], [[,,X~#...#.t..+...#~,X,]], [[,XX~###+#..t.#####~,,,]], [[,XX~~~#....#####~~~,,,]], -[[,,,..t+....#$$$#~,,,X,]], -[[,,,..t+....+$$T#~,,,X,]], +[[,,,..t+....#$.$#~,,,X,]], +[[,,,..t+....+.$T#~,,,X,]], [[,XX~~~#....#####~~~,X,]], -[[,,X~###+#....#####~,X,]], -[[,,X~#...#....+...#~,X,]], -[[,,X~#.t.######.t.#~,,,]], -[[,XX~#...#~~~~#...#~,,,]], +[[,,X~###+#..t.#####~,X,]], +[[,,X~#...#.t..+...#~,X,]], +[[,,X~#.T.######.t.#~,,,]], +[[,XX~#*..#~~~~#...#~,,,]], [[,,X~#####~,,~#####~,,,]], [[,,X~~~~~~~,,~~~~~~~,,,]], [[,,XXX,X,,XXX,X,,XXX,,,]], [[,,,,,,,,,,,,,,,,,,,,,,]], } +elseif version == 2 then +return { -- ruined +[[,,,,,,,,,,,,,,,,,,,,,,]], +[[,,XXXXXXXXXXXXXXXXXX,,]], +[[,,X~~~~~~~,,~~~~~~~XX,]], +[[,XX~#####~,,~#####~,X,]], +[[,XX~#$.t#~~~~#.*.#~XX,]], +[[,XX~#,t.#.#~.#.T.#~X,,]], +[[,,X~#t..#....+.,,#~XX,]], +[[,XX~###+#..#.#####~,X,]], +[[,XX~~#...#....X.~~~,X,]], +[[,,,.~~.,,..X.t..~~,,X,]], +[[,,,.~t.#..T.,#.~~~~,X,]], +[[,XX~~~..,.,...~~~~~,X,]], +[[,,X~###+#..X.#####~,X,]], +[[,,X~#*.t#....+,,$#~XX,]], +[[,,X~#.T.#..#.#.t.#~X,,]], +[[,XX~#t.,#~~#~#$..#~X,,]], +[[,,X~#####~~~~#####~X,,]], +[[,,X~~~~~~~,,~~~~~~~X,,]], +[[,,XXXXXXXXXXXXXXXXXX,,]], +[[,,,,,,,,,,,,,,,,,,,,,,]], +} +else +return { -- fortified +[[,,,,,,,,,,,,,,,,,,,,,,]], +[[,,,XX,,X,,,,,,,,,,X,,,]], +[[,,X~~~~~~~,,~~~~~XXX,,]], +[[,XX~#####~~~~#####~,,,]], +[[,XX~#...######.$.#~,X,]], +[[,XX~#.T....#..t..#~,,,]], +[[,,X~#....#.#.#.t.#~,X,]], +[[,XX~###..#.#.#.###~,,,]], +[[,XX~~~#..#.#.#.#~~~,,,]], +[[,,,...+t.#.#.#.#~,,,X,]], +[[,,,...+t.#.#T#.#~,,,X,]], +[[,XX~~~#.##.#.#.#~~~,X,]], +[[,,X~#####....#.###~,X,]], +[[,,X~#$.#######t..#~,X,]], +[[,,X~#T.+..tt..t..#~,,,]], +[[,XX~#**#######..$#~,,,]], +[[,,X~#####~~~~#####~,,,]], +[[,,X~~~~~~~,,~~~~~~~,,,]], +[[,,XXX,X,,XXX,X,,XXX,,,]], +[[,,,,,,,,,,,,,,,,,,,,,,]], +} +end \ No newline at end of file diff --git a/game/modules/tome/data/maps/zones/collapsed-tower.lua b/game/modules/tome/data/maps/zones/collapsed-tower.lua new file mode 100644 index 0000000000000000000000000000000000000000..9297c5f92a97ddc108ebea4b65ea618d1ca2027f --- /dev/null +++ b/game/modules/tome/data/maps/zones/collapsed-tower.lua @@ -0,0 +1,96 @@ +-- ToME - Tales of Maj'Eyal +-- Copyright (C) 2009 - 2019 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 + +local Talents = require("engine.interface.ActorTalents") + +setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}} + +local turret = function() + local NPC = require "mod.class.NPC" + local m = NPC.new{ + type = "construct", subtype = "crystal", image="trap/trap_beam.png", + display = "t", + body = { INVEN = 10, MAINHAND=1, OFFHAND=1, BODY=1, QUIVER=1 }, + life_rating = 20, + rank = 2, + inc_damage = { all = -75, }, + + open_door = true, + cut_immune = 1, + blind_immune = 1, + fear_immune = 1, + poison_immune = 1, + disease_immune = 1, + stone_immune = 1, + see_invisible = 30, + no_breath = 1, + infravision = 10, + never_move = 1, + + autolevel = "caster", + level_range = {1, nil}, exp_worth = 1, + stats = { mag=16, con=22 }, + size_category = 2, + name = "arcane crystal", color=colors.BLUE, + combat = { dam=resolvers.rngavg(1,2), atk=2, apr=0, dammod={str=0.4} }, + combat_armor = 10, combat_def = 0, + talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, }, + + resolvers.talents{ + [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=10}, + }, + + ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, }, + + } + return m +end + +specialList("actor", { + "/data/general/npcs/skeleton.lua", +}) +specialList("terrain", { + "/data/general/grids/water.lua", + "/data/general/grids/forest.lua", +}, true) +border = 0 +--rotates = {"default", "90", "180", "270", "flipx", "flipy"} + +defineTile('.', "FLOOR") +defineTile('#', "HARDWALL") +defineTile('+', "DOOR") +defineTile('!', "DOOR_VAULT") +defineTile('>', "DOWN") + + +defineTile('b', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}}) +defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}}) +defineTile('t', "FLOOR", nil, turret()) + +local def = { +[[##############]], +[[##############]], +[[##.##.$...####]], +[[#t.....>..####]], +[[##.##...$.####]], +[[#b$##$....####]], +[[##############]], +} + +return def diff --git a/game/modules/tome/data/zones/halfling-ruins/zone.lua b/game/modules/tome/data/zones/halfling-ruins/zone.lua index 3717fda1ac4e1a953f5b1c7409a975414c82a032..b53655217728c76b2c6d5f11722a9a63f04f4776 100644 --- a/game/modules/tome/data/zones/halfling-ruins/zone.lua +++ b/game/modules/tome/data/zones/halfling-ruins/zone.lua @@ -35,8 +35,9 @@ return { map = { class = "engine.generator.map.Roomer", nb_rooms = 10, - rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}}, + rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}, {"greater_vault",10}}, lesser_vaults_list = {"circle","rat-nest","skeleton-mage-cabal"}, + greater_vaults_list = {"living-weapons"}, lite_room_chance = 100, ['.'] = "FLOOR", ['#'] = "WALL", diff --git a/game/modules/tome/data/zones/lake-nur/zone.lua b/game/modules/tome/data/zones/lake-nur/zone.lua index 54d5f85467c2a46e31a5498ba55bc4bc35257b21..87177ed49305e36e5ca424b4454f19e22dd34917 100644 --- a/game/modules/tome/data/zones/lake-nur/zone.lua +++ b/game/modules/tome/data/zones/lake-nur/zone.lua @@ -42,6 +42,7 @@ return { class = "engine.generator.map.Roomer", nb_rooms = 10, rooms = {"random_room"}, + lesser_vaults_list = {"flooded-prison"}, lite_room_chance = 0, ['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"}, ['#'] = "WATER_WALL", @@ -87,6 +88,9 @@ return { underwater = true, effects = {"EFF_ZONE_AURA_UNDERWATER"}, generator = { + map = { + rooms = {"random_room",{"lesser_vault",7}}, + }, actor = { filters = {{special_rarity="water_rarity"}}, }, @@ -96,6 +100,7 @@ return { underwater = is_flooded, generator = is_flooded and { map = { + rooms = {"random_room",{"lesser_vault",5}}, down = "SHERTUL_FORTRESS_FLOOD", ['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"}, force_last_stair = true, diff --git a/game/modules/tome/data/zones/old-forest/zone.lua b/game/modules/tome/data/zones/old-forest/zone.lua index a45f8f7fd99016faf4cbb78178a869d5793cfd3b..2c2104fa91ef34d5f348a473c2dbeef57f3ad30c 100644 --- a/game/modules/tome/data/zones/old-forest/zone.lua +++ b/game/modules/tome/data/zones/old-forest/zone.lua @@ -46,7 +46,7 @@ return { edge_entrances = {4,6}, rooms = {"forest_clearing", {"lesser_vault",8}}, rooms_config = {forest_clearing={pit_chance=5, filters={{type="insect", subtype="ant"}, {type="insect"}, {type="animal", subtype="snake"}, {type="animal", subtype="canine"}}}}, - lesser_vaults_list = {"honey_glade", "troll-hideout", "mage-hideout", "thief-hideout", "plantlife", "mold-path", "bandit-fortress","loot-vault"}, + lesser_vaults_list = {"honey_glade", "troll-hideout", "mage-hideout", "thief-hideout", "plantlife", "mold-path", "bandit-fortress","loot-vault","worms"}, ['.'] = "GRASS", ['#'] = "TREE", up = "GRASS_UP4", diff --git a/game/modules/tome/data/zones/rhaloren-camp/zone.lua b/game/modules/tome/data/zones/rhaloren-camp/zone.lua index b61674cb6636d90cd98a3a47ece383ea18a8e836..2b80656275f24cc2de05e61d0a68ab3d97fc1601 100644 --- a/game/modules/tome/data/zones/rhaloren-camp/zone.lua +++ b/game/modules/tome/data/zones/rhaloren-camp/zone.lua @@ -124,9 +124,9 @@ return { ['.'] = "FLOOR", ['+'] = "DOOR", - nb_rooms = {0,1,1,2}, + nb_rooms = {1,1,2}, rooms = {"lesser_vault"}, - lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal"}, + lesser_vaults_list = {"circle","amon-sul-crypt","skeleton-mage-cabal","collapsed-tower"}, lite_room_chance = 100, }, actor = { diff --git a/game/modules/tome/data/zones/ruins-kor-pul/zone.lua b/game/modules/tome/data/zones/ruins-kor-pul/zone.lua index 5b78063836386bd3dc5b2bac33d930a8b7933193..2b8a4ead84c3ec4f68f2a4895bd18852c1ca3f9c 100644 --- a/game/modules/tome/data/zones/ruins-kor-pul/zone.lua +++ b/game/modules/tome/data/zones/ruins-kor-pul/zone.lua @@ -42,7 +42,7 @@ return { class = "engine.generator.map.Roomer", nb_rooms = 10, rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}}, - lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal"}, + lesser_vaults_list = {"circle","amon-sul-crypt","rat-nest","skeleton-mage-cabal","crystal-cabal","snake-pit"}, lite_room_chance = 100, ['.'] = "FLOOR", ['#'] = "WALL", diff --git a/game/modules/tome/data/zones/scintillating-caves/zone.lua b/game/modules/tome/data/zones/scintillating-caves/zone.lua index 22379e17d4bd58a2bc2a52498717e889f36fb5f1..cb77d59fee3c6fde2f7228c87332640e320746ad 100644 --- a/game/modules/tome/data/zones/scintillating-caves/zone.lua +++ b/game/modules/tome/data/zones/scintillating-caves/zone.lua @@ -40,7 +40,8 @@ return { map = { class = "engine.generator.map.Roomer", nb_rooms = 5, - rooms = {"random_room", {"money_vault",5}}, + rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}}, + lesser_vaults_list = {"amon-sul-crypt","skeleton-mage-cabal","crystal-cabal","snake-pit"}, lite_room_chance = 20, ['.'] = "CRYSTAL_FLOOR", ['#'] = {"CRYSTAL_WALL","CRYSTAL_WALL2","CRYSTAL_WALL3","CRYSTAL_WALL4","CRYSTAL_WALL5","CRYSTAL_WALL6","CRYSTAL_WALL7","CRYSTAL_WALL8","CRYSTAL_WALL9","CRYSTAL_WALL10","CRYSTAL_WALL11","CRYSTAL_WALL12","CRYSTAL_WALL13","CRYSTAL_WALL14","CRYSTAL_WALL15","CRYSTAL_WALL16","CRYSTAL_WALL17","CRYSTAL_WALL18","CRYSTAL_WALL19","CRYSTAL_WALL20",}, diff --git a/game/modules/tome/data/zones/slazish-fen/zone.lua b/game/modules/tome/data/zones/slazish-fen/zone.lua index 80b4d6500dbf48146e746261e60eb8ef45c07aa6..675692f8eebcd5a5ed91562787a88bc517972184 100644 --- a/game/modules/tome/data/zones/slazish-fen/zone.lua +++ b/game/modules/tome/data/zones/slazish-fen/zone.lua @@ -53,7 +53,7 @@ return { -- nb_rooms = {0,0,0,1}, -- rooms = {"lesser_vault"}, --- lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"}, +-- lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout"}, -- lite_room_chance = 100, }, actor = { diff --git a/game/modules/tome/data/zones/trollmire/zone.lua b/game/modules/tome/data/zones/trollmire/zone.lua index bf6d4b23f108a28f32e692262d62b8f968a94b59..11c4475c5e5fb1c9e4d44c9a36e192fdf156c189 100644 --- a/game/modules/tome/data/zones/trollmire/zone.lua +++ b/game/modules/tome/data/zones/trollmire/zone.lua @@ -61,9 +61,9 @@ return { road = "GRASS_ROAD_DIRT", add_road = true, - nb_rooms = {0,0,0,1}, + nb_rooms = {0,1}, rooms = {"lesser_vault"}, - lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"}, + lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout", "collapsed-tower"}, lite_room_chance = 100, }, actor = { @@ -189,9 +189,9 @@ return { pond = {{0.6, "DEEP_WATER"}, {0.8, "DEEP_WATER"}}, }, - nb_rooms = {0,0,0,1}, + nb_rooms = {0,1}, rooms = {"lesser_vault"}, - lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "forest-snake-pit", "mage-hideout"}, + lesser_vaults_list = {"honey_glade", "forest-ruined-building1", "forest-ruined-building2", "forest-ruined-building3", "snake-pit", "mage-hideout", "collapsed-tower"}, lite_room_chance = 100, }, actor = {