diff --git a/.vscode/settings.json b/.vscode/settings.json index c982466..3a199ec 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "godotTools.editorPath.godot4": "c:\\Program Files\\Godot_v4.3-stable_win64\\Godot_v4.3-stable_win64.exe" + "godotTools.editorPath.godot4": "c:\\Users\\danchie\\Documents\\Godot 4.4\\Godot_v4.4-stable_win64.exe" } \ No newline at end of file diff --git a/addons/beehave/blackboard.gd.uid b/addons/beehave/blackboard.gd.uid new file mode 100644 index 0000000..ce88a9e --- /dev/null +++ b/addons/beehave/blackboard.gd.uid @@ -0,0 +1 @@ +uid://dtev3hcobhh3v diff --git a/addons/beehave/debug/debugger.gd.uid b/addons/beehave/debug/debugger.gd.uid new file mode 100644 index 0000000..8037039 --- /dev/null +++ b/addons/beehave/debug/debugger.gd.uid @@ -0,0 +1 @@ +uid://c4f1tr8nox531 diff --git a/addons/beehave/debug/debugger_messages.gd.uid b/addons/beehave/debug/debugger_messages.gd.uid new file mode 100644 index 0000000..ccb129d --- /dev/null +++ b/addons/beehave/debug/debugger_messages.gd.uid @@ -0,0 +1 @@ +uid://7gg8su7l7adr diff --git a/addons/beehave/debug/debugger_tab.gd.uid b/addons/beehave/debug/debugger_tab.gd.uid new file mode 100644 index 0000000..c5a9541 --- /dev/null +++ b/addons/beehave/debug/debugger_tab.gd.uid @@ -0,0 +1 @@ +uid://b4dd5cgag3gmj diff --git a/addons/beehave/debug/global_debugger.gd.uid b/addons/beehave/debug/global_debugger.gd.uid new file mode 100644 index 0000000..618b265 --- /dev/null +++ b/addons/beehave/debug/global_debugger.gd.uid @@ -0,0 +1 @@ +uid://dsq1f7h88mp4m diff --git a/addons/beehave/debug/new_frames.gd.uid b/addons/beehave/debug/new_frames.gd.uid new file mode 100644 index 0000000..9b6c059 --- /dev/null +++ b/addons/beehave/debug/new_frames.gd.uid @@ -0,0 +1 @@ +uid://cr6a7f0fr1ik7 diff --git a/addons/beehave/debug/new_graph_edit.gd.uid b/addons/beehave/debug/new_graph_edit.gd.uid new file mode 100644 index 0000000..592d700 --- /dev/null +++ b/addons/beehave/debug/new_graph_edit.gd.uid @@ -0,0 +1 @@ +uid://cw7vqce212j2l diff --git a/addons/beehave/debug/new_graph_node.gd.uid b/addons/beehave/debug/new_graph_node.gd.uid new file mode 100644 index 0000000..ecf23c1 --- /dev/null +++ b/addons/beehave/debug/new_graph_node.gd.uid @@ -0,0 +1 @@ +uid://c88jpe7sk8ood diff --git a/addons/beehave/debug/new_node_blackboard.gd.uid b/addons/beehave/debug/new_node_blackboard.gd.uid new file mode 100644 index 0000000..f8e838e --- /dev/null +++ b/addons/beehave/debug/new_node_blackboard.gd.uid @@ -0,0 +1 @@ +uid://bqny8r14mh7ut diff --git a/addons/beehave/debug/old_frames.gd.uid b/addons/beehave/debug/old_frames.gd.uid new file mode 100644 index 0000000..b603ba4 --- /dev/null +++ b/addons/beehave/debug/old_frames.gd.uid @@ -0,0 +1 @@ +uid://7o2r5guwuf60 diff --git a/addons/beehave/debug/old_graph_edit.gd.uid b/addons/beehave/debug/old_graph_edit.gd.uid new file mode 100644 index 0000000..e193128 --- /dev/null +++ b/addons/beehave/debug/old_graph_edit.gd.uid @@ -0,0 +1 @@ +uid://con6dkacbux3 diff --git a/addons/beehave/debug/old_graph_node.gd.uid b/addons/beehave/debug/old_graph_node.gd.uid new file mode 100644 index 0000000..39c76cd --- /dev/null +++ b/addons/beehave/debug/old_graph_node.gd.uid @@ -0,0 +1 @@ +uid://b4l2tfd0asx38 diff --git a/addons/beehave/debug/tree_node.gd.uid b/addons/beehave/debug/tree_node.gd.uid new file mode 100644 index 0000000..cfae741 --- /dev/null +++ b/addons/beehave/debug/tree_node.gd.uid @@ -0,0 +1 @@ +uid://cq6m4hib5jnje diff --git a/addons/beehave/metrics/beehave_global_metrics.gd.uid b/addons/beehave/metrics/beehave_global_metrics.gd.uid new file mode 100644 index 0000000..c300a74 --- /dev/null +++ b/addons/beehave/metrics/beehave_global_metrics.gd.uid @@ -0,0 +1 @@ +uid://ois12pcskdb3 diff --git a/addons/beehave/nodes/beehave_node.gd.uid b/addons/beehave/nodes/beehave_node.gd.uid new file mode 100644 index 0000000..fd20b92 --- /dev/null +++ b/addons/beehave/nodes/beehave_node.gd.uid @@ -0,0 +1 @@ +uid://bg04ak3vbgask diff --git a/addons/beehave/nodes/beehave_tree.gd.uid b/addons/beehave/nodes/beehave_tree.gd.uid new file mode 100644 index 0000000..3f36972 --- /dev/null +++ b/addons/beehave/nodes/beehave_tree.gd.uid @@ -0,0 +1 @@ +uid://c5q0j8uujs8k1 diff --git a/addons/beehave/nodes/composites/composite.gd.uid b/addons/beehave/nodes/composites/composite.gd.uid new file mode 100644 index 0000000..6a2eb25 --- /dev/null +++ b/addons/beehave/nodes/composites/composite.gd.uid @@ -0,0 +1 @@ +uid://caj56bhuit8y1 diff --git a/addons/beehave/nodes/composites/randomized_composite.gd.uid b/addons/beehave/nodes/composites/randomized_composite.gd.uid new file mode 100644 index 0000000..1096930 --- /dev/null +++ b/addons/beehave/nodes/composites/randomized_composite.gd.uid @@ -0,0 +1 @@ +uid://bw88prwmrywoa diff --git a/addons/beehave/nodes/composites/selector.gd.uid b/addons/beehave/nodes/composites/selector.gd.uid new file mode 100644 index 0000000..d502e5b --- /dev/null +++ b/addons/beehave/nodes/composites/selector.gd.uid @@ -0,0 +1 @@ +uid://dtctf507t71tj diff --git a/addons/beehave/nodes/composites/selector_random.gd.uid b/addons/beehave/nodes/composites/selector_random.gd.uid new file mode 100644 index 0000000..aad51f6 --- /dev/null +++ b/addons/beehave/nodes/composites/selector_random.gd.uid @@ -0,0 +1 @@ +uid://c74iyjawmc3nt diff --git a/addons/beehave/nodes/composites/selector_reactive.gd.uid b/addons/beehave/nodes/composites/selector_reactive.gd.uid new file mode 100644 index 0000000..cb8048f --- /dev/null +++ b/addons/beehave/nodes/composites/selector_reactive.gd.uid @@ -0,0 +1 @@ +uid://7q4xte38jyq7 diff --git a/addons/beehave/nodes/composites/sequence.gd.uid b/addons/beehave/nodes/composites/sequence.gd.uid new file mode 100644 index 0000000..3f48eb4 --- /dev/null +++ b/addons/beehave/nodes/composites/sequence.gd.uid @@ -0,0 +1 @@ +uid://t6e8rtdiqhg5 diff --git a/addons/beehave/nodes/composites/sequence_random.gd.uid b/addons/beehave/nodes/composites/sequence_random.gd.uid new file mode 100644 index 0000000..6749865 --- /dev/null +++ b/addons/beehave/nodes/composites/sequence_random.gd.uid @@ -0,0 +1 @@ +uid://b2v7q8n5rsucr diff --git a/addons/beehave/nodes/composites/sequence_reactive.gd.uid b/addons/beehave/nodes/composites/sequence_reactive.gd.uid new file mode 100644 index 0000000..462a243 --- /dev/null +++ b/addons/beehave/nodes/composites/sequence_reactive.gd.uid @@ -0,0 +1 @@ +uid://bt7kp7k128gw4 diff --git a/addons/beehave/nodes/composites/sequence_star.gd.uid b/addons/beehave/nodes/composites/sequence_star.gd.uid new file mode 100644 index 0000000..a3b5533 --- /dev/null +++ b/addons/beehave/nodes/composites/sequence_star.gd.uid @@ -0,0 +1 @@ +uid://22e1jnayd6d2 diff --git a/addons/beehave/nodes/composites/simple_parallel.gd.uid b/addons/beehave/nodes/composites/simple_parallel.gd.uid new file mode 100644 index 0000000..bc1a116 --- /dev/null +++ b/addons/beehave/nodes/composites/simple_parallel.gd.uid @@ -0,0 +1 @@ +uid://bkd78br36f22s diff --git a/addons/beehave/nodes/decorators/cooldown.gd.uid b/addons/beehave/nodes/decorators/cooldown.gd.uid new file mode 100644 index 0000000..a2226e7 --- /dev/null +++ b/addons/beehave/nodes/decorators/cooldown.gd.uid @@ -0,0 +1 @@ +uid://npam8q0cckw4 diff --git a/addons/beehave/nodes/decorators/decorator.gd.uid b/addons/beehave/nodes/decorators/decorator.gd.uid new file mode 100644 index 0000000..32fde99 --- /dev/null +++ b/addons/beehave/nodes/decorators/decorator.gd.uid @@ -0,0 +1 @@ +uid://ee7t7mdnh7wf diff --git a/addons/beehave/nodes/decorators/delayer.gd.uid b/addons/beehave/nodes/decorators/delayer.gd.uid new file mode 100644 index 0000000..02945a8 --- /dev/null +++ b/addons/beehave/nodes/decorators/delayer.gd.uid @@ -0,0 +1 @@ +uid://ch31ebso22wxa diff --git a/addons/beehave/nodes/decorators/failer.gd.uid b/addons/beehave/nodes/decorators/failer.gd.uid new file mode 100644 index 0000000..6711487 --- /dev/null +++ b/addons/beehave/nodes/decorators/failer.gd.uid @@ -0,0 +1 @@ +uid://bm0vay28ba7dj diff --git a/addons/beehave/nodes/decorators/inverter.gd.uid b/addons/beehave/nodes/decorators/inverter.gd.uid new file mode 100644 index 0000000..acc1f0b --- /dev/null +++ b/addons/beehave/nodes/decorators/inverter.gd.uid @@ -0,0 +1 @@ +uid://bvbkudic8q2p1 diff --git a/addons/beehave/nodes/decorators/limiter.gd.uid b/addons/beehave/nodes/decorators/limiter.gd.uid new file mode 100644 index 0000000..9ede652 --- /dev/null +++ b/addons/beehave/nodes/decorators/limiter.gd.uid @@ -0,0 +1 @@ +uid://bsla11d2hsl4f diff --git a/addons/beehave/nodes/decorators/repeater.gd.uid b/addons/beehave/nodes/decorators/repeater.gd.uid new file mode 100644 index 0000000..37e4d25 --- /dev/null +++ b/addons/beehave/nodes/decorators/repeater.gd.uid @@ -0,0 +1 @@ +uid://b1tox1lfjp85u diff --git a/addons/beehave/nodes/decorators/succeeder.gd.uid b/addons/beehave/nodes/decorators/succeeder.gd.uid new file mode 100644 index 0000000..d39ce6e --- /dev/null +++ b/addons/beehave/nodes/decorators/succeeder.gd.uid @@ -0,0 +1 @@ +uid://dc4wovsitw6ds diff --git a/addons/beehave/nodes/decorators/time_limiter.gd.uid b/addons/beehave/nodes/decorators/time_limiter.gd.uid new file mode 100644 index 0000000..597018b --- /dev/null +++ b/addons/beehave/nodes/decorators/time_limiter.gd.uid @@ -0,0 +1 @@ +uid://cx68vwulwsmbh diff --git a/addons/beehave/nodes/decorators/until_fail.gd.uid b/addons/beehave/nodes/decorators/until_fail.gd.uid new file mode 100644 index 0000000..8fc5677 --- /dev/null +++ b/addons/beehave/nodes/decorators/until_fail.gd.uid @@ -0,0 +1 @@ +uid://c0agipyurkehb diff --git a/addons/beehave/nodes/leaves/action.gd.uid b/addons/beehave/nodes/leaves/action.gd.uid new file mode 100644 index 0000000..bce09e8 --- /dev/null +++ b/addons/beehave/nodes/leaves/action.gd.uid @@ -0,0 +1 @@ +uid://b3lhrf7h086f2 diff --git a/addons/beehave/nodes/leaves/blackboard_compare.gd.uid b/addons/beehave/nodes/leaves/blackboard_compare.gd.uid new file mode 100644 index 0000000..7400462 --- /dev/null +++ b/addons/beehave/nodes/leaves/blackboard_compare.gd.uid @@ -0,0 +1 @@ +uid://gnyeilxt2l0o diff --git a/addons/beehave/nodes/leaves/blackboard_erase.gd.uid b/addons/beehave/nodes/leaves/blackboard_erase.gd.uid new file mode 100644 index 0000000..b7d22d7 --- /dev/null +++ b/addons/beehave/nodes/leaves/blackboard_erase.gd.uid @@ -0,0 +1 @@ +uid://wj8886yb62i3 diff --git a/addons/beehave/nodes/leaves/blackboard_has.gd.uid b/addons/beehave/nodes/leaves/blackboard_has.gd.uid new file mode 100644 index 0000000..623099c --- /dev/null +++ b/addons/beehave/nodes/leaves/blackboard_has.gd.uid @@ -0,0 +1 @@ +uid://blbjrtid0i0vk diff --git a/addons/beehave/nodes/leaves/blackboard_set.gd.uid b/addons/beehave/nodes/leaves/blackboard_set.gd.uid new file mode 100644 index 0000000..fffe23b --- /dev/null +++ b/addons/beehave/nodes/leaves/blackboard_set.gd.uid @@ -0,0 +1 @@ +uid://c82bmefi5j38r diff --git a/addons/beehave/nodes/leaves/condition.gd.uid b/addons/beehave/nodes/leaves/condition.gd.uid new file mode 100644 index 0000000..c7d77d9 --- /dev/null +++ b/addons/beehave/nodes/leaves/condition.gd.uid @@ -0,0 +1 @@ +uid://2wnl5h3m16gh diff --git a/addons/beehave/nodes/leaves/leaf.gd.uid b/addons/beehave/nodes/leaves/leaf.gd.uid new file mode 100644 index 0000000..7f72198 --- /dev/null +++ b/addons/beehave/nodes/leaves/leaf.gd.uid @@ -0,0 +1 @@ +uid://bybthnj000p24 diff --git a/addons/beehave/plugin.gd.uid b/addons/beehave/plugin.gd.uid new file mode 100644 index 0000000..4c943e8 --- /dev/null +++ b/addons/beehave/plugin.gd.uid @@ -0,0 +1 @@ +uid://brq0oniu7r0o6 diff --git a/addons/beehave/utils/utils.gd.uid b/addons/beehave/utils/utils.gd.uid new file mode 100644 index 0000000..06af80a --- /dev/null +++ b/addons/beehave/utils/utils.gd.uid @@ -0,0 +1 @@ +uid://0pxtgaf20nnl diff --git a/addons/enhanced_gridmap/enhanced_gridmap.gd b/addons/enhanced_gridmap/enhanced_gridmap.gd index 0e79da1..b16ea19 100644 --- a/addons/enhanced_gridmap/enhanced_gridmap.gd +++ b/addons/enhanced_gridmap/enhanced_gridmap.gd @@ -23,11 +23,20 @@ var grid_data: Array = [] # 3D array [floor][row][column] var astar_by_floor = {} # Dictionary of AStar2D instances per floor var path = [] +# Update the obstacle items array to use your specified item indices +@export var obstacle_items: Array[int] = [12, 13, 14, 15] # Updated mesh library indices +@export var obstacle_directions: Array[Direction] = [] # Store the directions of placed obstacles + + # Direction and movement systems enum Direction { NORTHWEST, NORTH, NORTHEAST, WEST, CENTER, EAST, - SOUTHWEST, SOUTH, SOUTHEAST + SOUTHWEST, SOUTH, SOUTHEAST, + BLOCKED_NORTH = 10, + BLOCKED_EAST = 11, + BLOCKED_SOUTH = 12, + BLOCKED_WEST = 13 } var diagonal_movement: bool = false @@ -299,7 +308,9 @@ func get_neighbors(current_pos: Vector2i, floor_index: int) -> Array[NeighborInf is_walkable = is_walkable and \ is_position_valid(adjacent1) and is_cell_walkable(adjacent1, floor_index) and \ - is_position_valid(adjacent2) and is_cell_walkable(adjacent2, floor_index) + is_position_valid(adjacent2) and is_cell_walkable(adjacent2, floor_index) and \ + not is_blocked_by_obstacle(current_pos, adjacent1, floor_index) and \ + not is_blocked_by_obstacle(current_pos, adjacent2, floor_index) if diagonal_movement or not is_diagonal_direction(dir): neighbors.append(NeighborInfo.new(neighbor_pos, dir, is_walkable)) @@ -461,3 +472,73 @@ func _set(property, value): func set_diagonal_movement(enable: bool): diagonal_movement = enable initialize_astar() + +# Add this function to check if a movement is blocked by an obstacle +func is_blocked_by_obstacle(from_pos: Vector2i, to_pos: Vector2i, floor_index: int = 0) -> bool: + # Check if there's a horizontal obstacle + if from_pos.y == to_pos.y: # Moving horizontally + # Check for vertical obstacles that would block horizontal movement + var min_x = min(from_pos.x, to_pos.x) + var max_x = max(from_pos.x, to_pos.x) + for x in range(min_x, max_x + 1): + var cell_index = get_cell_item(Vector3i(x, floor_index, from_pos.y)) + if cell_index in obstacle_items: + var obstacle_idx = obstacle_items.find(cell_index) + if obstacle_idx != -1 and obstacle_idx < obstacle_directions.size(): + var dir = obstacle_directions[obstacle_idx] + if dir == Direction.BLOCKED_NORTH or dir == Direction.BLOCKED_SOUTH: + return true + + # Check if there's a vertical obstacle + if from_pos.x == to_pos.x: # Moving vertically + # Check for horizontal obstacles that would block vertical movement + var min_y = min(from_pos.y, to_pos.y) + var max_y = max(from_pos.y, to_pos.y) + for y in range(min_y, max_y + 1): + var cell_index = get_cell_item(Vector3i(from_pos.x, floor_index, y)) + if cell_index in obstacle_items: + var obstacle_idx = obstacle_items.find(cell_index) + if obstacle_idx != -1 and obstacle_idx < obstacle_directions.size(): + var dir = obstacle_directions[obstacle_idx] + if dir == Direction.BLOCKED_EAST or dir == Direction.BLOCKED_WEST: + return true + + return false + +func place_obstacle(pos: Vector3i, obstacle_item: int, direction: Direction) -> bool: + # Always place on floor 3 + pos.y = 3 + + if get_cell_item(pos) != -1: + return false # Cell is already occupied + + set_cell_item(pos, obstacle_item) + + # Store the direction of the obstacle + var item_index = obstacle_items.find(obstacle_item) + if item_index == -1: + item_index = 0 # Default to first item if not found + + while obstacle_directions.size() <= item_index: + obstacle_directions.append(Direction.CENTER) # Default + + obstacle_directions[item_index] = direction + + # Update the cell's orientation based on direction + var orientation = 0 + match direction: + Direction.BLOCKED_NORTH: + orientation = 0 # Default orientation + Direction.BLOCKED_EAST: + orientation = 1 # 90 degrees clockwise + Direction.BLOCKED_SOUTH: + orientation = 2 # 180 degrees + Direction.BLOCKED_WEST: + orientation = 3 # 270 degrees clockwise + + set_cell_item(pos, obstacle_item, orientation) + + # Re-initialize A* pathfinding to account for the new obstacle + initialize_astar() + + return true diff --git a/addons/enhanced_gridmap/enhanced_gridmap.gd.uid b/addons/enhanced_gridmap/enhanced_gridmap.gd.uid new file mode 100644 index 0000000..f263e91 --- /dev/null +++ b/addons/enhanced_gridmap/enhanced_gridmap.gd.uid @@ -0,0 +1 @@ +uid://bja8ixryvthu0 diff --git a/addons/enhanced_gridmap/enhanced_gridmap_dock.gd.uid b/addons/enhanced_gridmap/enhanced_gridmap_dock.gd.uid new file mode 100644 index 0000000..66ece5e --- /dev/null +++ b/addons/enhanced_gridmap/enhanced_gridmap_dock.gd.uid @@ -0,0 +1 @@ +uid://fmgdfwvicktv diff --git a/addons/enhanced_gridmap/enhanced_gridmap_dock.tscn b/addons/enhanced_gridmap/enhanced_gridmap_dock.tscn index 95dc45c..99c0891 100644 --- a/addons/enhanced_gridmap/enhanced_gridmap_dock.tscn +++ b/addons/enhanced_gridmap/enhanced_gridmap_dock.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=2 format=3 uid="uid://bnkcae3aoavgh"] -[ext_resource type="Script" path="res://addons/enhanced_gridmap/enhanced_gridmap_dock.gd" id="1_abcde"] +[ext_resource type="Script" uid="uid://fmgdfwvicktv" path="res://addons/enhanced_gridmap/enhanced_gridmap_dock.gd" id="1_abcde"] [node name="Enhanced GridMap" type="ScrollContainer"] anchors_preset = 15 diff --git a/addons/enhanced_gridmap/meshlibrary/default.tres b/addons/enhanced_gridmap/meshlibrary/default.tres index 3dba62a..e26bcde 100644 --- a/addons/enhanced_gridmap/meshlibrary/default.tres +++ b/addons/enhanced_gridmap/meshlibrary/default.tres @@ -1,8 +1,9 @@ -[gd_resource type="MeshLibrary" load_steps=11 format=3 uid="uid://54tpx8cmksfc"] +[gd_resource type="MeshLibrary" load_steps=12 format=3 uid="uid://54tpx8cmksfc"] [ext_resource type="ArrayMesh" uid="uid://dqguomxd16u0i" path="res://assets/models/meshes/start.res" id="1_xdwel"] [ext_resource type="ArrayMesh" uid="uid://dspusnbkr74hg" path="res://assets/models/meshes/hover.res" id="2_5gp4i"] [ext_resource type="Material" uid="uid://bsyh0x4cy5qyr" path="res://assets/models/meshes/end.tres" id="3_qi66w"] +[ext_resource type="ArrayMesh" uid="uid://dtr46jmckif0p" path="res://assets/models/meshes/block.res" id="4_8v5xv"] [ext_resource type="ArrayMesh" uid="uid://d4himvyb81in8" path="res://assets/models/meshes/non-walkable.res" id="4_h83ju"] [ext_resource type="ArrayMesh" uid="uid://bgvropltcot0q" path="res://assets/models/meshes/normal.res" id="5_san4u"] [ext_resource type="ArrayMesh" uid="uid://36tgon3b60db" path="res://assets/models/tiles/tile_heart.tres" id="6_r6sve"] @@ -18,65 +19,103 @@ size = Vector2(1, 1) item/0/name = "normal" item/0/mesh = ExtResource("1_xdwel") item/0/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/0/mesh_cast_shadow = 1 item/0/shapes = [] item/0/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/0/navigation_layers = 1 item/1/name = "hover" item/1/mesh = ExtResource("2_5gp4i") item/1/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/1/mesh_cast_shadow = 1 item/1/shapes = [] item/1/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/1/navigation_layers = 1 item/2/name = "start" item/2/mesh = ExtResource("1_xdwel") item/2/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/2/mesh_cast_shadow = 1 item/2/shapes = [] item/2/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/2/navigation_layers = 1 item/3/name = "end" item/3/mesh = SubResource("PlaneMesh_ti6kf") item/3/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/3/mesh_cast_shadow = 1 item/3/shapes = [] item/3/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/3/navigation_layers = 1 item/4/name = "non-walkable" item/4/mesh = ExtResource("4_h83ju") item/4/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/4/mesh_cast_shadow = 1 item/4/shapes = [] item/4/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/4/navigation_layers = 1 item/6/name = "grass" item/6/mesh = ExtResource("5_san4u") item/6/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/6/mesh_cast_shadow = 1 item/6/shapes = [] item/6/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/6/navigation_layers = 1 item/7/name = "tile_heart" item/7/mesh = ExtResource("6_r6sve") item/7/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0) +item/7/mesh_cast_shadow = 1 item/7/shapes = [] item/7/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/7/navigation_layers = 1 item/8/name = "tile_diamond" item/8/mesh = ExtResource("8_rj3ss") item/8/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0) +item/8/mesh_cast_shadow = 1 item/8/shapes = [] item/8/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/8/navigation_layers = 1 item/9/name = "tile_star" item/9/mesh = ExtResource("9_y8bbi") item/9/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0) +item/9/mesh_cast_shadow = 1 item/9/shapes = [] item/9/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/9/navigation_layers = 1 item/10/name = "tile_coin" item/10/mesh = ExtResource("9_44311") item/10/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.9, 0) +item/10/mesh_cast_shadow = 1 item/10/shapes = [] item/10/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/10/navigation_layers = 1 -item/11/name = "" -item/11/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/11/name = "obstacle_block" +item/11/mesh = ExtResource("4_8v5xv") +item/11/mesh_transform = Transform3D(1.65, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0.5) +item/11/mesh_cast_shadow = 1 item/11/shapes = [] -item/11/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/11/navigation_mesh_transform = Transform3D(0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0) item/11/navigation_layers = 1 +item/12/name = "obstacle_block_h" +item/12/mesh = ExtResource("4_8v5xv") +item/12/mesh_transform = Transform3D(1.65, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0.5) +item/12/mesh_cast_shadow = 1 +item/12/shapes = [] +item/12/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/12/navigation_layers = 1 +item/13/name = "obstacle_block_v" +item/13/mesh = ExtResource("4_8v5xv") +item/13/mesh_transform = Transform3D(1.65, 0, 0, 0, 1, 0, 0, 0, 1, 0, -2, 0.5) +item/13/mesh_cast_shadow = 1 +item/13/shapes = [] +item/13/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/13/navigation_layers = 1 +item/14/name = "" +item/14/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/14/mesh_cast_shadow = 1 +item/14/shapes = [] +item/14/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/14/navigation_layers = 1 +item/15/name = "" +item/15/mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/15/mesh_cast_shadow = 1 +item/15/shapes = [] +item/15/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/15/navigation_layers = 1 diff --git a/addons/enhanced_gridmap/plugin.gd.uid b/addons/enhanced_gridmap/plugin.gd.uid new file mode 100644 index 0000000..0295616 --- /dev/null +++ b/addons/enhanced_gridmap/plugin.gd.uid @@ -0,0 +1 @@ +uid://fcdsysbyx6pt diff --git a/assets/characters/Bob.glb.import b/assets/characters/Bob.glb.import index 4dab8f3..55659be 100644 --- a/assets/characters/Bob.glb.import +++ b/assets/characters/Bob.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/characters/Gatot.glb.import b/assets/characters/Gatot.glb.import index ce4ee37..903337b 100644 --- a/assets/characters/Gatot.glb.import +++ b/assets/characters/Gatot.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/characters/Masbro.glb.import b/assets/characters/Masbro.glb.import index e87dd8e..1b03a80 100644 --- a/assets/characters/Masbro.glb.import +++ b/assets/characters/Masbro.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/characters/Oldpop.glb.import b/assets/characters/Oldpop.glb.import index cc9b3e3..e0ab4f3 100644 --- a/assets/characters/Oldpop.glb.import +++ b/assets/characters/Oldpop.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/characters/animation.glb.import b/assets/characters/animation.glb.import index 17911e1..7838357 100644 --- a/assets/characters/animation.glb.import +++ b/assets/characters/animation.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/models/meshes/block.glb b/assets/models/meshes/block.glb new file mode 100644 index 0000000..637d117 Binary files /dev/null and b/assets/models/meshes/block.glb differ diff --git a/assets/models/meshes/block.glb.import b/assets/models/meshes/block.glb.import new file mode 100644 index 0000000..dba6f7b --- /dev/null +++ b/assets/models/meshes/block.glb.import @@ -0,0 +1,48 @@ +[remap] + +importer="scene" +importer_version=1 +type="PackedScene" +uid="uid://bwg5ntn1xa8o" +path="res://.godot/imported/block.glb-fb6bc8a4474a482c37edd6c5ac8ce3c9.scn" + +[deps] + +source_file="res://assets/models/meshes/block.glb" +dest_files=["res://.godot/imported/block.glb-fb6bc8a4474a482c37edd6c5ac8ce3c9.scn"] + +[params] + +nodes/root_type="" +nodes/root_name="" +nodes/apply_root_scale=true +nodes/root_scale=1.0 +nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true +meshes/ensure_tangents=true +meshes/generate_lods=true +meshes/create_shadow_meshes=true +meshes/light_baking=1 +meshes/lightmap_texel_size=0.2 +meshes/force_disable_compression=false +skins/use_named_skins=true +animation/import=true +animation/fps=30 +animation/trimming=false +animation/remove_immutable_tracks=true +animation/import_rest_as_RESET=false +import_script/path="" +_subresources={ +"meshes": { +"block_Plane_093": { +"generate/lightmap_uv": 0, +"generate/lods": 0, +"generate/shadow_meshes": 0, +"lods/normal_merge_angle": 60.0, +"save_to_file/enabled": true, +"save_to_file/path": "res://assets/models/meshes/block.res" +} +} +} +gltf/naming_version=1 +gltf/embedded_image_handling=1 diff --git a/assets/models/meshes/block.res b/assets/models/meshes/block.res new file mode 100644 index 0000000..0935365 Binary files /dev/null and b/assets/models/meshes/block.res differ diff --git a/assets/models/meshes/block_Block3.png b/assets/models/meshes/block_Block3.png new file mode 100644 index 0000000..c21cd11 Binary files /dev/null and b/assets/models/meshes/block_Block3.png differ diff --git a/assets/models/meshes/block_Block3.png.import b/assets/models/meshes/block_Block3.png.import new file mode 100644 index 0000000..7bc7597 --- /dev/null +++ b/assets/models/meshes/block_Block3.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://b6n6cxcffkg7s" +path.s3tc="res://.godot/imported/block_Block3.png-529ed6c98d1f6a034bc687571a41ed5d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/models/meshes/block_Block3.png" +dest_files=["res://.godot/imported/block_Block3.png-529ed6c98d1f6a034bc687571a41ed5d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/models/meshes/block_texture/block_1.png b/assets/models/meshes/block_texture/block_1.png new file mode 100644 index 0000000..8d48331 Binary files /dev/null and b/assets/models/meshes/block_texture/block_1.png differ diff --git a/assets/models/meshes/block_texture/block_1.png.import b/assets/models/meshes/block_texture/block_1.png.import new file mode 100644 index 0000000..0b5cb2b --- /dev/null +++ b/assets/models/meshes/block_texture/block_1.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bslcvqu835at5" +path.s3tc="res://.godot/imported/block_1.png-6b8ced44f05f806f44a7a813843484f3.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/models/meshes/block_texture/block_1.png" +dest_files=["res://.godot/imported/block_1.png-6b8ced44f05f806f44a7a813843484f3.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/models/meshes/block_texture/block_2.png b/assets/models/meshes/block_texture/block_2.png new file mode 100644 index 0000000..439528a Binary files /dev/null and b/assets/models/meshes/block_texture/block_2.png differ diff --git a/assets/models/meshes/block_texture/block_2.png.import b/assets/models/meshes/block_texture/block_2.png.import new file mode 100644 index 0000000..0818d1b --- /dev/null +++ b/assets/models/meshes/block_texture/block_2.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0e3o1bfwb4dq" +path.s3tc="res://.godot/imported/block_2.png-412f753f19be298d13d0f199fdd970a5.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/models/meshes/block_texture/block_2.png" +dest_files=["res://.godot/imported/block_2.png-412f753f19be298d13d0f199fdd970a5.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/models/meshes/block_texture/block_3.png b/assets/models/meshes/block_texture/block_3.png new file mode 100644 index 0000000..c21cd11 Binary files /dev/null and b/assets/models/meshes/block_texture/block_3.png differ diff --git a/assets/models/meshes/block_texture/block_3.png.import b/assets/models/meshes/block_texture/block_3.png.import new file mode 100644 index 0000000..f30651b --- /dev/null +++ b/assets/models/meshes/block_texture/block_3.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c6oe6hwm2a8j1" +path.s3tc="res://.godot/imported/block_3.png-a61521fcb1bdbdec39cb720b2b8601e6.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://assets/models/meshes/block_texture/block_3.png" +dest_files=["res://.godot/imported/block_3.png-a61521fcb1bdbdec39cb720b2b8601e6.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=0 diff --git a/assets/models/meshes/tile.glb.import b/assets/models/meshes/tile.glb.import index 132a705..48912bb 100644 --- a/assets/models/meshes/tile.glb.import +++ b/assets/models/meshes/tile.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/models/meshes/tiles.res b/assets/models/meshes/tiles.res index 29fc63d..b877432 100644 Binary files a/assets/models/meshes/tiles.res and b/assets/models/meshes/tiles.res differ diff --git a/assets/models/meshes/tiles_armagedon.glb.import b/assets/models/meshes/tiles_armagedon.glb.import index fa418e2..6d82bf6 100644 --- a/assets/models/meshes/tiles_armagedon.glb.import +++ b/assets/models/meshes/tiles_armagedon.glb.import @@ -18,6 +18,7 @@ nodes/root_name="" nodes/apply_root_scale=true nodes/root_scale=1.0 nodes/import_as_skeleton_bones=false +nodes/use_node_type_suffixes=true meshes/ensure_tangents=true meshes/generate_lods=true meshes/create_shadow_meshes=true diff --git a/assets/models/meshes/tiles_armagedon_a2.res b/assets/models/meshes/tiles_armagedon_a2.res index eb8a2c3..9f3803f 100644 Binary files a/assets/models/meshes/tiles_armagedon_a2.res and b/assets/models/meshes/tiles_armagedon_a2.res differ diff --git a/assets/models/meshes/tiles_armagedon_a3.res b/assets/models/meshes/tiles_armagedon_a3.res index 0765503..705746e 100644 Binary files a/assets/models/meshes/tiles_armagedon_a3.res and b/assets/models/meshes/tiles_armagedon_a3.res differ diff --git a/assets/models/meshes/tiles_armagedon_a4.res b/assets/models/meshes/tiles_armagedon_a4.res index 65689ef..6345c37 100644 Binary files a/assets/models/meshes/tiles_armagedon_a4.res and b/assets/models/meshes/tiles_armagedon_a4.res differ diff --git a/assets/models/meshes/tiles_armagedon_b1.res b/assets/models/meshes/tiles_armagedon_b1.res index 4e546e5..46c2e95 100644 Binary files a/assets/models/meshes/tiles_armagedon_b1.res and b/assets/models/meshes/tiles_armagedon_b1.res differ diff --git a/assets/models/meshes/tiles_armagedon_b2.res b/assets/models/meshes/tiles_armagedon_b2.res index e0dbe71..e427165 100644 Binary files a/assets/models/meshes/tiles_armagedon_b2.res and b/assets/models/meshes/tiles_armagedon_b2.res differ diff --git a/assets/models/meshes/tiles_armagedon_b3.res b/assets/models/meshes/tiles_armagedon_b3.res index 968e691..a48110a 100644 Binary files a/assets/models/meshes/tiles_armagedon_b3.res and b/assets/models/meshes/tiles_armagedon_b3.res differ diff --git a/assets/models/meshes/tiles_armagedon_b4.res b/assets/models/meshes/tiles_armagedon_b4.res index 5f08afa..ec61fa8 100644 Binary files a/assets/models/meshes/tiles_armagedon_b4.res and b/assets/models/meshes/tiles_armagedon_b4.res differ diff --git a/project.godot b/project.godot index 4cd9193..0eba99b 100644 --- a/project.godot +++ b/project.godot @@ -12,7 +12,7 @@ config_version=5 config/name="tekton-local" run/main_scene="res://scenes/main_scene.tscn" -config/features=PackedStringArray("4.3", "Forward Plus") +config/features=PackedStringArray("4.4", "Forward Plus") config/icon="res://icon.svg" [autoload] diff --git a/scenes/main.gd b/scenes/main.gd index 0033e49..6f0fb74 100644 --- a/scenes/main.gd +++ b/scenes/main.gd @@ -9,7 +9,7 @@ # [x] Grab tile is working, you can grab the tile from gridmap to playerboard # ------------------------------------------------------------------------------------- # [ ] Implement the Boosts tile, that can be used to boost player movement to next tile -# [ ] Implement the Obstacle tile, that can be used to block player movement to next tile +# [x] Implement the Obstacle tile, that can be used to block player movement to next tile # ------------------------------------------------------------------------------------- # [x] Added multiplayer support - with act as server and client # [x] Added UPnP support for automatic port forwarding, for android and desktop @@ -62,7 +62,18 @@ enum ActionState { GRABBING, PUTTING, RANDOMIZING, - ARRANGING + ARRANGING, + PLACING_OBSTACLE +} + +# Obstacle +var current_obstacle_direction = ObstacleDirection.VERTICAL +var obstacle_item_index = 12 # Default obstacle item index in mesh library +var current_obstacle_item = 12 # Starting with first obstacle item (12) + +enum ObstacleDirection { + VERTICAL, + HORIZONTAL } var current_action_state = ActionState.NONE @@ -88,6 +99,8 @@ func _ready(): multiplayer_peer.peer_disconnected.connect(_on_peer_disconnected) setup_action_buttons() setup_playerboard_ui() + # Obstacles + setup_obstacle_ui() func _process(delta): if multiplayer.is_server() and game_started: @@ -206,6 +219,47 @@ func set_action_state(new_state): ActionState.ARRANGING: show_arrangement_ui() local_player_character.highlight_occupied_playerboard_slots() + ActionState.PLACING_OBSTACLE: + local_player_character.highlight_valid_obstacle_cells() + +# Update the place_obstacle function for floor 3 +func place_obstacle(grid_position: Vector2i): + if not local_player_character or local_player_character.action_points < 1: + return false + + var floor_index = 3 # Always place on floor 3 + var direction = EnhancedGridMap.Direction.BLOCKED_NORTH + + match current_obstacle_direction: + ObstacleDirection.VERTICAL: + direction = EnhancedGridMap.Direction.BLOCKED_NORTH # Block movement along east-west axis + ObstacleDirection.HORIZONTAL: + direction = EnhancedGridMap.Direction.BLOCKED_EAST # Block movement along north-south axis + + var success = $EnhancedGridMap.place_obstacle( + Vector3i(grid_position.x, floor_index, grid_position.y), + current_obstacle_item, + direction + ) + + if success: + local_player_character.action_points -= 1 + local_player_character.clear_highlights() + + # Don't exit the obstacle placement mode to allow multiple placements + local_player_character.highlight_valid_obstacle_cells() + + # Sync the obstacle with other clients + if is_multiplayer_authority(): + rpc("sync_place_obstacle", grid_position.x, grid_position.y, floor_index, current_obstacle_item, direction) + + return true + return false + +# Update the RPC for obstacle synchronization +@rpc("any_peer", "call_local") +func sync_place_obstacle(x: int, y: int, floor_index: int, item_index: int, direction: int): + $EnhancedGridMap.place_obstacle(Vector3i(x, floor_index, y), item_index, direction) func update_button_states(): if not local_player_character or local_player_character.is_in_group("Bots"): @@ -932,6 +986,40 @@ func sync_playerboard(player_id: int, new_playerboard: Array): for slot_idx in range(25): update_board_slot(board_ui, slot_idx, new_playerboard[slot_idx]) +# Update the obstacle UI setup function +func setup_obstacle_ui(): + # Create the obstacle button + var obstacle_button = Button.new() + obstacle_button.text = "Place Obstacle" + obstacle_button.pressed.connect(func(): set_action_state(ActionState.PLACING_OBSTACLE)) + $ActionMenu/ActionButtonContainer.add_child(obstacle_button) + + # Create the direction toggle button + var direction_button = Button.new() + direction_button.text = "Direction: Vertical" + direction_button.pressed.connect(func(): + current_obstacle_direction = ObstacleDirection.HORIZONTAL if current_obstacle_direction == ObstacleDirection.VERTICAL else ObstacleDirection.VERTICAL + direction_button.text = "Direction: " + ("Horizontal" if current_obstacle_direction == ObstacleDirection.HORIZONTAL else "Vertical") + ) + $ActionMenu/ActionButtonContainer.add_child(direction_button) + + # Create the type cycle button + var type_button = Button.new() + type_button.text = "Type: 1" + type_button.pressed.connect(func(): + type_button.text = cycle_obstacle_type() + ) + $ActionMenu/ActionButtonContainer.add_child(type_button) + + +# Add a function to cycle through obstacle types +func cycle_obstacle_type(): + var obstacle_types = [12, 13, 14, 15] + var current_index = obstacle_types.find(current_obstacle_item) + current_index = (current_index + 1) % obstacle_types.size() + current_obstacle_item = obstacle_types[current_index] + return "Type: " + str(current_index + 1) + func update_board_slot(board_ui: Node, slot_idx: int, value: int): var slot_node = board_ui.get_node_or_null("Slot%d" % (slot_idx + 1)) if slot_node: diff --git a/scenes/main.gd.uid b/scenes/main.gd.uid new file mode 100644 index 0000000..92e367f --- /dev/null +++ b/scenes/main.gd.uid @@ -0,0 +1 @@ +uid://co1ads72by6na diff --git a/scenes/main.tscn b/scenes/main.tscn index 51718c0..75eb2d4 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -1,8 +1,8 @@ [gd_scene load_steps=26 format=3 uid="uid://dxn87yj8qnfpp"] [ext_resource type="MeshLibrary" uid="uid://54tpx8cmksfc" path="res://addons/enhanced_gridmap/meshlibrary/default.tres" id="1_110wo"] -[ext_resource type="Script" path="res://scenes/main.gd" id="1_xcpe3"] -[ext_resource type="Script" path="res://addons/enhanced_gridmap/enhanced_gridmap.gd" id="2_hbe1v"] +[ext_resource type="Script" uid="uid://co1ads72by6na" path="res://scenes/main.gd" id="1_xcpe3"] +[ext_resource type="Script" uid="uid://bja8ixryvthu0" path="res://addons/enhanced_gridmap/enhanced_gridmap.gd" id="2_hbe1v"] [ext_resource type="Environment" uid="uid://jbptgqvstei3" path="res://assets/main-environment.tres" id="4_ky38j"] [ext_resource type="StyleBox" uid="uid://dlw1ogamn741n" path="res://assets/styles/box_flat.tres" id="5_dvx6y"] [ext_resource type="Texture2D" uid="uid://2yrc6rl4dmd8" path="res://assets/textures/player_board_and_blue_print/tile_null.tres" id="6_2vy7d"] @@ -44,8 +44,9 @@ data = { script = ExtResource("2_hbe1v") columns = 14 rows = 12 -floors = 2 -metadata/_editor_floor_ = Vector3(0, 1, 0) +obstacle_items = Array[int]([12]) +obstacle_directions = Array[int]([11, 10, 12, 13]) +metadata/_editor_floor_ = Vector3(0, 2, 0) [node name="Camera3D" type="Camera3D" parent="."] transform = Transform3D(1, 0, 0, 0, 0.422618, 0.906308, 0, -0.906308, 0.422618, 7, 26, 17) @@ -935,8 +936,8 @@ anchor_left = 1.0 anchor_top = 1.0 anchor_right = 1.0 anchor_bottom = 1.0 -offset_left = -145.0 -offset_top = -218.0 +offset_left = -160.0 +offset_top = -384.0 grow_horizontal = 0 grow_vertical = 0 diff --git a/scenes/player.gd b/scenes/player.gd index 8ce9a9d..d1d8977 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -225,6 +225,9 @@ func handle_grid_click(grid_position: Vector2i): main.ActionState.RANDOMIZING: if grid_position in highlighted_cells: main.randomize_item_at_position(grid_position) + main.ActionState.PLACING_OBSTACLE: + if grid_position in highlighted_cells: + main.place_obstacle(grid_position) func is_position_occupied(pos: Vector2i) -> bool: for player in get_tree().get_nodes_in_group("Players"): @@ -1215,3 +1218,35 @@ func sync_position(pos: Vector2i): cell_size.y, current_position.y * cell_size.z + cell_size.z * 0.5 ) + cell_offset + +func highlight_valid_obstacle_cells(): + if not is_multiplayer_authority() or is_bot or is_in_group("Bots"): + return + + clear_highlights() + + var cells_to_highlight = [] + + # Highlight all empty cells on the grid except those occupied by players or obstacles + for x in range(enhanced_gridmap.columns): + for z in range(enhanced_gridmap.rows): + var pos = Vector2i(x, z) + var cell = Vector3i(x, 3, z) # Check floor 3 for occupancy + var occupied_by_player = false + var occupied_by_obstacle = false + + # Check if cell is occupied by any player + for player in get_tree().get_nodes_in_group("Players"): + if player.current_position == pos: + occupied_by_player = true + break + + # Check if cell is occupied by an obstacle + if enhanced_gridmap.get_cell_item(cell) in enhanced_gridmap.obstacle_items: + occupied_by_obstacle = true + + # Only add to highlights if not occupied by player or obstacle + if not occupied_by_player and not occupied_by_obstacle: + cells_to_highlight.append(pos) + + highlight_cells_if_authorized(cells_to_highlight) diff --git a/scenes/player.gd.uid b/scenes/player.gd.uid new file mode 100644 index 0000000..c0f7db1 --- /dev/null +++ b/scenes/player.gd.uid @@ -0,0 +1 @@ +uid://c78jcadupsdro diff --git a/scenes/player.tscn b/scenes/player.tscn index a75d7bd..4933738 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -1,25 +1,25 @@ [gd_scene load_steps=25 format=3 uid="uid://1dbdbg3q5778"] -[ext_resource type="Script" path="res://scenes/player.gd" id="1_qecr4"] +[ext_resource type="Script" uid="uid://c78jcadupsdro" path="res://scenes/player.gd" id="1_qecr4"] [ext_resource type="PackedScene" uid="uid://ejeamn0pyey4" path="res://assets/characters/Bob.glb" id="2_3e0d5"] [ext_resource type="Texture2D" uid="uid://b4y41h16q6m34" path="res://assets/textures/bub.png" id="2_5w327"] [ext_resource type="PackedScene" uid="uid://1vk0mjnwkngi" path="res://assets/characters/Masbro.glb" id="2_mjsl8"] [ext_resource type="PackedScene" uid="uid://d4cul3w3wem5w" path="res://assets/characters/Gatot.glb" id="4_3tlf6"] [ext_resource type="PackedScene" uid="uid://bmln7v6v5kvxg" path="res://assets/characters/Oldpop.glb" id="5_alfd1"] [ext_resource type="AnimationLibrary" uid="uid://c3pyopnwibckj" path="res://assets/characters/animations/animation-pack.res" id="6_5oq5w"] -[ext_resource type="Script" path="res://scripts/bot_behavior.gd" id="8_1o2fn"] -[ext_resource type="Script" path="res://addons/beehave/nodes/composites/selector.gd" id="9_jspru"] -[ext_resource type="Script" path="res://addons/beehave/nodes/composites/sequence.gd" id="10_hv4ee"] -[ext_resource type="Script" path="res://scripts/behaviors/conditions/has_ap.gd" id="11_7fhpq"] -[ext_resource type="Script" path="res://scripts/behaviors/actions/do_arrange.gd" id="12_1ppih"] -[ext_resource type="Script" path="res://scripts/behaviors/conditions/can_arrange.gd" id="12_hr248"] -[ext_resource type="Script" path="res://scripts/behaviors/conditions/can_grab.gd" id="13_41jsv"] -[ext_resource type="Script" path="res://scripts/behaviors/actions/do_grab.gd" id="15_5h472"] -[ext_resource type="Script" path="res://scripts/behaviors/conditions/can_put.gd" id="16_ac2sy"] -[ext_resource type="Script" path="res://scripts/behaviors/actions/do_put.gd" id="17_e03nk"] -[ext_resource type="Script" path="res://scripts/behaviors/conditions/should_move.gd" id="18_2ghcp"] -[ext_resource type="Script" path="res://scripts/behaviors/actions/do_move.gd" id="19_dl4fn"] -[ext_resource type="Script" path="res://scripts/bot_blackboard.gd" id="20_24ja6"] +[ext_resource type="Script" uid="uid://6g75rh3nj2s6" path="res://scripts/bot_behavior.gd" id="8_1o2fn"] +[ext_resource type="Script" uid="uid://dtctf507t71tj" path="res://addons/beehave/nodes/composites/selector.gd" id="9_jspru"] +[ext_resource type="Script" uid="uid://t6e8rtdiqhg5" path="res://addons/beehave/nodes/composites/sequence.gd" id="10_hv4ee"] +[ext_resource type="Script" uid="uid://b17qem72laaeb" path="res://scripts/behaviors/conditions/has_ap.gd" id="11_7fhpq"] +[ext_resource type="Script" uid="uid://b4fxorcb1yq17" path="res://scripts/behaviors/actions/do_arrange.gd" id="12_1ppih"] +[ext_resource type="Script" uid="uid://b25qg75d0xgkh" path="res://scripts/behaviors/conditions/can_arrange.gd" id="12_hr248"] +[ext_resource type="Script" uid="uid://cui40g7qjf1y3" path="res://scripts/behaviors/conditions/can_grab.gd" id="13_41jsv"] +[ext_resource type="Script" uid="uid://cuyorbwefmh0y" path="res://scripts/behaviors/actions/do_grab.gd" id="15_5h472"] +[ext_resource type="Script" uid="uid://b7y30e5mxygj0" path="res://scripts/behaviors/conditions/can_put.gd" id="16_ac2sy"] +[ext_resource type="Script" uid="uid://bdw5bwmr32h63" path="res://scripts/behaviors/actions/do_put.gd" id="17_e03nk"] +[ext_resource type="Script" uid="uid://bc7jpc1bwy4dg" path="res://scripts/behaviors/conditions/should_move.gd" id="18_2ghcp"] +[ext_resource type="Script" uid="uid://cireifbxafgf2" path="res://scripts/behaviors/actions/do_move.gd" id="19_dl4fn"] +[ext_resource type="Script" uid="uid://d2cr28ak2s1rr" path="res://scripts/bot_blackboard.gd" id="20_24ja6"] [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_xqgey"] albedo_color = Color(0.85, 0.085, 0.238, 1) @@ -56,7 +56,7 @@ visible = false [node name="AnimationPlayer" type="AnimationPlayer" parent="."] root_node = NodePath("../Masbro") libraries = { -"animation-pack": ExtResource("6_5oq5w") +&"animation-pack": ExtResource("6_5oq5w") } [node name="MeshInstance3D" type="MeshInstance3D" parent="."] diff --git a/scripts/behaviors/actions/do_arrange.gd.uid b/scripts/behaviors/actions/do_arrange.gd.uid new file mode 100644 index 0000000..ecb5d94 --- /dev/null +++ b/scripts/behaviors/actions/do_arrange.gd.uid @@ -0,0 +1 @@ +uid://b4fxorcb1yq17 diff --git a/scripts/behaviors/actions/do_grab.gd.uid b/scripts/behaviors/actions/do_grab.gd.uid new file mode 100644 index 0000000..a0c1d71 --- /dev/null +++ b/scripts/behaviors/actions/do_grab.gd.uid @@ -0,0 +1 @@ +uid://cuyorbwefmh0y diff --git a/scripts/behaviors/actions/do_move.gd.uid b/scripts/behaviors/actions/do_move.gd.uid new file mode 100644 index 0000000..e4482f5 --- /dev/null +++ b/scripts/behaviors/actions/do_move.gd.uid @@ -0,0 +1 @@ +uid://cireifbxafgf2 diff --git a/scripts/behaviors/actions/do_put.gd.uid b/scripts/behaviors/actions/do_put.gd.uid new file mode 100644 index 0000000..e65af6f --- /dev/null +++ b/scripts/behaviors/actions/do_put.gd.uid @@ -0,0 +1 @@ +uid://bdw5bwmr32h63 diff --git a/scripts/behaviors/conditions/can_arrange.gd.uid b/scripts/behaviors/conditions/can_arrange.gd.uid new file mode 100644 index 0000000..3f344ed --- /dev/null +++ b/scripts/behaviors/conditions/can_arrange.gd.uid @@ -0,0 +1 @@ +uid://b25qg75d0xgkh diff --git a/scripts/behaviors/conditions/can_grab.gd.uid b/scripts/behaviors/conditions/can_grab.gd.uid new file mode 100644 index 0000000..1e12c6b --- /dev/null +++ b/scripts/behaviors/conditions/can_grab.gd.uid @@ -0,0 +1 @@ +uid://cui40g7qjf1y3 diff --git a/scripts/behaviors/conditions/can_put.gd.uid b/scripts/behaviors/conditions/can_put.gd.uid new file mode 100644 index 0000000..7258c3e --- /dev/null +++ b/scripts/behaviors/conditions/can_put.gd.uid @@ -0,0 +1 @@ +uid://b7y30e5mxygj0 diff --git a/scripts/behaviors/conditions/has_ap.gd.uid b/scripts/behaviors/conditions/has_ap.gd.uid new file mode 100644 index 0000000..501ee64 --- /dev/null +++ b/scripts/behaviors/conditions/has_ap.gd.uid @@ -0,0 +1 @@ +uid://b17qem72laaeb diff --git a/scripts/behaviors/conditions/should_move.gd.uid b/scripts/behaviors/conditions/should_move.gd.uid new file mode 100644 index 0000000..d050061 --- /dev/null +++ b/scripts/behaviors/conditions/should_move.gd.uid @@ -0,0 +1 @@ +uid://bc7jpc1bwy4dg diff --git a/scripts/bot_behavior.gd.uid b/scripts/bot_behavior.gd.uid new file mode 100644 index 0000000..ce979c9 --- /dev/null +++ b/scripts/bot_behavior.gd.uid @@ -0,0 +1 @@ +uid://6g75rh3nj2s6 diff --git a/scripts/bot_blackboard.gd.uid b/scripts/bot_blackboard.gd.uid new file mode 100644 index 0000000..f74dff7 --- /dev/null +++ b/scripts/bot_blackboard.gd.uid @@ -0,0 +1 @@ +uid://d2cr28ak2s1rr diff --git a/tiles_armagedon_a1.res b/tiles_armagedon_a1.res index 489bc5f..e1cc909 100644 Binary files a/tiles_armagedon_a1.res and b/tiles_armagedon_a1.res differ