From da858c12aa96e2af16e09816a4a1e03c7090bb80 Mon Sep 17 00:00:00 2001 From: Yogi Wiguna Date: Thu, 12 Feb 2026 11:02:30 +0800 Subject: [PATCH] feat: Implement core player character logic, including state management, network synchronization, character selection, and manager initialization. --- .../enhanced_gridmap/meshlibrary/default.tres | 4 +- assets/models/meshes/crack.res | Bin 0 -> 7648 bytes assets/models/meshes/non-walkable.res | Bin 7628 -> 7620 bytes assets/models/non-walkable.tres | 3 +- scenes/player.gd | 101 ++++++++++++++-- scripts/managers/playerboard_manager.gd | 5 +- scripts/tekton.gd | 113 ++++++++++++++++-- 7 files changed, 206 insertions(+), 20 deletions(-) create mode 100644 assets/models/meshes/crack.res diff --git a/addons/enhanced_gridmap/meshlibrary/default.tres b/addons/enhanced_gridmap/meshlibrary/default.tres index 96ba67a..dfdd080 100644 --- a/addons/enhanced_gridmap/meshlibrary/default.tres +++ b/addons/enhanced_gridmap/meshlibrary/default.tres @@ -10,6 +10,7 @@ [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://dx41n2x8v30r1" path="res://assets/models/meshes/crack.res" id="10_r32il"] [ext_resource type="Texture2D" uid="uid://dpkx1a780pvwv" path="res://assets/textures/tile_diamond.png" id="10_sx8rm"] [sub_resource type="CompressedTexture2D" id="CompressedTexture2D_5d0gc"] @@ -120,7 +121,8 @@ item/5/mesh_cast_shadow = 1 item/5/shapes = [] item/5/navigation_mesh_transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) item/5/navigation_layers = 1 -item/6/name = "empty" +item/6/name = "crack" +item/6/mesh = ExtResource("10_r32il") 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 = [] diff --git a/assets/models/meshes/crack.res b/assets/models/meshes/crack.res new file mode 100644 index 0000000000000000000000000000000000000000..ac7728525667ccae9e203d6fd83b7e173183e9b6 GIT binary patch literal 7648 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 Ol7cv8So*3`Q$s_y4BKA- literal 0 HcmV?d00001 diff --git a/assets/models/meshes/non-walkable.res b/assets/models/meshes/non-walkable.res index df4573dc85b4f07ab5c6b0cf938b4a5585795e56..f95ccb8b599b974cf9f3cbd774c464ccde93bfe6 100644 GIT binary patch literal 7620 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 literal 7628 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 "around that floor" implies radius + var impact_center = target_pos + var stun_radius = 1.5 + + var players = get_tree().get_nodes_in_group("Players") + print("[Throw] Checking stun impact at %s. Found %d players." % [impact_center, players.size()]) + + for p in players: + if p == self: continue + + # Check distance + var dist = Vector2(p.current_position.x, p.current_position.y).distance_to(Vector2(impact_center.x, impact_center.y)) + print("[Throw] Player %s at %s. Dist: %.2f (Radius: %.1f)" % [p.name, p.current_position, dist, stun_radius]) + + if dist <= stun_radius: + if p.has_method("apply_stagger"): + print("[Throw] Applying stagger to %s" % p.name) + p.apply_stagger(3.0) + NotificationManager.send_message(self , "Stunned " + p.name + "!", NotificationManager.MessageType.WARNING) + + # 2. Tekton drops tiles (Spawn tiles around) AND shrinks + if tekton.has_method("on_thrown_landing"): + tekton.on_thrown_landing(self ) + else: + # Fallback + tekton.on_hit(self , 1.0) + + print("[Player %s] Tekton landed at %s" % [name, target_pos]) + ).set_delay(0.6) + + print("[Player %s] Threw Tekton to %s (Dist: %s)" % [name, target_pos, target_pos.distance_to(tekton.current_position)]) func knock_tekton(): if not is_multiplayer_authority() or is_frozen: diff --git a/scripts/managers/playerboard_manager.gd b/scripts/managers/playerboard_manager.gd index 21bea08..e1f02aa 100644 --- a/scripts/managers/playerboard_manager.gd +++ b/scripts/managers/playerboard_manager.gd @@ -34,6 +34,9 @@ func grab_item(grid_position: Vector2i) -> bool: if not enhanced_gridmap or not has_ap: return false + if player.get("is_frozen"): + return false + var cell = Vector3i(grid_position.x, 1, grid_position.y) var item = enhanced_gridmap.get_cell_item(cell) @@ -319,7 +322,7 @@ func auto_put_item() -> bool: # Check AP only if in turn-based mode var has_ap = player.action_points > 0 if TurnManager.turn_based_mode else true - if not enhanced_gridmap or not has_ap or player.is_bot or player.is_in_group("Bots"): + if not enhanced_gridmap or not has_ap or player.is_bot or player.is_in_group("Bots") or player.get("is_frozen"): return false # Step 1: Find empty adjacent (or current) grid cells diff --git a/scripts/tekton.gd b/scripts/tekton.gd index a7e2082..380f983 100644 --- a/scripts/tekton.gd +++ b/scripts/tekton.gd @@ -120,15 +120,114 @@ func _process(delta): global_position = carrier.global_position + Vector3(0, 1.5, 0) rotation = carrier.rotation -func _flash_damage(): +var mesh_cache: Array[MeshInstance3D] = [] +var original_scales: Array[Vector3] = [] + +func _ready(): + # Cache meshes and their initial scales + # We wait a frame to ensure all children are ready and transforms applied + await get_tree().process_frame var meshes = find_children("*", "MeshInstance3D", true) for mesh in meshes: - var original_modulate = mesh.transparency - # Quick flash hack or shader param? - # If standard material, maybe just modulate visibility or scale - var t = create_tween() - t.tween_property(mesh, "scale", Vector3(1.2, 1.2, 1.2), 0.1) - t.tween_property(mesh, "scale", Vector3(1.0, 1.0, 1.0), 0.1) + mesh_cache.append(mesh) + original_scales.append(mesh.scale) + +func _flash_damage(): + # If cache empty (e.g. called before ready), try to populate or just skip custom scaling + if mesh_cache.is_empty(): + return + + for i in range(mesh_cache.size()): + var mesh = mesh_cache[i] + if is_instance_valid(mesh): + var base_scale = original_scales[i] + var t = create_tween() + t.tween_property(mesh, "scale", base_scale * 1.2, 0.1) + t.tween_property(mesh, "scale", base_scale, 0.1) + +@rpc("any_peer", "call_local", "reliable") +func on_thrown_landing(attacker: Node = null): + """Called when Tekton lands after being thrown.""" + print("[Tekton] Landed! Shrinking and waiting...") + + # Disable movement/interaction logic temporarily + var controller = get_node_or_null("TektonController") + if controller and controller.get("timer"): + controller.timer.stop() + + # Visual Shrink + # Use cached meshes if available, else find them (but can't restore accurately if not cached) + if mesh_cache.is_empty(): + # Fallback if _ready hasn't run or failed + # We'll just define the user's specific vector as fallback target for the sphere + # But better to rely on cache. + pass + + for i in range(mesh_cache.size()): + var mesh = mesh_cache[i] + if is_instance_valid(mesh): + var base_scale = original_scales[i] + var t = create_tween() + t.tween_property(mesh, "scale", base_scale * 0.5, 0.2).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + + # Wait 1 seconds + await get_tree().create_timer(1.0).timeout + + # Grow back + for i in range(mesh_cache.size()): + var mesh = mesh_cache[i] + if is_instance_valid(mesh): + var base_scale = original_scales[i] + var t = create_tween() + t.tween_property(mesh, "scale", base_scale, 0.2).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) + + # Resume AI + if controller and controller.has_method("_start_timer"): + if is_multiplayer_authority() and not is_carried: + controller._start_timer() + + # Spawn tiles (as requested "tekton will spawn a tiles around that floor also") + if is_multiplayer_authority(): + spawn_tiles_around(8) # Standard amount + + # Floor Freeze (Visual/Instant - Run on all clients locally) + _temporarily_change_floor(current_position, 1, 6, 3.0) + +func _temporarily_change_floor(center: Vector2i, radius: int, new_id: int, duration: float): + if not enhanced_gridmap: return + + # Run locally on all clients to ensure instant feedback without network delay + var changed_cells = {} # pos: original_id + + for x in range(-radius, radius + 1): + for y in range(-radius, radius + 1): + var pos = center + Vector2i(x, y) + if enhanced_gridmap.is_position_valid(pos): + var cell_3d = Vector3i(pos.x, 0, pos.y) + var original = enhanced_gridmap.get_cell_item(cell_3d) + + # Only change if not already the new ID (avoid redundant updates or overriding existing freeze) + if original != new_id: + changed_cells[pos] = original + # Set locally immediately + enhanced_gridmap.set_cell_item(cell_3d, new_id) + + await get_tree().create_timer(duration).timeout + + # Restore locally + for pos in changed_cells: + var original = changed_cells[pos] + var current_cell = Vector3i(pos.x, 0, pos.y) + var current = enhanced_gridmap.get_cell_item(current_cell) + + # Only restore if it hasn't been changed to something else in meantime + if current == new_id: + enhanced_gridmap.set_cell_item(current_cell, original) + + # Stun nearby players handled by Thrower (Player.gd) or here? + # Player.gd handles the stun call because it knows the impact zone context better? + # Actually, Player.gd calls this function. Player.gd *also* iterates players to stun them. + # That is fine. func spawn_tiles_around(count: int = 4): """Spawns a mix of normal and special tiles in a radius."""