From 18c3dbecd67352cb7dc574bf0a47108845d11b92 Mon Sep 17 00:00:00 2001 From: Yogi Wiguna Date: Wed, 11 Mar 2026 15:29:07 +0800 Subject: [PATCH] feat: Add core game managers, main scene, enhanced gridmap, and essential assets, including a new special tiles manager for power-up effects and inventory. --- addons/enhanced_gridmap/enhanced_gridmap.gd | 2 +- .../enhanced_gridmap/meshlibrary/default.tres | 8 ++ .../meshes/ancient_lightning_stones.res | Bin 758 -> 758 bytes assets/models/meshes/block.res | Bin 11641 -> 5587 bytes scenes/main.tscn | 2 +- scripts/managers/goals_cycle_manager.gd | 4 + scripts/managers/player_movement_manager.gd | 17 ++-- scripts/managers/special_tiles_manager.gd | 4 +- scripts/managers/stop_n_go_manager.gd | 75 ++++++++++++++++-- 9 files changed, 97 insertions(+), 15 deletions(-) diff --git a/addons/enhanced_gridmap/enhanced_gridmap.gd b/addons/enhanced_gridmap/enhanced_gridmap.gd index 85c7da4..c90f1d1 100644 --- a/addons/enhanced_gridmap/enhanced_gridmap.gd +++ b/addons/enhanced_gridmap/enhanced_gridmap.gd @@ -16,7 +16,7 @@ signal grid_updated @export var hover_item: int = 1 @export var start_item: int = -1 @export var end_item: int = -1 -@export var immutable_items: Array[int] = [1, 2, 3, 4] # Items that cannot be randomized/reset (Start, Safe, Finish, Wall) +@export var immutable_items: Array[int] = [1, 2, 3, 4, 16] # Items that cannot be randomized/reset (Start, Safe, Finish, Wall, Safe Zone Wall) var current_mesh_library: MeshLibrary var grid_data: Array = [] # 3D array [floor][row][column] diff --git a/addons/enhanced_gridmap/meshlibrary/default.tres b/addons/enhanced_gridmap/meshlibrary/default.tres index 99b12d0..360534f 100644 --- a/addons/enhanced_gridmap/meshlibrary/default.tres +++ b/addons/enhanced_gridmap/meshlibrary/default.tres @@ -11,6 +11,7 @@ [ext_resource type="ArrayMesh" uid="uid://bfv8cw1vho5p5" path="res://assets/models/meshes/ancient_lightning_stones.res" id="8_cg50n"] [ext_resource type="BoxMesh" uid="uid://fy4bhoeii40c" path="res://addons/enhanced_gridmap/meshlibrary/tile_safe_zone.tres" id="8_uwjsj"] [ext_resource type="BoxMesh" uid="uid://dy5p77cjb3geo" path="res://addons/enhanced_gridmap/meshlibrary/tile_start.tres" id="9_pgnbl"] +[ext_resource type="ArrayMesh" uid="uid://dtr46jmckif0p" path="res://assets/models/meshes/block.res" id="9_uwjsj"] [ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"] [ext_resource type="BoxMesh" uid="uid://b5cc3prem52r6" path="res://addons/enhanced_gridmap/meshlibrary/tile_freeze.tres" id="11_pgnbl"] [ext_resource type="BoxMesh" uid="uid://dcjdwbffgtutt" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="11_uwjsj"] @@ -177,3 +178,10 @@ 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 +item/16/name = "wall" +item/16/mesh = ExtResource("9_uwjsj") +item/16/mesh_transform = Transform3D(2, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0.5) +item/16/mesh_cast_shadow = 1 +item/16/shapes = [] +item/16/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) +item/16/navigation_layers = 1 diff --git a/assets/models/meshes/ancient_lightning_stones.res b/assets/models/meshes/ancient_lightning_stones.res index a9a9a09a1fe78c228c0a38c132e27b60f380684e..8bf911ff943f2db894ba60cd67c0011bf67d11a5 100644 GIT binary patch delta 140 zcmV;70CWHL1@;9XQd2`i0ssI201yBG6$bzS-U0vsD77#BU=;?X76A6%u^>wUT_Gb9 zMlOzDKt_kL#TQ>}F@Q~%uDIgT6q6P`dbH??Lw^Ph`m@BI&de#(m^q!jup}hgAqe@&U8R0WJY6QZ!Eh delta 140 zcmeyy`i)f~DA?JVi2(=%7#PIZ85r&XIT~B_|0amBEfr&6yT4Jvn=!V%$3tSLMIEE0 z>@l(UnvF*p%wl&v>hccuiTd*5;v#jvzmg^|&I?sr887!qe%3Onvh$=#TvC9MuGWI7 sVpDtj1Qi!d6;za#{ohh~u;*H}r=(_L2UoBYi)@%8&q?;pCm8h@0i}R3Gynhq diff --git a/assets/models/meshes/block.res b/assets/models/meshes/block.res index 25ec46201a3c3b07b0498b446673b7ab96429517..353d5a59fe458a9b0aad290f2c236fe2e4639ba7 100644 GIT binary patch literal 5587 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 RA!e!;Aa5RIcjBL}{|{Cg_EP`= diff --git a/scenes/main.tscn b/scenes/main.tscn index 96ff0ae..ae6b54a 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -9906,7 +9906,7 @@ alignment = 1 [node name="Title" type="Label" parent="PauseMenu/Panel/VBox" unique_id=1740539610] layout_mode = 2 theme_override_font_sizes/font_size = 24 -text = "PAUSED" +text = "Menu" horizontal_alignment = 1 [node name="Spacer" type="Control" parent="PauseMenu/Panel/VBox" unique_id=57341975] diff --git a/scripts/managers/goals_cycle_manager.gd b/scripts/managers/goals_cycle_manager.gd index d6baaa6..3ee1aa3 100644 --- a/scripts/managers/goals_cycle_manager.gd +++ b/scripts/managers/goals_cycle_manager.gd @@ -417,6 +417,10 @@ func _randomize_tiles_around_player(player: Node): # Check if there are tiles nearby or if empty var current_item = enhanced_gridmap.get_cell_item(cell) + # IMMUTABLE CHECK: Do not randomize/delete walls or special items on Floor 1 + if current_item in enhanced_gridmap.immutable_items: + continue + # Decide: delete, spawn, or randomize var action = rng.randi() % 3 diff --git a/scripts/managers/player_movement_manager.gd b/scripts/managers/player_movement_manager.gd index 60f61fa..f5be9d6 100644 --- a/scripts/managers/player_movement_manager.gd +++ b/scripts/managers/player_movement_manager.gd @@ -84,13 +84,20 @@ func simple_move_to(grid_position: Vector2i) -> bool: print("[Move] Failed: Cannot move to finish yet") return false - var cell_item = enhanced_gridmap.get_cell_item(Vector3i(grid_position.x, 0, grid_position.y)) + var cell_floor = enhanced_gridmap.get_cell_item(Vector3i(grid_position.x, 0, grid_position.y)) + var cell_item = enhanced_gridmap.get_cell_item(Vector3i(grid_position.x, 1, grid_position.y)) - # Allow passing through Walls (Item 4) if Invisible - var is_wall_passable = player.get("is_invisible") and cell_item == 4 + # Allow passing through Walls (Item 4 or 16) if Invisible + var is_wall_passable = player.get("is_invisible") and (cell_floor == 4 or cell_item == 16 or cell_item == 4) - if (cell_item == -1 or cell_item in enhanced_gridmap.non_walkable_items) and not is_wall_passable: - print("[Move] Failed: Cell Item %d is non-walkable" % cell_item) + # Check Floor 0 (Basic Walkability/Void) + if (cell_floor == -1 or cell_floor in enhanced_gridmap.non_walkable_items) and not is_wall_passable: + print("[Move] Failed: Floor Item %d is non-walkable" % cell_floor) + return false + + # Check Floor 1 (Obstacles/Walls) + if (cell_item != -1 and cell_item in [4, 13, 16]) and not is_wall_passable: + print("[Move] Failed: Blocked by Item %d on Floor 1" % cell_item) return false # PHYSICS CHECK: Ensure no static obstacles (like Stands) are blocking the path diff --git a/scripts/managers/special_tiles_manager.gd b/scripts/managers/special_tiles_manager.gd index 5442f71..11dfd5c 100644 --- a/scripts/managers/special_tiles_manager.gd +++ b/scripts/managers/special_tiles_manager.gd @@ -391,7 +391,7 @@ func _execute_block_floor(target_pos: Vector2i = Vector2i.ZERO): if "immutable_items" in enhanced_gridmap: if original_item in enhanced_gridmap.immutable_items: is_immutable = true - if original_item in [1, 2, 3, 4] or is_immutable: continue + if original_item in [1, 2, 3, 4, 16] or is_immutable: continue batch_data.append({"x": block_pos.x, "y": 0, "z": block_pos.z, "item": 4}) @@ -441,7 +441,7 @@ func spawn_powerups_around(center: Vector2i, force_powerups: bool = true, only_c # PROTECTED FLOOR CHECK: Don't spawn on existing walls or void var f0 = enhanced_gridmap.get_cell_item(Vector3i(pos.x, 0, pos.y)) var f1 = enhanced_gridmap.get_cell_item(Vector3i(pos.x, 1, pos.y)) - if f0 in [4, -1] or f1 == 4 or f1 == 13: + if f0 in [4, -1] or f1 in [4, 13, 16]: continue var item_id: int diff --git a/scripts/managers/stop_n_go_manager.gd b/scripts/managers/stop_n_go_manager.gd index 1f1e71f..49eefda 100644 --- a/scripts/managers/stop_n_go_manager.gd +++ b/scripts/managers/stop_n_go_manager.gd @@ -470,10 +470,11 @@ func _spawn_safe_zone(): gridmap = get_node_or_null("/root/Main/EnhancedGridMap") if not gridmap: return - # Collect valid center positions (not too close to edges so the zone fits) + # Collect valid center positions (account for wall footprint: radius + 1) + var spawn_buffer = SAFE_ZONE_RADIUS + 1 var valid_positions: Array[Vector2i] = [] - for x in range(SAFE_ZONE_RADIUS, gridmap.columns - SAFE_ZONE_RADIUS): - for z in range(SAFE_ZONE_RADIUS, gridmap.rows - SAFE_ZONE_RADIUS): + for x in range(spawn_buffer, gridmap.columns - spawn_buffer): + for z in range(spawn_buffer, gridmap.rows - spawn_buffer): var tile = gridmap.get_cell_item(Vector3i(x, 0, z)) # Only walkable tiles (not start/finish) if tile == TILE_WALKABLE: @@ -648,16 +649,59 @@ func sync_safe_zone(centers: Array, radius: int): if not gridmap: return # Paint safe zones on Floor 0 (Floor layer) - # This ensures items and walls on Floor 1 are visible ON TOP of the safe zone + # Also paint walls (ID 16) around the zone with 1 door on each side for center in safe_zone_centers: + # 1. Paint the safe floor for dx in range(-radius, radius + 1): for dz in range(-radius, radius + 1): var x = center.x + dx var z = center.y + dz if x >= 0 and x < gridmap.columns and z >= 0 and z < gridmap.rows: - # ONLY replace standard walkable floor (don't overwrite Start/Finish/Walls on Layer 0) if gridmap.get_cell_item(Vector3i(x, 0, z)) == TILE_WALKABLE: gridmap.set_cell_item(Vector3i(x, 0, z), TILE_SAFE) + + # 2. Paint the walls (item ID 16) ON LAYER 1 to block movement + # We scan from -3 to +3 to handle symmetric wall indices around the 5x5 zone + for dx in range(-radius - 1, radius + 2): + for dz in range(-radius - 1, radius + 2): + var x = center.x + dx + var z = center.y + dz + + if x >= 0 and x < gridmap.columns and z >= 0 and z < gridmap.rows: + # big room logic: 5x5 span (Indices -2 to 2) + # North/West use -radius/-radius-1, South/East use radius/radius+1 + var is_north = dz == -radius - 1 and dx >= -radius and dx <= radius + var is_south = dz == radius and dx >= -radius and dx <= radius + var is_west = dx == -radius and dz >= -radius and dz <= radius + var is_east = dx == radius + 1 and dz >= -radius and dz <= radius + + var orientation = 0 + var is_wall = false + + if is_north: + orientation = 0 + is_wall = true + elif is_south: + orientation = 0 + is_wall = true + elif is_west: + orientation = 22 + is_wall = true + elif is_east: + orientation = 22 + is_wall = true + + if is_wall: + # Door logic: Skip center (0) on the respective border line + var is_door = (is_north and dx == 0) or (is_south and dx == 0) or \ + (is_west and dz == 0) or (is_east and dz == 0) + if is_door: + continue + + gridmap.set_cell_item(Vector3i(x, 1, z), 16, orientation) + + # Update pathfinding for bots and movement checks + gridmap.initialize_astar() # Notify local player var my_id = multiplayer.get_unique_id() @@ -683,8 +727,27 @@ func sync_clear_safe_zone(centers_to_clear: Array): var z = center.y + dz if x >= 0 and x < gridmap.columns and z >= 0 and z < gridmap.rows: # Restore Floor 0 back to standard walkable floor - if gridmap.get_cell_item(Vector3i(x, 0, z)) == TILE_SAFE: + var current = gridmap.get_cell_item(Vector3i(x, 0, z)) + if current == TILE_SAFE: gridmap.set_cell_item(Vector3i(x, 0, z), TILE_WALKABLE) + + # Also clean up walls ON LAYER 1 + # Scan -3 to +3 range to ensure all shifted walls are cleared + for dx in range(-SAFE_ZONE_RADIUS - 1, SAFE_ZONE_RADIUS + 2): + for dz in range(-SAFE_ZONE_RADIUS - 1, SAFE_ZONE_RADIUS + 2): + var x = center.x + dx + var z = center.y + dz + if x >= 0 and x < gridmap.columns and z >= 0 and z < gridmap.rows: + # Clear any wall items on Floor 1 + if gridmap.get_cell_item(Vector3i(x, 1, z)) != -1: + gridmap.set_cell_item(Vector3i(x, 1, z), -1) + + # Clear local state + safe_zone_centers = [] + safe_zone_spawned = false + + # Restore navigation + gridmap.initialize_astar() print("[StopNGo] Safe Zones cleared.") # Ensure local state is also updated in case this was just an RPC call