From 4b7a64a1198825300c95b1c4006464042d0177e4 Mon Sep 17 00:00:00 2001 From: Yogi Wiguna Date: Wed, 11 Mar 2026 09:56:10 +0800 Subject: [PATCH] feat: Implement core player movement with advanced pushing mechanics, define game modes, and introduce various new managers and UI components. --- .../enhanced_gridmap/meshlibrary/default.tres | 19 ++---------------- .../meshlibrary/mat_normal.tres | 5 +++-- .../meshlibrary/tile_normal.tres | 6 ++++-- .../meshes/ancient_lightning_stones.res | Bin 758 -> 758 bytes assets/models/meshes/freeze_floor.res | Bin 2822 -> 2822 bytes assets/models/tiles/tile_coin.tres | 16 --------------- assets/models/tiles/tile_star.tres | 16 --------------- project.godot | 2 +- scenes/player.gd | 4 ++-- scripts/bot_controller.gd | 2 ++ scripts/bot_strategic_planner.gd | 2 ++ scripts/game_mode.gd | 3 ++- scripts/managers/auth_manager.gd | 16 +++++++-------- scripts/managers/camera_context_manager.gd | 2 ++ scripts/managers/lobby_manager.gd | 2 ++ scripts/managers/notification_manager.gd | 2 +- scripts/managers/player_input_manager.gd | 6 ++++++ scripts/managers/player_movement_manager.gd | 2 ++ scripts/managers/playerboard_manager.gd | 2 ++ scripts/managers/special_tiles_manager.gd | 2 ++ scripts/managers/user_profile_manager.gd | 4 ++-- scripts/models/scarcity_model.gd | 4 +++- scripts/ui/boot_screen.gd | 10 ++++----- scripts/ui/powerup_inventory_ui.gd | 8 ++++++++ scripts/ui/settings_menu.gd | 6 ++++-- 25 files changed, 65 insertions(+), 76 deletions(-) diff --git a/addons/enhanced_gridmap/meshlibrary/default.tres b/addons/enhanced_gridmap/meshlibrary/default.tres index 64211ef..99b12d0 100644 --- a/addons/enhanced_gridmap/meshlibrary/default.tres +++ b/addons/enhanced_gridmap/meshlibrary/default.tres @@ -13,6 +13,7 @@ [ext_resource type="BoxMesh" uid="uid://dy5p77cjb3geo" path="res://addons/enhanced_gridmap/meshlibrary/tile_start.tres" id="9_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"] +[ext_resource type="BoxMesh" uid="uid://dcjdwbffgtutt" path="res://addons/enhanced_gridmap/meshlibrary/tile_non_walkable.tres" id="11_uwjsj"] [sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5d0gc"] load_path = "res://.godot/imported/tile_heart.png-deeef50755ca225f028608dfd16900e6.s3tc.ctex" @@ -21,23 +22,8 @@ load_path = "res://.godot/imported/tile_heart.png-deeef50755ca225f028608dfd16900 resource_name = "boost" transparency = 1 cull_mode = 2 -albedo_color = Color(0.91, 0.91, 0.91, 0.45098) albedo_texture = SubResource("CompressedTexture2D_5d0gc") -[sub_resource type="ArrayMesh" id="ArrayMesh_r2l4m"] -_surfaces = [{ -"aabb": AABB(-0.282176, -0.000324821, -0.282176, 0.564351, 0.050792, 0.564351), -"format": 34896613377, -"index_count": 36, -"index_data": PackedByteArray("BwAEAAUABwAGAAQABQACAAMABQAEAAIAAAAEAAYAAAACAAQABQABAAcABQADAAEAAgABAAMAAgAAAAEAAQAGAAcAAQAAAAYA"), -"name": "boost", -"primitive": 3, -"uv_scale": Vector4(0, 0, 0, 0), -"vertex_count": 8, -"vertex_data": PackedByteArray("AAD/////AAAAAP7/AAAAAP///////wAA///+/wAAAAD//wAA//8AAP//AAAAAAAAAAAAAP//AAAAAAAAAAAAAA==") -}] -blend_shape_mode = 0 - [sub_resource type="ArrayMesh" id="ArrayMesh_pgnbl"] resource_name = "tile_heart" _surfaces = [{ @@ -54,13 +40,11 @@ _surfaces = [{ "vertex_data": PackedByteArray("AAD//////78AAP//////vwAA/////6oqAAD+/wAAAAAAAP7/AAD/vwAA/v8AAKoq/////////7//////////v//////////////+/wAAAAD///7/AAD/v////v8AAP////8AAP///7///wAA////P///AAD///////8AAAAAAAD//wAAAAD/P///AAAAAP//AAAAAP///78AAAAA////PwAAAAD//6oqAAAAAAAAAAAAAAAAAAD/PwAAAAAAAKoq/////////39U1VTV/7//v////39U1VTV/////////3//v/9//7//v////3//v/9//////wAA/3//v/9//7//vwAA/3//v/9//////wAA/39U1VTV/7//vwAA/39U1VTV") }] blend_shape_mode = 0 -shadow_mesh = SubResource("ArrayMesh_r2l4m") [sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2vf4e"] resource_name = "boost" transparency = 1 cull_mode = 2 -albedo_color = Color(0.91, 0.91, 0.91, 0.45098) albedo_texture = ExtResource("10_sx8rm") [sub_resource type="ArrayMesh" id="ArrayMesh_r32il"] @@ -110,6 +94,7 @@ 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("11_uwjsj") 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 = [] diff --git a/addons/enhanced_gridmap/meshlibrary/mat_normal.tres b/addons/enhanced_gridmap/meshlibrary/mat_normal.tres index 8b4856a..55166d6 100644 --- a/addons/enhanced_gridmap/meshlibrary/mat_normal.tres +++ b/addons/enhanced_gridmap/meshlibrary/mat_normal.tres @@ -1,4 +1,5 @@ -[gd_resource type="StandardMaterial3D" load_steps=0 format=3 uid="uid://dqhmv78u8iy1d"] +[gd_resource type="StandardMaterial3D" format=3 uid="uid://dqhmv78u8iy1d"] [resource] -albedo_color = Color(0.310617, 0.310617, 0.310617, 1) +transparency = 1 +albedo_color = Color(0.30980393, 0.30980393, 0.30980393, 0) diff --git a/addons/enhanced_gridmap/meshlibrary/tile_normal.tres b/addons/enhanced_gridmap/meshlibrary/tile_normal.tres index fc5fac2..7d8028b 100644 --- a/addons/enhanced_gridmap/meshlibrary/tile_normal.tres +++ b/addons/enhanced_gridmap/meshlibrary/tile_normal.tres @@ -1,7 +1,9 @@ [gd_resource type="BoxMesh" format=3 uid="uid://bb3b32qso3yab"] -[ext_resource type="Material" uid="uid://dqhmv78u8iy1d" path="res://addons/enhanced_gridmap/meshlibrary/mat_normal.tres" id="1_4kxai"] +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_n7oje"] +transparency = 1 +albedo_color = Color(0.30980393, 0.30980393, 0.30980393, 0) [resource] -material = ExtResource("1_4kxai") +material = SubResource("StandardMaterial3D_n7oje") size = Vector3(1, 0.1, 1) diff --git a/assets/models/meshes/ancient_lightning_stones.res b/assets/models/meshes/ancient_lightning_stones.res index 8bf911ff943f2db894ba60cd67c0011bf67d11a5..a9a9a09a1fe78c228c0a38c132e27b60f380684e 100644 GIT binary patch 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 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 diff --git a/assets/models/meshes/freeze_floor.res b/assets/models/meshes/freeze_floor.res index a343f0441c7b017655eb10b57f204110e8757f0c..eee16196335d01f585c852c76b4eda474f07b55f 100644 GIT binary patch delta 207 zcmV;=05JcC7KRoLQd2`i0ssI201yBG@39S~1_tj2T_OOsv$zI*0)I!qkO700^aVYi z*@YIc&q60BaC^|n+XoEv@S6ub+~)xI%^j0(Kf+QXq&#aZH}EV zOH#5;swi2rq_GoivnNTFw%Gs*fk??B)08X(q6W~miA-yo(xMVnN*2cxCEH<5$(Ep! J2D94G> zcA*9Av(U*2+#YoD_5lMu{N@1<_c_2lv-{lh&O8Gc`OX0T8949bKlA>LbMgOOG_Eso z<2m2tJp4EFZ<%AJIk@kbgA4D?8@O;@3$Gm_M7uFC6qKy5RkB@Lv`sJ++NQ5 void: # ============================================================================= @rpc("any_peer", "call_local", "reliable") -func trigger_screen_shake(shake_type: String) -> void: +func trigger_screen_shake(_shake_type: String) -> void: # Shake disabled by user request. Camera movement now handled by CameraContextManager. pass diff --git a/scripts/bot_controller.gd b/scripts/bot_controller.gd index a5015aa..adec48c 100644 --- a/scripts/bot_controller.gd +++ b/scripts/bot_controller.gd @@ -1,6 +1,8 @@ extends Node class_name BotController + + # BotController - Standalone modular bot AI system (no Beehave dependency) # Handles all bot decision-making: movement, grabbing, putting, arranging, and sabotage diff --git a/scripts/bot_strategic_planner.gd b/scripts/bot_strategic_planner.gd index c5c556b..8db7933 100644 --- a/scripts/bot_strategic_planner.gd +++ b/scripts/bot_strategic_planner.gd @@ -1,6 +1,8 @@ extends RefCounted class_name BotStrategicPlanner + + # BotStrategicPlanner - Strategic decision-making for bot AI # Evaluates tile needs, pathfinding targets, and sabotage opportunities diff --git a/scripts/game_mode.gd b/scripts/game_mode.gd index 15db93e..e395c4a 100644 --- a/scripts/game_mode.gd +++ b/scripts/game_mode.gd @@ -1,4 +1,5 @@ -class_name GameMode extends RefCounted +extends RefCounted +class_name GameMode enum Mode { FREEMODE = 0, diff --git a/scripts/managers/auth_manager.gd b/scripts/managers/auth_manager.gd index afe1c09..7774ba1 100644 --- a/scripts/managers/auth_manager.gd +++ b/scripts/managers/auth_manager.gd @@ -143,10 +143,10 @@ func _get_device_id() -> String: # Try to load saved device ID for consistent guest identity var id_file := "user://device_id.txt" if FileAccess.file_exists(id_file): - var file := FileAccess.open(id_file, FileAccess.READ) - if file: - var saved_id := file.get_as_text().strip_edges() - file.close() + var file_read := FileAccess.open(id_file, FileAccess.READ) + if file_read: + var saved_id := file_read.get_as_text().strip_edges() + file_read.close() if not saved_id.is_empty(): return saved_id @@ -156,10 +156,10 @@ func _get_device_id() -> String: device_id = str(randi()) + str(Time.get_ticks_msec()) # Save for future use - var file := FileAccess.open(id_file, FileAccess.WRITE) - if file: - file.store_string(device_id) - file.close() + var file_write := FileAccess.open(id_file, FileAccess.WRITE) + if file_write: + file_write.store_string(device_id) + file_write.close() return device_id diff --git a/scripts/managers/camera_context_manager.gd b/scripts/managers/camera_context_manager.gd index 9157870..d07f83d 100644 --- a/scripts/managers/camera_context_manager.gd +++ b/scripts/managers/camera_context_manager.gd @@ -1,5 +1,7 @@ extends Node + + # CameraContextManager - Smoothly follows player and clamps to arena edges var camera: Camera3D diff --git a/scripts/managers/lobby_manager.gd b/scripts/managers/lobby_manager.gd index 22f4614..08a9d74 100644 --- a/scripts/managers/lobby_manager.gd +++ b/scripts/managers/lobby_manager.gd @@ -1,5 +1,7 @@ extends Node + + # LobbyManager - Manages room/lobby state across scenes # Signals diff --git a/scripts/managers/notification_manager.gd b/scripts/managers/notification_manager.gd index 7a15371..9d7317a 100644 --- a/scripts/managers/notification_manager.gd +++ b/scripts/managers/notification_manager.gd @@ -38,7 +38,7 @@ const MESSAGES = { "USED_SPECIAL_POWER": "Used a special power!" } -static func send_message(target: Node, message: String, type: int = MessageType.NORMAL): +static func send_message(target: Node, message: String, _type: int = MessageType.NORMAL): if is_instance_valid(target) and target.has_method("rpc"): # Check if the text is empty, do nothing if message.is_empty(): diff --git a/scripts/managers/player_input_manager.gd b/scripts/managers/player_input_manager.gd index 37594d3..2e414f1 100644 --- a/scripts/managers/player_input_manager.gd +++ b/scripts/managers/player_input_manager.gd @@ -1,5 +1,7 @@ extends Node + + var player: Node3D var movement_manager: Node var race_manager: Node @@ -98,6 +100,10 @@ func handle_unhandled_input(event): var mode = LobbyManager.get_game_mode() var is_sng = mode == GameMode.Mode.STOP_N_GO + # Safety check for SettingsManager + if not SettingsManager: + return + # Get dynamic keybinds var key_p1 = SettingsManager.get_control_keycode("powerup_1") var key_p2 = SettingsManager.get_control_keycode("powerup_2") diff --git a/scripts/managers/player_movement_manager.gd b/scripts/managers/player_movement_manager.gd index 3bedf17..60f61fa 100644 --- a/scripts/managers/player_movement_manager.gd +++ b/scripts/managers/player_movement_manager.gd @@ -1,5 +1,7 @@ extends Node + + var player: Node3D var enhanced_gridmap: Node diff --git a/scripts/managers/playerboard_manager.gd b/scripts/managers/playerboard_manager.gd index 179d870..736804c 100644 --- a/scripts/managers/playerboard_manager.gd +++ b/scripts/managers/playerboard_manager.gd @@ -1,5 +1,7 @@ extends Node + + # PlayerboardManager - Handles all playerboard operations including grab, put, arrange var player: Node3D diff --git a/scripts/managers/special_tiles_manager.gd b/scripts/managers/special_tiles_manager.gd index 4e41af8..5442f71 100644 --- a/scripts/managers/special_tiles_manager.gd +++ b/scripts/managers/special_tiles_manager.gd @@ -1,5 +1,7 @@ extends Node + + # SpecialTilesManager - Handles special effects triggered by holo tile pickups # Holo tile indices (11-14) trigger special effects diff --git a/scripts/managers/user_profile_manager.gd b/scripts/managers/user_profile_manager.gd index c2b9808..fc8982b 100644 --- a/scripts/managers/user_profile_manager.gd +++ b/scripts/managers/user_profile_manager.gd @@ -31,8 +31,8 @@ func _ready() -> void: auth.auth_completed.connect(_on_auth_completed) auth.logged_out.connect(_on_logged_out) -func _on_auth_completed(_success: bool, user_data: Dictionary) -> void: - if _success: +func _on_auth_completed(success: bool, _user_data: Dictionary) -> void: + if success: await load_profile() func _on_logged_out() -> void: diff --git a/scripts/models/scarcity_model.gd b/scripts/models/scarcity_model.gd index 485a5c1..6d43561 100644 --- a/scripts/models/scarcity_model.gd +++ b/scripts/models/scarcity_model.gd @@ -1,5 +1,7 @@ -class_name ScarcityModel extends RefCounted +class_name ScarcityModel + + # ScarcityModel - Data definitions for tile scarcity diff --git a/scripts/ui/boot_screen.gd b/scripts/ui/boot_screen.gd index 27eecce..7df0718 100644 --- a/scripts/ui/boot_screen.gd +++ b/scripts/ui/boot_screen.gd @@ -162,11 +162,11 @@ func _load_existing_patches() -> void: var patches: Array[String] = [] dir.list_dir_begin() - var file := dir.get_next() - while file != "": - if file.ends_with(".pck"): - patches.append(file) - file = dir.get_next() + var patch_file := dir.get_next() + while patch_file != "": + if patch_file.ends_with(".pck"): + patches.append(patch_file) + patch_file = dir.get_next() dir.list_dir_end() # Sort patches by version (filename includes version) diff --git a/scripts/ui/powerup_inventory_ui.gd b/scripts/ui/powerup_inventory_ui.gd index 7e26558..e53c348 100644 --- a/scripts/ui/powerup_inventory_ui.gd +++ b/scripts/ui/powerup_inventory_ui.gd @@ -1,5 +1,7 @@ extends Control + + # PowerUpInventoryUI - Displays stored powerups and handles selection # UI References @@ -146,6 +148,12 @@ func _update_btn_shortcut(effect_id: int, btn: Button): var is_sng = mode == GameMode.Mode.STOP_N_GO var key_text = "" + + # Safety check for SettingsManager (Autoload) + if not SettingsManager: + sc_lbl.text = "" + return + if is_sng: match effect_id: 0: key_text = SettingsManager.get_control_text("powerup_1") diff --git a/scripts/ui/settings_menu.gd b/scripts/ui/settings_menu.gd index 8e4218b..1562e0e 100644 --- a/scripts/ui/settings_menu.gd +++ b/scripts/ui/settings_menu.gd @@ -26,7 +26,9 @@ var listening_action: String = "" # Set when waiting for a keypress func _ready(): # Theme inheritance is broken by CanvasLayer root, no need for theme = null _load_ui_values() - _connect_signals() + + if SettingsManager: + _connect_signals() # Initial visibility visible = false @@ -165,7 +167,7 @@ func _update_all_key_labels(): func _update_key_label(action_name: String): var btn = get_node_or_null("%" + action_name.to_pascal_case() + "Btn") - if btn: + if btn and SettingsManager: btn.text = SettingsManager.get_control_text(action_name) btn.modulate = Color.WHITE