Compare commits

...

2 Commits

Author SHA1 Message Date
2534a72265 Initial room creation and pathfinding 2025-07-01 16:55:26 +10:00
931aa8b350 Added wall generation to building 2025-07-01 12:45:11 +10:00
14 changed files with 232 additions and 102 deletions

View File

@ -26,7 +26,7 @@ offset_bottom = 635.0
text = "Confirm" text = "Confirm"
[node name="GameCam" type="Camera3D" parent="."] [node name="GameCam" type="Camera3D" parent="."]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 24.5127, 23.2849, 20.9667) transform = Transform3D(1, 0, 0, 0, 0.182236, 0.983255, 0, -0.983255, 0.182236, 24.5127, 23.2849, 20.9667)
size = 31.34 size = 31.34
script = ExtResource("3_7jktm") script = ExtResource("3_7jktm")

View File

@ -3,9 +3,10 @@ extends Node3D
var tile_grid_size = 64 var tile_grid_size = 64
var astar_grid_room = AStarGrid2D.new() var astar_grid_room = AStarGrid2D.new()
var load_tile = preload("res://tiles/base_tile/tile.tscn") var load_tile = preload("res://tiles/base_tile/base_tile.tscn")
var load_room = preload("res://places/base_place/base_room.tscn")
var tile_dict = {} var place_tile_dict = {}
var selection_drag_dict = {} var selection_drag_dict = {}
var selection_dict = {} var selection_dict = {}
@ -27,58 +28,14 @@ func _ready():
var tile = load_tile.instantiate() var tile = load_tile.instantiate()
tile.set_position(pos) tile.set_position(pos)
tile.grid_pos = pos
tile.update(0, 2) tile.update(0, 2)
tile_dict[pos] = tile place_tile_dict[pos] = tile
add_child(tile) add_child(tile)
func build_selection(b):
#When the build or destroy button is clicked, changes the selected tiles to match the button's request
if not build_allowed:
return
for i in selection_dict:
var tile_selected = tile_dict[i]
tile_selected.update(1, 4)
selection_dict.clear()
for i in tile_dict:
#if not selection_dict.has(i):
var tile_selected = tile_dict[i]
tile_selected.update(1, 0)
func clear_selection():
#When the clear button is clicked, it clears the selected tiles without doing anything.
for i in tile_dict:
var tile_selected = tile_dict[i]
tile_selected.update(1, 0)
build_allowed = true
selection_dict.clear()
func end_select_drag():
#Adds dragged tiles to the current selection on mouse-up
tile_count_x_hist = 0
tile_count_z_hist = 0
selection_dict.merge(selection_drag_dict)
if verify_room():
build_allowed = true
for i in selection_dict:
tile_dict[i].update(3, 0)
else:
build_allowed = false
for i in selection_dict:
tile_dict[i].update(4, 0)
selection_drag_dict.clear()
func draw_tile_click(click_pos): func draw_tile_click(click_pos):
#starts a selection drag #starts a selection drag
@ -86,7 +43,7 @@ func draw_tile_click(click_pos):
tile_count_x_hist = 0 tile_count_x_hist = 0
tile_count_z_hist = 0 tile_count_z_hist = 0
if tile_dict.has(build_start_pos): if place_tile_dict.has(build_start_pos):
select_tile(build_start_pos) select_tile(build_start_pos)
func init_select_drag(float_build_start_pos, float_build_mouse_pos): func init_select_drag(float_build_start_pos, float_build_mouse_pos):
@ -108,7 +65,8 @@ func init_select_drag(float_build_start_pos, float_build_mouse_pos):
for x in range(min(0, tile_count_x), max(0, tile_count_x) + 1): for x in range(min(0, tile_count_x), max(0, tile_count_x) + 1):
for z in range(min(0, tile_count_z), max(0, tile_count_z) + 1): for z in range(min(0, tile_count_z), max(0, tile_count_z) + 1):
var select_drag_pos = build_start_pos + Vector3i(x, 0, z) var select_drag_pos = build_start_pos + Vector3i(x, 0, z)
if tile_dict.has(select_drag_pos): if place_tile_dict.has(select_drag_pos):
if not place_tile_dict[select_drag_pos].construction_mode == 4:
select_drag_array.append(select_drag_pos) select_drag_array.append(select_drag_pos)
if select_drag_array: if select_drag_array:
@ -117,29 +75,27 @@ func init_select_drag(float_build_start_pos, float_build_mouse_pos):
func draw_select_drag(array): func draw_select_drag(array):
#Clears previous drag, then calls tile selection on all currently dragged tiles #Clears previous drag, then calls tile selection on all currently dragged tiles
selection_drag_dict.clear() for i in place_tile_dict:
for i in tile_dict:
if not selection_dict.has(i): if not selection_dict.has(i):
var tile_selected = tile_dict[i] var tile_selected = place_tile_dict[i]
tile_selected.update(1, 0) tile_selected.update(1, 0)
selection_drag_dict.clear()
for i in array: for i in array:
var id = i select_tile(i)
select_tile(id)
func select_tile(pos): func select_tile(pos):
#Tells tiles to be selected #Tells tiles to be selected
var tile = tile_dict[pos] var tile = place_tile_dict[pos]
selection_drag_dict[pos] = tile
if not tile.construction_mode == 4:
print(tile.construction_mode)
if build_allowed: if build_allowed:
tile.update(3, 0) tile.update(3, 0)
else: else:
tile.update(4, 0) tile.update(4, 0)
selection_drag_dict[pos] = tile
func verify_room(): func verify_room():
#Verifies that a given selection is fully contiguous #Verifies that a given selection is fully contiguous
@ -155,21 +111,89 @@ func verify_room():
var verify_pos = verify_queue_array.pop_back() var verify_pos = verify_queue_array.pop_back()
var verify_neighbor_array = [ var verify_neighbor_array = place_tile_dict[verify_pos].neighbor_array
Vector3i(verify_pos.x + 1, 0, verify_pos.z),
Vector3i(verify_pos.x - 1, 0, verify_pos.z),
Vector3i(verify_pos.x, 0, verify_pos.z + 1),
Vector3i(verify_pos.x, 0, verify_pos.z - 1)
]
for n in verify_neighbor_array: for n in verify_neighbor_array:
if selection_dict.has(n): if selection_dict.has(verify_pos + n):
if not verify_checked_array.has(n): if not verify_checked_array.has(verify_pos + n):
if not verify_queue_array.has(n): if not verify_queue_array.has(verify_pos + n):
verify_queue_array.append(n) verify_queue_array.append(verify_pos + n)
verify_checked_array.append(verify_pos) verify_checked_array.append(verify_pos)
verify_array.erase(verify_pos) verify_array.erase(verify_pos)
return true return true
func end_select_drag():
#Adds dragged tiles to the current selection on mouse-up
tile_count_x_hist = 0
tile_count_z_hist = 0
selection_dict.merge(selection_drag_dict)
for i in selection_dict.keys():
var tile = selection_dict[i]
for j in range(4):
tile.update_face(j, 1)
var neighbor = 0
for j in tile.neighbor_array:
if not selection_dict.has(i + j):
tile.update_face(neighbor, 2)
neighbor = neighbor + 1
if verify_room():
build_allowed = true
for i in selection_dict:
place_tile_dict[i].update(3, 0)
else:
build_allowed = false
for i in selection_dict:
place_tile_dict[i].update(4, 0)
selection_drag_dict.clear()
func build_selection():
#When the build or destroy button is clicked, changes the selected tiles to match the button's request
if not build_allowed:
return
for i in selection_dict:
var tile_selected = place_tile_dict[i]
tile_selected.update(1, 4)
create_room()
selection_dict.clear()
func clear_selection():
#When the clear button is clicked, it clears the selected tiles without doing anything.
for i in selection_dict:
var tile_selected = selection_dict[i]
tile_selected.update(1, 0)
build_allowed = true
for i in selection_dict.keys():
var tile = selection_dict[i]
for j in range(4):
tile.update_face(j, 1)
selection_dict.clear()
func create_room():
var room = load_room.instantiate()
room.position = (selection_dict.keys().min())
room.room_tile_dict = selection_dict.duplicate()
room.name = str("Room", room.get_instance_id())
add_child(room)
for i in room.room_tile_dict:
place_tile_dict[i].room_id = room

View File

@ -1,6 +1,6 @@
[gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"] [gd_scene load_steps=2 format=3 uid="uid://bujuwgn3y42ek"]
[ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://places/base_place/place.gd" id="1_uq3a8"] [ext_resource type="Script" uid="uid://n4vvqmlmq5fp" path="res://places/base_place/base_place.gd" id="1_uq3a8"]
[node name="BasePlace" type="Node3D"] [node name="BasePlace" type="Node3D"]
script = ExtResource("1_uq3a8") script = ExtResource("1_uq3a8")

View File

@ -0,0 +1,32 @@
extends Node
var room_tile_dict = {}
var path_grid = AStar3D.new()
var neighbor_array = [
Vector3i(0, 0, -1),
Vector3i(1, 0, 0),
Vector3i(0, 0, 1),
Vector3i(-1, 0, 0),
]
func _ready():
self.name = str("Room", self.get_instance_id())
init_path_grid()
pass
func init_path_grid():
print(self.name)
for i in room_tile_dict.keys():
var id = path_grid.get_available_point_id()
path_grid.add_point(id, i)
for n in neighbor_array:
if room_tile_dict.has(i + n):
var closest = path_grid.get_closest_point(i + n)
if (i + n) == Vector3i(path_grid.get_point_position(closest)):
path_grid.connect_points(id, closest)

View File

@ -0,0 +1 @@
uid://c2neixe7kpvma

View File

@ -0,0 +1,12 @@
[gd_scene load_steps=3 format=3 uid="uid://f0b4ptwari8y"]
[ext_resource type="Script" uid="uid://c2neixe7kpvma" path="res://places/base_place/base_room.gd" id="1_3l4mp"]
[sub_resource type="SphereMesh" id="SphereMesh_3l4mp"]
[node name="BaseRoom" type="Node3D"]
script = ExtResource("1_3l4mp")
[node name="ConnectMesh" type="MeshInstance3D" parent="."]
visible = false
mesh = SubResource("SphereMesh_3l4mp")

View File

@ -43,7 +43,7 @@ func _on_area_3d_input_event(_camera, event, event_position, _normal, _shade_id)
func _on_confirm_button_pressed() -> void: func _on_confirm_button_pressed() -> void:
if place.build_allowed: if place.build_allowed:
place.build_selection(true) place.build_selection()
is_building = false is_building = false
emit_signal("room_built") emit_signal("room_built")
else: else:

View File

@ -37,7 +37,7 @@ var red = preload("res://tiles/base_tile/red.tres")
var blue = preload("res://tiles/base_tile/blue.tres") var blue = preload("res://tiles/base_tile/blue.tres")
var lightblue = preload("res://tiles/base_tile/lightblue.tres") var lightblue = preload("res://tiles/base_tile/lightblue.tres")
var faces = { var face_dict = {
"floor": null, "floor": null,
"north": null, "north": null,
"east": null, "east": null,
@ -45,12 +45,58 @@ var faces = {
"west": null "west": null
} }
var neighbor_array = [
Vector3i(0, 0, -1),
Vector3i(1, 0, 0),
Vector3i(0, 0, 1),
Vector3i(-1, 0, 0),
]
var wall_array = [
Vector3i(0, 0, 0),
Vector3i(1, 0, 0),
Vector3i(1, 0, 1),
Vector3i(0, 0, 1),
]
var load_wall = preload("res://tiles/base_tile/base_wall.tscn")
var grid_pos = null
var wall_dict = {}
var room_id = null
func _ready(): func _ready():
$Label3D.text = str(grid_pos)
pass pass
func invalid_this_tile(): func invalid_this_tile():
pass pass
func update_face(neighbor_index, mode):
var face = neighbor_array[neighbor_index]
if mode == 1:
for i in wall_dict.keys():
wall_dict[i].queue_free()
wall_dict.erase(i)
if mode == 2:
if not wall_dict.has(face):
var wall = load_wall.instantiate()
wall.position = wall_array[neighbor_index]
wall.rotation_degrees = Vector3(0, neighbor_index * -90, 0)
wall_dict[face] = wall
add_child(wall)
func update(sel_mode: int = 0, con_mode: int = 0): func update(sel_mode: int = 0, con_mode: int = 0):
if sel_mode: if sel_mode:
@ -88,12 +134,10 @@ func update(sel_mode: int = 0, con_mode: int = 0):
if con_mode == 1: if con_mode == 1:
# non-interactable # non-interactable
$Label3D.text = "1"
pass pass
elif con_mode == 2: elif con_mode == 2:
# closed # closed
$Label3D.text = "2"
$Floor/FloorMesh.set_material_override(gray) $Floor/FloorMesh.set_material_override(gray)
pass pass
@ -103,7 +147,6 @@ func update(sel_mode: int = 0, con_mode: int = 0):
elif con_mode == 4: elif con_mode == 4:
# built # built
$Label3D.text = "4"
$Floor/FloorMesh.set_material_override(null) $Floor/FloorMesh.set_material_override(null)
pass pass

View File

@ -1,27 +1,21 @@
[gd_scene load_steps=3 format=3 uid="uid://gs6yynwvvot2"] [gd_scene load_steps=4 format=3 uid="uid://gs6yynwvvot2"]
[ext_resource type="Script" uid="uid://jqjcr7dxjnbt" path="res://tiles/base_tile/tile.gd" id="1_v7x5k"] [ext_resource type="Script" uid="uid://jqjcr7dxjnbt" path="res://tiles/base_tile/base_tile.gd" id="1_yoisu"]
[ext_resource type="PlaneMesh" uid="uid://bis4hdushjnjm" path="res://tiles/base_tile/base_floor.tres" id="2_ipr02"] [ext_resource type="PlaneMesh" uid="uid://bis4hdushjnjm" path="res://tiles/base_tile/base_floor.tres" id="2_wxg2y"]
[ext_resource type="Script" uid="uid://df68d87131dv7" path="res://tiles/base_tile/base_wall.gd" id="3_enx1c"]
[node name="Tile" type="Node3D"] [node name="Tile" type="Node3D"]
script = ExtResource("1_v7x5k") script = ExtResource("1_yoisu")
[node name="Floor" type="Node3D" parent="."] [node name="Floor" type="Node3D" parent="."]
[node name="FloorMesh" type="MeshInstance3D" parent="Floor"] [node name="FloorMesh" type="MeshInstance3D" parent="Floor"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.5, 0, 0.5)
mesh = ExtResource("2_ipr02") mesh = ExtResource("2_wxg2y")
skeleton = NodePath("../..") skeleton = NodePath("../..")
[node name="Walls" type="Node" parent="."] [node name="Walls" type="Node3D" parent="."]
script = ExtResource("3_enx1c")
[node name="NorthWall" type="Node3D" parent="Walls"]
[node name="EastWall" type="Node3D" parent="Walls"]
[node name="SouthWall" type="Node3D" parent="Walls"]
[node name="WestWall" type="Node3D" parent="Walls"]
[node name="Label3D" type="Label3D" parent="."] [node name="Label3D" type="Label3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.0668138, 0.997765, 0, -0.997765, 0.0668138, 0.341829, 0.0223614, 0.130147) transform = Transform3D(1, 0, 0, 0, 0.0668138, 0.997765, 0, -0.997765, 0.0668138, 0.341829, 0.0223614, 0.130147)

View File

@ -0,0 +1,14 @@
extends Node3D
var wall = preload("res://tiles/base_tile/base_wall.tscn")
var _debug_face_mode = {
1: "none",
2: "full",
3: "partial",
4: "door"
}
func update(walls: Dictionary):
for i in walls:
print(i)

View File

@ -0,0 +1 @@
uid://df68d87131dv7

View File

@ -0,0 +1,9 @@
[gd_scene load_steps=2 format=3 uid="uid://diovc4myisuow"]
[sub_resource type="BoxMesh" id="BoxMesh_xdfmn"]
[node name="Node3D" type="Node3D"]
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 0.1, 0.5, 0.5, 0.05)
mesh = SubResource("BoxMesh_xdfmn")