feat: Add new visual effects, player and lobby scenes, and a special tiles manager.

This commit is contained in:
2026-03-17 18:04:57 +08:00
parent efdd8f4969
commit 05d9617f84
22 changed files with 5385 additions and 7 deletions
+20
View File
@@ -259,6 +259,11 @@ func is_holo_tile(item_id: int) -> bool:
# =============================================================================
func _execute_faster_speed():
# VFX: show speed initiator on all peers
if player.is_multiplayer_authority() and player.has_method("can_rpc") and player.can_rpc():
player.rpc("play_skill_vfx", "skill_speed")
elif player.has_method("play_skill_vfx"):
player.play_skill_vfx("skill_speed")
if player.movement_manager:
player.movement_manager.set_speed_multiplier(1.5) # 50% faster
active_buffs[SpecialEffect.FASTER_SPEED] = FASTER_DURATION
@@ -266,6 +271,11 @@ func _execute_faster_speed():
NotificationManager.send_message(player, "Speed Boost! (5s)", NotificationManager.MessageType.POWERUP)
func _execute_area_freeze(target_pos: Vector2i = Vector2i.ZERO):
# VFX: show freeze initiator on all peers
if player.is_multiplayer_authority() and player.has_method("can_rpc") and player.can_rpc():
player.rpc("play_skill_vfx", "skill_freeze")
elif player.has_method("play_skill_vfx"):
player.play_skill_vfx("skill_freeze")
var center_pos = target_pos
# Determine Level early for distance calculation
@@ -368,6 +378,11 @@ func _execute_area_freeze(target_pos: Vector2i = Vector2i.ZERO):
func _execute_block_floor(target_pos: Vector2i = Vector2i.ZERO):
# VFX: show wall initiator on all peers
if player.is_multiplayer_authority() and player.has_method("can_rpc") and player.can_rpc():
player.rpc("play_skill_vfx", "skill_wall")
elif player.has_method("play_skill_vfx"):
player.play_skill_vfx("skill_wall")
# "Wall Block" - Spawn line behind player
var behind_pos = target_pos
var last_dir = player.movement_manager.last_move_direction if player.movement_manager else Vector2i(0, 1)
@@ -425,6 +440,11 @@ func _execute_block_floor(target_pos: Vector2i = Vector2i.ZERO):
NotificationManager.send_message(player, "Defensive Wall Deployed!", NotificationManager.MessageType.POWERUP)
func _execute_invisible_mode(target: Node3D):
# VFX: show ghost initiator on all peers (on the caster/player, not the target)
if player.is_multiplayer_authority() and player.has_method("can_rpc") and player.can_rpc():
player.rpc("play_skill_vfx", "skill_ghost")
elif player.has_method("play_skill_vfx"):
player.play_skill_vfx("skill_ghost")
target.is_invisible = true
invisible_timer = INVISIBLE_DURATION