diff --git a/proto3/godot/autoloads/global.gd b/proto3/godot/autoloads/global.gd index 9606d1a..d7280e7 100644 --- a/proto3/godot/autoloads/global.gd +++ b/proto3/godot/autoloads/global.gd @@ -5,8 +5,7 @@ var raycasts_count = 100 var raycast_queue = [] var astar: AStar -# Need to make more generic -var exit_door: Node +var interior func _ready(): set_save_slot(0) @@ -35,6 +34,7 @@ func update_time(delta): if game_hour == 24: game_hour = 0 game_day += 1 + emit_signal("new_day") match(game_hour): 23,0,1,2,3: day_period = periods.NIGHT diff --git a/proto3/godot/autoloads/quests.gd b/proto3/godot/autoloads/quests.gd index 6935235..fb2fd03 100644 --- a/proto3/godot/autoloads/quests.gd +++ b/proto3/godot/autoloads/quests.gd @@ -159,7 +159,7 @@ class ObjectiveWalkto extends QuestObjective: return save_data func _ready(): - pass + set_process(false) func check_trigger(t): @@ -201,13 +201,15 @@ func create_objective(v): var o_title = v[1] var o_desc = v[2] var o_radius = v[3] - var where = global.exit_door.global_transform.origin + var where = global.interior.exit_doors[0].global_transform.origin var obj = ObjectiveWalkto.new(o_title, o_desc, where, o_radius) return obj return null var up_time = 0.0 var state: int = 0 +func activate(): + set_process(true) func _process(delta): up_time += delta if up_time > 1000.0: diff --git a/proto3/godot/project.godot b/proto3/godot/project.godot index 9943195..3196b83 100644 --- a/proto3/godot/project.godot +++ b/proto3/godot/project.godot @@ -217,7 +217,6 @@ grabbing="*res://autoloads/grabbing.gd" global="*res://autoloads/global.gd" rpg="*res://autoloads/rpg.gd" combat="*res://autoloads/combat.gd" -phy_bones="*res://autoloads/phy_bones.gd" quests="*res://autoloads/quests.gd" [input] diff --git a/proto3/godot/scenes/main.gd b/proto3/godot/scenes/main.gd index c1eba85..99c4e1f 100644 --- a/proto3/godot/scenes/main.gd +++ b/proto3/godot/scenes/main.gd @@ -20,6 +20,7 @@ func _ready(): assert(e == OK) e = quests.connect("new_quest", self, "new_quest") assert(e == OK) + global.interior = $dungeon var default_meta = { "grabbing": false, @@ -39,6 +40,8 @@ var player_meta = { func start_ai(): print("prepared") $"meta-ai".start() + global.interior = $dungeon + quests.activate() func save(): global.save_characters() diff --git a/proto3/godot/scenes/maps/dungeon.gd b/proto3/godot/scenes/maps/dungeon.gd index 1dbef10..b3885e5 100644 --- a/proto3/godot/scenes/maps/dungeon.gd +++ b/proto3/godot/scenes/maps/dungeon.gd @@ -13,25 +13,30 @@ 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 = 3 -var size_y = 3 -var floors = 6 +var size_x = 2 +var size_y = 2 +var floors = 2 var w = 10 var h = 8 var dungeon = [] var dungeon_save = {} var spawn_save = {} var prepared = false +var map = [] +var exit_doors = [] +var stairs_x = 0 +var stairs_y = 0 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 = [] +var doors = {} func build_rooms(): print("build_rooms") - var stairs_x = randi() % size_x - var stairs_y = randi() % size_y + stairs_x = randi() % size_x + stairs_y = randi() % size_y for k in range(floors): var cur_x = stairs_x @@ -41,38 +46,23 @@ func build_rooms(): 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 + var sel = [cur_room.OPEN_LEFT, cur_room.OPEN_RIGHT, cur_room.OPEN_UP, cur_room.OPEN_DOWN] + var rsel = [cur_room.OPEN_RIGHT, cur_room.OPEN_LEFT, cur_room.OPEN_DOWN, cur_room.OPEN_UP] + var selx = [-1, 1, 0, 0] + var sely = [0, 0, -1, 1] + var nx = cur_x + selx[choice] + var ny = cur_y + sely[choice] + if nx >= 0 && nx < size_x && ny >= 0 && ny < size_y: + cur_room.open_path(sel[choice]) + if !cur_room in visited: + visited.push_back(cur_room) + var old_room = cur_room + cur_x = nx + cur_y = ny + cur_room = dungeon[k * size_x * size_y + cur_y * size_x + cur_x] + cur_room.open_path(rsel[choice]) + if visited.size() == size_x * size_y: + break print("base rooms done") for fl in range(floors): for k in range(size_x): @@ -89,11 +79,41 @@ func build_rooms(): dungeon[right].open_window(dungeon[right].OPEN_RIGHT) window_rooms.push_back(left) window_rooms.push_back(right) + +func build_exits(): + var street_exits = [] + while street_exits.size() == 0: + var fl = 0 + 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 + for h in [up, down]: + print(h) + if street_exits.size() < 1: + if dungeon[h].has_meta("master_room"): + continue + if randf() > 0.7: + var d = dungeon[h].OPEN_UP if h == up else dungeon[h].OPEN_DOWN + dungeon[h].outside_doors.push_back(d) + dungeon[h].set_meta("exit_room", true) + print("exit room: ", h) + street_exits.push_back(h) + 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 + for h in [left, right]: + print(h) + if street_exits.size() < 1: + if dungeon[h].has_meta("master_room"): + continue + if randf() > 0.7: + var d = dungeon[h].OPEN_LEFT if h == left else dungeon[h].OPEN_RIGHT + dungeon[h].outside_doors.push_back(d) + dungeon[h].set_meta("exit_room", true) + print("exit room: ", h) + street_exits.push_back(h) print("rooms build complete") var special_rooms = { - "exit_room": { - "alloc": size_x * size_y - }, "master_room": { "alloc": floors * size_x * size_y }, @@ -106,6 +126,10 @@ var special_rooms = { } func alloc_special_rooms(): var allocated = [] + for e in range(floors): + var id = e * size_x * size_y + stairs_y * size_x + stairs_x + allocated.push_back(id) + dungeon[id].set_meta("stairs", e) for k in special_rooms.keys(): if special_rooms[k].has("id"): allocated.push_back(special_rooms[k].id) @@ -126,8 +150,6 @@ func alloc_special_rooms(): 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") @@ -163,22 +185,30 @@ func _process(_delta): if dungeon_save.empty(): state = 20 else: - state = 30 + state = 40 20: + print("build rooms") build_rooms() state = 21 21: + print("build special rooms") build_special_rooms() - state = 22 - 22: + state = 31 + 31: + print("build exits") + build_exits() + state = 32 + 32: + print("build room nodes") for r in dungeon: r.create_rooms() - assert(global.exit_door) - state = 23 - 23: + exit_doors = get_tree().get_nodes_in_group("exit_door") + state = 33 + 33: + print("spawn furniture") furniture_nodes = get_tree().get_nodes_in_group("furniture") - state = 24 - 24: + state = 34 + 34: if furniture_nodes.size() > 0: var k = furniture_nodes.pop_front() if k.name.begins_with("fc"): @@ -200,19 +230,19 @@ func _process(_delta): k.rotate_y(randf() * PI / 24.0) else: save() - state = 40 - 30: + state = 50 + 40: dungeon_ids = range(dungeon.size()) - state = 31 - 31: + state = 41 + 41: 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: + state = 50 + 50: print("loaded") - state = 50 + state = 60 prepared = true emit_signal("prepared") diff --git a/proto3/godot/scenes/maps/interior2.gd b/proto3/godot/scenes/maps/interior2.gd index f39f9f2..8fe649f 100644 --- a/proto3/godot/scenes/maps/interior2.gd +++ b/proto3/godot/scenes/maps/interior2.gd @@ -9,11 +9,12 @@ const BITLEFT = (1 << 2) const BITRIGHT = (1 << 3) var exits = [] var windows = [] +var outside_doors = [] var door = preload("res://scenes/maps/door.tscn") var jail_door = preload("res://scenes/maps/jail-door.tscn") var window = preload("res://scenes/maps/window.tscn") -var outside_door = preload("res://scenes/maps/window.tscn") +var outside_door = preload("res://scenes/maps/door-outside.tscn") var stairs = preload("res://scenes/maps/stairs.tscn") var outside_door_placed = false var tw2d @@ -127,31 +128,46 @@ func _ready(): te2d = $c_modular/e2d.transform tn2d = $c_modular/n2d.transform ts2d = $c_modular/s2d.transform +var open_paths = { + OPEN_UP: { + "rm_walls": ["n2d", "iw4d"], + "rm": ["fc4"], + "bit": BITUP + }, + OPEN_DOWN: { + "rm_walls": ["s2d", "iw11d"], + "rm": ["fc5"], + "bit": BITDOWN + }, + OPEN_LEFT: { + "rm_walls": ["w2d", "iw17d"], + "rm": ["fc2"], + "bit": BITLEFT + }, + OPEN_RIGHT: { + "rm_walls": ["e2d", "iw22d"], + "rm": ["fc3"], + "bit": BITRIGHT + }, +} func open_path(flag): - if flag == OPEN_UP: - $c_modular/n2d.queue_free() - $c_modular/iw4d.queue_free() - $fc4.queue_free() - bitflags |= BITUP - elif flag == OPEN_DOWN: - $c_modular/s2d.queue_free() - $c_modular/iw11d.queue_free() - $fc5.queue_free() - bitflags |= BITDOWN - elif flag == OPEN_LEFT: - $c_modular/w2d.queue_free() - $c_modular/iw17d.queue_free() - $fc2.queue_free() - bitflags |= BITLEFT - elif flag == OPEN_RIGHT: - $c_modular/e2d.queue_free() - $c_modular/iw22d.queue_free() - $fc3.queue_free() - bitflags |= BITRIGHT if !flag in exits: - if exits.size() == 1 && !has_meta("master_room"): - $fc1.queue_free() + var kf = open_paths[flag] + bitflags |= kf.bit exits.push_back(flag) + for e in kf.rm: + if get_node(e): + get_node(e).queue_free() +func create_paths(): + for flag in exits: + var kf = open_paths[flag] + for e in kf.rm_walls: + $c_modular.get_node(e).queue_free() + for e in kf.rm: + if get_node(e): + get_node(e).queue_free() + if exits.size() == 1 && !has_meta("master_room"): + $fc1.queue_free() func open_window(flag): if !flag in windows: windows.push_back(flag) @@ -202,51 +218,85 @@ func master_room(): func wall2door(n): var door_xform = n.transform var door_i + for e in get_tree().get_nodes_in_group("door"): + var xpos = e.global_transform.origin + var ypos = n.global_transform.origin + if xpos.distance_to(ypos) < 1.3: + n.queue_free() + return if has_meta("jail_room"): door_i = jail_door.instance() else: door_i = door.instance() add_child(door_i) door_i.transform = door_xform + door_i.add_to_group("door") n.queue_free() +func exit_door(n): + var xn = n.name + var exit_door_xform = n.transform + var xdoor_i = outside_door.instance() + add_child(xdoor_i) + xdoor_i.transform = exit_door_xform + xdoor_i.name = xn + n.queue_free() + xdoor_i.add_to_group("exit_door") func wall2window(n): var window_xform = n.transform + var xn = n.name var window_i -# if has_meta("jail_room"): -# window_i = jail_window.instance() -# else: -# window_i = door.instance() - if has_meta("exit_room") && !outside_door_placed: - print("exit room place door") - window_i = outside_door.instance() - outside_door_placed = true - global.exit_door = window_i - else: - window_i = window.instance() + window_i = window.instance() add_child(window_i) + window_i.name = xn window_i.transform = window_xform n.queue_free() + +var bitdata = { + BITLEFT: { + "doors": ["iw17d"], + "path_remove": ["path_west"], + "nodes_remove": ["iw1", "iw2d", "iw3", "iw8", "iw9d", "iw10"] + }, + BITRIGHT: { + "doors": ["iw22d"], + "path_remove": ["path_east"], + "nodes_remove": ["iw5", "iw6d", "iw7", "iw12", "iw13d", "iw14"] + }, + BITUP: { + "doors": [], + "path_remove": ["path_north"], + "nodes_remove": ["iw15", "iw16d", "iw23d", "iw24"] + }, + BITDOWN: { + "doors": [], + "path_remove": ["path_south"], + "nodes_remove": ["iw18d", "iw19", "iw20", "iw21d"] + } +} + +var master_metas = ["master_room", "kitchen_room", "exit_room", "stairs"] func create_rooms(): assert(exits.size() > 0) - if has_meta("master_room"): + create_paths() + var is_master_room = false + for m in master_metas: + if has_meta(m): + is_master_room = true + if is_master_room: master_room() - elif has_meta("kitchen_room"): - master_room() - elif has_meta("exit_room"): - assert(windows.size() > 0) - master_room() - for e in get_children(): - if e.is_in_group("furniture"): - e.queue_free() - elif has_meta("stairs"): - master_room() - var stairs_i = stairs.instance() - add_child(stairs_i) - for e in get_children(): - if e.is_in_group("furniture"): - e.queue_free() - if get_meta("stairs") > 0: - $c_modular/floor.queue_free() + if has_meta("exit_room"): + assert(windows.size() > 0) + for e in get_children(): + if e.is_in_group("furniture"): + e.queue_free() + if has_meta("stairs"): + var stairs_i = stairs.instance() + add_child(stairs_i) + for e in get_children(): + if e.is_in_group("furniture"): + e.queue_free() + if get_meta("stairs") > 0: + $c_modular/floor.queue_free() elif exits.size() == 1: personal_room() elif exits.size() == 4: @@ -255,49 +305,26 @@ func create_rooms(): wall2door($c_modular/iw9d) wall2door($c_modular/iw13d) else: - if bitflags & BITLEFT == 0: - $c_modular/iw1.queue_free() - $c_modular/iw2d.queue_free() - $c_modular/iw3.queue_free() - $c_modular/iw8.queue_free() - $c_modular/iw9d.queue_free() - $c_modular/iw10.queue_free() - wall2door($c_modular/iw17d) - $path_west.queue_free() - if bitflags & BITRIGHT == 0: - $c_modular/iw5.queue_free() - $c_modular/iw6d.queue_free() - $c_modular/iw7.queue_free() - $c_modular/iw12.queue_free() - $c_modular/iw13d.queue_free() - $c_modular/iw14.queue_free() - wall2door($c_modular/iw22d) - $path_east.queue_free() - if bitflags & BITUP == 0: - $c_modular/iw15.queue_free() - $c_modular/iw16d.queue_free() - $c_modular/iw23d.queue_free() - $c_modular/iw24.queue_free() - $path_north.queue_free() - if bitflags & BITDOWN == 0: - $c_modular/iw18d.queue_free() - $c_modular/iw19.queue_free() - $c_modular/iw20.queue_free() - $c_modular/iw21d.queue_free() - $path_south.queue_free() - if OPEN_LEFT in windows: - wall2window($c_modular/w1) - wall2window($c_modular/w2d) - wall2window($c_modular/w3) - if OPEN_DOWN in windows: - wall2window($c_modular/s1) - wall2window($c_modular/s2d) - wall2window($c_modular/s3) - if OPEN_RIGHT in windows: - wall2window($c_modular/e1) - wall2window($c_modular/e2d) - wall2window($c_modular/e3) - if OPEN_UP in windows: - wall2window($c_modular/n1) - wall2window($c_modular/n2d) - wall2window($c_modular/n3) + for e in [BITLEFT, BITRIGHT, BITUP, BITDOWN]: + if bitflags & e == 0: + for g in bitdata[e].doors: + wall2door($c_modular.get_node(g)) + for g in bitdata[e].path_remove: + get_node(g).queue_free() + for g in bitdata[e].nodes_remove: + $c_modular.get_node(g).queue_free() + var external = { + OPEN_LEFT: ["w1", "w2d", "w3"], + OPEN_DOWN: ["s1", "s2d", "s3"], + OPEN_RIGHT: ["e1", "e2d", "e3"], + OPEN_UP: ["n1", "n2d", "n3"] + } + for p in windows: + for q in external[p]: + var n = $c_modular.get_node(q) + if !p in outside_doors: + wall2window(n) + for p in outside_doors: + var q = external[p][1] + var n = $c_modular.get_node(q) + exit_door(n) diff --git a/proto3/godot/ui/quest_indicator.gd b/proto3/godot/ui/quest_indicator.gd index bb6b736..16a63d7 100644 --- a/proto3/godot/ui/quest_indicator.gd +++ b/proto3/godot/ui/quest_indicator.gd @@ -10,14 +10,14 @@ extends Node2D var target: = Vector3() var rect: = Rect2() func _ready(): - var pos = get_viewport().get_camera().unproject_position(target) + pass # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): var pos = get_viewport().get_camera().unproject_position(target) rect = get_viewport_rect() - rect.grow(-8.0) + rect = rect.grow(-8.0) if get_viewport().get_camera().is_position_behind(target): if visible: hide()