update BG, tile

This commit is contained in:
2026-03-10 23:13:24 +08:00
parent d53e4601e4
commit 884ce60cf1
19 changed files with 273 additions and 18 deletions
@@ -8,9 +8,9 @@
[ext_resource type="ArrayMesh" uid="uid://bqvqj3fhf5x51" path="res://assets/models/tiles/tile_ghost.tres" id="6_r32il"]
[ext_resource type="ArrayMesh" uid="uid://cv4bedhida00g" path="res://assets/models/tiles/tile_star.tres" id="7_p5epg"]
[ext_resource type="ArrayMesh" uid="uid://gpnl4cjrivor" path="res://assets/models/tiles/tile_speed.tres" id="7_sx8rm"]
[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="BoxMesh" uid="uid://dcjdwbffgtutt" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="10_pgnbl"]
[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"]
@@ -110,7 +110,6 @@ 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("10_pgnbl")
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 = []
@@ -186,3 +185,10 @@ 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 = "Ancient Lightning Stones"
item/15/mesh = ExtResource("8_cg50n")
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
Binary file not shown.

After

Width:  |  Height:  |  Size: 859 KiB

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://u6igejwdutv1"
path.s3tc="res://.godot/imported/level_bg_colloseum.jpg-ea8a2c73325905e650d57c2e50e0d1bc.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/graphics/level_bg/level_bg_colloseum.jpg"
dest_files=["res://.godot/imported/level_bg_colloseum.jpg-ea8a2c73325905e650d57c2e50e0d1bc.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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
Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

@@ -0,0 +1,41 @@
[remap]
importer="texture"
type="CompressedTexture2D"
uid="uid://cunm3fe2utrsy"
path.s3tc="res://.godot/imported/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg-69394e445366683380463d4afc846305.s3tc.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
}
[deps]
source_file="res://assets/models/Textures/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg"
dest_files=["res://.godot/imported/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg-69394e445366683380463d4afc846305.s3tc.ctex"]
[params]
compress/mode=2
compress/high_quality=false
compress/lossy_quality=0.7
compress/uastc_level=0
compress/rdo_quality_loss=0.0
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/channel_remap/red=0
process/channel_remap/green=1
process/channel_remap/blue=2
process/channel_remap/alpha=3
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
@@ -0,0 +1,7 @@
[gd_resource type="StandardMaterial3D" format=3 uid="uid://deufkavgeo0jg"]
[sub_resource type="CompressedTexture2D" id="CompressedTexture2D_ywepx"]
load_path = "res://.godot/imported/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg-69394e445366683380463d4afc846305.s3tc.ctex"
[resource]
albedo_texture = SubResource("CompressedTexture2D_ywepx")
@@ -0,0 +1,12 @@
# Blender 5.0.1 MTL File: 'quit.blend'
# www.blender.org
newmtl Material.001
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
map_Kd C:/Users/beng/Downloads/3d_Ripper_Pro_v103/Downloads/SarahMyriamMadi/01- Handpainted.Log/4e3103ab214e443c83147afcd786aa6e_RGB_M_Buche_albedo.jpeg
@@ -0,0 +1,34 @@
# Blender 5.0.1
# www.blender.org
mtllib ancient_lightning_stone.mtl
o Cube
v -0.500000 0.001070 0.500000
v -0.500000 0.201070 0.500000
v -0.500000 0.001070 -0.500000
v -0.500000 0.201070 -0.500000
v 0.500000 0.001070 0.500000
v 0.500000 0.201070 0.500000
v 0.500000 0.001070 -0.500000
v 0.500000 0.201070 -0.500000
vn -1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 -1.0000
vn 1.0000 -0.0000 -0.0000
vn -0.0000 -0.0000 1.0000
vn -0.0000 -1.0000 -0.0000
vn -0.0000 1.0000 -0.0000
vt 0.041259 0.022396
vt 0.145314 0.022396
vt 0.145314 0.286889
vt 0.041259 0.286889
vt 0.383323 0.184104
vt 0.249490 0.184104
vt 0.249490 0.050271
vt 0.383323 0.050271
s 0
usemtl Material.001
f 1/1/1 2/2/1 4/3/1 3/4/1
f 3/1/2 4/2/2 8/3/2 7/4/2
f 7/1/3 8/2/3 6/3/3 5/4/3
f 5/1/4 6/2/4 2/3/4 1/4/4
f 3/5/5 7/6/5 5/7/5 1/8/5
f 8/5/6 4/6/6 2/7/6 6/8/6
@@ -0,0 +1,25 @@
[remap]
importer="wavefront_obj"
importer_version=1
type="Mesh"
uid="uid://c5dhg8hrvx8au"
path="res://.godot/imported/ancient_lightning_stone.obj-128ba3478bbc9a63b53917a60bbaf172.mesh"
[deps]
files=["res://.godot/imported/ancient_lightning_stone.obj-128ba3478bbc9a63b53917a60bbaf172.mesh"]
source_file="res://assets/models/meshes/ancient_lightning_stone.obj"
dest_files=["res://.godot/imported/ancient_lightning_stone.obj-128ba3478bbc9a63b53917a60bbaf172.mesh", "res://.godot/imported/ancient_lightning_stone.obj-128ba3478bbc9a63b53917a60bbaf172.mesh"]
[params]
generate_tangents=true
generate_lods=true
generate_shadow_mesh=true
generate_lightmap_uv2=false
generate_lightmap_uv2_texel_size=0.2
scale_mesh=Vector3(1, 1, 1)
offset_mesh=Vector3(0, 0, 0)
force_disable_mesh_compression=false
Binary file not shown.
@@ -0,0 +1,34 @@
[gd_resource type="ArrayMesh" format=4 uid="uid://dwif2e63pfrp3"]
[ext_resource type="Material" uid="uid://deufkavgeo0jg" path="res://assets/models/ancient-lightning-stones.tres" id="1_6ovj8"]
[sub_resource type="ArrayMesh" id="ArrayMesh_hoqx8"]
_surfaces = [{
"aabb": AABB(-0.5, 0.00107, -0.5, 1, 0.2, 1),
"format": 34896613377,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAgABAAMAAAAEAAEABAADAAEAAgAFAAAAAgADAAUABgAEAAAAAAAFAAYABwADAAQABQADAAcABgAHAAQABQAHAAYA"),
"name": "Material",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 8,
"vertex_data": PackedByteArray("AAD/////AAAAAAAA//8AAAAA//8AAAAAAAAAAAAAAAD//wAA//8AAP////8AAAAA////////AAD//wAAAAAAAA==")
}]
blend_shape_mode = 0
[resource]
_surfaces = [{
"aabb": AABB(-0.5, 0.00107, -0.5, 1, 0.2, 1),
"attribute_data": PackedByteArray("MyVD+o8KQ/ozJY22jwqNtjMlQ/qPCkP6MyWNto8KjbYzJUP6jwpD+jMljbaPCo22MyVD+o8KQ/ozJY22jwqNtt4/3dAhYt3Q3j8g8yFiIPPeP93QIWLd0N4/IPMhYiDz"),
"format": 34896613399,
"index_count": 36,
"index_data": PackedByteArray("AAABAAIAAgABAAMABAAFAAYABgAFAAcACAAJAAoACgAJAAsADAANAA4ADgANAA8AEAARABIAEgARABMAFAAVABYAFgAVABcA"),
"material": ExtResource("1_6ovj8"),
"name": "Material",
"primitive": 3,
"uv_scale": Vector4(0, 0, 0, 0),
"vertex_count": 24,
"vertex_data": PackedByteArray("AAD/////VNUAAAAA//9U1QAA//8AAFTVAAAAAAAAVNUAAP//AAD//wAAAAAAAP///////wAA/////wAAAAD///////8AAFTV//8AAAAAVNX///////9U1f//AAD//1TV/////////7///wAA////vwAA//////+/AAAAAP///7///wAAAAD//wAAAAAAAP////8AAP////8AAAAA/////wAA//8AAP+//////wAA/78AAP//////v/////////+/VNVU1VTVVNVU1VTVVNVU1f+//7//v/+//7//v/+//7+qKqoqqiqqKqoqqiqqKqoq//////////////////////9//z//f/8//3//P/9//z////9/////f////3////9/")
}]
blend_shape_mode = 0
shadow_mesh = SubResource("ArrayMesh_hoqx8")
Binary file not shown.
+1 -5
View File
@@ -21,6 +21,7 @@ config/icon="res://icon.svg"
[autoload]
SettingsManager="*uid://c1ouaaqnn0lrc"
Nakama="*uid://bueyqhhvxe0tx"
NakamaManager="*res://scripts/nakama_manager.gd"
AuthManager="*res://scripts/managers/auth_manager.gd"
@@ -32,7 +33,6 @@ GoalManager="*res://scripts/managers/goal_manager.gd"
PlayerManager="*res://scripts/managers/player_manager.gd"
GoalsCycleManager="*res://scripts/managers/goals_cycle_manager.gd"
Satori="*uid://b8vev00s34b7"
SettingsManager="*uid://c1ouaaqnn0lrc"
[display]
@@ -69,28 +69,24 @@ move_north={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":87,"physical_keycode":0,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194320,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null)
]
}
move_south={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":83,"physical_keycode":0,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194322,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null)
]
}
move_west={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":65,"physical_keycode":0,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194319,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null)
]
}
move_east={
"deadzone": 0.5,
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":68,"physical_keycode":0,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null)
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":4194321,"physical_keycode":0,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null)
, Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null)
]
}
move_northeast={
+30 -1
View File
@@ -61,6 +61,9 @@ func _ready():
# Setup global multiplayer spawners (Stands, etc.)
_setup_multiplayer_spawners()
# Apply Arena Background
_apply_arena_background()
# HUD Settings connection is now handled internally by TouchControlsManager
# which calls _toggle_pause_menu() on this scene.
@@ -86,6 +89,31 @@ func _setup_multiplayer_spawners():
stand_spawner.add_spawnable_scene("res://scenes/static_tekton_stand.tscn")
add_child(stand_spawner)
func _apply_arena_background():
var arena_bg = get_node_or_null("ArenaBG")
if not arena_bg:
return
var selected_area = LobbyManager.get_selected_area()
var texture_path = ""
match selected_area:
"Colloseum":
texture_path = "res://assets/graphics/level_bg/level_bg_colloseum.jpg"
"Stop N Go Arena":
texture_path = "res://assets/graphics/level_bg/placeholder_stop_n_go.jpg"
"Tekton Doors Arena":
texture_path = "res://assets/graphics/level_bg/placeholder_tekton_doors.jpg"
"Classic", _:
texture_path = "res://assets/graphics/level_bg/placeholder_classic.jpg"
if ResourceLoader.exists(texture_path):
var tex = load(texture_path)
if tex:
arena_bg.texture = tex
else:
print("Arena bg texture not found: ", texture_path)
@rpc("any_peer", "call_local", "reliable")
func sync_portal_configs(configs: Array):
if portal_mode_manager:
@@ -2082,9 +2110,10 @@ func _on_back_to_menu_pressed():
"""Return to lobby/main menu and clean up game state."""
print("[Main] Returning to lobby...")
# Clean up game state
# Proper ordered cleanup to avoid ghost players
GameStateManager.end_game()
LobbyManager.reset()
# Properly disconnect from Nakama match
_cleanup_multiplayer()
+7 -1
View File
@@ -33,6 +33,7 @@
[ext_resource type="Texture2D" uid="uid://ckhdyxnho6sjp" path="res://assets/graphics/touch_control/spawn_tile.png" id="28_j8jky"]
[ext_resource type="Texture2D" uid="uid://b2vhatfmufn3d" path="res://assets/graphics/touch_control/ghost.png" id="33_5q0nq"]
[ext_resource type="Texture2D" uid="uid://biun2yvglxgij" path="res://assets/graphics/touch_control/grab_tekton.png" id="36_pibwh"]
[ext_resource type="Texture2D" uid="uid://u6igejwdutv1" path="res://assets/graphics/level_bg/level_bg_colloseum.jpg" id="37_fuf3a"]
[ext_resource type="Script" uid="uid://86ikh0wuqk7v" path="res://scripts/ui/powerup_inventory_ui.gd" id="powerup_ui_script"]
[ext_resource type="Script" uid="uid://b54tfa0n6kogi" path="res://scripts/managers/touch_controls.gd" id="touch_manager"]
[ext_resource type="Script" uid="uid://djiml4sh61dc1" path="res://scripts/ui/virtual_joystick.gd" id="virtual_joystick"]
@@ -101,7 +102,7 @@ auto_randomize = true
start_item = 2
end_item = 3
immutable_items = Array[int]([4])
metadata/_editor_floor_ = Vector3(0, 1, 0)
metadata/_editor_floor_ = Vector3(0, 0, 0)
[node name="Camera3D" type="Camera3D" parent="." unique_id=1200003163]
transform = Transform3D(1, 0, 0, 0, 0.422618, 0.906308, 0, -0.906308, 0.422618, 7, 22.925, 18.4489)
@@ -10212,6 +10213,11 @@ custom_minimum_size = Vector2(0, 40)
layout_mode = 2
text = "Back"
[node name="ArenaBG" type="Sprite3D" parent="." unique_id=2070634860]
transform = Transform3D(4, 0, 0, 0, 1.8291987, 3.557251, 0, -3.557251, 1.8291987, 6.109789, -30, -4)
texture = ExtResource("37_fuf3a")
region_rect = Rect2(0, 0, 1080, 0)
[connection signal="pressed" from="Menu/Host" to="." method="_on_host_pressed"]
[connection signal="pressed" from="Menu/Join" to="." method="_on_join_pressed"]
[connection signal="text_submitted" from="MessageInput" to="." method="_on_message_input_text_submitted"]
+2 -2
View File
@@ -358,8 +358,8 @@ func link_google(id_token: String) -> bool:
func logout() -> void:
print("[AuthManager] Logging out...")
if NakamaManager.socket:
NakamaManager.socket.close()
# FULL CLEANUP: close socket, leave bridge, clear multiplayer peer
NakamaManager.cleanup()
clear_session()
+1
View File
@@ -50,3 +50,4 @@ func reset():
bots.clear()
game_started_flag = false
local_player_character = null
emit_signal("game_state_changed")
+26 -4
View File
@@ -40,9 +40,9 @@ signal scarcity_mode_changed(mode: String)
# Character and area selection
var available_characters: Array[String] = ["Copper", "Dabro", "Gatot", "Pip", "Random"]
var available_areas: Array[String] = ["Desert", "Forest", "City", "Factory"]
var available_areas: Array[String] = []
var available_game_modes: Array[String] = ["Freemode", "Stop n Go", "Tekton Doors"]
var selected_area: String = "Desert" # Host-controlled
var selected_area: String = "Classic" # Host-controlled
var game_mode: String = "Freemode" # Host-controlled
var local_character_index: int = 0 # Local player's character index
@@ -59,11 +59,24 @@ signal game_mode_changed(mode: String)
var _all_ready: bool = false
func _ready():
_update_available_areas(game_mode)
# Connect to Nakama signals
NakamaManager.match_joined.connect(_on_match_joined)
multiplayer.peer_connected.connect(_on_peer_connected)
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
func _update_available_areas(mode: String) -> void:
match mode:
"Freemode":
available_areas = ["Classic", "Colloseum"]
"Stop n Go":
available_areas = ["Stop N Go Arena"]
"Tekton Doors":
available_areas = ["Tekton Doors Arena"]
_:
available_areas = ["Classic"]
# =============================================================================
# Room Creation / Joining
# =============================================================================
@@ -106,6 +119,9 @@ func leave_room() -> void:
# Disconnect from Nakama match
if NakamaManager.socket:
NakamaManager.socket.close()
# Important: Clean up game state as well to prevent ghost players
GameStateManager.reset()
emit_signal("room_left")
@@ -384,11 +400,16 @@ func set_game_mode(mode: String) -> void:
game_mode = mode
rpc("sync_game_mode", mode)
_update_available_areas(mode)
if selected_area not in available_areas:
set_area(available_areas[0])
@rpc("authority", "call_local", "reliable")
func sync_game_mode(mode: String) -> void:
"""Sync game mode selection from host to clients."""
game_mode = mode
_update_available_areas(mode)
emit_signal("game_mode_changed", mode)
func start_game() -> void:
@@ -540,7 +561,8 @@ func reset() -> void:
is_host = false
_all_ready = false
match_duration = 180 # Reset to default 3 minutes
selected_area = "Desert"
game_mode = "Freemode"
_update_available_areas(game_mode)
selected_area = available_areas[0]
local_character_index = 0 # Default to "Copper"
enable_cycle_timer = false
game_mode = "Freemode"
+4 -3
View File
@@ -46,6 +46,7 @@ const TILE_START = 3 # Start Line
const TILE_FINISH = 3 # Finish Line
const TILE_SAFE = 2 # Green Safe Zone
const TILE_OBSTACLE = 4 # Wall
const TILE_LIGHTNING_STONE = 15 # Ancient Rock with Lightning Symbol
var hud_layer: CanvasLayer
var mission_label: Label
@@ -709,8 +710,8 @@ func _spawn_powerup_tiles():
for i in range(PERMANENT_POWERUP_LOCATIONS.size()):
var pos = PERMANENT_POWERUP_LOCATIONS[i]
# Set Floor 0 beneath power-up to ID 1 (Hover pattern) - Static PADS
gridmap.set_cell_item(Vector3i(pos.x, 0, pos.y), 1)
# Set Floor 0 beneath power-up to ID 15 (Ancient Lightning Stone)
gridmap.set_cell_item(Vector3i(pos.x, 0, pos.y), TILE_LIGHTNING_STONE)
# Cycle through the available power-up types
var tile_id = POWERUP_TILES[i % POWERUP_TILES.size()]
@@ -720,7 +721,7 @@ func _spawn_powerup_tiles():
# Sync both floor and tile to all clients and host
if can_rpc():
main.rpc("sync_grid_item", pos.x, 0, pos.y, 1) # Sync floor change (Pad on)
main.rpc("sync_grid_item", pos.x, 0, pos.y, TILE_LIGHTNING_STONE) # Sync floor change (Stone on)
main.rpc("sync_grid_item", pos.x, 1, pos.y, tile_id) # Sync power-up
powerups_spawned = true