made the initial inventory loadout into a resource to initialize the injected dependency with
This commit is contained in:
@@ -1,82 +1,92 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Chickensoft.AutoInject;
|
||||
using Chickensoft.Introspection;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
using Movementtests.systems;
|
||||
|
||||
[Tool, GlobalClass]
|
||||
[Tool, GlobalClass, Meta(typeof(IAutoConnect))]
|
||||
public partial class AbilitySelection : Control
|
||||
{
|
||||
public override void _Notification(int what) => this.Notify(what);
|
||||
|
||||
#region Signals
|
||||
|
||||
[Signal] public delegate void AbilityAddedEventHandler(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior behavior);
|
||||
[Signal] public delegate void AbilityRemovedEventHandler(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior behavior);
|
||||
|
||||
#endregion
|
||||
|
||||
#region Exports
|
||||
|
||||
[Export] public WeaponSystem.WeaponEvent ForEvent { get; set; } = WeaponSystem.WeaponEvent.StartedFlying;
|
||||
|
||||
[Export] public string Title { get; set; } = string.Empty;
|
||||
|
||||
[Export] public PackedScene AbilitySelectedItem { get; set; }
|
||||
|
||||
[Export] public ForgeAbilityBehavior[] AbilityBehaviors { get; set; }
|
||||
[Export] public PackedScene? AbilitySelectedItem { get; set; }
|
||||
[Export] public ForgeAbilityBehavior[] AbilityBehaviors { get; set; } = [];
|
||||
|
||||
private VBoxContainer _selectedAbilities;
|
||||
private MenuButton _addAbility;
|
||||
private PopupMenu _addAbilityMenu;
|
||||
#endregion
|
||||
|
||||
#region Nodes
|
||||
|
||||
[Node("%SelectedAbilities")] public required VBoxContainer SelectedAbilities { get; set; }
|
||||
[Node("%AddAbility")] public required MenuButton AddAbility { get; set; }
|
||||
public required PopupMenu AddAbilityMenu { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
public override void _Ready()
|
||||
public void OnReady()
|
||||
{
|
||||
// Initialize title (also in Editor as Tool)
|
||||
var titleLabel = GetNode<Label>("%TitleLabel");
|
||||
titleLabel.Text = Title;
|
||||
|
||||
_selectedAbilities = GetNode<VBoxContainer>("%SelectedAbilities");
|
||||
_addAbility = GetNode<MenuButton>("%AddAbility");
|
||||
_addAbilityMenu = _addAbility.GetPopup();
|
||||
AddAbilityMenu = AddAbility.GetPopup();
|
||||
|
||||
if (Engine.IsEditorHint()) return;
|
||||
if (Engine.IsEditorHint()) return; // Editor flow stops here
|
||||
|
||||
var i = 0;
|
||||
foreach (var behavior in AbilityBehaviors)
|
||||
{
|
||||
_addAbilityMenu.AddIconItem(behavior.Icon, behavior.Name);
|
||||
_addAbilityMenu.SetItemMetadata(i, behavior);
|
||||
AddAbilityMenu.AddIconItem(behavior.Icon, behavior.Name);
|
||||
AddAbilityMenu.SetItemMetadata(i, behavior);
|
||||
i += 1;
|
||||
}
|
||||
|
||||
_addAbilityMenu.IndexPressed += AddAbilityMenuOnIndexPressed;
|
||||
AddAbilityMenu.IndexPressed += AddAbilityMenuOnIndexPressed;
|
||||
}
|
||||
|
||||
public void Initialize(IEnumerable<Resource> equippedAbilities)
|
||||
public void Initialize(IEnumerable<ForgeAbilityBehavior> equippedAbilities)
|
||||
{
|
||||
foreach (var equippedAbility in equippedAbilities)
|
||||
{
|
||||
if (equippedAbility is not ForgeAbilityBehavior ability) continue;
|
||||
AddSelectedAbility(ability);
|
||||
AddSelectedAbility(equippedAbility);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddAbilityMenuOnIndexPressed(long index)
|
||||
{
|
||||
var indexInt = Convert.ToInt32(index);
|
||||
var metadata = (ForgeAbilityBehavior) _addAbilityMenu.GetItemMetadata(indexInt);
|
||||
var metadata = (ForgeAbilityBehavior) AddAbilityMenu.GetItemMetadata(indexInt);
|
||||
EmitSignalAbilityAdded(ForEvent, metadata);
|
||||
}
|
||||
|
||||
public void AddSelectedAbility(ForgeAbilityBehavior behavior)
|
||||
{
|
||||
var newSelectedAbilityItem = AbilitySelectedItem.Instantiate() as SelectedAbility;
|
||||
if (newSelectedAbilityItem == null) return;
|
||||
if (AbilitySelectedItem?.Instantiate() is not SelectedAbility newSelectedAbilityItem) return;
|
||||
|
||||
newSelectedAbilityItem.SetAbility(behavior);
|
||||
newSelectedAbilityItem.AbilityRemoved += ability => EmitSignalAbilityRemoved(ForEvent, ability);
|
||||
_selectedAbilities.AddChild(newSelectedAbilityItem);
|
||||
SelectedAbilities.AddChild(newSelectedAbilityItem);
|
||||
}
|
||||
|
||||
public void RemoveSelectedAbility(ForgeAbilityBehavior behavior)
|
||||
{
|
||||
foreach (var child in _selectedAbilities.GetChildren())
|
||||
foreach (var child in SelectedAbilities.GetChildren())
|
||||
{
|
||||
if (child is not SelectedAbility selectedAbility || selectedAbility.Ability != behavior) continue;
|
||||
_selectedAbilities.RemoveChild(selectedAbility);
|
||||
_addAbility.GrabFocus();
|
||||
SelectedAbilities.RemoveChild(selectedAbility);
|
||||
AddAbility.GrabFocus();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,18 +66,14 @@ public partial class InventoryUi : Control
|
||||
|
||||
public void OnWeaponEventInventoryAdded(WeaponEventAbilityData data)
|
||||
{
|
||||
if (data.Ability is not ForgeAbilityBehavior abilityBehavior) return;
|
||||
|
||||
var selection = GetAbilitySelection(data.ForEvent);
|
||||
selection.AddSelectedAbility(abilityBehavior);
|
||||
selection.AddSelectedAbility(data.Ability);
|
||||
}
|
||||
|
||||
public void OnWeaponEventInventoryRemoved(WeaponEventAbilityData data)
|
||||
{
|
||||
if (data.Ability is not ForgeAbilityBehavior abilityBehavior) return;
|
||||
|
||||
var selection = GetAbilitySelection(data.ForEvent);
|
||||
selection.RemoveSelectedAbility(abilityBehavior);
|
||||
selection.RemoveSelectedAbility(data.Ability);
|
||||
}
|
||||
|
||||
public AbilitySelection GetAbilitySelection(WeaponSystem.WeaponEvent forEvent)
|
||||
|
||||
Reference in New Issue
Block a user