Skip to content
Snippets Groups Projects
Commit c1b55ef0 authored by DarkGod's avatar DarkGod
Browse files

Merge branch 'vaults-update' into 'master'

Update living weapons and sleeping dragons vaults

Starsapphire messaged me with some updates for them and I added some improvements myself.  
For living weapons: added new "moving" enemy weapon weaker than the animated and poltergeist ones, added support for orcs weapon types, and improved the way the ASCII map generation is handled.  
For sleeping dragons: replaces the sleep effect with a proper dozing effect to prevent use of instant use skills while asleep, bumped up chances of aggroing when picking up loot, added as a possible vault to spawn in Eruan, and bumped classes of the dragons from just wyrmic to wyrmic plus 1 random one for drakes and plus 2 random ones for the wyrm (they're supposed to be deadly even by vault standards after all!)  

See merge request !608
parents 6f8be8de 47faa34e
No related branches found
No related tags found
1 merge request!608Update living weapons and sleeping dragons vaults
Pipeline #
...@@ -52,15 +52,13 @@ local imbueEgo = function(gem, object) ...@@ -52,15 +52,13 @@ local imbueEgo = function(gem, object)
if not gem then return end if not gem then return end
if not object then return end if not object then return end
local Entity = require("engine.Entity") local Entity = require("engine.Entity")
local ego = Entity.new{ local ego = Entity.new{
fake_ego = true, name = "imbue "..gem.name,
name = "imbued_"..gem.name, keywords = {[gem.name] = true},
keywords = {[gem.name] = true}, wielder = table.clone(gem.imbue_powers),
wielder = table.clone(gem.imbue_powers, true), talent_on_spell = gem.talent_on_spell,
been_imbued = true, fake_ego = true, unvault_ego = 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) game.zone:applyEgo(object, ego, "object", true)
end end
-- A lot of elseif -- A lot of elseif
...@@ -69,11 +67,14 @@ local make_poltergeist = function(type) ...@@ -69,11 +67,14 @@ local make_poltergeist = function(type)
local filter = nil local filter = nil
local x_level = nil local x_level = nil
if type == "greater" then if type == "greater" then
filter = {no_tome_drops=true, unique=true, special=function(o) return (o.slot == "MAINHAND") end} filter = {no_tome_drops=true, unique=true, special=function(o) return (o.slot == "MAINHAND") end}
x_level = math.max(15, resolvers.current_level + 10) x_level = math.max(15, resolvers.current_level + 10)
else elseif type == "normal" then
filter = {id=true, add_levels=5, force_tome_drops=true, tome_drops="store", tome_mod="gvault", special=function(o) return (o.slot == "MAINHAND") end} filter = {id=true, type="weapon", add_levels=5, force_tome_drops=true, tome_drops="store", tome_mod="gvault", special=function(o) return true end}
x_level = math.max(10, resolvers.current_level + 5) x_level = math.max(10, resolvers.current_level + 5)
else
filter = {id=true, type="weapon", add_levels=0, force_tome_drops=true, tome_drops="store", tome_mod="vault", special=function(o) return true end}
x_level = math.max(5, resolvers.current_level)
end end
o = game.zone:makeEntity(game.level, "object", filter, nil, true) o = game.zone:makeEntity(game.level, "object", filter, nil, true)
o.no_drop = false o.no_drop = false
...@@ -142,6 +143,27 @@ local make_poltergeist = function(type) ...@@ -142,6 +143,27 @@ local make_poltergeist = function(type)
{type="weapon", subtype="greatsword", autoreq=true, force_inven = "PSIONIC_FOCUS", no_drops=true}, {type="weapon", subtype="greatsword", autoreq=true, force_inven = "PSIONIC_FOCUS", no_drops=true},
} }
make_req(el, o, "mindstar") make_req(el, o, "mindstar")
elseif o.subtype == "steamgun" then --For Orcs DLC!
class = "Gunslinger"
e.autolevel = "slinger"
e.ai_tactic = resolvers.tactic"ranged"
e[#e+1] = resolvers.talents{
[Talents.T_STEAMGUN_MASTERY] = {base=1, every=10, max=5},
[Talents.T_STRAFE] = {base=1, every=10, max=5},
[Talents.T_SHOOT] = 1
}
e[#e+1] = resolvers.inscription("IMPLANT:_STEAM_GENERATOR", {cooldown=32, power=10}),
make_req(el, o, "steamgun")
make_req(el, o, "shot", "QUIVER")
elseif o.subtype == "steamsaw" then
class = "Sawbutcher"
e.autolevel = "warrior"
e[#e+1] = resolvers.talents{
[Talents.T_STEAMSAW_MASTERY]={base=1, every=10, max=5},
[Talents.T_TO_THE_ARMS] = {base=1, every=10, max=5},
}
e[#e+1] = resolvers.inscription("IMPLANT:_STEAM_GENERATOR", {cooldown=32, power=10}),
make_req(el, o, "steamsaw")
elseif o.subtype == "whip" then elseif o.subtype == "whip" then
class = "Corruptor" class = "Corruptor"
e.autolevel = "caster" e.autolevel = "caster"
...@@ -176,20 +198,34 @@ local make_poltergeist = function(type) ...@@ -176,20 +198,34 @@ local make_poltergeist = function(type)
end end
e[#e+1] = resolvers.auto_equip_filters(class) e[#e+1] = resolvers.auto_equip_filters(class)
if type == "greater" then if type == "greater" then
e.name = "Poltergeist " .. o.name e.name = "Poltergeist " .. o.name
e.rank = 3.5 e.rank = 3.5
e.max_life = resolvers.rngavg(100,120)
e.life_rating = 20
e.resist = {all=20}
e.auto_classes={ e.auto_classes={
{class=class, start_level=10, level_rate=80}, {class=class, start_level=10, level_rate=80},
{class="Cursed", start_level=20, level_rate=40} {class=(rng.percent(65) and "Cursed" or "Doomed"), start_level=20, level_rate=40}
} }
else elseif type == "normal" then
e.name = "Animated " .. o.name e.name = "Animated " .. o.name
e.rank = 3 e.rank = 3
e.max_life = resolvers.rngavg(80,100)
e.life_rating = 15
e.auto_classes={ e.auto_classes={
{class=class, start_level=10, level_rate=50} {class=class, start_level=10, level_rate=50}
} }
else
e.name = "Moving " .. o.name
e.rank = 2
e.max_life = resolvers.rngavg(60,80)
e.life_rating = 12
e.auto_classes={
{class=class, start_level=10, level_rate=30}
}
end end
if type == "greater" then if type == "greater" then
local filter = {type="gem", ignore_material_restriction=true,special=function(ee) return ee.material_level == o.material_level end} 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) gem = game.zone:makeEntity(game.level, "object", filter, nil, true)
...@@ -213,50 +249,71 @@ specialList("actor", { ...@@ -213,50 +249,71 @@ specialList("actor", {
}) })
-- Here I use a simple workaround to generate various different animated weapons. local p_char = '0'
-- Animated weapons at different spots ('p' or 'P') will be replaced to a, b, c, d, ... etc local used_char = {}
-- So, I can't use characters at the start of the alphebet, and the number of animated wepons is limitted. local function check_def(def)
for x = 1, #(def[1]) do
for y = 1, #def do
used_char[used_char[y]:sub(x,x)] = true
end
end
end
local function get_next(p_char)
while used_char[p_char] == true do
p_char = string.char(string.byte(p_char) + 1)
end
used_char[p_char] = true
return p_char
end
function make_poltergeist_room(def)
for x = 1, #(def[1]) do
for y = 1, #def do
if def[y]:sub(x, x) == "P" then
p_char = get_next(p_char)
defineTile(p_char, "FLOOR", nil, make_poltergeist("greater"))
def[y] = def[y]:sub(1, x-1)..p_char..def[y]:sub(x+1, #def[y])
elseif def[y]:sub(x, x) == "p" then
p_char = get_next(p_char)
defineTile(p_char, "FLOOR", nil, make_poltergeist("normal"))
def[y] = def[y]:sub(1, x-1)..p_char..def[y]:sub(x+1, #def[y])
elseif def[y]:sub(x, x) == "a" then
p_char = get_next(p_char)
defineTile(p_char, "FLOOR", nil, make_poltergeist("smaller"))
def[y] = def[y]:sub(1, x-1)..p_char..def[y]:sub(x+1, #def[y])
end
end
end
return def
end
-- It had been updated to detect unused characters on alphabet to be replaced with moving weapons.
-- Just use make_poltergeist_room(def)
defineTile('#', "WALL") defineTile('#', "WALL")
defineTile('+', "DOOR") defineTile('+', "DOOR")
defineTile('.', "FLOOR") defineTile('.', "FLOOR")
defineTile('X', "HARDWALL") defineTile('X', "HARDWALL")
defineTile('!', "DOOR_VAULT") defineTile('!', "DOOR_VAULT")
defineTile('U', "FLOOR", {random_filter={type="armor", add_levels=5, tome_mod="gvault"}}, nil) defineTile('A', "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('W', "FLOOR", {random_filter={type="weapon", add_levels=5, tome_mod="gvault"}}, {random_filter={subtype='wight', add_levels=5}})
defineTile('Z', "FLOOR", {random_filter={add_levels=10, 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('b', "FLOOR", nil, {random_filter={name='blade horror', add_levels=10}})
defineTile('x', "FLOOR", nil, {random_filter={subtype='wight', add_levels=5}}) defineTile('h', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={subtype='eldritch', add_levels=10}})
defineTile('y', "FLOOR", {random_filter={add_levels=10, tome_mod="gvault"}}, {random_filter={subtype='eldritch', add_levels=10}}) defineTile('s', "FLOOR", nil, {random_filter={subtype='skeleton', add_levels=5}})
defineTile('z', "FLOOR", nil, {random_filter={subtype='skeleton', add_levels=5}})
startx = 12
starty = 10
local def = { local def = {
[[XXXXXXXXXXXXXXX]], [[XXXXXXXXXXXXXXX]],
[[XU#.Vx.#....pZX]], [[XA#pA.a#...aZZX]],
[[XP+.p..+.....pX]], [[XP+....+....hpX]],
[[XV#.Ux.##z..y.X]], [[XW#.W.a##.....X]],
[[X##+######z...X]], [[X##+######....X]],
[[Xp..#..P.##...X]], [[Xp..#..P.##a..X]],
[[X...#p...p##+#X]], [[X..a#p...p##+#X]],
[[XU.p#.....#z.zX]], [[XA..#.....#.a.X]],
[[XU..###+###.p.X]], [[X...###+###s.sX]],
[[XpZZ+..w###...X]], [[XWpA+..b###...X]],
[[XXXXXXXXXXXX!XX]], [[XXXXXXXXXXXX!XX]],
} }
local pd_small = 'a'
local pd_big = 'A' return make_poltergeist_room(def)
for x = 1, #(def[1]) do \ No newline at end of file
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
...@@ -22,7 +22,7 @@ starty = 7 ...@@ -22,7 +22,7 @@ starty = 7
setStatusAll{no_teleport=true} setStatusAll{no_teleport=true}
rotates = {"default", "90", "180", "270", "flipx", "flipy"} rotates = {"default", "90", "180", "270", "flipx", "flipy"}
unique = "sleeping_dragon_vault"
defineTile('o', "WALL") defineTile('o', "WALL")
defineTile('.', "FLOOR") defineTile('.', "FLOOR")
defineTile('#', "HARDWALL") defineTile('#', "HARDWALL")
...@@ -65,8 +65,9 @@ local check_sleep = function(self) ...@@ -65,8 +65,9 @@ local check_sleep = function(self)
game.level.seen_wyrm_awoken = true game.level.seen_wyrm_awoken = true
game.log("The dragons here are asleep. You may try to steal their treasure... at your own risk.") game.log("The dragons here are asleep. You may try to steal their treasure... at your own risk.")
end end
if not self:hasEffect(self.EFF_SLEEP) then if not self:hasEffect(self.EFF_DOZING) then
self:setEffect(self.EFF_SLEEP, 999, {src=self, power=1, waking=0, insomnia=0, contagious=0}) self:setEffect(self.EFF_DOZING, 999, {})
self.energy.value = 0
end end
return true return true
end end
...@@ -78,7 +79,7 @@ local aggro_wyrm = function() ...@@ -78,7 +79,7 @@ local aggro_wyrm = function()
game.level.wyrm_awoken = true game.level.wyrm_awoken = true
for uid, e in pairs(game.level.entities) do for uid, e in pairs(game.level.entities) do
if e.sleeping_wyrm == true then if e.sleeping_wyrm == true then
e:removeEffect(e.EFF_SLEEP) e:removeEffect(e.EFF_DOZING)
e:setTarget(game.player) e:setTarget(game.player)
end end
end end
...@@ -104,9 +105,9 @@ local aggro_wyrm_grid = function(chance) ...@@ -104,9 +105,9 @@ local aggro_wyrm_grid = function(chance)
end end
return g return g
end end
defineTile('1', aggro_wyrm_grid(2), {random_filter={add_levels=25, type="money"}}) defineTile('1', aggro_wyrm_grid(3), {random_filter={add_levels=25, type="money"}})
defineTile('2', aggro_wyrm_grid(5), {random_filter={add_levels=10, tome_mod="uvault"}}) defineTile('2', aggro_wyrm_grid(10), {random_filter={add_levels=15, tome_mod="uvault"}})
defineTile('3', aggro_wyrm_grid(25), {random_filter={add_levels=15, tome_mod="gvault"}}) defineTile('3', aggro_wyrm_grid(33), {random_filter={add_levels=25, tome_mod="gvault"}})
defineTile('W', "FLOOR", nil, defineTile('W', "FLOOR", nil,
{entity_mod=function(e) {entity_mod=function(e)
e.make_escort = nil e.make_escort = nil
...@@ -118,8 +119,8 @@ defineTile('W', "FLOOR", nil, ...@@ -118,8 +119,8 @@ defineTile('W', "FLOOR", nil,
return e return e
end, end,
random_filter={special_rarity="wyrm_rarity", random_filter={special_rarity="wyrm_rarity",
add_levels=15, add_levels=10,
random_boss={name_scheme="Sleeping #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5} 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}
} }
} }
) )
...@@ -134,8 +135,7 @@ defineTile('D', "FLOOR", nil, ...@@ -134,8 +135,7 @@ defineTile('D', "FLOOR", nil,
return e return e
end, end,
random_filter={special_rarity="drake_rarity", random_filter={special_rarity="drake_rarity",
add_levels=15, 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}
random_boss={name_scheme="Dozing #rng#", force_classes={Wyrmic=true}, nb_classes=0, loot_quality="store", loot_quantity=1, rank=3.5}
} }
} }
) )
......
...@@ -3973,4 +3973,19 @@ newEffect{ ...@@ -3973,4 +3973,19 @@ newEffect{
self:removeEffect(eff.src.EFF_FED_UPON, false, true) self:removeEffect(eff.src.EFF_FED_UPON, false, true)
end end
end, end,
}
newEffect{
name = "DOZING", image = "talents/sleep.png",
desc = "Dozing",
long_desc = function(self, eff) return "The target is completely asleep, unable to act." end,
type = "other",
subtype = { sleep=true },
status = "detrimental",
parameters = { },
activate = function(self, eff)
self:effectTemporaryValue(eff, "dont_act", 1)
end,
deactivate = function(self, eff)
end,
} }
\ No newline at end of file
...@@ -51,7 +51,7 @@ return { ...@@ -51,7 +51,7 @@ return {
nb_rooms = {0,0,1}, nb_rooms = {0,0,1},
rooms = {"greater_vault"}, rooms = {"greater_vault"},
greater_vaults_list = {"dragon_lair", "lava_island", "bandit-fortress", "horror-chamber", "living-weapons"}, greater_vaults_list = {"dragon_lair", "lava_island", "bandit-fortress", "horror-chamber", "living-weapons", "sleeping-dragons"},
lite_room_chance = 100, lite_room_chance = 100,
}, },
actor = { actor = {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment