Files
kicking-high/proto3/godot/scenes/maps/dungeon.gd
2020-04-13 12:45:25 +03:00

185 lines
5.4 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():
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()