scpcb-godot/src/DynamicMap.gd
2025-01-22 12:43:35 +00:00

798 lines
25 KiB
GDScript
Raw Blame History

extends Node3D
var roomTemplatesRaw = Dictionary()
func _ready() -> void:
#RMesh.LoadRMesh(self, "GFX\\map\\gatea_opt.rmesh")
#B3D.Load("GFX\\npcs\\106_2.b3d")
add_child(B3D.Load("GFX\\apache.b3d"))
var rooms = INI.Load("res://Data/rooms.ini")
for room in rooms:
if room == "loose":
continue
if room == "room ambience":
continue
var roomInfo = rooms[room]
if not roomInfo.has("mesh path"):
print(room, roomInfo)
continue
roomTemplatesRaw.get_or_add(room, roomInfo)
#RMesh.LoadRMesh(self, roomInfo["mesh path"])
#CreateMap()
var I_Zone: MapZones = MapZones.new()
var RandomSeed: String = ""
var MapWidth = Main.options.get("options").get("map size").to_int()
var MapHeight = Main.options.get("options").get("map size").to_int()
const RoomScale = 8.0 / 2048.0
const HideDistance = 15.0
var MapTemp = Utils.Init2DArray(MapWidth + 1, MapHeight + 1, 0)
var MapFound = Utils.Init2DArray(MapWidth + 1, MapHeight + 1, 0)
const ZONEAMOUNT = 3
const ROOM1 = 1
const ROOM2 = 2
const ROOM2C = 3
const ROOM3 = 4
const ROOM4 = 5
var MapRoom: Array
var MapName = Utils.Init2DArray(MapWidth, MapHeight, "")
var MapRoomID = Utils.Init1DArray(ROOM4 + 1, 0)
func GetZone(y):
return min(floor((float(MapWidth - y) / MapWidth * ZONEAMOUNT)), ZONEAMOUNT -1)
func SetRoom(room_name, room_type, pos, min_pos, max_pos): # place a room without overwriting others
if max_pos < min_pos:
print(str("Can't place ", room_name))
return false
print(str("--- SETROOM: ", room_name.to_upper(), " ---"))
var looped = false
var can_place = true
while MapRoom[room_type][pos] != "":
print(str("found ", MapRoom[room_type][pos]))
pos = pos + 1
if pos > max_pos:
if not looped:
pos = min_pos + 1
looped = true
else:
can_place = false
break
print(str(room_name, " ", pos))
if can_place:
print("--------------")
MapRoom[room_type][pos] = room_name
return true
else:
print(str("couldn't place ", room_name))
return false
func CreateMap():
print(str("Generating a map using the seed ", RandomSeed))
I_Zone.Transition[0] = 13
I_Zone.Transition[1] = 7
I_Zone.HasCustomForest = false
I_Zone.HasCustomMT = false
var x: float
var y: float
var temp: float
#var i: float
var tempheight: float
var x2: float
#var y2: float
var width: float
var height: float
var zone: float
Main.SeedRnd = Utils.GenerateSeedNumber(RandomSeed)
x = floor(MapWidth / 2)
y = MapHeight - 2 # Rand(3, 5)
for i1 in range(y, MapHeight - 1):
MapTemp[x][i1] = 1
while y < 2:
width = randi_range(10, 15)
if x > MapWidth * 0.6:
width = -width
elif x > MapWidth * 0.4:
x = x - width / 2
# make sure the hallway doesn't go outside the array
if x + width > MapWidth - 3:
#x = -width+MapWidth-4
width = MapWidth - 3 - x
elif x + width < 2:
#x = 3-width
width = -x + 2
x = min(x, x + width)
width = abs(width)
for i1 in range(x, x + width):
MapTemp[min(i1, MapWidth)][y] = 1
height = randi_range(3, 4)
if y - height < 1:
height = y - 1
var yhallways = randi_range(4, 5)
if GetZone(y - height) != GetZone(y - height + 1):
height = height - 1
#For i = 1 To yhallways
for i in range(1, yhallways):
x2 = max(min(randi_range(x, x + width - 1),MapWidth - 2), 2)
while MapTemp[x2][y - 1] or MapTemp[x2 - 1][y - 1] or MapTemp[x2 + 1][y - 1]:
x2 = x2 + 1
if x2 < x + width:
if i == 1:
tempheight = height
if randi_range(1, 2) == 1:
x2 = x
else:
x2 = x + width
else:
tempheight = randi_range(1, height)
for y2 in range(y - tempheight, y):
if GetZone(y2) != GetZone(y2 + 1): # a room leading from zone to another
MapTemp[x2][y2] = 255
else:
MapTemp[x2][y2] = 1
if tempheight == height:
temp = x2
x = temp
y = y - height
var ZoneAmount = 3
var Room1Amount = Utils.Init1DArray(3, 0)
var Room2Amount = Utils.Init1DArray(3, 0)
var Room2CAmount = Utils.Init1DArray(3, 0)
var Room3Amount = Utils.Init1DArray(3, 0)
var Room4Amount = Utils.Init1DArray(3, 0)
# count the amount of rooms
#For y = 1 To MapHeight - 1
for y1 in range(1, MapHeight - 1):
zone = GetZone(y)
for x1 in range(1, MapWidth - 1):
if MapTemp[x1][y1] > 0:
temp = min(MapTemp[x1 + 1][y1], 1) + min(MapTemp[x1 - 1][y1], 1)
temp = temp + min(MapTemp[x1][y1 + 1], 1) + min(MapTemp[x1][y1 - 1], 1)
if MapTemp[x1][y1] < 255:
MapTemp[x1][y1] = temp
match MapTemp[x1][y1]:
1:
Room1Amount[zone] = Room1Amount[zone] +1
2:
if min(MapTemp[x1 + 1][y1], 1) + min(MapTemp[x1 - 1][y1], 1) == 2:
Room2Amount[zone] = Room2Amount[zone] + 1
elif min(MapTemp[x1][y1 + 1], 1) + min(MapTemp[x1][y1 - 1], 1) == 2:
Room2Amount[zone] = Room2Amount[zone] + 1
else:
Room2CAmount[zone] = Room2CAmount[zone] + 1
3:
Room3Amount[zone] = Room3Amount[zone] + 1
4:
Room4Amount[zone] = Room4Amount[zone] + 1
# force more room1s (if needed)
for i in range(0, 2):
# need more rooms if there are less than 5 of them
temp = -Room1Amount[i] + 5
var y2 = 0
var placed = false
if temp > 0:
for y1 in range((MapHeight/ZoneAmount) * (2 - i) + 1, ((MapHeight/ZoneAmount) * ((2 - i) + 1.0)) - 2):
for x1 in range(2, MapWidth - 2):
if MapTemp[x1][y1] == 0:
if (min(MapTemp[x1 + 1][y], 1) + min(MapTemp[x1 - 1][y1], 1) + min(MapTemp[x1][y1 + 1], 1) + min(MapTemp[x1][y1 - 1], 1)) == 1:
#If Rand(4)=1 Then
if MapTemp[x1 + 1][y]:
x2 = x1 + 1
y2 = y1
elif MapTemp[x - 1][y]:
x2 = x1 - 1
y2 = y1
elif MapTemp[x][y + 1]:
x2 = x1
y2 = y1 + 1
elif MapTemp[x][y-1]:
x2 = x1
y2 = y1 - 1
placed = false
if MapTemp[x2][y2] > 1 and MapTemp[x2][y2] < 4:
match MapTemp[x2][y2]:
2:
if min(MapTemp[x2 + 1][y2], 1) + min(MapTemp[x2 - 1][y2], 1) == 2:
Room2Amount[i] = Room2Amount[i] - 1
Room3Amount[i] = Room3Amount[i] + 1
placed = true
elif min(MapTemp[x2][y2 + 1], 1) + min(MapTemp[x2][y2 - 1], 1) == 2:
Room2Amount[i] = Room2Amount[i] - 1
Room3Amount[i] = Room3Amount[i] + 1
placed = true
3:
Room3Amount[i] = Room3Amount[i] - 1
Room4Amount[i] = Room4Amount[i] + 1
placed = true
if placed:
MapTemp[x2][y2] == MapTemp[x2][y2] + 1
MapTemp[x1][y1] = 1
Room1Amount[i] = Room1Amount[i] + 1
temp = temp - 1
if temp == 0:
break
if temp == 0:
break
# force more room4s and room2Cs
for i in range(0, 2):
var temp2 = 0
match i:
2:
zone = 2
temp2 = MapHeight / 3 #-1
1:
zone = MapHeight / 3 + 1
temp2 = MapHeight * (2.0 / 3.0) - 1
0:
zone = MapHeight * (2.0 / 3.0) + 1
temp2 = MapHeight - 2
if Room4Amount[i] < 1: # we want at least 1 ROOM4
print(str("forcing a ROOM4 into zone ", i))
temp = 0
for y1 in range(zone, temp2):
for x1 in range(2, MapWidth - 2):
if MapTemp[x1][y1] == 3:
if not (MapTemp[x1+1][y1] or MapTemp[x1+1][y1+1] or MapTemp[x1+1][y1-1] or MapTemp[x1+2][y1]):
MapTemp[x1+1][y1] = 1
temp = 1
elif not (MapTemp[x1-1][y1] or MapTemp[x1-1][y1+1] or MapTemp[x1-1][y1-1] or MapTemp[x1-2][y1]):
MapTemp[x1-1][y1] = 1
temp = 1
elif not (MapTemp[x1][y1+1] or MapTemp[x1+1][y1+1] or MapTemp[x1-1][y1+1] or MapTemp[x1][y1+2]):
MapTemp[x1][y1+1] = 1
temp = 1
elif not (MapTemp[x1][y1-1] or MapTemp[x1+1][y1-1] or MapTemp[x1-1][y1-1] or MapTemp[x1][y1-2]):
MapTemp[x1][y1-1] = 1
temp = 1
if temp == 1:
MapTemp[x1][y1] = 4 # turn this room into a ROOM4
print(str("ROOM4 forced into slot (", x1, ", ", y1, ")"))
Room4Amount[i] = Room4Amount[i] + 1
Room3Amount[i] = Room3Amount[i] - 1
Room1Amount[i] = Room1Amount[i] + 1
if temp == 1:
break
if temp == 1:
break
if temp == 0:
print(str("Couldn't place ROOM4 in zone ", i))
if Room2CAmount[i] < 1: #we want at least 1 ROOM2C
print(str("forcing a ROOM2C into zone ", i))
temp = 0
zone = zone + 1
temp2 = temp2 - 1
#For y = zone To temp2
#For x = 3 To MapWidth - 3
#If MapTemp(x,y)=1 Then
#Select True ;see if adding some rooms is possible
#Case MapTemp(x-1,y)>0
#If (MapTemp(x,y-1)+MapTemp(x,y+1)+MapTemp(x+2,y))=0 Then
#If (MapTemp(x+1,y-2)+MapTemp(x+2,y-1)+MapTemp(x+1,y-1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x+1,y)=2
#DebugLog "ROOM2C forced into slot ("+(x+1)+", "+(y)+")"
#MapTemp(x+1,y-1)=1
#temp=1
#Else If (MapTemp(x+1,y+2)+MapTemp(x+2,y+1)+MapTemp(x+1,y+1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x+1,y)=2
#DebugLog "ROOM2C forced into slot ("+(x+1)+", "+(y)+")"
#MapTemp(x+1,y+1)=1
#temp=1
#EndIf
#EndIf
#Case MapTemp(x+1,y)>0
#If (MapTemp(x,y-1)+MapTemp(x,y+1)+MapTemp(x-2,y))=0 Then
#If (MapTemp(x-1,y-2)+MapTemp(x-2,y-1)+MapTemp(x-1,y-1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x-1,y)=2
#DebugLog "ROOM2C forced into slot ("+(x-1)+", "+(y)+")"
#MapTemp(x-1,y-1)=1
#temp=1
#Else If (MapTemp(x-1,y+2)+MapTemp(x-2,y+1)+MapTemp(x-1,y+1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x-1,y)=2
#DebugLog "ROOM2C forced into slot ("+(x-1)+", "+(y)+")"
#MapTemp(x-1,y+1)=1
#temp=1
#EndIf
#EndIf
#Case MapTemp(x,y-1)>0
#If (MapTemp(x-1,y)+MapTemp(x+1,y)+MapTemp(x,y+2))=0 Then
#If (MapTemp(x-2,y+1)+MapTemp(x-1,y+2)+MapTemp(x-1,y+1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x,y+1)=2
#DebugLog "ROOM2C forced into slot ("+(x)+", "+(y+1)+")"
#MapTemp(x-1,y+1)=1
#temp=1
#Else If (MapTemp(x+2,y+1)+MapTemp(x+1,y+2)+MapTemp(x+1,y+1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x,y+1)=2
#DebugLog "ROOM2C forced into slot ("+(x)+", "+(y+1)+")"
#MapTemp(x+1,y+1)=1
#temp=1
#EndIf
#EndIf
#Case MapTemp(x,y+1)>0
#If (MapTemp(x-1,y)+MapTemp(x+1,y)+MapTemp(x,y-2))=0 Then
#If (MapTemp(x-2,y-1)+MapTemp(x-1,y-2)+MapTemp(x-1,y-1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x,y-1)=2
#DebugLog "ROOM2C forced into slot ("+(x)+", "+(y-1)+")"
#MapTemp(x-1,y-1)=1
#temp=1
#Else If (MapTemp(x+2,y-1)+MapTemp(x+1,y-2)+MapTemp(x+1,y-1))=0 Then
#MapTemp(x,y)=2
#MapTemp(x,y-1)=2
#DebugLog "ROOM2C forced into slot ("+(x)+", "+(y-1)+")"
#MapTemp(x+1,y-1)=1
#temp=1
#EndIf
#EndIf
#End Select
#If temp=1 Then
#Room2CAmount[i]=Room2CAmount[i]+1
#Room2Amount[i]=Room2Amount[i]+1
#EndIf
#EndIf
#If temp=1 Then Exit
#Next
#If temp=1 Then Exit
#Next
#
#If temp=0 Then DebugLog "Couldn't place ROOM2C in zone "+i
#EndIf
#
#Next
var MaxRooms = 55 * MapWidth / 20
MaxRooms = max(MaxRooms, Room1Amount[0] + Room1Amount[1] + Room1Amount[2] + 1)
MaxRooms = max(MaxRooms, Room2Amount[0] + Room2Amount[1] + Room2Amount[2] + 1)
MaxRooms = max(MaxRooms, Room2CAmount[0] + Room2CAmount[1] + Room2CAmount[2] + 1)
MaxRooms = max(MaxRooms, Room3Amount[0] + Room3Amount[1] + Room3Amount[2] + 1)
MaxRooms = max(MaxRooms, Room4Amount[0] + Room4Amount[1] + Room4Amount[2] + 1)
MapRoom = Utils.Init2DArray(ROOM4 + 1, MaxRooms)
# zone 1 --------------------------------------------------------------------------------------------------
var min_pos = 1
var max_pos = Room1Amount[0] - 1
MapRoom[ROOM1][0] = "start"
SetRoom("roompj", ROOM1, floor(0.1 * float(Room1Amount[0])), min_pos,max_pos)
SetRoom("914", ROOM1, floor(0.3 * float(Room1Amount[0])), min_pos, max_pos)
SetRoom("room1archive",ROOM1,floor(0.5 * float(Room1Amount[0])), min_pos, max_pos)
SetRoom("room205", ROOM1, floor(0.6 * float(Room1Amount[0])), min_pos, max_pos)
MapRoom[ROOM2C][0] = "lockroom"
min_pos = 1
max_pos = Room2Amount[0]-1
MapRoom[ROOM2][0] = "room2closets"
SetRoom("room2testroom2", ROOM2, floor(0.1 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2scps", ROOM2, floor(0.2 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2storage", ROOM2, floor(0.3 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2gw_b", ROOM2, floor(0.4 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2sl", ROOM2, floor(0.5 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room012", ROOM2, floor(0.55 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2scps2", ROOM2, floor(0.6 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room1123", ROOM2, floor(0.7 * float(Room2Amount[0])), min_pos, max_pos)
SetRoom("room2elevator", ROOM2, floor(0.85 * float(Room2Amount[0])), min_pos, max_pos)
MapRoom[ROOM3][floor(randf_range(0.2, 0.8) * float(Room3Amount[0]))] = "room3storage"
MapRoom[ROOM2C][floor(0.5 * float(Room2CAmount[0]))] = "room1162"
MapRoom[ROOM4][floor(0.3 * float(Room4Amount[0]))] = "room4info"
# zone 2 --------------------------------------------------------------------------------------------------
min_pos = Room1Amount[0]
max_pos = Room1Amount[0] + Room1Amount[1] - 1
SetRoom("room079", ROOM1, Room1Amount[0] + floor(0.15 * float(Room1Amount[1])), min_pos, max_pos)
SetRoom("room106", ROOM1, Room1Amount[0] + floor(0.3 * float(Room1Amount[1])), min_pos, max_pos)
SetRoom("008", ROOM1, Room1Amount[0] + floor(0.4 * float(Room1Amount[1])), min_pos, max_pos)
SetRoom("room035", ROOM1, Room1Amount[0] + floor(0.5 * float(Room1Amount[1])), min_pos, max_pos)
SetRoom("coffin", ROOM1, Room1Amount[0] + floor(0.7 * float(Room1Amount[1])), min_pos, max_pos)
min_pos = Room2Amount[0]
max_pos = Room2Amount[0] + Room2Amount[1] - 1
MapRoom[ROOM2][Room2Amount[0] + floor(0.1 * float(Room2Amount[1]))] = "room2nuke"
SetRoom("room2tunnel", ROOM2, Room2Amount[0] + floor(0.25 * float(Room2Amount[1])), min_pos, max_pos)
SetRoom("room049", ROOM2, Room2Amount[0] + floor(0.4 * float(Room2Amount[1])),min_pos,max_pos)
SetRoom("room2shaft",ROOM2,Room2Amount[0] + floor(0.6 * float(Room2Amount[1])), min_pos, max_pos)
SetRoom("testroom", ROOM2, Room2Amount[0] + floor(0.7 * float(Room2Amount[1])), min_pos, max_pos)
SetRoom("room2servers", ROOM2, Room2Amount[0] + floor(0.9 * Room2Amount[1]), min_pos, max_pos)
MapRoom[ROOM3][Room3Amount[0] + floor(0.3 * float(Room3Amount[1]))] = "room513"
MapRoom[ROOM3][Room3Amount[0] + floor(0.6 * float(Room3Amount[1]))] = "room966"
MapRoom[ROOM2C][Room2CAmount[0] + floor(0.5 * float(Room2CAmount[1]))] = "room2cpit"
# zone 3 --------------------------------------------------------------------------------------------------
MapRoom[ROOM1][Room1Amount[0] + Room1Amount[1] + Room1Amount[2] - 2] = "exit1"
MapRoom[ROOM1][Room1Amount[0] + Room1Amount[1] + Room1Amount[2] - 1] = "gateaentrance"
MapRoom[ROOM1][Room1Amount[0] + Room1Amount[1]] = "room1lifts"
min_pos = Room2Amount[0] + Room2Amount[1]
max_pos = Room2Amount[0] + Room2Amount[1]+Room2Amount[2] - 1
MapRoom[ROOM2][min_pos + floor(0.1 * float(Room2Amount[2]))] = "room2poffices"
SetRoom("room2cafeteria", ROOM2, min_pos + floor(0.2 * float(Room2Amount[2])), min_pos, max_pos)
SetRoom("room2sroom", ROOM2, min_pos + floor(0.3 * float(Room2Amount[2])), min_pos, max_pos)
SetRoom("room2servers2", ROOM2, min_pos + floor(0.4 * Room2Amount[2]), min_pos, max_pos)
SetRoom("room2offices", ROOM2, min_pos + floor(0.45 * Room2Amount[2]), min_pos, max_pos)
SetRoom("room2offices4", ROOM2, min_pos + floor(0.5 * Room2Amount[2]), min_pos, max_pos)
SetRoom("room860", ROOM2, min_pos + floor(0.6 * Room2Amount[2]), min_pos, max_pos)
SetRoom("medibay", ROOM2, min_pos + floor(0.7 * float(Room2Amount[2])), min_pos, max_pos)
SetRoom("room2poffices2", ROOM2, min_pos + floor(0.8 * Room2Amount[2]), min_pos, max_pos)
SetRoom("room2offices2", ROOM2, min_pos + floor(0.9 * float(Room2Amount[2])), min_pos, max_pos)
MapRoom[ROOM2C][Room2CAmount[0] + Room2CAmount[1]] = "room2ccont"
MapRoom[ROOM2C][Room2CAmount[0] + Room2CAmount[1] + 1] = "lockroom2"
MapRoom[ROOM3][Room3Amount[0] + Room3Amount[1] + floor(0.3 * float(Room3Amount[2]))] = "room3servers"
MapRoom[ROOM3][Room3Amount[0] + Room3Amount[1] + floor(0.7 * float(Room3Amount[2]))] = "room3servers2"
#MapRoom(ROOM3, Room3Amount[0]+Room3Amount[1]) = "room3gw"
MapRoom[ROOM3][Room3Amount[0] + Room3Amount[1] + floor(0.5 * float(Room3Amount[2]))] = "room3offices"
print(MapRoom)
#----------------------- creating the map --------------------------------
#temp = 0
#Local r.Rooms, spacing# = 8.0
#For y = MapHeight - 1 To 1 Step - 1
#
#;zone% = GetZone(y)
#
#If y < MapHeight/3+1 Then
#zone=3
#ElseIf y < MapHeight*(2.0/3.0);-1
#zone=2
#Else
#zone=1
#EndIf
#
#For x = 1 To MapWidth - 2
#If MapTemp(x, y) = 255 Then
#If y>MapHeight/2 Then ;zone = 2
#r = CreateRoom(zone, ROOM2, x * 8, 0, y * 8, "checkpoint1")
#Else ;If zone = 3
#r = CreateRoom(zone, ROOM2, x * 8, 0, y * 8, "checkpoint2")
#EndIf
#ElseIf MapTemp(x, y) > 0
#
#temp = Min(MapTemp(x + 1, y),1) + Min(MapTemp(x - 1, y),1) + Min(MapTemp(x, y + 1),1) + Min(MapTemp(x, y - 1),1)
#
#Select temp ;viereisiss<73> ruuduissa olevien huoneiden m<><6D>r<EFBFBD>
#Case 1
#If MapRoomID(ROOM1) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM1, MapRoomID(ROOM1)) <> "" Then MapName(x, y) = MapRoom(ROOM1, MapRoomID(ROOM1))
#EndIf
#
#r = CreateRoom(zone, ROOM1, x * 8, 0, y * 8, MapName(x, y))
#If MapTemp(x, y + 1) Then
#r\angle = 180
#TurnEntity(r\obj, 0, r\angle, 0)
#ElseIf MapTemp(x - 1, y)
#r\angle = 270
#TurnEntity(r\obj, 0, r\angle, 0)
#ElseIf MapTemp(x + 1, y)
#r\angle = 90
#TurnEntity(r\obj, 0, r\angle, 0)
#Else
#r\angle = 0
#End If
#MapRoomID(ROOM1)=MapRoomID(ROOM1)+1
#Case 2
#If MapTemp(x - 1, y)>0 And MapTemp(x + 1, y)>0 Then
#If MapRoomID(ROOM2) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM2, MapRoomID(ROOM2)) <> "" Then MapName(x, y) = MapRoom(ROOM2, MapRoomID(ROOM2))
#EndIf
#r = CreateRoom(zone, ROOM2, x * 8, 0, y * 8, MapName(x, y))
#If Rand(2) = 1 Then r\angle = 90 Else r\angle = 270
#TurnEntity(r\obj, 0, r\angle, 0)
#MapRoomID(ROOM2)=MapRoomID(ROOM2)+1
#ElseIf MapTemp(x, y - 1)>0 And MapTemp(x, y + 1)>0
#If MapRoomID(ROOM2) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM2, MapRoomID(ROOM2)) <> "" Then MapName(x, y) = MapRoom(ROOM2, MapRoomID(ROOM2))
#EndIf
#r = CreateRoom(zone, ROOM2, x * 8, 0, y * 8, MapName(x, y))
#If Rand(2) = 1 Then r\angle = 180 Else r\angle = 0
#TurnEntity(r\obj, 0, r\angle, 0)
#MapRoomID(ROOM2)=MapRoomID(ROOM2)+1
#Else
#If MapRoomID(ROOM2C) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM2C, MapRoomID(ROOM2C)) <> "" Then MapName(x, y) = MapRoom(ROOM2C, MapRoomID(ROOM2C))
#EndIf
#
#If MapTemp(x - 1, y)>0 And MapTemp(x, y + 1)>0 Then
#r = CreateRoom(zone, ROOM2C, x * 8, 0, y * 8, MapName(x, y))
#r\angle = 180
#TurnEntity(r\obj, 0, r\angle, 0)
#ElseIf MapTemp(x + 1, y)>0 And MapTemp(x, y + 1)>0
#r = CreateRoom(zone, ROOM2C, x * 8, 0, y * 8, MapName(x, y))
#r\angle = 90
#TurnEntity(r\obj, 0, r\angle, 0)
#ElseIf MapTemp(x - 1, y)>0 And MapTemp(x, y - 1)>0
#r = CreateRoom(zone, ROOM2C, x * 8, 0, y * 8, MapName(x, y))
#TurnEntity(r\obj, 0, 270, 0)
#r\angle = 270
#Else
#r = CreateRoom(zone, ROOM2C, x * 8, 0, y * 8, MapName(x, y))
#EndIf
#MapRoomID(ROOM2C)=MapRoomID(ROOM2C)+1
#EndIf
#Case 3
#If MapRoomID(ROOM3) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM3, MapRoomID(ROOM3)) <> "" Then MapName(x, y) = MapRoom(ROOM3, MapRoomID(ROOM3))
#EndIf
#
#r = CreateRoom(zone, ROOM3, x * 8, 0, y * 8, MapName(x, y))
#If (Not MapTemp(x, y - 1)) Then
#TurnEntity(r\obj, 0, 180, 0)
#r\angle = 180
#ElseIf (Not MapTemp(x - 1, y))
#TurnEntity(r\obj, 0, 90, 0)
#r\angle = 90
#ElseIf (Not MapTemp(x + 1, y))
#TurnEntity(r\obj, 0, -90, 0)
#r\angle = 270
#End If
#MapRoomID(ROOM3)=MapRoomID(ROOM3)+1
#Case 4
#If MapRoomID(ROOM4) < MaxRooms And MapName(x,y) = "" Then
#If MapRoom(ROOM4, MapRoomID(ROOM4)) <> "" Then MapName(x, y) = MapRoom(ROOM4, MapRoomID(ROOM4))
#EndIf
#
#r = CreateRoom(zone, ROOM4, x * 8, 0, y * 8, MapName(x, y))
#MapRoomID(ROOM4)=MapRoomID(ROOM4)+1
#End Select
#
#EndIf
#
#Next
#Next
#
#r = CreateRoom(0, ROOM1, (MapWidth-1) * 8, 500, 8, "gatea")
#MapRoomID(ROOM1)=MapRoomID(ROOM1)+1
#
#r = CreateRoom(0, ROOM1, (MapWidth-1) * 8, 0, (MapHeight-1) * 8, "pocketdimension")
#MapRoomID(ROOM1)=MapRoomID(ROOM1)+1
#
#If IntroEnabled
#r = CreateRoom(0, ROOM1, 8, 0, (MapHeight-1) * 8, "173")
#MapRoomID(ROOM1)=MapRoomID(ROOM1)+1
#EndIf
#
#r = CreateRoom(0, ROOM1, 8, 800, 0, "dimension1499")
#MapRoomID(ROOM1)=MapRoomID(ROOM1)+1
#
#For r.Rooms = Each Rooms
#PreventRoomOverlap(r)
#Next
#
#If 0 Then
#Repeat
#Cls
#For x = 0 To MapWidth - 1
#For y = 0 To MapHeight - 1
#If MapTemp(x, y) = 0 Then
#
#zone=GetZone(y)
#
#Color 50*zone, 50*zone, 50*zone
#Rect(x * 32, y * 32, 30, 30)
#Else
#If MapTemp(x, y) = 255 Then
#Color 0,200,0
#Else If MapTemp(x,y)=4 Then
#Color 50,50,255
#Else If MapTemp(x,y)=3 Then
#Color 50,255,255
#Else If MapTemp(x,y)=2 Then
#Color 255,255,50
#Else
#Color 255, 255, 255
#EndIf
#Rect(x * 32, y * 32, 30, 30)
#End If
#Next
#Next
#
#For x = 0 To MapWidth - 1
#For y = 0 To MapHeight - 1
#
#If MouseX()>x*32 And MouseX()<x*32+32 Then
#If MouseY()>y*32 And MouseY()<y*32+32 Then
#Color 255, 0, 0
#Else
#Color 200, 200, 200
#EndIf
#Else
#Color 200, 200, 200
#EndIf
#
#If MapTemp(x, y) > 0 Then
#Text x * 32 +2, (y) * 32 + 2,MapTemp(x, y) +" "+ MapName(x,y)
#End If
#Next
#Next
#
#Flip
#Until KeyHit(28)
#EndIf
#
#
#For y = 0 To MapHeight
#For x = 0 To MapWidth
#MapTemp(x, y) = Min(MapTemp(x, y),1)
#Next
#Next
#
#Local d.Doors
#Local shouldSpawnDoor%
#For y = MapHeight To 0 Step -1
#
#If y<I_Zone\Transition[1]-1 Then
#zone=3
#ElseIf y>=I_Zone\Transition[1]-1 And y<I_Zone\Transition[0]-1 Then
#zone=2
#Else
#zone=1
#EndIf
#
#For x = MapWidth To 0 Step -1
#If MapTemp(x,y) > 0 Then
#If zone = 2 Then temp=2 Else temp=0
#
#For r.Rooms = Each Rooms
#r\angle = WrapAngle(r\angle)
#If Int(r\x/8.0)=x And Int(r\z/8.0)=y Then
#shouldSpawnDoor = False
#Select r\RoomTemplate\Shape
#Case ROOM1
#If r\angle=90
#shouldSpawnDoor = True
#EndIf
#Case ROOM2
#If r\angle=90 Or r\angle=270
#shouldSpawnDoor = True
#EndIf
#Case ROOM2C
#If r\angle=0 Or r\angle=90
#shouldSpawnDoor = True
#EndIf
#Case ROOM3
#If r\angle=0 Or r\angle=180 Or r\angle=90
#shouldSpawnDoor = True
#EndIf
#Default
#shouldSpawnDoor = True
#End Select
#If shouldSpawnDoor
#If (x+1)<(MapWidth+1)
#If MapTemp(x + 1, y) > 0 Then
#d.Doors = CreateDoor(r\zone, Float(x) * spacing + spacing / 2.0, 0, Float(y) * spacing, 90, r, Max(Rand(-3, 1), 0), temp)
#r\AdjDoor[0] = d
#EndIf
#EndIf
#EndIf
#
#shouldSpawnDoor = False
#Select r\RoomTemplate\Shape
#Case ROOM1
#If r\angle=180
#shouldSpawnDoor = True
#EndIf
#Case ROOM2
#If r\angle=0 Or r\angle=180
#shouldSpawnDoor = True
#EndIf
#Case ROOM2C
#If r\angle=180 Or r\angle=90
#shouldSpawnDoor = True
#EndIf
#Case ROOM3
#If r\angle=180 Or r\angle=90 Or r\angle=270
#shouldSpawnDoor = True
#EndIf
#Default
#shouldSpawnDoor = True
#End Select
#If shouldSpawnDoor
#If (y+1)<(MapHeight+1)
#If MapTemp(x, y + 1) > 0 Then
#d.Doors = CreateDoor(r\zone, Float(x) * spacing, 0, Float(y) * spacing + spacing / 2.0, 0, r, Max(Rand(-3, 1), 0), temp)
#r\AdjDoor[3] = d
#EndIf
#EndIf
#EndIf
#
#Exit
#EndIf
#Next
#
#End If
#
#Next
#Next
#
#For r.Rooms = Each Rooms
#;If r\angle >= 360
#; r\angle = r\angle-360
#;EndIf
#r\angle = WrapAngle(r\angle)
#r\Adjacent[0]=Null
#r\Adjacent[1]=Null
#r\Adjacent[2]=Null
#r\Adjacent[3]=Null
#For r2.Rooms = Each Rooms
#If r<>r2 Then
#If r2\z=r\z Then
#If (r2\x)=(r\x+8.0) Then
#r\Adjacent[0]=r2
#If r\AdjDoor[0] = Null Then r\AdjDoor[0] = r2\AdjDoor[2]
#ElseIf (r2\x)=(r\x-8.0)
#r\Adjacent[2]=r2
#If r\AdjDoor[2] = Null Then r\AdjDoor[2] = r2\AdjDoor[0]
#EndIf
#ElseIf r2\x=r\x Then
#If (r2\z)=(r\z-8.0) Then
#r\Adjacent[1]=r2
#If r\AdjDoor[1] = Null Then r\AdjDoor[1] = r2\AdjDoor[3]
#ElseIf (r2\z)=(r\z+8.0)
#r\Adjacent[3]=r2
#If r\AdjDoor[3] = Null Then r\AdjDoor[3] = r2\AdjDoor[1]
#EndIf
#EndIf
#EndIf
#If (r\Adjacent[0]<>Null) And (r\Adjacent[1]<>Null) And (r\Adjacent[2]<>Null) And (r\Adjacent[3]<>Null) Then Exit
#Next
#Next