MultiplayerFighter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
4.2 KiB

extends Control
class_name ActionBar
## Action bar displaying 12 ability slots at the bottom of the screen
## Pre-populated with Jump, Dash, Attack, Block + 8 empty slots for expansion
# Ability button references (12 slots)
var ability_buttons: Array[AbilityButton] = []
# Player reference
var player: Character = null
# Slot assignments (which slot holds which ability)
const SLOT_ATTACK = 0 # Left Mouse Button
const SLOT_BLOCK = 1 # Right Mouse Button
const SLOT_DASH = 2 # F key
const SLOT_JUMP = 3 # Space
func _ready():
# Ability buttons are children of the HBoxContainer
var container = $HBoxContainer
if container:
for child in container.get_children():
if child is AbilityButton:
ability_buttons.append(child)
print("[ActionBar] Found ", ability_buttons.size(), " ability button slots")
# Initialize button appearances
_initialize_slots()
## Set the player reference and connect signals
func set_player(p: Character):
if player:
_disconnect_player_signals()
player = p
if player:
_connect_player_signals()
_update_all_abilities()
## Initialize all slots with their keybinds
func _initialize_slots():
if ability_buttons.size() < 12:
push_warning("[ActionBar] Expected 12 slots, found ", ability_buttons.size())
return
# Set keybinds for all slots
var keybinds = ["LMB", "RMB", "F", "Space", "5", "6", "7", "8", "9", "0", "-", "="]
for i in range(min(12, ability_buttons.size())):
ability_buttons[i].set_keybind(keybinds[i])
print("[ActionBar] Initialized all ability slots")
## Update all ability icons and data
func _update_all_abilities():
if not player:
return
# Clear all slots first
for button in ability_buttons:
button.clear_ability()
# Re-set keybinds
_initialize_slots()
# SLOT 0: Attack (Main Hand or Unarmed)
if player.equipped_weapon:
var weapon_data = player.equipped_weapon.weapon_data
if weapon_data and weapon_data.icon:
ability_buttons[SLOT_ATTACK].set_ability(
weapon_data.icon,
"LMB",
weapon_data.weapon_name,
"Attack with " + weapon_data.weapon_name
)
else:
# Unarmed attack - use placeholder or no icon
ability_buttons[SLOT_ATTACK].set_ability(
null,
"LMB",
"Unarmed Attack",
"Punch enemies"
)
# SLOT 1: Block (if shield equipped)
if player.equipped_offhand:
var offhand_data = player.equipped_offhand.weapon_data
if offhand_data and offhand_data.can_block and offhand_data.icon:
ability_buttons[SLOT_BLOCK].set_ability(
offhand_data.icon,
"RMB",
"Block",
"Block with " + offhand_data.weapon_name + " (" + str(int(offhand_data.block_reduction * 100)) + "% reduction)"
)
# If main hand can block
elif player.equipped_weapon:
var weapon_data = player.equipped_weapon.weapon_data
if weapon_data and weapon_data.can_block and weapon_data.icon:
ability_buttons[SLOT_BLOCK].set_ability(
weapon_data.icon,
"RMB",
"Block",
"Block with " + weapon_data.weapon_name + " (" + str(int(weapon_data.block_reduction * 100)) + "% reduction)"
)
# SLOT 2: Dash
ability_buttons[SLOT_DASH].set_ability(
null, # TODO: Add dash icon
"F",
"Dash",
"Dash in movement direction\nCooldown: 4s"
)
# SLOT 3: Jump
ability_buttons[SLOT_JUMP].set_ability(
null, # TODO: Add jump icon
"Space",
"Jump",
"Jump into the air"
)
# Slots 4-11 remain empty for future abilities
print("[ActionBar] Updated all ability displays")
## Connect to player signals
func _connect_player_signals():
if not player:
return
# We'll add custom signals to player.gd for weapon changes and cooldowns
# For now, just print
print("[ActionBar] Connected to player signals")
## Disconnect from player signals
func _disconnect_player_signals():
if not player:
return
print("[ActionBar] Disconnected from player signals")
## Update dash cooldown
func update_dash_cooldown(remaining: float, total: float):
if ability_buttons.size() > SLOT_DASH:
if remaining > 0:
ability_buttons[SLOT_DASH].start_cooldown(remaining, total)
## Update attack cooldown
func update_attack_cooldown(remaining: float, total: float):
if ability_buttons.size() > SLOT_ATTACK:
if remaining > 0:
ability_buttons[SLOT_ATTACK].start_cooldown(remaining, total)
## Called when weapon is equipped/unequipped
func on_weapon_changed():
_update_all_abilities()