215 lines
5.8 KiB
GDScript3
215 lines
5.8 KiB
GDScript3
extends Spatial
|
|
|
|
signal prepared
|
|
|
|
|
|
# Declare member variables here. Examples:
|
|
# var a = 2
|
|
# var b = "text"
|
|
|
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
var room = preload("res://scenes/maps/interior2.tscn")
|
|
var bed = preload("res://scenes/furniture/bed.tscn")
|
|
var table_chairs = preload("res://scenes/furniture/table_chairs.tscn")
|
|
var closet = preload("res://scenes/furniture/closet.tscn")
|
|
var size_x = 4
|
|
var size_y = 5
|
|
var floors = 5
|
|
var w = 10
|
|
var h = 8
|
|
var dungeon = []
|
|
var dungeon_save = {}
|
|
var spawn_save = {}
|
|
var prepared = false
|
|
func save():
|
|
for k in range(dungeon.size()):
|
|
dungeon[k].save()
|
|
dungeon_save[str(k)] = dungeon[k].save_data
|
|
global.save_data.dungeon = dungeon_save
|
|
var window_rooms = []
|
|
func build_rooms():
|
|
print("build_rooms")
|
|
var stairs_x = randi() % size_x
|
|
var stairs_y = randi() % size_y
|
|
|
|
for k in range(floors):
|
|
var cur_x = stairs_x
|
|
var cur_y = stairs_y
|
|
var cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x]
|
|
cur_room.set_meta("stairs", k)
|
|
var visited = []
|
|
while cur_room:
|
|
var choice = randi() % 4
|
|
match(choice):
|
|
0:
|
|
if cur_x > 0:
|
|
cur_room.open_path(cur_room.OPEN_LEFT)
|
|
cur_x -= 1
|
|
1:
|
|
if cur_x < size_x - 1:
|
|
cur_room.open_path(cur_room.OPEN_RIGHT)
|
|
cur_x += 1
|
|
2:
|
|
if cur_y > 0:
|
|
cur_room.open_path(cur_room.OPEN_UP)
|
|
cur_y -= 1
|
|
3:
|
|
if cur_y < size_y - 1:
|
|
cur_room.open_path(cur_room.OPEN_DOWN)
|
|
cur_y += 1
|
|
if !cur_room in visited:
|
|
visited.push_back(cur_room)
|
|
cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x]
|
|
match(choice):
|
|
0:
|
|
cur_room.open_path(cur_room.OPEN_RIGHT)
|
|
1:
|
|
cur_room.open_path(cur_room.OPEN_LEFT)
|
|
2:
|
|
cur_room.open_path(cur_room.OPEN_DOWN)
|
|
3:
|
|
cur_room.open_path(cur_room.OPEN_UP)
|
|
# print(cur_x, " ", cur_y)
|
|
if visited.size() == size_x * size_y:
|
|
break
|
|
print("base rooms done")
|
|
for fl in range(floors):
|
|
for k in range(size_x):
|
|
var up = fl * size_x * size_y + k
|
|
var down = fl * size_x * size_y + (size_y - 1) * size_x + k
|
|
dungeon[up].open_window(dungeon[up].OPEN_UP)
|
|
dungeon[down].open_window(dungeon[down].OPEN_DOWN)
|
|
window_rooms.push_back(up)
|
|
window_rooms.push_back(down)
|
|
for k in range(size_y):
|
|
var left = fl * size_x * size_y + k * size_x
|
|
var right = fl * size_x * size_y + k * size_x + size_x - 1
|
|
dungeon[left].open_window(dungeon[left].OPEN_LEFT)
|
|
dungeon[right].open_window(dungeon[right].OPEN_RIGHT)
|
|
window_rooms.push_back(left)
|
|
window_rooms.push_back(right)
|
|
print("rooms build complete")
|
|
var special_rooms = {
|
|
"exit_room": {
|
|
"alloc": size_x * size_y
|
|
},
|
|
"master_room": {
|
|
"alloc": floors * size_x * size_y
|
|
},
|
|
"jail_room": {
|
|
"alloc": floors * size_x * size_y,
|
|
},
|
|
"kitchen_room": {
|
|
"alloc": size_x * size_y
|
|
}
|
|
}
|
|
func alloc_special_rooms():
|
|
var allocated = []
|
|
for k in special_rooms.keys():
|
|
if special_rooms[k].has("id"):
|
|
allocated.push_back(special_rooms[k].id)
|
|
for k in special_rooms.keys():
|
|
if special_rooms[k].has("id"):
|
|
continue
|
|
while true:
|
|
var room_id = randi() % special_rooms[k].alloc
|
|
if !room_id in allocated:
|
|
special_rooms[k].id = room_id
|
|
allocated.push_back(room_id)
|
|
break
|
|
for k in special_rooms.keys():
|
|
var room_id = special_rooms[k].id
|
|
dungeon[room_id].set_meta(k, true)
|
|
if k == "master_room":
|
|
var player_spawn = Spatial.new()
|
|
dungeon[room_id].add_child(player_spawn)
|
|
player_spawn.name = "player-spawn"
|
|
player_spawn.add_to_group("spawn")
|
|
if k == "exit_room":
|
|
print("exit room: ", room_id)
|
|
|
|
func build_special_rooms():
|
|
print("build_special_rooms")
|
|
alloc_special_rooms()
|
|
|
|
var state = 0
|
|
func _ready():
|
|
pass
|
|
# Called every frame. 'delta' is the elapsed time since the previous frame.
|
|
var furniture_nodes = []
|
|
var dungeon_ids = []
|
|
func _process(_delta):
|
|
match(state):
|
|
0:
|
|
global.load_game()
|
|
if global.save_data.has("dungeon"):
|
|
dungeon_save = global.save_data.dungeon
|
|
state = 1
|
|
1:
|
|
dungeon.resize(floors * size_x * size_y)
|
|
for k in range(floors):
|
|
for i in range(size_x):
|
|
for j in range(size_y):
|
|
var ri = room.instance()
|
|
add_child(ri)
|
|
ri.translation.x = i * w - size_x / 2 * w
|
|
ri.translation.y = 3.0 * float(k)
|
|
ri.translation.z = j * h - size_y / 2 * h
|
|
dungeon[k * size_x * size_y + j * size_x + i] = ri
|
|
if dungeon_save.empty():
|
|
state = 20
|
|
else:
|
|
state = 30
|
|
20:
|
|
build_rooms()
|
|
state = 21
|
|
21:
|
|
build_special_rooms()
|
|
state = 22
|
|
22:
|
|
for r in dungeon:
|
|
r.create_rooms()
|
|
state = 23
|
|
23:
|
|
furniture_nodes = get_tree().get_nodes_in_group("furniture")
|
|
state = 24
|
|
24:
|
|
if furniture_nodes.size() > 0:
|
|
var k = furniture_nodes.pop_front()
|
|
if k.name.begins_with("fc"):
|
|
if randf() > 0.5 && !k.get_parent().has_meta("kitchen_room"):
|
|
var bed_i = bed.instance()
|
|
bed_i.set_meta("save_path", "res://scenes/furniture/bed.tscn")
|
|
k.add_child(bed_i)
|
|
k.rotate_y(randf() * PI / 8.0)
|
|
elif !k.get_parent().has_meta("master_room") && !k.get_parent().has_meta("jail_room"):
|
|
var table_i = table_chairs.instance()
|
|
table_i.set_meta("save_path", "res://scenes/furniture/table_chairs.tscn")
|
|
k.add_child(table_i)
|
|
k.rotate_y(randf() * PI / 8.0)
|
|
elif k.name.begins_with("fwb"):
|
|
if !k.get_parent().has_meta("master_room") && !k.get_parent().has_meta("jail_room"):
|
|
var closet_i = closet.instance()
|
|
closet_i.set_meta("save_path", "res://scenes/furniture/closet.tscn")
|
|
k.add_child(closet_i)
|
|
k.rotate_y(randf() * PI / 24.0)
|
|
else:
|
|
save()
|
|
state = 40
|
|
30:
|
|
dungeon_ids = range(dungeon.size())
|
|
state = 31
|
|
31:
|
|
if dungeon_ids.size() > 0:
|
|
var k = dungeon_ids.pop_front()
|
|
dungeon[k].save_data = dungeon_save[str(k)]
|
|
dungeon[k].restore()
|
|
else:
|
|
state = 40
|
|
40:
|
|
print("loaded")
|
|
state = 50
|
|
prepared = true
|
|
emit_signal("prepared")
|