From abed26d13b8164890beed65683401c50df83020f Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Sun, 16 Apr 2023 14:11:17 -0700 Subject: [PATCH] equipping items with keys --- Characters/ExampleEnemy.tscn | 2 + Characters/Player.tscn | 4 ++ Characters/States/PlayerState.cs | 31 +++++++++++++-- Items/Inventory.cs | 67 ++++++++++++++++++++++++-------- Items/Item.cs | 2 + Items/Weapon.cs | 2 +- project.godot | 15 +++++++ 7 files changed, 102 insertions(+), 21 deletions(-) diff --git a/Characters/ExampleEnemy.tscn b/Characters/ExampleEnemy.tscn index 3508c9e..7077955 100644 --- a/Characters/ExampleEnemy.tscn +++ b/Characters/ExampleEnemy.tscn @@ -163,8 +163,10 @@ shape = SubResource("RectangleShape2D_8lxmf") [node name="Inventory" type="Node2D" parent="."] y_sort_enabled = true script = ExtResource("7_43gq8") +Items = [null] [node name="Sword" parent="Inventory" instance=ExtResource("8_s3c8r")] +Knockback = 100.0 [node name="FlashAnimation" type="AnimationPlayer" parent="."] libraries = { diff --git a/Characters/Player.tscn b/Characters/Player.tscn index dedeeaa..fe35f8f 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -193,6 +193,10 @@ horizontal_alignment = 1 y_sort_enabled = true position = Vector2(0, 2) script = ExtResource("7_xyenu") +InventoryMap = { +"equip_1": 0, +"equip_2": 1 +} [node name="Sword" parent="Inventory" instance=ExtResource("7_4rxuv")] diff --git a/Characters/States/PlayerState.cs b/Characters/States/PlayerState.cs index 763fc59..e9e7207 100644 --- a/Characters/States/PlayerState.cs +++ b/Characters/States/PlayerState.cs @@ -13,13 +13,32 @@ namespace SupaLidlGame.Characters.State public override CharacterState Input(InputEvent @event) { + var inventory = Character.Inventory; + #if DEBUG - if (@event.IsActionPressed("equip")) - { - Character.Inventory.SelectedItem = Character.Inventory.GetNode("Sword"); - } + //if (@event.IsActionPressed("equip")) + //{ + // inventory.SelectedItem = inventory.GetNode("Sword"); + //} #endif + if (this is PlayerIdleState or PlayerMoveState + && !_player.Inventory.IsUsingItem) + { + if (@event.IsActionPressed("equip_1")) + { + inventory.SelectedItem = inventory.GetItemByMap("equip_1"); + } + else if (@event.IsActionPressed("equip_2")) + { + inventory.SelectedItem = inventory.GetItemByMap("equip_2"); + } + else if (@event.IsActionPressed("equip_3")) + { + inventory.SelectedItem = inventory.GetItemByMap("equip_3"); + } + } + return base.Input(@event); } @@ -36,6 +55,10 @@ namespace SupaLidlGame.Characters.State Character.Target = dirToMouse; } } + else if (!Character.Direction.IsZeroApprox()) + { + Character.Target = Character.Direction; + } if (Godot.Input.IsActionPressed("attack1")) { diff --git a/Items/Inventory.cs b/Items/Inventory.cs index 55f787d..f2f4a5a 100644 --- a/Items/Inventory.cs +++ b/Items/Inventory.cs @@ -1,6 +1,6 @@ -using System.Collections.Generic; using Godot; using SupaLidlGame.Characters; +using Godot.Collections; namespace SupaLidlGame.Items { @@ -8,7 +8,11 @@ namespace SupaLidlGame.Items { public Character Character { get; private set; } - public List Items { get; private set; } = new List(); + [Export] + public Array Items { get; private set; } = new Array(); + + [Export] + public Dictionary InventoryMap { get; set; } public const int MaxCapacity = 32; @@ -28,30 +32,44 @@ namespace SupaLidlGame.Items set => EquipItem(value, ref _offhandItem); } + public bool IsUsingItem => (SelectedItem?.IsUsing ?? false) || + (OffhandItem?.IsUsing ?? false); + + public Inventory() + { + InventoryMap = new Dictionary(); + InventoryMap.Add("equip_1", 0); + InventoryMap.Add("equip_2", 1); + InventoryMap.Add("equip_3", 2); + } + private bool EquipItem(Item item, ref Item slot) { - if (item is not null && item.IsOneHanded) + if (item is not null) { - // we can not equip this if either hand is occupied by - // two-handed item - - if (_selectedItem is not null && !_selectedItem.IsOneHanded) + if (item.IsOneHanded) { - return false; + // we can not equip this if either hand is occupied by + // two-handed item + + if (_selectedItem is not null && !_selectedItem.IsOneHanded) + { + return false; + } + + if (_offhandItem is not null && !_offhandItem.IsOneHanded) + { + return false; + } } - if (_offhandItem is not null && !_offhandItem.IsOneHanded) + if (!Items.Contains(item)) { + GD.PrintErr("Tried to equip an item not in the inventory."); return false; } } - if (!Items.Contains(item)) - { - GD.PrintErr("Tried to equip an item not in the inventory."); - return false; - } - if (slot is not null) { slot.Unequip(Character); @@ -67,6 +85,20 @@ namespace SupaLidlGame.Items return true; } + public Item GetItemByMap(string keymap) + { + if (InventoryMap.ContainsKey(keymap)) + { + int idx = InventoryMap[keymap]; + if (idx < Items.Count) + { + return Items[InventoryMap[keymap]]; + } + } + else GD.Print(keymap + " does not exist"); + return null; + } + public Item AddItem(Item item) { if (Items.Count >= MaxCapacity) @@ -76,7 +108,10 @@ namespace SupaLidlGame.Items item.CharacterOwner = Character; item.Visible = false; - Items.Add(item); + if (!Items.Contains(item)) + { + Items.Add(item); + } return item; } diff --git a/Items/Item.cs b/Items/Item.cs index c2e64d1..f19a768 100644 --- a/Items/Item.cs +++ b/Items/Item.cs @@ -20,6 +20,8 @@ namespace SupaLidlGame.Items public Character CharacterOwner { get; set; } + public virtual bool IsUsing => false; + /// /// Determines if this item can directly stack with other items /// diff --git a/Items/Weapon.cs b/Items/Weapon.cs index 2771733..33476f6 100644 --- a/Items/Weapon.cs +++ b/Items/Weapon.cs @@ -8,7 +8,7 @@ namespace SupaLidlGame.Items { public double RemainingUseTime { get; protected set; } = 0; - public bool IsUsing => RemainingUseTime > 0; + public override bool IsUsing => RemainingUseTime > 0; /// /// How much damage in HP that this weapon deals. diff --git a/project.godot b/project.godot index 6febc80..6a5b4bd 100644 --- a/project.godot +++ b/project.godot @@ -66,6 +66,21 @@ interact={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":70,"key_label":0,"unicode":0,"echo":false,"script":null) ] } +equip_1={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":49,"key_label":0,"unicode":49,"echo":false,"script":null) +] +} +equip_2={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":50,"key_label":0,"unicode":50,"echo":false,"script":null) +] +} +equip_3={ +"deadzone": 0.5, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":51,"key_label":0,"unicode":51,"echo":false,"script":null) +] +} [layer_names]