feat: introduce special power-up manager with inventory and associated UI
This commit is contained in:
@@ -22,10 +22,12 @@ var active_buffs: Dictionary = {} # EffectEnum -> float (Duration Running)
|
|||||||
# Cooldown Constants (Level 1 / Level 8)
|
# Cooldown Constants (Level 1 / Level 8)
|
||||||
const COOLDOWN_L1 = 15.0
|
const COOLDOWN_L1 = 15.0
|
||||||
const COOLDOWN_L8 = 5.0
|
const COOLDOWN_L8 = 5.0
|
||||||
|
const GLOBAL_COOLDOWN_MAX = 5.0
|
||||||
const FASTER_DURATION = 5.0
|
const FASTER_DURATION = 5.0
|
||||||
const FREEZE_SLOW_DURATION = 3.0
|
const FREEZE_SLOW_DURATION = 3.0
|
||||||
|
|
||||||
signal cooldown_updated(effect: int, time_left: float, max_time: float)
|
signal cooldown_updated(effect: int, time_left: float, max_time: float)
|
||||||
|
signal global_cooldown_updated(time_left: float, max_time: float)
|
||||||
signal powerup_unlocked(effect: int, level: int)
|
signal powerup_unlocked(effect: int, level: int)
|
||||||
|
|
||||||
|
|
||||||
@@ -234,6 +236,7 @@ func activate_effect(effect: int, target_player: Node3D = null):
|
|||||||
|
|
||||||
# Apply 5s cooldown globally
|
# Apply 5s cooldown globally
|
||||||
global_cooldown_timer = 5.0
|
global_cooldown_timer = 5.0
|
||||||
|
emit_signal("global_cooldown_updated", global_cooldown_timer, GLOBAL_COOLDOWN_MAX)
|
||||||
|
|
||||||
# Play generic cast animation or sound?
|
# Play generic cast animation or sound?
|
||||||
if player.is_multiplayer_authority() and multiplayer.has_multiplayer_peer() and multiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
|
if player.is_multiplayer_authority() and multiplayer.has_multiplayer_peer() and multiplayer.multiplayer_peer.get_connection_status() == MultiplayerPeer.CONNECTION_CONNECTED:
|
||||||
@@ -552,6 +555,9 @@ func _process(delta):
|
|||||||
# Update Global Cooldown
|
# Update Global Cooldown
|
||||||
if global_cooldown_timer > 0:
|
if global_cooldown_timer > 0:
|
||||||
global_cooldown_timer -= delta
|
global_cooldown_timer -= delta
|
||||||
|
if global_cooldown_timer <= 0:
|
||||||
|
global_cooldown_timer = 0
|
||||||
|
emit_signal("global_cooldown_updated", global_cooldown_timer, GLOBAL_COOLDOWN_MAX)
|
||||||
|
|
||||||
# Update Active Buffs (Speed)
|
# Update Active Buffs (Speed)
|
||||||
if active_buffs.has(SpecialEffect.FASTER_SPEED):
|
if active_buffs.has(SpecialEffect.FASTER_SPEED):
|
||||||
|
|||||||
@@ -84,6 +84,17 @@ func _setup_btn(effect_id: int, btn: Button):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Add Cooldown Overlay
|
||||||
|
if not btn.has_node("CooldownOverlay"):
|
||||||
|
var overlay = ColorRect.new()
|
||||||
|
overlay.name = "CooldownOverlay"
|
||||||
|
overlay.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||||||
|
overlay.color = Color(0, 0, 0, 0.6) # Semi-transparent black
|
||||||
|
overlay.set_anchors_preset(Control.PRESET_FULL_RECT)
|
||||||
|
overlay.anchor_top = 1.0 # Start empty at bottom
|
||||||
|
overlay.grow_vertical = Control.GROW_DIRECTION_BEGIN
|
||||||
|
btn.add_child(overlay)
|
||||||
|
|
||||||
# Add Keyboard Shortcut Label
|
# Add Keyboard Shortcut Label
|
||||||
if not btn.has_node("ShortcutLabel"):
|
if not btn.has_node("ShortcutLabel"):
|
||||||
var sc_lbl = Label.new()
|
var sc_lbl = Label.new()
|
||||||
@@ -148,6 +159,21 @@ func _on_player_child_entered(node: Node, player_node: Node):
|
|||||||
if player_node.child_entered_tree.is_connected(_on_player_child_entered):
|
if player_node.child_entered_tree.is_connected(_on_player_child_entered):
|
||||||
player_node.child_entered_tree.disconnect(_on_player_child_entered)
|
player_node.child_entered_tree.disconnect(_on_player_child_entered)
|
||||||
|
|
||||||
|
func _on_global_cooldown_updated(time_left: float, max_time: float):
|
||||||
|
for effect in icon_containers:
|
||||||
|
var btn = icon_containers[effect]
|
||||||
|
var overlay = btn.get_node_or_null("CooldownOverlay")
|
||||||
|
if overlay:
|
||||||
|
if time_left > 0:
|
||||||
|
overlay.visible = true
|
||||||
|
overlay.anchor_top = 1.0 - (time_left / max_time)
|
||||||
|
btn.disabled = true
|
||||||
|
else:
|
||||||
|
overlay.visible = false
|
||||||
|
overlay.anchor_top = 1.0
|
||||||
|
if special_manager_ref and special_manager_ref.inventory.get(effect, false):
|
||||||
|
btn.disabled = false
|
||||||
|
|
||||||
func _connect_special_manager(special_manager):
|
func _connect_special_manager(special_manager):
|
||||||
special_manager_ref = special_manager
|
special_manager_ref = special_manager
|
||||||
print("[PowerUpUI] Connected to SpecialTilesManager")
|
print("[PowerUpUI] Connected to SpecialTilesManager")
|
||||||
@@ -159,12 +185,14 @@ func _connect_special_manager(special_manager):
|
|||||||
if not special_manager.is_connected("inventory_updated", _on_inventory_updated):
|
if not special_manager.is_connected("inventory_updated", _on_inventory_updated):
|
||||||
special_manager.connect("inventory_updated", _on_inventory_updated)
|
special_manager.connect("inventory_updated", _on_inventory_updated)
|
||||||
|
|
||||||
|
if not special_manager.is_connected("global_cooldown_updated", _on_global_cooldown_updated):
|
||||||
|
special_manager.connect("global_cooldown_updated", _on_global_cooldown_updated)
|
||||||
|
|
||||||
# Initial State Sync
|
# Initial State Sync
|
||||||
if icon_containers.is_empty():
|
if icon_containers.is_empty():
|
||||||
print("[PowerUpUI] Warning: Icon containers empty during setup. Attempting _ready logic now...")
|
print("[PowerUpUI] Warning: Icon containers empty during setup. Attempting _ready logic now...")
|
||||||
var container = get_node_or_null("Container")
|
var container = get_node_or_null("Container")
|
||||||
if container:
|
if container:
|
||||||
# Fix: Use correct IDs 0-3 here too
|
|
||||||
_setup_btn(0, container.get_node_or_null("SpeedBtn"))
|
_setup_btn(0, container.get_node_or_null("SpeedBtn"))
|
||||||
_setup_btn(1, container.get_node_or_null("FreezeAreaBtn"))
|
_setup_btn(1, container.get_node_or_null("FreezeAreaBtn"))
|
||||||
_setup_btn(2, container.get_node_or_null("WallBtn"))
|
_setup_btn(2, container.get_node_or_null("WallBtn"))
|
||||||
@@ -206,6 +234,11 @@ func _on_inventory_updated(inventory: Dictionary):
|
|||||||
# Single slot logic: Only the owned one is visible
|
# Single slot logic: Only the owned one is visible
|
||||||
btn.visible = has_item
|
btn.visible = has_item
|
||||||
if has_item:
|
if has_item:
|
||||||
btn.disabled = false # Individual cooldown logic might disable it later
|
# Check global cooldown before enabling
|
||||||
|
var is_cooling = false
|
||||||
|
if special_manager_ref and special_manager_ref.global_cooldown_timer > 0:
|
||||||
|
is_cooling = true
|
||||||
|
|
||||||
|
btn.disabled = is_cooling
|
||||||
btn.modulate = Color.WHITE
|
btn.modulate = Color.WHITE
|
||||||
_update_btn_shortcut(effect, btn)
|
_update_btn_shortcut(effect, btn)
|
||||||
|
|||||||
Reference in New Issue
Block a user