Commit 43bbeee0f34133830651062861d19f33c1c5ddb3

Authored by DarkGod
2 parents 4146f63d 87d314e2

Merge branch 'master' of git.net-core.org:tome/t-engine4

... ... @@ -38,7 +38,9 @@ newEntity{
38 38 size_category = 3,
39 39
40 40 resolvers.racial(),
41   -
  41 + rnd_boss_init = function(self, data)
  42 + self.inc_damage.all = (self.inc_damage.all or 0) - 30 -- Compensate for high base damage talents
  43 + end,
42 44 open_door = true,
43 45 resolvers.sustains_at_birth(),
44 46 resolvers.inscriptions(3, "infusion"),
... ...
... ... @@ -92,6 +92,8 @@ newEntity{
92 92 },
93 93 }
94 94
  95 +-- this makes the item worse
  96 +--[[
95 97 newEntity{
96 98 power_source = {technique=true},
97 99 name = "burglar's ", prefix=true, instant_resolve=true,
... ... @@ -108,6 +110,7 @@ newEntity{
108 110 infravision = resolvers.mbonus_material(5, 4),
109 111 },
110 112 }
  113 +]]
111 114
112 115 newEntity{
113 116 power_source = {psionic=true},
... ...
... ... @@ -120,7 +120,7 @@ defineTile('W', "FLOOR", nil,
120 120 end,
121 121 random_filter={special_rarity="wyrm_rarity",
122 122 add_levels=10,
123   - random_boss={name_scheme="Sleeping #rng#", force_classes={Wyrmic=true}, class_filter=function(d) return d.power_source and ((d.power_source.nature or d.power_source.technique) and not d.power_source.arcane) end, loot_quality="store", loot_quantity=1, rank=3.5}
  123 + random_boss={name_scheme="Sleeping #rng#", force_classes={Wyrmic=true}, class_filter=function(d) return d.power_source and ((d.power_source.nature or d.power_source.technique) and not d.power_source.arcane) and d.name ~= "Wyrmic" end, loot_quality="store", loot_quantity=1, rank=3.5}
124 124 }
125 125 }
126 126 )
... ... @@ -135,7 +135,7 @@ defineTile('D', "FLOOR", nil,
135 135 return e
136 136 end,
137 137 random_filter={special_rarity="drake_rarity",
138   - random_boss={name_scheme="Dozing #rng#", force_classes={Wyrmic=true}, class_filter=function(d) return d.power_source and ((d.power_source.nature or d.power_source.technique) and not d.power_source.arcane) end, nb_classes=1, loot_quality="store", loot_quantity=1, rank=3.5}
  138 + random_boss={name_scheme="Dozing #rng#", force_classes={Wyrmic=true}, class_filter=function(d) return d.power_source and ((d.power_source.nature or d.power_source.technique) and not d.power_source.arcane) and d.name ~= "Wyrmic" end, nb_classes=1, loot_quality="store", loot_quantity=1, rank=3.5}
139 139 }
140 140 }
141 141 )
... ...
... ... @@ -33,9 +33,8 @@ defineTile('.', "FLOOR")
33 33 defineTile('#', "HARDWALL")
34 34 defineTile('!', "DOOR_VAULT")
35 35
36   -defineTile('$', "FLOOR", {random_filter={add_levels=20, type="money"}})
37   -defineTile('*', "FLOOR", {random_filter={add_levels=15, tome_mod="gvault"}})
38   -defineTile('~', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}})
  36 +defineTile('*', "FLOOR", {random_filter={add_levels=20, tome_mod="gvault"}})
  37 +defineTile('~', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}})
39 38
40 39 defineTile('w', "FLOOR", nil, {random_filter={add_levels=10, name = "carrion worm mass"}} )
41 40 defineTile('W', "FLOOR", nil, {random_filter={add_levels=5, name = "worm that walks"}} )
... ... @@ -45,8 +44,8 @@ return {
45 44 [[#~~w*w~~#]],
46 45 [[#..www..#]],
47 46 [[#..ooo..#]],
48   - [[#.......#]],
49   - [[#.Wo.oW.#]],
50   - [[#$$o.o$$#]],
  47 + [[#..w.o..#]],
  48 + [[#.WowoW.#]],
  49 + [[#~~o.o~~#]],
51 50 [[####!####]],
52 51 }
\ No newline at end of file
... ...
... ... @@ -53,7 +53,7 @@ local turret = function(version)
53 53 talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, },
54 54
55 55 resolvers.talents{
56   - [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=9},
  56 + [Talents.T_ELEMENTAL_BOLT]={base=2, every=4, max=8},
57 57 },
58 58
59 59 ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, },
... ...
... ... @@ -58,7 +58,7 @@ if vaultvariations == 1 then -- Gloomy theme
58 58 end,
59 59 random_filter={name="honey tree", add_levels=4}}
60 60 )
61   - defineTile('P', "FLOOR", nil,
  61 + defineTile('P', "GRASS", nil,
62 62 {entity_mod=function(e)
63 63 e.make_escort = nil
64 64 e.name = rng.table{"gloomy ", "deformed ", "sick "}..e.name
... ... @@ -81,11 +81,11 @@ if vaultvariations == 1 then -- Gloomy theme
81 81 return {
82 82 [[,,,,,,,,,,,,,,,,,,,,,]],
83 83 [[,#################X,,]],
84   - [[,#....#.....,,#,X,,X,]],
85   - [[,#P...+......,+,...#,]],
  84 + [[,#i...#.....,,#,X,,X,]],
  85 + [[,#P...+......,+,..i#,]],
86 86 [[,######...T...######,]],
87 87 [[,#.,,,,.......+..i.#,]],
88   - [[,#..,,#,,.....#B...#,]],
  88 + [[,#i.,B#,,.....#B...#,]],
89 89 [[,########+#+########,]],
90 90 [[,,,,,,,,,,,,,,,,,,,,,]],
91 91 }
... ... @@ -121,27 +121,27 @@ elseif vaultvariations == 2 then -- FLooded theme
121 121 [[,,,,,,,,,,,,,,,,,,~~~]],
122 122 [[,#################X~~]],
123 123 [[,#~P~~#~~~~~~~#~~~~X~]],
124   - [[,#~~~,+,~~~~~~X~~~~#,]],
  124 + [[,#~~~,+,~~~~~~X~~P~#,]],
125 125 [[,######,~~T~~~######,]],
126 126 [[,#~~i,+,~~~~~,+,~~~#,]],
127   - [[,#~~~,#,,,,,,,#~~~B#,]],
  127 + [[,#B~~,#i,,,,,i#~~~B#,]],
128 128 [[,########+#+########,]],
129 129 [[,,,,,,,,,,,,,,,,,,,,,]],
130 130 }
131 131
132 132 else -- Normal theme
133 133 defineTile('T', "GRASS", nil, {random_filter={name="honey tree", add_levels=4}})
134   - defineTile('P', "FLORR", nil, {random_filter={name="giant venus flytrap", add_levels=4}})
  134 + defineTile('P', "GRASS", nil, {random_filter={name="giant venus flytrap", add_levels=4}})
135 135 defineTile('B', "FLOOR", nil, {random_filter={name="brown bear", add_levels=4}})
136 136 defineTile('i', "FLOOR", {random_filter={add_levels=4, tome_mod="vault"}})
137 137 return {
138 138 [[,,,,,,,,,,,,,,,,,,,,,]],
139 139 [[,#################X,,]],
140   - [[,#....#.,..,..#.X.,X,]],
141   - [[,#.i..+..,,,..+..,.#,]],
  140 + [[,#B...#.,..,..#iX.,X,]],
  141 + [[,#.i..+..,,,..+..,P#,]],
142 142 [[,######..,T,,.######,]],
143   - [[,#....+.,,,,..+....#,]],
144   - [[,#P...#....,,.#B...#,]],
  143 + [[,#i...+.,,,,..+...P#,]],
  144 + [[,#P...#....,,.#B..i#,]],
145 145 [[,########+#+########,]],
146 146 [[,,,,,,,,,,,,,,,,,,,,,]],
147 147 }
... ...
  1 +-- ToME - Tales of Maj'Eyal
  2 +-- Copyright (C) 2009 - 2019 Nicolas Casalini
  3 +--
  4 +-- This program is free software: you can redistribute it and/or modify
  5 +-- it under the terms of the GNU General Public License as published by
  6 +-- the Free Software Foundation, either version 3 of the License, or
  7 +-- (at your option) any later version.
  8 +--
  9 +-- This program is distributed in the hope that it will be useful,
  10 +-- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +-- GNU General Public License for more details.
  13 +--
  14 +-- You should have received a copy of the GNU General Public License
  15 +-- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +--
  17 +-- Nicolas Casalini "DarkGod"
  18 +-- darkgod@te4.org
  19 +
  20 +specialList("actor", {
  21 + "/data/general/npcs/orc-grushnak.lua",
  22 + "/data/general/npcs/orc.lua",
  23 + "/data/general/npcs/bear.lua",
  24 +})
  25 +
  26 +specialList("terrain", {
  27 + "/data/general/grids/basic.lua",
  28 + "/data/zones/grushnak-pride/grids.lua",
  29 +})
  30 +
  31 +setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
  32 +rotates = {"default", "90", "180", "270", "flipx", "flipy"}
  33 +
  34 +defineTile('.', "FLOOR")
  35 +defineTile('+', "DOOR")
  36 +defineTile('!', "DOOR_VAULT")
  37 +defineTile('#', "HARDWALL")
  38 +
  39 +defineTile('G', "FLOOR", {random_filter={add_levels=5, tome_mod="uvault"}}, {random_filter={add_levels=15, name = "orc archer", random_boss={name_scheme="#rng# the Archer", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=3.5, force_classes={Archer=true}}}} )
  40 +defineTile('B', "FLOOR", {random_filter={add_levels=5, tome_mod="uvault"}}, {random_filter={add_levels=12, name = "war bear", random_boss={name_scheme="Warbear #rng#", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3.5, force_classes={Brawler=true}}}} )
  41 +defineTile('o', "FLOOR", nil, nil, {random_filter={name="sliding rock"}})
  42 +defineTile('T', "FLOOR", {random_filter={add_levels=15, tome_mod="uvault"}}, {random_filter={add_levels=16, name = "orc elite fighter", random_boss={name_scheme="Elite Combat Trainer #rng#", force_classes={Bulwark=true}, nb_classes=2, class_filter=function(d) return d.power_source and d.power_source.technique and not d.power_source.arcane and d.name ~= "Bulwark" end, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=4}}})
  43 +defineTile('t', "FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=5, name = "orc elite fighter"}})
  44 +defineTile('C', "FLOOR", {random_filter={add_levels=15, tome_mod="uvault"}}, {random_filter={add_levels=16, name = "orc elite berserker", random_boss={name_scheme="Elite Combat Trainer #rng#", force_classes={Berserker=true}, nb_classes=2, class_filter=function(d) return d.power_source and d.power_source.technique and not d.power_source.arcane and d.name ~= "Berserker" end, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=4}}})
  45 +defineTile('c', "FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=5, name = "orc elite berserker"}})
  46 +defineTile('D', "TRAINING_DUMMY")
  47 +defineTile('w', "FLOOR", {random_filter={type='weapon', add_levels=16, tome_mod="gvault"}})
  48 +defineTile('W', "FLOOR", {random_filter={type='weapon', add_levels=25, tome_mod="uvault"}})
  49 +defineTile('a', "FLOOR", {random_filter={type='armor', add_levels=16, tome_mod="gvault"}})
  50 +defineTile('A', "FLOOR", {random_filter={type='armor', add_levels=25, tome_mod="uvault"}})
  51 +defineTile('b', "FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=20, name = "orc elite berserker"}})
  52 +defineTile('f', "FLOOR", {random_filter={add_levels=10, type="jewelry", tome_mod="gvault"}}, {random_filter={add_levels=20, name = "orc elite fighter"}})
  53 +
  54 +return {
  55 +[[#########################]],
  56 +[[##.G#DB.+wW#AAaa#B.D#DfD#]],
  57 +[[##..#C..#wW###Aa+..T#bfb#]],
  58 +[[##..#D.t#wwWW#Aa#c.D#f.b#]],
  59 +[[##.###+###########+###+##]],
  60 +[[!o..+...................#]],
  61 +[[##.###+###########+###+##]],
  62 +[[##..#D.c#wwWW#Aa#B.D#b.f#]],
  63 +[[##..#T..#wW###Aa+..C#bfb#]],
  64 +[[##.G#DB.+wW#AAaa#t.D#DfD#]],
  65 +[[#########################]],
  66 +}
... ...
  1 +-- ToME - Tales of Maj'Eyal
  2 +-- Copyright (C) 2009 - 2019 Nicolas Casalini
  3 +--
  4 +-- This program is free software: you can redistribute it and/or modify
  5 +-- it under the terms of the GNU General Public License as published by
  6 +-- the Free Software Foundation, either version 3 of the License, or
  7 +-- (at your option) any later version.
  8 +--
  9 +-- This program is distributed in the hope that it will be useful,
  10 +-- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +-- GNU General Public License for more details.
  13 +--
  14 +-- You should have received a copy of the GNU General Public License
  15 +-- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +--
  17 +-- Nicolas Casalini "DarkGod"
  18 +-- darkgod@te4.org
  19 +
  20 +specialList("actor", {
  21 + "/data/general/npcs/orc-vor.lua",
  22 + "/data/general/npcs/bird.lua",
  23 + "/data/general/npcs/faeros.lua",
  24 +})
  25 +
  26 +specialList("terrain", {
  27 + "/data/general/grids/burntland.lua",
  28 + "/data/general/grids/lava.lua",
  29 + "/data/general/grids/gothic.lua",
  30 + "/data/general/grids/basic.lua",
  31 + "/data/zones/vor-pride/grids.lua",
  32 +})
  33 +
  34 +setStatusAll{no_teleport=true}
  35 +rotates = {"default", "90", "180", "270", "flipx", "flipy"}
  36 +
  37 +defineTile('.', "BURNT_GROUND")
  38 +defineTile('T', "LAVA_WALL")
  39 +defineTile('L', function() if rng.percent(50) then return "LAVA_FLOOR" else return "BURNT_GROUND" end end)
  40 +defineTile('#', "HARDWALL")
  41 +defineTile('!', "DOOR_VAULT")
  42 +defineTile('B', "GENERIC_BOOK2")
  43 +
  44 +defineTile('*', "BURNT_GROUND", {random_filter={add_levels=15, tome_mod="gvault"}})
  45 +defineTile('*', "BURNT_GROUND", {random_filter={add_levels=5, tome_mod="uvault"}})
  46 +
  47 +defineTile('P', "LAVA_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {random_filter={add_levels=22, name = "Phoenix"}})
  48 +--fierce guardian being summoned--triple class ultimate faeros
  49 +defineTile('F', "LAVA_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {random_filter={add_levels=10, name = "ultimate faeros", random_boss={name_scheme="#rng# the Flamebringer", force_classes={Archmage=true}, nb_classes=2, class_filter=function(d) return d.power_source and (d.power_source.arcane and not d.power_source.technique) and d.name ~= "Archmage" end, ai_move="move_complex", rank=4}}})
  50 +defineTile('f', "BURNT_GROUND", nil, {random_filter={add_levels=5, name = "greater faeros"}} )
  51 +defineTile('M', "BURNT_GROUND", {random_filter={add_levels=12, tome_mod="uvault"}}, {random_filter={add_levels=7, name = "orc high pyromancer", random_boss={name_scheme="#rng# the Invoker", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=3.5, force_classes={Archmage=true}}}})
  52 +defineTile('m', "BURNT_GROUND", nil, {random_filter={add_levels=5, name = "orc pyromancer"}} )
  53 +
  54 +if rng.percent(7) then --rare phoenix-7% to show in here plus 35% this vault shows gives 2.5% chance per game for a phoenix from one of these
  55 +return {
  56 + [[###########]],
  57 + [[#**Tf.fT**#]],
  58 + [[#mm.LLL.mm#]],
  59 + [[#MB.LPL.BM#]],
  60 + [[#T..LLL..T#]],
  61 + [[#TT.....TT#]],
  62 + [[#+*T...T*+#]],
  63 + [[#####!#####]],
  64 +}
  65 +else
  66 +return {
  67 + [[###########]],
  68 + [[#**Tf.fT**#]],
  69 + [[#mm.LLL.mm#]],
  70 + [[#MB.LFL.BM#]],
  71 + [[#T..LLL..T#]],
  72 + [[#TT.....TT#]],
  73 + [[#+*T...T*+#]],
  74 + [[#####!#####]],
  75 +}
  76 +end
\ No newline at end of file
... ...
  1 +-- ToME - Tales of Maj'Eyal
  2 +-- Copyright (C) 2009 - 2019 Nicolas Casalini
  3 +--
  4 +-- This program is free software: you can redistribute it and/or modify
  5 +-- it under the terms of the GNU General Public License as published by
  6 +-- the Free Software Foundation, either version 3 of the License, or
  7 +-- (at your option) any later version.
  8 +--
  9 +-- This program is distributed in the hope that it will be useful,
  10 +-- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +-- GNU General Public License for more details.
  13 +--
  14 +-- You should have received a copy of the GNU General Public License
  15 +-- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +--
  17 +-- Nicolas Casalini "DarkGod"
  18 +-- darkgod@te4.org
  19 +
  20 +specialList("actor", {
  21 + "/data/general/npcs/orc-rak-shor.lua",
  22 + "/data/general/npcs/horror-undead.lua",
  23 + "/data/general/npcs/ghoul.lua",
  24 + "/data/general/npcs/lich.lua",
  25 +})
  26 +
  27 +specialList("terrain", {
  28 + "/data/general/grids/bone.lua",
  29 + "/data/general/grids/gothic.lua",
  30 + "/data/general/grids/basic.lua",
  31 +})
  32 +
  33 +setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
  34 +rotates = {"default", "90", "180", "270", "flipx", "flipy"}
  35 +
  36 +defineTile('.', "BONEFLOOR")
  37 +defineTile('+', "DOOR")
  38 +defineTile('!', "DOOR_VAULT")
  39 +defineTile('#', "HARDBONEWALL")
  40 +
  41 +defineTile(',', "BONEFLOOR", {random_filter={add_levels=16, tome_mod="gvault"}})
  42 +defineTile('a', "BONEFLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=10, name = "necrotic abomination"}})
  43 +defineTile('s', "BONEFLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=10, name = "sanguine horror"}})
  44 +defineTile('b', "BONEFLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=10, name = "bone horror"}})
  45 +defineTile('g', "BONEFLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "ghoulking"}})
  46 +defineTile('n', "BONEFLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "orc necromancer"}})
  47 +defineTile('l', "BONEFLOOR", {random_filter={add_levels=20, tome_mod="uvault"}}, {random_filter={add_levels=33, name = "lich"}})
  48 +defineTile('N', "BONEFLOOR", {random_filter={add_levels=12, tome_mod="uvault"}}, {random_filter={add_levels=22, name = "orc necromancer", random_boss={name_scheme="Grand Necromancer #rng#", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=3.5, force_classes={Necromancer=true}}}} )
  49 +defineTile('C', "BONEFLOOR", {random_filter={add_levels=12, tome_mod="uvault"}}, {random_filter={add_levels=16, name = "orc blood mage", random_boss={name_scheme="Inquisitor #rng#", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=3.5, force_classes={Corruptor=true}}}} )
  50 +defineTile('M', "BONEFLOOR", {random_filter={add_levels=12, tome_mod="uvault"}}, {random_filter={add_levels=25, name = "sanguine horror", random_boss={name_scheme="#rng# the Tortured Mass", nb_classes=2, class_filter=function(d) return d.power_source and d.power_source.arcane and not d.power_source.technique and d.name ~= "Corruptor" end, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=4, force_classes={Corruptor=true}}}} )
  51 +defineTile('T', "BONEFLOOR", {random_filter={add_levels=12, tome_mod="uvault"}}, {random_filter={add_levels=25, name = "bone horror", random_boss={name_scheme="Tortured Mass #rng#", nb_classes=2, class_filter=function(d) return d.power_source and d.power_source.arcane and d.power_source.technique and d.name ~= "Reaver" end, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=4, force_classes={Reaver=true}}}} )
  52 +
  53 +return {
  54 +[[.#####....#####]],
  55 +[[.#,.T######g.,#]],
  56 +[[.#,..#n...#..M#]],
  57 +[[.#,g.#....+.,,#]],
  58 +[[.###+#.n..#####]],
  59 +[[..#.....######.]],
  60 +[[..!.....#a..l#.]],
  61 +[[..!....N+..,,#.]],
  62 +[[..#..a..######.]],
  63 +[[.###+#...n#####]],
  64 +[[.#T.s#....+..g#]],
  65 +[[.#..,#C.a.#.,,#]],
  66 +[[.#g,,######M,,#]],
  67 +[[.#####....#####]],
  68 +}
... ...
  1 +-- ToME - Tales of Maj'Eyal
  2 +-- Copyright (C) 2009 - 2019 Nicolas Casalini
  3 +--
  4 +-- This program is free software: you can redistribute it and/or modify
  5 +-- it under the terms of the GNU General Public License as published by
  6 +-- the Free Software Foundation, either version 3 of the License, or
  7 +-- (at your option) any later version.
  8 +--
  9 +-- This program is distributed in the hope that it will be useful,
  10 +-- but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12 +-- GNU General Public License for more details.
  13 +--
  14 +-- You should have received a copy of the GNU General Public License
  15 +-- along with this program. If not, see <http://www.gnu.org/licenses/>.
  16 +--
  17 +-- Nicolas Casalini "DarkGod"
  18 +-- darkgod@te4.org
  19 +
  20 +specialList("actor", {
  21 + "/data/general/npcs/fire-drake.lua",
  22 + "/data/general/npcs/storm-drake.lua",
  23 + "/data/general/npcs/cold-drake.lua",
  24 + "/data/general/npcs/venom-drake.lua",
  25 + "/data/general/npcs/orc-gorbat.lua",
  26 +})
  27 +
  28 +specialList("terrain", {
  29 + "/data/general/grids/burntland.lua",
  30 + "/data/general/grids/lava.lua",
  31 + "/data/general/grids/mountain.lua",
  32 + "/data/general/grids/ice.lua",
  33 + "/data/general/grids/slime.lua",
  34 + "/data/general/grids/jungle.lua",
  35 + "/data/general/grids/basic.lua",
  36 + "/data/zones/gorbat-pride/grids.lua",
  37 +})
  38 +
  39 +setStatusAll{no_teleport=true, vault_only_door_open=true, room_map = {can_open=true}}
  40 +rotates = {"default", "90", "180", "270", "flipx", "flipy"}
  41 +
  42 +defineTile(',', "FENCE_FLOOR")
  43 +defineTile('.', "FENCE_FLOOR")
  44 +defineTile('#', "HARDMOUNTAIN_WALL")
  45 +defineTile('D', "DOOR")
  46 +defineTile('i', "ICY_FLOOR")
  47 +defineTile('a', function() if rng.percent(33) then return "LAVA_FLOOR" else return "BURNT_GROUND" end end)
  48 +defineTile('l', "CRYSTAL_FLOOR")
  49 +defineTile('L', "WALL")
  50 +defineTile('e', "SLIME_FLOOR")
  51 +defineTile('!', "DOOR_VAULT")
  52 +defineTile('|', "MOUNTAIN_WALL")
  53 +defineTile('R', "ROCKY_GROUND")
  54 +
  55 +local Talents = require("engine.interface.ActorTalents")
  56 +defineTile('W', "FENCE_FLOOR", {random_filter={add_levels=15, tome_mod="uvault"}}, {random_filter={add_levels=15, name = "orc master wyrmic", random_boss={name_scheme="#rng# the Herald", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=3.5, force_classes={Wyrmic=true}}}} )
  57 +defineTile('m', "FENCE_FLOOR", {random_filter={add_levels=30, type="money"}}, {random_filter={add_levels=12, name = "orc grand summoner", random_boss={name_scheme="Beastmaster #rng#", nb_classes=0, loot_quality="store", loot_quantity=1, no_loot_randart=true, ai_move="move_complex", rank=3.2, force_classes={Summoner=true}}}} )
  58 +defineTile('F', "LAVA_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {entity_mod=function(e)
  59 + e[#e+1] = resolvers.talents{
  60 + [Talents.T_BLASTWAVE]={base=4, every=12, max=10},
  61 + [Talents.T_BURNING_WAKE]={base=4, every=12, max=12},
  62 + [Talents.T_CLEANSING_FLAMES]={base=3, every=15, max=8},
  63 + [Talents.T_WILDFIRE]={base=3, every=15, max=7},}
  64 + e:resolve()
  65 + return e end, random_filter={add_levels=25, name = "fire wyrm", random_boss={name_scheme="#rng# the Flame Terror", nb_classes=2, class_filter=function(d) return d.power_source and (d.power_source.arcane) and d.name ~= "Sun Paladin" end, loot_quality="store", loot_quantity=1, ai_move="move_complex", rank=4, force_classes={['Sun Paladin']=true}}}} )
  66 +defineTile('f', "BURNT_GROUND", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "fire drake"}} )
  67 +defineTile('S', "CRYSTAL_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {entity_mod=function(e)
  68 + e[#e+1] = resolvers.talents{
  69 + [Talents.T_NOVA]={base=4, every=12, max=10},
  70 + [Talents.T_THUNDERCLAP]={base=4, every=12, max=12},
  71 + [Talents.T_HURRICANE]={base=3, every=15, max=8},
  72 + [Talents.T_TEMPEST]={base=3, every=15, max=7},
  73 + [Talents.T_LIVING_LIGHTNING]={base=1, every=20, max=4},}
  74 + e:resolve()
  75 + return e end, random_filter={add_levels=25, name = "storm wyrm", random_boss={name_scheme="#rng# the Storm Terror", nb_classes=2, class_filter=function(d) return d.power_source and (d.power_source.arcane) and d.name ~= "Archmage" end, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=4, force_classes={Archmage=true}}}} )
  76 +defineTile('s', "CRYSTAL_FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "storm drake"}} )
  77 +defineTile('C', "ICY_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {entity_mod=function(e)
  78 + e[#e+1] = resolvers.talents{
  79 + [Talents.T_FREEZE]={base=4, every=12, max=10},
  80 + [Talents.T_SHIVGOROTH_FORM]={base=4, every=12, max=12},
  81 + [Talents.T_BODY_OF_ICE]={base=3, every=15, max=8},
  82 + [Talents.T_UTTERCOLD]={base=3, every=15, max=7},}
  83 + e:resolve()
  84 + return e end, random_filter={add_levels=25, name = "ice wyrm", random_boss={name_scheme="#rng# the Fozen Terror", nb_classes=2, class_filter=function(d) return d.power_source and (d.power_source.nature or d.power_source.technique) and d.name ~= "Wyrmic" end, loot_quality="store", loot_quantity=1, no_loot_randart=true, loot_unique=true, ai_move="move_complex", rank=4, force_classes={Wyrmic=true}}}} )
  85 +defineTile('c', "ICY_FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "cold drake"}} )
  86 +defineTile('V', "SLIME_FLOOR", {random_filter={add_levels=25, tome_mod="uvault"}}, {entity_mod=function(e)
  87 + e[#e+1] = resolvers.talents{
  88 + [Talents.T_INDISCERNIBLE_ANATOMY]={base=4, every=12, max=10},
  89 + [Talents.T_GRAND_ARRIVAL]=3,
  90 + [Talents.T_WILD_SUMMON]=4,
  91 + [Talents.T_ACIDIC_SOIL]={base=3, every=15, max=7},
  92 + [Talents.T_UNSTOPPABLE_NATURE]={base=3, every=15, max=7},}
  93 + e:resolve()
  94 + return e end, random_filter={add_levels=25, name = "venom wyrm", random_boss={name_scheme="#rng# the Caustic Terror", nb_classes=2, class_filter=function(d) return d.power_source and (d.power_source.nature) and d.name ~= "Oozemancer" end, loot_quality="store", loot_quantity=1, ai_move="move_complex", rank=4, force_classes={Oozemancer=true}}}} )
  95 +defineTile('v', "SLIME_FLOOR", {random_filter={add_levels=20, type="money"}}, {random_filter={add_levels=12, name = "venom drake"}} )
  96 +
  97 +
  98 +return {
  99 + [[,#######################,]],
  100 + [[,#veeeeLve......fLaaaaf#,]],
  101 + [[,#eeeeeDRRRRRRRRRDaaaaa#,]],
  102 + [[,#veevVLWm..R..mWLFfaaf#,]],
  103 + [[,#||||||||||R||||||||||#,]],
  104 + [[,#sllsSLWm..R..mWLCciic#,]],
  105 + [[,#lllllDRRRRRRRRRDiiiii#,]],
  106 + [[,#sllllLsl..R.iicLiiiic#,]],
  107 + [[,###########!###########,]],
  108 + [[,,,,,,,,,,,,,,,,,,,,,,,,,]],
  109 +}
... ...
... ... @@ -53,7 +53,7 @@ local turret = function()
53 53 talent_cd_reduction={[Talents.T_ELEMENTAL_BOLT]=3, },
54 54
55 55 resolvers.talents{
56   - [Talents.T_ELEMENTAL_BOLT]={base=1, every=5, max=10},
  56 + [Talents.T_ELEMENTAL_BOLT]={base=3, every=5, max=10},
57 57 },
58 58
59 59 ai = "dumb_talented_simple", ai_state = { ai_move="move_complex", talent_in=3, },
... ... @@ -78,17 +78,19 @@ defineTile('!', "DOOR_VAULT")
78 78 defineTile('>', "DYNAMIC_ZONE_EXIT")
79 79
80 80
81   -defineTile('b', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}})
  81 +defineTile('b', "FLOOR", {random_filter={add_levels=20, tome_mod="gvault"}}, {random_filter={add_levels=5, name="skeleton magus"}})
82 82 defineTile('$', "FLOOR", {random_filter={add_levels=25, type="money"}})
83   -defineTile('t', "FLOOR", nil, turret())
  83 +defineTile('j', "FLOOR", {random_filter={add_levels=10, type="jewelry", tome_mod="gvault"}})
  84 +defineTile('t', "FLOOR", {random_filter={add_levels=5, tome_mod="gvault"}}, turret())
84 85
85 86 local def = {
86 87 [[##############]],
87 88 [[##############]],
88   -[[##.##.$...####]],
89   -[[#t.....>..####]],
  89 +[[##.##t$..t####]],
  90 +[[#t.+...>..####]],
90 91 [[##.##...$.####]],
91   -[[#b$##$....####]],
  92 +[[#b$$#$...t####]],
  93 +[[#jjj##########]],
92 94 [[##############]],
93 95 }
94 96
... ...
... ... @@ -99,7 +99,7 @@ newTalent{
99 99 local eq = t.getEq(self, t)
100 100 local turn = t.getTurn(self, t)
101 101 return ([[Your fungus reaches into the primordial ages of the world, granting you ancient instincts.
102   - Each time you receive non-regeneration healing you gain %d%% of a turn per 100 life healed. This effect can't add energy past 2 stored turns and overhealing is not counted.
  102 + Each time you receive non-regeneration healing you gain %0.1f%% of a turn per 100 life healed. This effect can't add energy past 2 stored turns and overhealing is not counted.
103 103 Also, regeneration effects on you will decrease your equilibrium by %0.1f each turn.
104 104 The turn gain increases with your Mindpower.]]):
105 105 format(turn * 100, eq)
... ...
... ... @@ -23,5 +23,5 @@ return { one_per_level=true,
23 23 {name="whistling-vortex", minor=true, percent=50},
24 24 {name="glowing-chest", minor=true, percent=30},
25 25 {name="glowing-chest", minor=true, percent=30},
26   - {name="sub-vault", minor=true, percent=100, max_repeat=3},
  26 + {name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
27 27 }
... ...
... ... @@ -74,6 +74,11 @@ tm:applyOnGroups(rooms, function(room, idx)
74 74 end)
75 75 if levers_placed < 2 then return self:redo() end
76 76
  77 +if rng.percent(15) and not game.state:doneEvent("renegade-wyrmics") then
  78 + game.state:doneEvent("renegade-wyrmics",1) -- special vault! can only show once per game and only in gorbat pride; contains exceptionally difficult foes and exceptional loot
  79 + game.level.data.generator.map.greater_vaults_list = {"renegade-wyrmics"}
  80 +end
  81 +
77 82 -- Complete the map by putting wall in all the remaining blank spaces
78 83 tm:fillAll()
79 84
... ...
... ... @@ -21,5 +21,5 @@ return { one_per_level=true,
21 21 {group="fareast-generic", percent_factor=1.5},
22 22 {name="antimagic-bush", minor=true, percent=80, max_repeat=3, forbid={1,3,5}},
23 23 {name="glowing-chest", minor=true, percent=30},
24   - {name="sub-vault", minor=true, percent=100, max_repeat=3},
  24 + {name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
25 25 }
... ...
... ... @@ -28,8 +28,8 @@ self:defineTile('"', "HARDWALL")
28 28 self:defineTile('t', "TRAINING_DUMMY")
29 29 self:defineTile('b', "FLOOR", nil, "ORC_ELITE_BERSERKER")
30 30 self:defineTile('f', "FLOOR", nil, "ORC_ELITE_FIGHTER")
31   -self:defineTile("B", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_BERSERKER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Berserker=true}, nb_classes=1, loot_quality="store", loot_quantity=1, rank=3.5}}})
32   -self:defineTile("F", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_FIGHTER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Bulwark=true}, nb_classes=1, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=3.5}}})
  31 +self:defineTile("B", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_BERSERKER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Berserker=true}, nb_classes=1, class_filter=function(d) return d.name ~= "Berserker" end, loot_quality="store", loot_quantity=1, rank=3.5}}})
  32 +self:defineTile("F", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_FIGHTER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Bulwark=true}, nb_classes=1, class_filter=function(d) return d.name ~= "Bulwark" end, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=3.5}}})
33 33 self:defineTile('>', "SLIME_TUNNELS", nil, nil, nil, {special="slimepit"})
34 34 self:defineTile(";", "UNDERGROUND_CREEP", nil, nil, nil, {special="slimepit"})
35 35 self:defineTile("s", "UNDERGROUND_CREEP", nil, {random_filter={special_rarity="slime_rarity"}}, nil, {special="slimepit"})
... ...
... ... @@ -23,8 +23,8 @@ self:defineTile('"', "HARDWALL")
23 23 self:defineTile('t', "TRAINING_DUMMY")
24 24 self:defineTile('b', "FLOOR", nil, "ORC_ELITE_BERSERKER")
25 25 self:defineTile('f', "FLOOR", nil, "ORC_ELITE_FIGHTER")
26   -self:defineTile("B", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_BERSERKER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Berserker=true}, nb_classes=1, loot_quality="store", loot_quantity=1, rank=3.5}}})
27   -self:defineTile("F", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_FIGHTER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Bulwark=true}, nb_classes=1, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=3.5}}})
  26 +self:defineTile("B", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_BERSERKER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Berserker=true}, nb_classes=1, class_filter=function(d) return d.name ~= "Berserker" end, loot_quality="store", loot_quantity=1, rank=3.5}}})
  27 +self:defineTile("F", "FLOOR", nil, {random_filter={define_as="ORC_ELITE_FIGHTER", random_boss={name_scheme="Combat Trainer #rng#", force_classes={Bulwark=true}, nb_classes=1, class_filter=function(d) return d.name ~= "Bulwark" end, loot_quality="store", loot_quantity=1, loot_unique=true, no_loot_randart=true, rank=3.5}}})
28 28
29 29 -- Make the barracks
30 30 local bsp = BSP.new(5, 5, 6):make(30, 30, '.', '#')
... ... @@ -76,6 +76,11 @@ tm:applyOnGroups(bsp.rooms, function(room, idx)
76 76 end
77 77 end, true)
78 78
  79 +if rng.percent(22) and not game.state:doneEvent("grushnak-armory") then
  80 + game.state:doneEvent("grushnak-armory",1) -- special vault! can only show once per game and only in grushnak pride; contains exceptionally difficult foes and exceptional loot
  81 + game.level.data.generator.map.greater_vaults_list = {"grushnak-armory"}
  82 +end
  83 +
79 84 -- Ensure enough size
80 85 if tm:eliminateByFloodfill{'#', '"', 'T'} < 350 then return self:redo() end
81 86
... ...
... ... @@ -35,7 +35,7 @@ return {
35 35 map = {
36 36 class = "engine.generator.map.Roomer",
37 37 nb_rooms = 10,
38   - rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}, {"greater_vault",10}},
  38 + rooms = {"random_room", {"money_vault",5}, {"lesser_vault",8}, {"greater_vault",5}},
39 39 lesser_vaults_list = {"circle","rat-nest","skeleton-mage-cabal"},
40 40 greater_vaults_list = {"living-weapons"},
41 41 lite_room_chance = 100,
... ...
... ... @@ -42,7 +42,6 @@ return {
42 42 class = "engine.generator.map.Roomer",
43 43 nb_rooms = 10,
44 44 rooms = {"random_room"},
45   - lesser_vaults_list = {"flooded-prison"},
46 45 lite_room_chance = 0,
47 46 ['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"},
48 47 ['#'] = "WATER_WALL",
... ... @@ -90,6 +89,7 @@ return {
90 89 generator = {
91 90 map = {
92 91 rooms = {"random_room",{"lesser_vault",7}},
  92 + lesser_vaults_list = {"flooded-prison"},
93 93 },
94 94 actor = {
95 95 filters = {{special_rarity="water_rarity"}},
... ... @@ -101,6 +101,7 @@ return {
101 101 generator = is_flooded and {
102 102 map = {
103 103 rooms = {"random_room",{"lesser_vault",5}},
  104 + lesser_vaults_list = {"flooded-prison"},
104 105 down = "SHERTUL_FORTRESS_FLOOD",
105 106 ['.'] = {"WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR","WATER_FLOOR_BUBBLE"},
106 107 force_last_stair = true,
... ... @@ -112,6 +113,8 @@ return {
112 113 },
113 114 } or {
114 115 map = {
  116 + rooms = {"random_room",{"lesser_vault",5}},
  117 + lesser_vaults_list = {"worms"},
115 118 ['.'] = "FLOOR",
116 119 ['#'] = "WALL",
117 120 up = "UP",
... ...
... ... @@ -22,5 +22,5 @@ return { one_per_level=true,
22 22 {name="whistling-vortex", minor=true, percent=50},
23 23 {name="necrotic-air", minor=true, percent=100, max_repeat=3},
24 24 {name="glowing-chest", minor=true, percent=30},
25   - {name="sub-vault", minor=true, percent=100, max_repeat=3},
  25 + {name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
26 26 }
... ...
... ... @@ -47,6 +47,11 @@ tm:applyOnGroups(rooms, function(room, idx)
47 47 if event then self:addSpot(event, "event-spot", "subvault-place") end
48 48 end)
49 49
  50 +if rng.percent(15) and not game.state:doneEvent("renegade-undead") then
  51 + game.state:doneEvent("renegade-undead",1) -- special vault! can only show once per game and only in rak'shor pride; contains exceptionally difficult foes and exceptional loot
  52 + game.level.data.generator.map.greater_vaults_list = {"renegade-undead"}
  53 +end
  54 +
50 55 -- Complete the map by putting wall in all the remaining blank spaces
51 56 tm:fillAll()
52 57
... ...
... ... @@ -22,5 +22,5 @@ return { one_per_level=true,
22 22 {name="fell-aura", minor=true, percent=100, max_repeat=3},
23 23 {name="spellblaze-scar", minor=true, percent=50},
24 24 {name="glowing-chest", minor=true, percent=30},
25   - {name="sub-vault", minor=true, percent=100, max_repeat=3},
  25 + {name="sub-vault", minor=true, percent=100, max_repeat=rng.percent(33) and 1 or 0}, --33% chance of 2 vaults, 67% chance of 1 for each floor
26 26 }
... ...
... ... @@ -67,6 +67,11 @@ tm:applyOnGroups(rooms, function(room, idx)
67 67 end
68 68 end)
69 69
  70 +if rng.percent(15) and not game.state:doneEvent("renegade-pyromancers") then
  71 + game.state:doneEvent("renegade-pyromancers",1) -- special vault! can only show once per game and only in vor pride; contains exceptionally difficult foes and exceptional loot
  72 + game.level.data.generator.map.greater_vaults_list = {"renegade-pyromancers"}
  73 +end
  74 +
70 75 -- Complete the map by putting wall in all the remaining blank spaces
71 76 tm:fillAll()
72 77 -- if tm:eliminateByFloodfill{'#', 'T'} < 400 then return self:regenerate() end
... ...