diff --git a/addons/forge/resources/abilities/ForgeAbilityBehavior.cs b/addons/forge/resources/abilities/ForgeAbilityBehavior.cs index c2f032cb..a7cfd454 100644 --- a/addons/forge/resources/abilities/ForgeAbilityBehavior.cs +++ b/addons/forge/resources/abilities/ForgeAbilityBehavior.cs @@ -10,5 +10,9 @@ namespace Gamesmiths.Forge.Godot.Resources.Abilities; [Icon("uid://bcx7anhepqfmd")] public abstract partial class ForgeAbilityBehavior : Resource { + [Export] public string? Name { get; set; } + [Export] public string? Description { get; set; } + [Export] public Texture2D? Icon { get; set; } + public abstract IAbilityBehavior GetBehavior(); } diff --git a/managers/InventoryManager.cs b/managers/InventoryManager.cs new file mode 100644 index 00000000..8b920629 --- /dev/null +++ b/managers/InventoryManager.cs @@ -0,0 +1,58 @@ +using System.Collections.Generic; +using Gamesmiths.Forge.Godot.Resources.Abilities; +using Godot; +using Movementtests.systems; + +namespace Movementtests.managers; + +public partial class WeaponEventAbilityData(WeaponSystem.WeaponEvent forEvent, Resource ability) + : RefCounted +{ + public WeaponSystem.WeaponEvent ForEvent { get; private set; } = forEvent; + public Resource Ability { get; private set; } = ability; +} + +public partial class InventoryManager : Node +{ + [Signal] + public delegate void InventoryChangedEventHandler(); + + [Signal] + public delegate void WeaponEventInventoryChangedEventHandler(); + [Signal] + public delegate void WeaponEventAbilityAddedEventHandler(WeaponEventAbilityData data); + [Signal] + public delegate void WeaponEventAbilityRemovedEventHandler(WeaponEventAbilityData data); + + public Dictionary> WeaponEventsInventory { get; } = []; + + public static InventoryManager Instance { get; private set; } + + public override void _Ready() + { + Instance = this; + WeaponEventsInventory[WeaponSystem.WeaponEvent.FlyingTick] = new HashSet(); + WeaponEventsInventory[WeaponSystem.WeaponEvent.StartedFlying] = new HashSet(); + WeaponEventsInventory[WeaponSystem.WeaponEvent.StoppedFlying] = new HashSet(); + } + + public void AddAbilityForWeaponEvent(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior abilityBehavior) + { + var inventoryForEvent = WeaponEventsInventory[forEvent]; + var addedAbilityToInventory = inventoryForEvent.Add(abilityBehavior); + if (!addedAbilityToInventory) return; + + EmitSignalWeaponEventInventoryChanged(); + EmitSignalWeaponEventAbilityAdded(new WeaponEventAbilityData(forEvent, abilityBehavior)); + } + + public void RemoveAbilityForWeaponEvent(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior abilityBehavior) + { + var inventoryForEvent = WeaponEventsInventory[forEvent]; + var removedFromInventory = inventoryForEvent.Remove(abilityBehavior); + if (!removedFromInventory) return; + + EmitSignalWeaponEventInventoryChanged(); + EmitSignalWeaponEventAbilityRemoved(new WeaponEventAbilityData(forEvent, abilityBehavior)); + } +} diff --git a/managers/InventoryManager.cs.uid b/managers/InventoryManager.cs.uid new file mode 100644 index 00000000..80718de8 --- /dev/null +++ b/managers/InventoryManager.cs.uid @@ -0,0 +1 @@ +uid://cgwhrwfqsiing diff --git a/maps/levels/2 - tuto_sword.tscn b/maps/levels/2 - tuto_sword.tscn index 49df4614..2f647fd8 100644 --- a/maps/levels/2 - tuto_sword.tscn +++ b/maps/levels/2 - tuto_sword.tscn @@ -343,7 +343,7 @@ transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, -7.25, 20.5, -27.5) transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 1.3647223, 23.75, -13.75) [node name="Enemy28" parent="Tutorial" index="2" unique_id=1765389924 node_paths=PackedStringArray("Target") instance=ExtResource("7_egib5")] -transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -5, 22, 16.5) +transform = Transform3D(-4.371139e-08, 0, 1, 0, 1, 0, -1, 0, -4.371139e-08, -5, 22, 15.5) Target = NodePath("../../Player") RHealth = SubResource("Resource_invhv") RDamage = SubResource("Resource_cgfmf") @@ -520,15 +520,15 @@ size = Vector3(1, 1, 4.75) material = ExtResource("3_4m8g1") [node name="CSGBox3D137" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="10" unique_id=1930091014] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 22.5, 58) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6, 22.5, 57.5) use_collision = true -size = Vector3(1, 1, 11) +size = Vector3(1, 1, 12) material = ExtResource("3_4m8g1") [node name="CSGBox3D138" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="11" unique_id=1299444131] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 22.5, 58) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2, 22.5, 57.5) use_collision = true -size = Vector3(1, 1, 11) +size = Vector3(1, 1, 12) material = ExtResource("3_4m8g1") [node name="CSGBox3D139" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="12" unique_id=1708119368] @@ -628,9 +628,9 @@ size = Vector3(9.5, 5, 11.75) material = ExtResource("3_4m8g1") [node name="CSGBox3D133" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="28" unique_id=672467040] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 21.487345, 58) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 21.487345, 57.5) use_collision = true -size = Vector3(5, 1, 11) +size = Vector3(5, 1, 12) material = ExtResource("3_4m8g1") [node name="CSGBox3D141" type="CSGBox3D" parent="Tutorial/DashWithMantle" index="29" unique_id=1207463075] @@ -765,10 +765,10 @@ use_collision = true size = Vector3(2, 3.25, 1) material = ExtResource("3_4m8g1") -[node name="Player" parent="." index="9" unique_id=1309399929] +[node name="Player" parent="." index="10" unique_id=1309399929] transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, -0.5, 0, 0) -[node name="PlayerFellRespawn" parent="." index="10" unique_id=479136076] +[node name="PlayerFellRespawn" parent="." index="11" unique_id=479136076] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.5, 1.5, 0) [node name="OmniLight3D" type="OmniLight3D" parent="." index="13" unique_id=702421172] diff --git a/menus/scenes/components/AbilitySelection.cs b/menus/scenes/components/AbilitySelection.cs index 5d4445ea..f3863997 100644 --- a/menus/scenes/components/AbilitySelection.cs +++ b/menus/scenes/components/AbilitySelection.cs @@ -1,55 +1,83 @@ using System; +using System.Collections.Generic; +using Gamesmiths.Forge.Godot.Resources.Abilities; using Godot; using Movementtests.systems; [Tool, GlobalClass] public partial class AbilitySelection : Control { - [Signal] public delegate void AbilityAddedEventHandler(WeaponSystem.WeaponEvent forEvent, string abilityName); + [Signal] public delegate void AbilityAddedEventHandler(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior behavior); + [Signal] public delegate void AbilityRemovedEventHandler(WeaponSystem.WeaponEvent forEvent, ForgeAbilityBehavior behavior); [Export] public WeaponSystem.WeaponEvent ForEvent { get; set; } = WeaponSystem.WeaponEvent.StartedFlying; - private string _title = string.Empty; - [Export] public string Title { - get => _title; - set - { - _title = value; - TitleChanged(); - } - } + [Export] public string Title { get; set; } = string.Empty; - [Export] public PackedScene AbilitySelectionItem { get; set; } + [Export] public PackedScene AbilitySelectedItem { get; set; } + + [Export] public ForgeAbilityBehavior[] AbilityBehaviors { get; set; } - private VBoxContainer _abilities; + private VBoxContainer _selectedAbilities; private MenuButton _addAbility; private PopupMenu _addAbilityMenu; public override void _Ready() { - _abilities = GetNode("%SelectedAbilities"); + var titleLabel = GetNode