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")