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(): global.save_characters() for k in range(dungeon.size()): dungeon[k].save() dungeon_save[str(k)] = dungeon[k].save_data global.save_data.dungeon = dungeon_save global.save_game() 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") func build_special_rooms(): print("build_special_rooms") var special_rooms = [] var p_id = window_rooms[randi() % window_rooms.size()] special_rooms.push_back(p_id) # var e_id = -1 # while true: # e_id = window_rooms[randi() % (size_x * size_] # if !e_id in special_rooms: # break # special_rooms.push_back(e_id) while special_rooms.size() < 3: var r_id = randi() % dungeon.size() if !r_id in special_rooms: special_rooms.push_back(r_id) var j_id = special_rooms[1] var k_id = special_rooms[2] dungeon[p_id].set_meta("master_room", true) dungeon[j_id].set_meta("jail_room", true) dungeon[k_id].set_meta("kitchen_room", true) # dungeon[e_id].set_meta("exit_room", true) var player_spawn = Spatial.new() dungeon[p_id].add_child(player_spawn) player_spawn.name = "player-spawn" player_spawn.add_to_group("spawn") var state = 0 func _ready(): pass # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(_delta): match(state): 0: global.load_game() if global.save_data.has("dungeon"): dungeon_save = global.save_data.dungeon 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 = 1 else: state = 2 1: build_rooms() build_special_rooms() for r in dungeon: r.create_rooms() for k in get_tree().get_nodes_in_group("furniture"): 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) save() state = 3 2: for k in range(dungeon.size()): dungeon[k].save_data = dungeon_save[str(k)] dungeon[k].restore() state = 3 3: print("loaded") state = 4 prepared = true emit_signal("prepared") _: if Input.is_action_just_pressed("save_game"): save()