Skip to content
Snippets Groups Projects
Commit 5fbb9f98 authored by dg's avatar dg
Browse files

fix crash on scroll

betet generator


git-svn-id: http://svn.net-core.org/repos/t-engine4@132 51575b47-30f0-44d4-a5cc-537603b46e54
parent 288edb34
No related branches found
No related tags found
No related merge requests found
......@@ -94,7 +94,7 @@ end
--- Asks the zone to generate a level of level "lev"
-- @param lev the level (from 1 to zone.max_level)
-- @return a Level object
function _M:getLevel(game, lev, no_close)
function _M:getLevel(game, lev, old_lev, no_close)
-- Before doing anything else, close the current level
if not no_close and game.level and game.level.map then
if game.level.data.persistant then
......@@ -123,7 +123,7 @@ function _M:getLevel(game, lev, no_close)
-- In any cases, make one if none was found
if not level then
level = self:newLevel(level_data, lev, game)
level = self:newLevel(level_data, lev, old_lev, game)
end
-- Clean up things
......@@ -132,7 +132,7 @@ function _M:getLevel(game, lev, no_close)
return level
end
function _M:newLevel(level_data, lev, game)
function _M:newLevel(level_data, lev, old_lev, game)
local map = self.map_class.new(level_data.width, level_data.height)
if level_data.all_lited then map:liteAll(0, 0, map.w, map.h) end
if level_data.all_remembered then map:rememberAll(0, 0, map.w, map.h) end
......@@ -143,7 +143,7 @@ function _M:newLevel(level_data, lev, game)
self.grid_list,
level_data.generator.map
)
local startx, starty = generator:generate()
local startx, starty = generator:generate(lev, old_lev)
local level = self.level_class.new(lev, map)
level.start = {x=startx, y=starty}
......
......@@ -11,7 +11,7 @@ function _M:init(map, grid_list, data)
self.down = grid_list[data.down]
end
function _M:generate()
function _M:generate(lev, old_lev)
for i = 0, self.map.w - 1 do for j = 0, self.map.h - 1 do
self.map(i, j, Map.TERRAIN, self.wall)
end end
......@@ -60,7 +60,13 @@ function _M:generate()
end
end
-- Always starts at 1, 1
self.map(1, 1, Map.TERRAIN, self.up)
self.map(math.floor(self.map.w/2)*2-1-2*(1-math.mod(self.map.w,2)), math.floor(self.map.h/2)*2-1-2*(1-math.mod(self.map.h,2)), Map.TERRAIN, self.down)
return 1, 1
local ux, uy = 1, 1
local dx, dy = math.floor(self.map.w/2)*2-1-2*(1-math.mod(self.map.w,2)), math.floor(self.map.h/2)*2-1-2*(1-math.mod(self.map.h,2))
self.map(ux, uy, Map.TERRAIN, self.up)
self.map(dx, dy, Map.TERRAIN, self.down)
if lev > old_lev then
return ux, uy
else
return dx, dy
end
end
......@@ -130,7 +130,7 @@ function _M:markTunnel(x, y, xdir, ydir, id)
local dir = coord_to_dir[xdir][ydir]
for i, d in ipairs(mark_dirs[dir]) do
local xd, yd = dir_to_coord[d][1], dir_to_coord[d][2]
if not self.room_map[x+xd][y+yd].tunnel then self.room_map[x+xd][y+yd].tunnel = id end
if self.map:isBound(x+xd, y+yd) and not self.room_map[x+xd][y+yd].tunnel then self.room_map[x+xd][y+yd].tunnel = id end
end
if not self.room_map[x][y].tunnel then self.room_map[x][y].tunnel = id end
end
......@@ -160,36 +160,37 @@ function _M:tunnel(x1, y1, x2, y2, id)
end
nx, ny = x1 + xdir, y1 + ydir
end
print(feat, "try pos", nx, ny, "dir", coord_to_dir[xdir][ydir])
-- print(feat, "try pos", nx, ny, "dir", coord_to_dir[xdir][ydir])
if self.room_map[nx][ny].room then
tun[#tun+1] = {nx,ny}
x1, y1 = nx, ny
print(feat, "accept room")
-- print(feat, "accept room")
elseif self.room_map[nx][ny].can_open ~= nil then
if self.room_map[nx][ny].can_open then
print(feat, "tunnel crossing can_open", nx,ny)
-- print(feat, "tunnel crossing can_open", nx,ny)
for i = -1, 1 do for j = -1, 1 do if self.map:isBound(nx + i, ny + j) and self.room_map[nx + i][ny + j].can_open then
self.room_map[nx + i][ny + j].can_open = false
print(feat, "forbiding crossing at ", nx+i,ny+j)
-- print(feat, "forbiding crossing at ", nx+i,ny+j)
end end end
tun[#tun+1] = {nx,ny,true}
x1, y1 = nx, ny
print(feat, "accept can_open")
-- print(feat, "accept can_open")
else
print(feat, "reject can_open")
-- print(feat, "reject can_open")
end
elseif self.room_map[x1][y1].tunnel then
if self.room_map[x1][y1].tunnel ~= id then
tun[#tun+1] = {nx,ny}
x1, y1 = nx, ny
-- print(feat, "accept tunnel")
else
print(feat, "reject tunnel")
-- print(feat, "reject tunnel")
end
else
tun[#tun+1] = {nx,ny}
x1, y1 = nx, ny
print(feat, "accept normal")
-- print(feat, "accept normal")
end
self:markTunnel(x1, y2, xdir, ydir, id)
......@@ -201,7 +202,6 @@ function _M:tunnel(x1, y1, x2, y2, id)
for _, t in ipairs(tun) do
local nx, ny = t[1], t[2]
-- self.room_map[nx][ny].tunnel = true
if t[3] and self.data.door and rng.percent(self.data.door_chance) then
self.map(nx, ny, Map.TERRAIN, self.grid_list[self:resolve("door")])
else
......@@ -211,7 +211,7 @@ function _M:tunnel(x1, y1, x2, y2, id)
end
--- Make rooms and connect them with tunnels
function _M:generate()
function _M:generate(lev, old_lev)
for i = 0, self.map.w - 1 do for j = 0, self.map.h - 1 do
self.map(i, j, Map.TERRAIN, self.grid_list[self:resolve("#")])
end end
......@@ -233,7 +233,29 @@ function _M:generate()
tx, ty = rooms[i].cx, rooms[i].cy
end
-- Always starts at 1, 1
self.map(rooms[1].cx, rooms[1].cy, Map.TERRAIN, self.up)
return rooms[1].cx, rooms[1].cy
-- Put down stairs
local dx, dy
while true do
dx, dy = rng.range(1, self.map.w - 1), rng.range(1, self.map.h - 1)
if not self.map:checkEntity(dx, dy, Map.TERRAIN, "block_move") and not self.room_map[dx][dy].special then
self.map(dx, dy, Map.TERRAIN, self.grid_list[self:resolve("down")])
break
end
end
-- Put up stairs
local ux, uy
while true do
ux, uy = rng.range(1, self.map.w - 1), rng.range(1, self.map.h - 1)
if not self.map:checkEntity(ux, uy, Map.TERRAIN, "block_move") and not self.room_map[ux][uy].special then
self.map(ux, uy, Map.TERRAIN, self.grid_list[self:resolve("down")])
break
end
end
if lev > old_lev then
return ux, uy
else
return dx, dy
end
end
......@@ -103,56 +103,14 @@ function _M:findMatchingTiles(st, dir)
for _, dt in ipairs(self.tiles) do
local ok = true
print("try match ", st.id, dt.id)
if dir == 8 then
local sw = #st
local dw = #dt
print("sw/dw", sw,dw,#st[1],#dt[1])
if dw < sw then
print("dest 8 smaller")
for offset = 0, sw - dw do
ok = true
for i = 1, dw do
print("","try offset",offset,i,"::",st[i+offset] and st[i+offset][1], dt[i] and dt[i][self.block.h])
if not st[i+offset] or not dt[i] or not self:matchTile(st[i+offset][1], dt[i][self.block.h]) then ok = false end
end
print("tried ",offset,"result",ok)
if ok then break end
end
else
print("dest 8 bigger")
for offset = 0, dw - sw do
ok = true
for i = 1, sw do
print("","try offset",offset,i,"::",st[i] and st[i][1], dt[i+offset] and dt[i+offset][self.block.h])
if not st[i] or not dt[i+offset] or not self:matchTile(st[i][1], dt[i+offset][self.block.h]) then ok = false end
end
print("tried ",offset,"result",ok)
if ok then break end
end
for i = 1, self.block.w do
if not self:matchTile(st[i][1], dt[i][self.block.h]) then ok = false end
end
elseif dir == 2 then
--[[
local sw = #st
local dw = #dt
if dw < sw then
print("dest 2 smaller")
for offset = 0, sw - dw do
for i = offset + 1, offset + dw do
if not st[i] or not dt[i] or not self:matchTile(st[i][self.block.h], dt[i][1]) then ok = false end
end
print("tried ",offset,"result",ok)
end
else
print("dest 2 bigger")
for offset = 0, dw - sw do
for i = offset + 1, offset + sw do
if not self:matchTile(st[i][self.block.h], dt[i][1]) then ok = false end
end
print("tried ",offset,"result",ok)
end
for i = 1, self.block.w do
if not self:matchTile(st[i][self.block.h], dt[i][1]) then ok = false end
end
]]
elseif dir == 4 then
for j = 1, self.block.h do
if not self:matchTile(st[1][j], dt[#dt][j]) then ok = false end
......
......@@ -24,8 +24,8 @@ function _M:generate()
o:resolve()
local x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
local tries = 0
while self.map(x, y, Map.OBJECT) and tries < 100 do
x, y = rng.range(0, self.map.w), rng.range(0, self.map.h)
while (self.map:checkEntity(x, y, Map.TERRAIN, "block_move") or self.map(x, y, Map.OBJECT)) and tries < 100 do
x, y = rng.range(0, self.map.w-1), rng.range(0, self.map.h-1)
tries = tries + 1
end
if tries < 100 then
......
......@@ -104,7 +104,7 @@ function _M:getSaveDescription()
end
function _M:changeLevel(lev)
self.zone:getLevel(self, lev)
self.zone:getLevel(self, lev, self.level and self.level.level or -1000)
self.player:move(self.level.start.x, self.level.start.y, true)
self.level:addEntity(self.player)
end
......
......@@ -11,11 +11,11 @@ tiles =
{
{type="tunnel",
[[#.#]],
[[#.#]],
[[#<#]],
[[#.#]],
[[#.#]],
[[##.##]],
[[##.##]],
[[##.##]],
[[##.##]],
[[##.##]],
},
{type="tunnel",
......@@ -26,12 +26,13 @@ tiles =
[[##.##]],
},
--[=[
{type="tunnel",
{
[[#####]],
[[#####]],
[[.....]],
[[#####]],
[[#####]],
},
{type="tunnel",
......@@ -65,8 +66,7 @@ tiles =
[[##.##]],
[[##.##]],
},
]=]
--[=[
{type="tunnel",
[[##.##]],
[[##.##]],
......@@ -158,28 +158,4 @@ tiles =
[[....#]],
[[#####]],
},
]=]
--[=[
{type="room",
[[#####.####]],
[[#........#]],
[[....##....]],
[[#........#]],
[[#####.####]],
},
{type="room",
[[#####.####]],
[[#........#]],
[[....##....]],
[[#........#]],
[[####..####]],
[[####..####]],
[[#........#]],
[[....##....]],
[[#........#]],
[[#####.####]],
},
]=]
}
......@@ -10,19 +10,9 @@ return {
map = {
class = "engine.generator.map.Roomer",
nb_rooms = 9,
rooms = {"simple",},--"pilar"},
rooms = {"simple", "pilar"},
['.'] = "FLOOR",
['#'] = "WALL",
['<'] = "UP",
['1'] = "1",
['2'] = "2",
['3'] = "3",
['4'] = "4",
['5'] = "5",
['6'] = "6",
['7'] = "7",
['8'] = "8",
['9'] = "9",
up = "UP",
down = "DOWN",
door = "DOOR",
......
......@@ -190,7 +190,7 @@ static int map_to_screen(lua_State *L)
{
for (j = map->my; j < map->my + map->mheight; j++)
{
if ((i >= map->w) || (j >= map->h)) continue;
if ((i < 0) || (j < 0) || (i >= map->w) || (j >= map->h)) continue;
int dx = x + (i - map->mx) * 16;
int dy = y + (j - map->my) * 16;
......
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