Fixed bug with front door placement
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user