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
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()
|
|
|