From 2f587f5eeaa1bddc59a1d427ab309e3e70e30ad7 Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Sun, 12 Sep 2010 23:18:54 +0000
Subject: [PATCH] Extracter the rooms loader of Roomer generator into a
 RoomsLoader taht is now alos used by Forest Added possible vaults to Eruan
 and the Trollshaws

git-svn-id: http://svn.net-core.org/repos/t-engine4@1194 51575b47-30f0-44d4-a5cc-537603b46e54
---
 .../default/engine/generator/map/Forest.lua   |  24 +++-
 .../default/engine/generator/map/Roomer.lua   | 107 +--------------
 .../engine/generator/map/RoomsLoader.lua      | 126 ++++++++++++++++++
 .../default/engine/generator/map/Static.lua   |  33 ++++-
 game/modules/tome/class/Game.lua              |   2 +-
 .../tome/data/general/grids/forest.lua        |  58 ++++++++
 .../tome/data/general/grids/mountain.lua      |  12 ++
 .../tome/data/gfx/terrain/rock_grass.png      | Bin 0 -> 1328 bytes
 .../tome/data/gfx/terrain/rock_grass_dark.png | Bin 0 -> 1308 bytes
 .../tome/data/maps/vaults/dragon_lair.lua     |  45 +++++++
 .../tome/data/maps/vaults/honey_glade.lua     |  44 ++++++
 .../data/maps/vaults/honey_glade_dark.lua     |  44 ++++++
 .../modules/tome/data/rooms/greater_vault.lua |   2 +-
 game/modules/tome/data/rooms/lesser_vault.lua |  56 ++++++++
 game/modules/tome/data/zones/eruan/grids.lua  |   2 +
 game/modules/tome/data/zones/eruan/zone.lua   |   7 +-
 .../tome/data/zones/infinite-dungeon/zone.lua |   2 +-
 .../tome/data/zones/old-forest/zone.lua       |   3 +-
 .../tome/data/zones/tol-falas/zone.lua        |   4 +-
 .../tome/data/zones/trollshaws/zone.lua       |   5 +
 20 files changed, 464 insertions(+), 112 deletions(-)
 create mode 100644 game/engines/default/engine/generator/map/RoomsLoader.lua
 create mode 100644 game/modules/tome/data/gfx/terrain/rock_grass.png
 create mode 100644 game/modules/tome/data/gfx/terrain/rock_grass_dark.png
 create mode 100644 game/modules/tome/data/maps/vaults/dragon_lair.lua
 create mode 100644 game/modules/tome/data/maps/vaults/honey_glade.lua
 create mode 100644 game/modules/tome/data/maps/vaults/honey_glade_dark.lua
 create mode 100644 game/modules/tome/data/rooms/lesser_vault.lua

diff --git a/game/engines/default/engine/generator/map/Forest.lua b/game/engines/default/engine/generator/map/Forest.lua
index 57b67c8040..2f13be61d8 100644
--- a/game/engines/default/engine/generator/map/Forest.lua
+++ b/game/engines/default/engine/generator/map/Forest.lua
@@ -20,7 +20,8 @@
 require "engine.class"
 local Map = require "engine.Map"
 require "engine.Generator"
-module(..., package.seeall, class.inherit(engine.Generator))
+local RoomsLoader = require "engine.generator.map.RoomsLoader"
+module(..., package.seeall, class.inherit(engine.Generator, RoomsLoader))
 
 function _M:init(zone, map, level, data)
 	engine.Generator.init(self, zone, map, level)
@@ -40,6 +41,8 @@ function _M:init(zone, map, level, data)
 		self.do_ponds.hurst = self.do_ponds.hurst or nil
 		self.do_ponds.lacunarity = self.do_ponds.lacunarity or nil
 	end
+
+	RoomsLoader.init(self, data)
 end
 
 function _M:addPond(x, y, spots)
@@ -114,6 +117,7 @@ function _M:generate(lev, old_lev)
 	end
 
 	local spots = {}
+	self.spots = spots
 
 	if self.do_ponds then
 		for i = 1, rng.range(self.do_ponds.nb[1], self.do_ponds.nb[2]) do
@@ -121,6 +125,24 @@ function _M:generate(lev, old_lev)
 		end
 	end
 
+	local nb_room = util.getval(self.data.nb_rooms or 0)
+	local rooms = {}
+	while nb_room > 0 do
+		local rroom
+		while true do
+			rroom = self.rooms[rng.range(1, #self.rooms)]
+			if type(rroom) == "table" and rroom.chance_room then
+				if rng.percent(rroom.chance_room) then rroom = rroom[1] break end
+			else
+				break
+			end
+		end
+
+		local r = self:roomAlloc(rroom, #rooms+1, lev, old_lev)
+		if r then rooms[#rooms+1] = r end
+		nb_room = nb_room - 1
+	end
+
 	local ux, uy, dx, dy
 	if self.data.edge_entrances then
 		ux, uy, dx, dy, spots = self:makeStairsSides(lev, old_lev, self.data.edge_entrances, spots)
diff --git a/game/engines/default/engine/generator/map/Roomer.lua b/game/engines/default/engine/generator/map/Roomer.lua
index ca6e01448f..75cb2fe919 100644
--- a/game/engines/default/engine/generator/map/Roomer.lua
+++ b/game/engines/default/engine/generator/map/Roomer.lua
@@ -20,7 +20,8 @@
 require "engine.class"
 local Map = require "engine.Map"
 require "engine.Generator"
-module(..., package.seeall, class.inherit(engine.Generator))
+local RoomsLoader = require "engine.generator.map.RoomsLoader"
+module(..., package.seeall, class.inherit(engine.Generator, RoomsLoader))
 
 function _M:init(zone, map, level, data)
 	engine.Generator.init(self, zone, map, level)
@@ -31,102 +32,7 @@ function _M:init(zone, map, level, data)
 	self.data.lite_room_chance = self.data.lite_room_chance or 25
 	self.grid_list = zone.grid_list
 
-	self.rooms = {}
-	for i, file in ipairs(data.rooms) do
-		if type(file) == "table" then
-			table.insert(self.rooms, {self:loadRoom(file[1]), chance_room=file[2]})
-		else
-			table.insert(self.rooms, self:loadRoom(file))
-		end
-	end
-end
-
-function _M:loadRoom(file)
-	local f, err = loadfile("/data/rooms/"..file..".lua")
-	if not f and err then error(err) end
-	setfenv(f, setmetatable({
-		Map = require("engine.Map"),
-	}, {__index=_G}))
-	local ret, err = f()
-	if not ret and err then error(err) end
-
-	-- We got a room generator function, save it for later
-	if type(ret) == "function" then
-		print("loaded room generator",file,ret)
-		return ret
-	end
-
-	-- Init the room with name and size
-	local t = { name=file, w=ret[1]:len(), h=#ret }
-
-	-- Read the room map
-	for j, line in ipairs(ret) do
-		local i = 1
-		for c in line:gmatch(".") do
-			t[i] = t[i] or {}
-			t[i][j] = c
-			i = i + 1
-		end
-	end
-	print("loaded room",file,t.w,t.h)
-
-	return t
-end
-
---- Make up a room
-function _M:roomAlloc(room, id, lev, old_lev)
-	if type(room) == 'function' then
-		print("room generator", room, "is making a room")
-		room = room(self, id, lev, old_lev)
-	end
-	print("alloc", room.name)
-	-- Sanity check
-	if self.map.w - 2 - room.w < 2 or self.map.h - 2 - room.h < 2 then return false end
-
-	local tries = 100
-	while tries > 0 do
-		local ok = true
-		local x, y = rng.range(1, self.map.w - 2 - room.w), rng.range(1, self.map.h - 2 - room.h)
-
-		-- Do we stomp ?
-		for i = 1, room.w do
-			for j = 1, room.h do
-				if self.map.room_map[i-1+x][j-1+y].room then ok = false break end
-			end
-			if not ok then break end
-		end
-
-		if ok then
-			local is_lit = rng.percent(self.data.lite_room_chance)
-
-			-- ok alloc it using the default generator or a specific one
-			local cx, cy
-			if room.generator then
-				cx, cy = room:generator(x, y, is_lit)
-			else
-				for i = 1, room.w do
-					for j = 1, room.h do
-						self.map.room_map[i-1+x][j-1+y].room = id
-						local c = room[i][j]
-						if c == '!' then
-							self.map.room_map[i-1+x][j-1+y].room = nil
-							self.map.room_map[i-1+x][j-1+y].can_open = true
-							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve('#'))
-						else
-							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve(c))
-						end
-						if is_lit then self.map.lites(i-1+x, j-1+y, true) end
-					end
-				end
-			end
-			print("room allocated at", x, y,"with center",math.floor(x+(room.w-1)/2), math.floor(y+(room.h-1)/2))
-			cx = cx or math.floor(x+(room.w-1)/2)
-			cy = cy or math.floor(y+(room.h-1)/2)
-			return { id=id, x=x, y=y, cx=cx, cy=cy, room=room }
-		end
-		tries = tries - 1
-	end
-	return false
+	RoomsLoader.init(self, data)
 end
 
 --- Random tunnel dir
@@ -336,17 +242,14 @@ function _M:generate(lev, old_lev)
 	local spots = {}
 	self.spots = spots
 
-	local nb_room = self.data.nb_rooms or 10
+	local nb_room = util.getval(self.data.nb_rooms or 10)
 	local rooms = {}
 	while nb_room > 0 do
 		local rroom
 		while true do
 			rroom = self.rooms[rng.range(1, #self.rooms)]
 			if type(rroom) == "table" and rroom.chance_room then
-				if rng.percent(rroom.chance_room) then
-					rroom = rroom[1]
-					break
-				end
+				if rng.percent(rroom.chance_room) then rroom = rroom[1] break end
 			else
 				break
 			end
diff --git a/game/engines/default/engine/generator/map/RoomsLoader.lua b/game/engines/default/engine/generator/map/RoomsLoader.lua
new file mode 100644
index 0000000000..4146ed4e95
--- /dev/null
+++ b/game/engines/default/engine/generator/map/RoomsLoader.lua
@@ -0,0 +1,126 @@
+-- TE4 - T-Engine 4
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+require "engine.class"
+local Map = require "engine.Map"
+
+--- Generator interface that can use rooms
+module(..., package.seeall, class.make)
+
+function _M:init(data)
+	self.rooms = {}
+
+	if not data.rooms then return end
+
+	for i, file in ipairs(data.rooms) do
+		if type(file) == "table" then
+			table.insert(self.rooms, {self:loadRoom(file[1]), chance_room=file[2]})
+		else
+			table.insert(self.rooms, self:loadRoom(file))
+		end
+	end
+end
+
+function _M:loadRoom(file)
+	local f, err = loadfile("/data/rooms/"..file..".lua")
+	if not f and err then error(err) end
+	setfenv(f, setmetatable({
+		Map = require("engine.Map"),
+	}, {__index=_G}))
+	local ret, err = f()
+	if not ret and err then error(err) end
+
+	-- We got a room generator function, save it for later
+	if type(ret) == "function" then
+		print("loaded room generator",file,ret)
+		return ret
+	end
+
+	-- Init the room with name and size
+	local t = { name=file, w=ret[1]:len(), h=#ret }
+
+	-- Read the room map
+	for j, line in ipairs(ret) do
+		local i = 1
+		for c in line:gmatch(".") do
+			t[i] = t[i] or {}
+			t[i][j] = c
+			i = i + 1
+		end
+	end
+	print("loaded room",file,t.w,t.h)
+
+	return t
+end
+
+--- Make up a room
+function _M:roomAlloc(room, id, lev, old_lev)
+	if type(room) == 'function' then
+		print("room generator", room, "is making a room")
+		room = room(self, id, lev, old_lev)
+	end
+	print("alloc", room.name)
+	-- Sanity check
+	if self.map.w - 2 - room.w < 2 or self.map.h - 2 - room.h < 2 then return false end
+
+	local tries = 100
+	while tries > 0 do
+		local ok = true
+		local x, y = rng.range(1, self.map.w - 2 - room.w), rng.range(1, self.map.h - 2 - room.h)
+
+		-- Do we stomp ?
+		for i = 1, room.w do
+			for j = 1, room.h do
+				if self.map.room_map[i-1+x][j-1+y].room then ok = false break end
+			end
+			if not ok then break end
+		end
+
+		if ok then
+			local is_lit = rng.percent(self.data.lite_room_chance)
+
+			-- ok alloc it using the default generator or a specific one
+			local cx, cy
+			if room.generator then
+				cx, cy = room:generator(x, y, is_lit)
+			else
+				for i = 1, room.w do
+					for j = 1, room.h do
+						self.map.room_map[i-1+x][j-1+y].room = id
+						local c = room[i][j]
+						if c == '!' then
+							self.map.room_map[i-1+x][j-1+y].room = nil
+							self.map.room_map[i-1+x][j-1+y].can_open = true
+							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve('#'))
+						else
+							self.map(i-1+x, j-1+y, Map.TERRAIN, self:resolve(c))
+						end
+						if is_lit then self.map.lites(i-1+x, j-1+y, true) end
+					end
+				end
+			end
+			print("room allocated at", x, y,"with center",math.floor(x+(room.w-1)/2), math.floor(y+(room.h-1)/2))
+			cx = cx or math.floor(x+(room.w-1)/2)
+			cy = cy or math.floor(y+(room.h-1)/2)
+			return { id=id, x=x, y=y, cx=cx, cy=cy, room=room }
+		end
+		tries = tries - 1
+	end
+	return false
+end
diff --git a/game/engines/default/engine/generator/map/Static.lua b/game/engines/default/engine/generator/map/Static.lua
index 02f6e751de..6ab1afa3b0 100644
--- a/game/engines/default/engine/generator/map/Static.lua
+++ b/game/engines/default/engine/generator/map/Static.lua
@@ -85,11 +85,21 @@ function _M:loadMap(file)
 	local m = { w=ret[1]:len(), h=#ret }
 
 	-- Read the map
+	local rotate = util.getval(g.rotates or "default")
 	for j, line in ipairs(ret) do
 		local i = 1
 		for c in line:gmatch(".") do
-			m[i] = m[i] or {}
-			m[i][j] = c
+			local ii, jj = i, j
+
+			if rotate == "flipx" then ii, jj = m.w - i + 1, j
+			elseif rotate == "flipy" then ii, jj = i, m.h - j + 1
+			elseif rotate == "90" then ii, jj = j, m.w - i + 1
+			elseif rotate == "180" then ii, jj = m.w - i + 1, m.h - j + 1
+			elseif rotate == "270" then ii, jj = m.h - j + 1, i
+			end
+
+			m[ii] = m[ii] or {}
+			m[ii][jj] = c
 			i = i + 1
 		end
 	end
@@ -99,6 +109,25 @@ function _M:loadMap(file)
 	m.endx = g.endx or math.floor(m.w / 2)
 	m.endy = g.endy or math.floor(m.h / 2)
 
+	if rotate == "flipx" then
+		m.startx = m.w - m.startx + 1
+		m.endx   = m.w - m.endx   + 1
+	elseif rotate == "flipy" then
+		m.starty = m.h - m.starty + 1
+		m.endy   = m.h - m.endy   + 1
+	elseif rotate == "90" then
+		m.startx, m.starty = m.starty, m.w - m.startx + 1
+		m.endx,   m.endy   = m.endy,   m.w - m.endx   + 1
+		m.w, m.h = m.h, m.w
+	elseif rotate == "180" then
+		m.startx, m.starty = m.w - m.startx + 1, m.h - m.starty + 1
+		m.endx,   m.endy   = m.w - m.endx   + 1, m.h - m.endy   + 1
+	elseif rotate == "270" then
+		m.startx, m.starty = m.h - m.starty + 1, m.startx
+		m.endx,   m.endy   = m.h - m.endy   + 1, m.endx
+		m.w, m.h = m.h, m.w
+	end
+
 	self.gen_map = m
 	self.tiles = t
 
diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua
index 6ab1cca73b..949b56b43b 100644
--- a/game/modules/tome/class/Game.lua
+++ b/game/modules/tome/class/Game.lua
@@ -524,7 +524,7 @@ function _M:setupCommands()
 		end,
 		[{"_g","ctrl"}] = function()
 			if config.settings.tome.cheat then
-				self:changeLevel(1, "infinite-dungeon")
+				self:changeLevel(1, "eruan")
 --				self.player:grantQuest("test")
 			end
 		end,
diff --git a/game/modules/tome/data/general/grids/forest.lua b/game/modules/tome/data/general/grids/forest.lua
index b9e3c16d08..c307298a42 100644
--- a/game/modules/tome/data/general/grids/forest.lua
+++ b/game/modules/tome/data/general/grids/forest.lua
@@ -38,6 +38,21 @@ newEntity{
 }
 end
 
+for i = 1, 20 do
+newEntity{
+	define_as = "HARDTREE"..(i > 1 and i or ""),
+	name = "tall thick tree",
+	image = "terrain/grass.png",
+	add_displays = class:makeTrees("terrain/tree_alpha"),
+	display = '#', color=colors.LIGHT_GREEN, back_color={r=44,g=95,b=43},
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+}
+end
+
 newEntity{
 	define_as = "GRASS_DARK1",
 	name = "grass", image = "terrain/grass_dark1.png",
@@ -59,8 +74,51 @@ newEntity{
 }
 end
 
+for i = 1, 20 do
+newEntity{
+	define_as = "HARDTREE_DARK"..i,
+	name = "tall thick tree", image = "terrain/grass_dark1.png",
+	force_clone = true,
+	add_displays = class:makeTrees("terrain/tree_alpha"),
+	display = '#', color=colors.GREEN, back_color={r=44,g=95,b=43},
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+}
+end
+
 newEntity{
 	define_as = "FLOWER",
 	name = "flower", image = "terrain/grass_flower3.png",
 	display = ';', color=colors.YELLOW, back_color={r=44,g=95,b=43},
 }
+
+newEntity{
+	define_as = "ROCK_VAULT",
+	name = "huge lose rock", image = "terrain/rock_grass.png",
+	display = '+', color=colors.GREY, back_color={r=44,g=95,b=43},
+	notice = true,
+	always_remember = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	door_player_check = "This rock is loose, you think you can move it away.",
+	door_opened = "GRASS",
+	dig = "GRASS",
+}
+
+newEntity{
+	define_as = "ROCK_VAULT_DARK",
+	name = "huge lose rock", image = "terrain/rock_grass_dark.png",
+	display = '+', color=colors.GREY, back_color={r=44,g=95,b=43},
+	notice = true,
+	always_remember = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	door_player_check = "This rock is loose, you think you can move it away.",
+	door_opened = "GRASS_DARK1",
+	dig = "GRASS_DARK1",
+}
diff --git a/game/modules/tome/data/general/grids/mountain.lua b/game/modules/tome/data/general/grids/mountain.lua
index 3141d9a7d5..8bbe4ae2e9 100644
--- a/game/modules/tome/data/general/grids/mountain.lua
+++ b/game/modules/tome/data/general/grids/mountain.lua
@@ -45,3 +45,15 @@ newEntity{
 	block_sight = true,
 	dig = "ROCKY_GROUND",
 }
+
+newEntity{
+	define_as = "HARDMOUNTAIN_WALL",
+	name = "hard rocky mountain", image = "terrain/rocky_mountain.png",
+	display = '#', color=colors.UMBER, back_color=colors.LIGHT_UMBER,
+	always_remember = true,
+	does_block_move = true,
+	block_sight = true,
+	block_sense = true,
+	block_esp = true,
+	air_level = -20,
+}
diff --git a/game/modules/tome/data/gfx/terrain/rock_grass.png b/game/modules/tome/data/gfx/terrain/rock_grass.png
new file mode 100644
index 0000000000000000000000000000000000000000..92a096890d22a41a03cb55ed8b47fc7a25ea216f
GIT binary patch
literal 1328
zcmV-01<(44P)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(1m#IYK~zYIl~z4y8%Y%YEH7dr1~F^4*abBL32fpkT%<Z&y12rmT3n|I
zq*8GRp)$oG7ITHl_zH2YRHSg>fLx?7=hERggbE=wDweQFgIUC|Ear;0dRi&Yg?q&^
z!_NEr-tV6C0Yo|i0H=az4&}fSTL*cmkR#F6^q09(107}Td9wKAQ~+!V1vb)yAjs^{
z8bGJfkpKeCTux<U-17?P5ep?U4JCmf2yEM4E|>h+_k93^)<8Ekw#gCzkQ!J5slk5f
zeC>4!ix2=-j{u+?Snt)<)z$IwvFCZq<<hooV~jBdz+$nGQr7GB$sg0?XG2`8$IOY<
zBjf?1IYcSv0Ru&DrY#i&!E(7gIXMBKlmb9bgkcCEj^jKFW0e=O1rhxqOi}<qwOS>_
z33{azU!|0+fbq;rr?6WB79j;7ZK)J!x7%zl2_<Hh9)=-{-tn8he4wvIC(}?t5NNHd
z)ha_Vo6YFTY6u)DB|$_g8IZgO>`;M!*tSh@6F77j4u`|xkj}H&EN?Zb!8-jYdDwOe
ziBrLT=^WO36$HVH7cYbmLI`7w5JGExbaa#?$zrh>jYdh5kom6bQUKyOzP`Q|U0o_8
znxj+(9XOFPh{y`tw)4RxW7%XWWf+F8>*5=t0tR3j3V_qqJ3tlaUA~AIqVaePpjN9<
zRKqn*CKC<-wFh~r+U<4_1g4?5q)APIuwxH6p4DpAbzKri$WUN+{NMy3@7wLRX{dbS
zTG1SG{hEy0@n$EmolXb9+1VM3Aoi1!6RkC&x>X9w$;xWEToNXShlgBHOq0n(O4;l6
z`u+ZFHtTdc^oIH%l_bY(Q^o=XOCWCQw{PEStzFl3U6%`rt)|1rk01N}{=>t=j&8O_
zDHVpH@B8vnQOAttC@@|OH&GnNbftLarD(0+y?aO3cDqekH=E7!ezRDMAWH+?YxR8J
zCnz>aqBQ`jwQu_edqB2hy8}`N?;l)X5kelo`o;YH`}F0@mtVhrrE(h%htuhFI-L@a
z5aRgwSO_s5kE1C1^5qMFySuy7(^F$i7=}rb02mAg0Mbw5=~k3p8;jDEoN~H)&=}zR
zG#-x+4-Wy%=bOPudG#z=V%_XE<1ElR+MU4vmq-YJcn*u2-6nHeO8$udS&1~DwANu5
z_F6sa8BPV3B{rRwYtpuDO6o8Sd%fO&OOKmcw$#<t6*n>8_XmvunmU?e-@Jk-!K|`=
z;(4Cuc|r)!^C*n<dVMq+iLSOjtD~c%D2gZm<#L%ar}&ouAcRPg#27=#JsOS57p7Q5
zfuJW+O5NYzYpow19&T=KT-VJHubuL)*X#M~U@+iHqC_$cWeMzAzh&V~O*ZJq<1x#n
zr%b-@lNu_w;cyr?HO24QybxWz=X}`O>3*0$Z{EBih<MV)P5r$EFmCES_s>lh<#)RL
zQ!B_?|Fi1Z2_oJnso(9JSHODNqHT$!_xt@?t#*2P>UrKj-D&aMtR7K%ZJusLUOJCV
zr-EV;q67e<lpO%<A6#U2v&sf(v52QzL1S{USO6G}M(HO}zA(wJnc};<JJHqpCzD_3
z<N*p6o>Eu>PwCowwuSL=D$q^cyWCBGnk_dsH<SXVq0ro{E%`B-UxD{{eFrxCcRm<9
mJZWna2C*LTOnG+N=l%td5=1J5pn|Ue0000<MNUMnLSTZQ#B$I8

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/gfx/terrain/rock_grass_dark.png b/game/modules/tome/data/gfx/terrain/rock_grass_dark.png
new file mode 100644
index 0000000000000000000000000000000000000000..5f085d3c81627a0e47f51ef16a5f5cbccd92f4a6
GIT binary patch
literal 1308
zcmV+%1>^dOP)<h;3K|Lk000e1NJLTq001BW001Be0ssI2{21+{00006bW%=J0RI60
z0RJ~w8+`x(1kp)EK~zYIotCj{8%Y$#f07n4pv6ofg#{<rU_=ZFL6G8#lt$In`v<6S
z>GI0^D_o{Xaa^VTiWsiA#*pH?g)sspMxZ4ux63k!K@4UQSG?7DB`1WtuUKYxXWpCn
z-Z$^P*617{(O>|Ah$>?Qx4Q#9)ihu)OqD@n)$5F8yS$0uaTEbNMrl}&<5;E{V}Ps6
zE5Mu^zv?z3*e(|&8lV%s1&AD9E$xtvrD*Kp;Dc6oDvskY3?CjI0OuUg?RNY9zWr#|
zM{Z*Q+96Oc|0m>`rO>=7whn*@zS?>cfJXnOCzHuwFzEOD)>`o)4pys`Qc7!W|FZ6t
zlT{mAQ{;CUL7QF3kw>84>o|_Bwa=eF2f{G)bMid*NAXL7=rI8GK$GZ34CF_6seuLT
z8EpmtP)d0Rp3kQBAfj>vir_Y)a*Pa%sSaU09s^oyzJol^z3Jx8YNOfXpnl3|G1YM#
z8)JkJYb}tbsl4uyqm&Yg#FJNc(&T4*p!R4x3d7Kw^W<D#UteEe%Q#KbrZaIPhJuLO
zZ6xH?2c{Ff#Z7e_$K7tXx&Gndq2KSfTCLS;m8NN{)spQG27_L&w_dNEbDuwdwil)y
zQf0J5WZ;EVJKNi`Kq!)@Y&OsH!C>$-B$cZ#v#6uK;SHkNO^Y7lZ$6&`FJ8P5uJbLH
z%cTzhh9E*u^>{pv<2bz3dwOjPcTW`=hT&i^5Ocx|;GEk#hbUVTi7{q89*38@DcoQ$
zH$6Q~6H2M8t1IC6_}H5eh(JULKGZ<KR`J$a;bb@*`U~Z;TrQPTNs>$^6Km~sI+gE|
z2ZaDHvpQn}&<W01AGz7@v%|x~Ua!~d^*rOEmLLeKsse6rZzq#Unx;yrySqE@`|$Aa
z;NSpgx7*9*QW8{p=0r<ve@0KYz&R(cZi{-$S_{|mIv$U;*4ElIO`GTTW&@$@I5x>N
zIXyiUD!fH`E*1;F(ipRsNaV}Y3@9b26Z}k-QA9la<W_%J$;?8_VzDsBH1{<e4wX{#
z`MfO4EX#oV`}>oV6X#r6mcrz0HUqk!l(|#xoqNotRffGVv&$LZ$9z5?4u>?-Dj>T0
zCIYohc3xHH++g-A@PEZ|Y!Vq|1n8XvtKa`0)8^brfilMAd7ey@;KI~dFHpSRW?FwI
z!!Q(4=Xsta$q%f@M!(mS$;5v-Jw2UW&P;5ojLzmI5oFZ)q~GsLT0J;8`10ioptUZF
z!d{r}Cly6eS(Xw2(JP?t>hjQPwY<2CqNvVXJESet3$)fZH#b0<rZ+b?gTdfw@$&HX
zKroxl{7n)eNq%i{UWfN}R@b%peD3Ya)aKdcm)w=bVqszve5*4P*bCF*mz|#Ohx!?f
zM#7B0eI_<&0`-mMCN{0$*GCmKd%EUSb8dj|$=4sE-T@@r0npjJgl)4`G^|U@b#ijj
z?RM=)TfK7|%jqj;?slm6B{PV4W63m`V&sS*(PWAaXP_84GU`IQ2~dA4pe)PPY6TQU
z(fy>VGq?UwJHEfaw--kGMqhr5h<3oHqR>3EWD1}&dPU>_qU{L+&HBihKTWZPY<7L*
zM3H4#ic4u4n_bYx5@@Q7Ofxb>Znv}Z^U#mwn?~nDY?A5Yz4M(GyKSAsT<|aRnn37&
Sa-g#S0000<MNUMnLSTZhCWFWT

literal 0
HcmV?d00001

diff --git a/game/modules/tome/data/maps/vaults/dragon_lair.lua b/game/modules/tome/data/maps/vaults/dragon_lair.lua
new file mode 100644
index 0000000000..93718ed3b3
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/dragon_lair.lua
@@ -0,0 +1,45 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+startx = 25
+starty = 6
+
+defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "SAND")
+defineTile('X', "HARDMOUNTAIN_WALL")
+defineTile('$', "SAND", {random_filter={add_levels=15}})
+defineTile('D', "SAND", {random_filter={add_levels=20}}, {random_filter={name="greater multi-hued wyrm", add_levels=50}})
+defineTile('d', "SAND", nil, {random_filter={name="multi-hued drake hatchling", add_levels=20}})
+
+rotates = {"default", "90", "180", "270", "flipx", "flipy"}
+
+return {
+[[  XXXXXXX X X XXX    X    ]],
+[[ XXXd  XXXXXXXXdXX XXXXXX ]],
+[[XXXXXXX     XXXX XXX   XXX]],
+[[XdXXX   $$$   Xd XXX X  XX]],
+[[XX     $$$$$  dXXX   XX XX]],
+[[Xd    $$$D$$$      XXXX!XX]],
+[[XX     $$$$$   XXXXXXXX   ]],
+[[XXXXX   $$$   XXXXXXXXXXXX]],
+[[  XXX X     XXX XXXXXXXXX ]],
+[[ XXXX XXXXXX ddXXXXXX     ]],
+[[ XXXdXX  XXXXXXXXXXXXX    ]],
+[[  XXXX     XXXXXXXX       ]],
+}
\ No newline at end of file
diff --git a/game/modules/tome/data/maps/vaults/honey_glade.lua b/game/modules/tome/data/maps/vaults/honey_glade.lua
new file mode 100644
index 0000000000..7981db1996
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/honey_glade.lua
@@ -0,0 +1,44 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+defineTile('!', "ROCK_VAULT", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "GRASS")
+defineTile('+', "DOOR")
+defineTile('X', {"HARDTREE","HARDTREE2","HARDTREE3","HARDTREE4","HARDTREE5","HARDTREE6","HARDTREE7","HARDTREE8","HARDTREE9","HARDTREE10","HARDTREE11","HARDTREE12","HARDTREE13","HARDTREE14","HARDTREE15","HARDTREE16","HARDTREE17","HARDTREE18","HARDTREE19","HARDTREE20"})
+defineTile('^', "GRASS", nil, nil, {random_filter={add_levels=5}})
+defineTile('#', "GRASS", nil, {random_filter={name="honey tree"}})
+defineTile('q', "GRASS", {random_filter={add_levels=10}}, {random_filter={name="brown bear", add_levels=10}})
+defineTile('Q', "GRASS", {random_filter={add_levels=20}}, {random_filter={name="grizzly bear", add_levels=20}})
+
+startx = 2
+starty = 10
+
+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]],
+}
diff --git a/game/modules/tome/data/maps/vaults/honey_glade_dark.lua b/game/modules/tome/data/maps/vaults/honey_glade_dark.lua
new file mode 100644
index 0000000000..0aad549239
--- /dev/null
+++ b/game/modules/tome/data/maps/vaults/honey_glade_dark.lua
@@ -0,0 +1,44 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+defineTile('!', "ROCK_VAULT_DARK", nil, nil, nil, {room_map={special=false, room=false, can_open=true}})
+defineTile(' ', "GRASS_DARK1")
+defineTile('+', "DOOR")
+defineTile('X', {"HARDTREE_DARK1","HARDTREE_DARK2","HARDTREE_DARK3","HARDTREE_DARK4","HARDTREE_DARK5","HARDTREE_DARK6","HARDTREE_DARK7","HARDTREE_DARK8","HARDTREE_DARK9","HARDTREE_DARK10","HARDTREE_DARK11","HARDTREE_DARK12","HARDTREE_DARK13","HARDTREE_DARK14","HARDTREE_DARK15","HARDTREE_DARK16","HARDTREE_DARK17","HARDTREE_DARK18","HARDTREE_DARK19","HARDTREE_DARK20"})
+defineTile('^', "GRASS_DARK1", nil, nil, {random_filter={add_levels=5}})
+defineTile('#', "GRASS_DARK1", nil, {random_filter={name="honey tree"}})
+defineTile('q', "GRASS_DARK1", {random_filter={add_levels=10}}, {random_filter={name="brown bear", add_levels=10}})
+defineTile('Q', "GRASS_DARK1", {random_filter={add_levels=20}}, {random_filter={name="grizzly bear", add_levels=20}})
+
+startx = 2
+starty = 10
+
+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]],
+}
diff --git a/game/modules/tome/data/rooms/greater_vault.lua b/game/modules/tome/data/rooms/greater_vault.lua
index 3a7a73e901..7fbe26d6c6 100644
--- a/game/modules/tome/data/rooms/greater_vault.lua
+++ b/game/modules/tome/data/rooms/greater_vault.lua
@@ -23,7 +23,7 @@ local list = {
 }
 
 return function(gen, id, lev, old_lev)
-	local vaultid = rng.table(gen.data.vaults_list or list)
+	local vaultid = rng.table(gen.data.greater_vaults_list or list)
 	local vault_map = engine.Map.new(max_w, max_h)
 	local Static = require("engine.generator.map.Static")
 	local data = table.clone(gen.data)
diff --git a/game/modules/tome/data/rooms/lesser_vault.lua b/game/modules/tome/data/rooms/lesser_vault.lua
new file mode 100644
index 0000000000..d1a5c0cf81
--- /dev/null
+++ b/game/modules/tome/data/rooms/lesser_vault.lua
@@ -0,0 +1,56 @@
+-- ToME - Tales of Middle-Earth
+-- Copyright (C) 2009, 2010 Nicolas Casalini
+--
+-- This program is free software: you can redistribute it and/or modify
+-- it under the terms of the GNU General Public License as published by
+-- the Free Software Foundation, either version 3 of the License, or
+-- (at your option) any later version.
+--
+-- This program is distributed in the hope that it will be useful,
+-- but WITHOUT ANY WARRANTY; without even the implied warranty of
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+-- GNU General Public License for more details.
+--
+-- You should have received a copy of the GNU General Public License
+-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
+--
+-- Nicolas Casalini "DarkGod"
+-- darkgod@te4.org
+
+local max_w, max_h = 50, 50
+local list = {
+	"honey_glade",
+}
+
+return function(gen, id, lev, old_lev)
+	local vaultid = rng.table(gen.data.lesser_vaults_list or list)
+	local vault_map = engine.Map.new(max_w, max_h)
+	local Static = require("engine.generator.map.Static")
+	local data = table.clone(gen.data)
+	data.map = "vaults/"..vaultid
+
+	local old_map = gen.level.map
+	local old_game_level = game.level
+	game.level = gen.level
+	gen.level.map = vault_map
+	local vault = Static.new(gen.zone, vault_map, gen.level, data)
+	vault:generate(lev, old_lev)
+	game.level = old_game_level
+	gen.level.map = old_map
+
+	local w = vault_map.w
+	local h = vault_map.h
+	return { name="lesser_vault-"..vaultid.."-"..w.."x"..h, w=w, h=h, generator = function(self, x, y, is_lit)
+		gen.map:import(vault_map, x, y)
+		vault_map:close()
+		-- Make it a room, and make it special so that we do not tunnel through
+		for i = x, x + w - 1 do for j = y, y + h - 1 do
+			gen.map.room_map[i][j].special = true
+			gen.map.room_map[i][j].room = id
+		end end
+		if vault.gen_map.startx and vault.gen_map.starty then
+			gen.spots[#gen.spots+1] = {x=vault.gen_map.startx + x, y=vault.gen_map.starty + y, check_connectivity="entrance", type="vault", subtype="lesser"}
+			return vault.gen_map.startx + x, vault.gen_map.starty + y
+		end
+	end}
+end
diff --git a/game/modules/tome/data/zones/eruan/grids.lua b/game/modules/tome/data/zones/eruan/grids.lua
index 42797611be..cab6da50e5 100644
--- a/game/modules/tome/data/zones/eruan/grids.lua
+++ b/game/modules/tome/data/zones/eruan/grids.lua
@@ -19,7 +19,9 @@
 
 load("/data/general/grids/basic.lua")
 load("/data/general/grids/water.lua")
+load("/data/general/grids/forest.lua")
 load("/data/general/grids/sand.lua")
+load("/data/general/grids/mountain.lua")
 
 newEntity{
 	define_as = "MOUNT_DOOM_PORTAL",
diff --git a/game/modules/tome/data/zones/eruan/zone.lua b/game/modules/tome/data/zones/eruan/zone.lua
index 7695e69820..f8e108d018 100644
--- a/game/modules/tome/data/zones/eruan/zone.lua
+++ b/game/modules/tome/data/zones/eruan/zone.lua
@@ -25,7 +25,7 @@ return {
 	decay = {300, 800},
 	actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
 	width = 50, height = 50,
---	all_remembered = true,
+	all_remembered = true,
 	all_lited = true,
 	persistant = "zone",
 	ambiant_music = "Bazaar of Tal-Mashad.ogg",
@@ -45,6 +45,11 @@ return {
 				size = {w=25, h=25},
 				pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
 			},
+
+			nb_rooms = {1,2},
+			rooms = {"greater_vault"},
+			greater_vaults_list = {"dragon_lair"},
+			lite_room_chance = 100,
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
diff --git a/game/modules/tome/data/zones/infinite-dungeon/zone.lua b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
index 43ffed9202..7ec6a03f35 100644
--- a/game/modules/tome/data/zones/infinite-dungeon/zone.lua
+++ b/game/modules/tome/data/zones/infinite-dungeon/zone.lua
@@ -36,7 +36,7 @@ return {
 --			rooms = {"simple", "pilar", {"money_vault",5}},
 			rooms = {"simple", "greater_vault"},
 			rooms_config = {pit={filters={{type="undead"}}}},
-			vaults_list = {"double-t","crypt","treasure1","diggers"},
+			greater_vaults_list = {"double-t","crypt","treasure1","diggers"},
 			lite_room_chance = 50,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
diff --git a/game/modules/tome/data/zones/old-forest/zone.lua b/game/modules/tome/data/zones/old-forest/zone.lua
index 00e54e30ff..e5d4fabe68 100644
--- a/game/modules/tome/data/zones/old-forest/zone.lua
+++ b/game/modules/tome/data/zones/old-forest/zone.lua
@@ -34,8 +34,9 @@ return {
 			class = "engine.generator.map.Roomer",
 			nb_rooms = 10,
 			edge_entrances = {6,4},
-			rooms = {"forest_clearing"},
+			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_dark"},
 			['.'] = "GRASS_DARK1",
 			['#'] = {"TREE_DARK1","TREE_DARK2","TREE_DARK3","TREE_DARK4","TREE_DARK5","TREE_DARK6","TREE_DARK7","TREE_DARK8","TREE_DARK9","TREE_DARK10","TREE_DARK11","TREE_DARK12","TREE_DARK13","TREE_DARK14","TREE_DARK15","TREE_DARK16","TREE_DARK17","TREE_DARK18","TREE_DARK19","TREE_DARK20",},
 			up = "UP",
diff --git a/game/modules/tome/data/zones/tol-falas/zone.lua b/game/modules/tome/data/zones/tol-falas/zone.lua
index f175ede5e4..a2847f8e14 100644
--- a/game/modules/tome/data/zones/tol-falas/zone.lua
+++ b/game/modules/tome/data/zones/tol-falas/zone.lua
@@ -35,7 +35,7 @@ return {
 			nb_rooms = 10,
 			rooms = {"simple", "pilar", {"money_vault",5}, {"pit",7}, {"greater_vault",8}},
 			rooms_config = {pit={filters={{type="undead"}}}},
-			vaults_list = {"double-t","crypt","treasure1","diggers"},
+			greater_vaults_list = {"double-t","crypt","treasure1","diggers"},
 			lite_room_chance = 100,
 			['.'] = "FLOOR",
 			['#'] = "WALL",
@@ -45,7 +45,7 @@ return {
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
-			nb_npc = {0, 0},
+			nb_npc = {20, 30},
 			guardian = "THE_MASTER",
 		},
 		object = {
diff --git a/game/modules/tome/data/zones/trollshaws/zone.lua b/game/modules/tome/data/zones/trollshaws/zone.lua
index 3aa79d4782..8fcd3153a4 100644
--- a/game/modules/tome/data/zones/trollshaws/zone.lua
+++ b/game/modules/tome/data/zones/trollshaws/zone.lua
@@ -45,6 +45,11 @@ return {
 				size = {w=25, h=25},
 				pond = {{0.6, "DEEP_WATER"}, {0.8, "SHALLOW_WATER"}},
 			},
+
+			nb_rooms = {0,0,0,0,1},
+			rooms = {"lesser_vault"},
+			greater_vaults_list = {"honey_tree"},
+			lite_room_chance = 100,
 		},
 		actor = {
 			class = "engine.generator.actor.Random",
-- 
GitLab