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.
158 lines
4.2 KiB
158 lines
4.2 KiB
|
3 weeks ago
|
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()
|