From 98d096303ca5d5212d6e834df822e65b248cc426 Mon Sep 17 00:00:00 2001 From: Zenny Date: Sat, 7 Sep 2024 02:22:14 -0700 Subject: [PATCH] Big fix of inventory system, add accessory item type --- src/game/GameLogic.Output.cs | 2 +- src/game/IGameRepo.cs | 43 ++++++---- src/inventory_menu/InventoryMenu.cs | 86 ++++++++++++-------- src/items/InventoryItem.cs | 6 +- src/items/InventoryItemInfo.cs | 1 + src/items/accessory/Accessory.cs | 30 +++++++ src/items/accessory/Accessory.tscn | 31 +++++++ src/items/accessory/AccessoryInfo.cs | 10 +++ src/items/accessory/accessory.png | Bin 0 -> 3240 bytes src/items/accessory/accessory.png.import | 35 ++++++++ src/items/armor/Armor.cs | 6 +- src/items/armor/Armor.tscn | 12 +-- src/items/weapons/Weapon.cs | 14 ++-- src/items/weapons/WeaponInfo.cs | 2 - src/items/weapons/models/CommonSword.tscn | 2 +- src/items/weapons/models/RareSword.tscn | 2 +- src/items/weapons/models/UncommonSword.tscn | 2 +- src/map/dungeon/rooms/DungeonRoom.cs | 3 +- src/map/dungeon/rooms/Room1.tscn | 7 +- src/map/dungeon/rooms/Room2.tscn | 7 +- src/player/Player.cs | 6 +- src/system/stats/DamageCalculator.cs | 22 ++--- 22 files changed, 229 insertions(+), 100 deletions(-) create mode 100644 src/items/accessory/Accessory.cs create mode 100644 src/items/accessory/Accessory.tscn create mode 100644 src/items/accessory/AccessoryInfo.cs create mode 100644 src/items/accessory/accessory.png create mode 100644 src/items/accessory/accessory.png.import diff --git a/src/game/GameLogic.Output.cs b/src/game/GameLogic.Output.cs index 11922041..4d7af89a 100644 --- a/src/game/GameLogic.Output.cs +++ b/src/game/GameLogic.Output.cs @@ -8,7 +8,7 @@ namespace GameJamDungeon { public readonly record struct StartGame(); - public readonly record struct SetInventoryMode(List Inventory); + public readonly record struct SetInventoryMode(List Inventory); public readonly record struct HideInventory(); diff --git a/src/game/IGameRepo.cs b/src/game/IGameRepo.cs index d25d226e..dc550b09 100644 --- a/src/game/IGameRepo.cs +++ b/src/game/IGameRepo.cs @@ -9,7 +9,7 @@ public interface IGameRepo : IDisposable { event Action? Ended; - AutoProp> InventoryItems { get; } + AutoProp> InventoryItems { get; } IAutoProp IsInventoryScreenOpened { get; } @@ -23,13 +23,17 @@ public interface IGameRepo : IDisposable void SetPlayerGlobalPosition(Vector3 playerGlobalPosition); - public void OnWeaponEquipped(WeaponInfo equippedItem); + public void OnWeaponEquipped(Weapon equippedItem); - public void OnArmorEquipped(ArmorInfo equippedItem); + public void OnArmorEquipped(Armor equippedItem); - public WeaponInfo EquippedWeapon { get; } + public void OnAccessoryEquipped(Accessory equippedItem); - public ArmorInfo EquippedArmor { get; } + public Weapon EquippedWeapon { get; } + + public Armor EquippedArmor { get; } + + public Accessory EquippedAccessory { get; } public AutoProp HPBarValue { get; } @@ -40,10 +44,10 @@ public class GameRepo : IGameRepo { public event Action? Ended; - private readonly AutoProp> _inventoryItems; + private readonly AutoProp> _inventoryItems; private readonly AutoProp _isInventoryScreenOpened; - public AutoProp> InventoryItems => _inventoryItems; + public AutoProp> InventoryItems => _inventoryItems; public IAutoProp IsInventoryScreenOpened => _isInventoryScreenOpened; @@ -53,12 +57,16 @@ public class GameRepo : IGameRepo public IAutoProp IsPaused => _isPaused; private readonly AutoProp _isPaused; - private WeaponInfo _equippedWeapon; - public WeaponInfo EquippedWeapon => _equippedWeapon; + private Weapon _equippedWeapon; + public Weapon EquippedWeapon => _equippedWeapon; - private ArmorInfo _equippedArmor; + private Armor _equippedArmor; - public ArmorInfo EquippedArmor => _equippedArmor; + public Armor EquippedArmor => _equippedArmor; + + private Accessory _equippedAccessory; + + public Accessory EquippedAccessory => _equippedAccessory; public AutoProp HPBarValue { get; } @@ -68,11 +76,11 @@ public class GameRepo : IGameRepo public GameRepo() { - _inventoryItems = new AutoProp>([]); + _inventoryItems = new AutoProp>([]); _isInventoryScreenOpened = new AutoProp(false); _isPaused = new AutoProp(false); _playerGlobalPosition = new AutoProp(Vector3.Zero); - _equippedWeapon = WeaponInfo.Default; + _equippedWeapon = new Weapon(); HPBarValue = new AutoProp(0); VTBarValue = new AutoProp(0); } @@ -91,16 +99,21 @@ public class GameRepo : IGameRepo public void SetPlayerGlobalPosition(Vector3 playerGlobalPosition) => _playerGlobalPosition.OnNext(playerGlobalPosition); - public void OnWeaponEquipped(WeaponInfo equippedItem) + public void OnWeaponEquipped(Weapon equippedItem) { _equippedWeapon = equippedItem; } - public void OnArmorEquipped(ArmorInfo equippedItem) + public void OnArmorEquipped(Armor equippedItem) { _equippedArmor = equippedItem; } + public void OnAccessoryEquipped(Accessory equippedItem) + { + _equippedAccessory = equippedItem; + } + public void OnGameEnded() { Pause(); diff --git a/src/inventory_menu/InventoryMenu.cs b/src/inventory_menu/InventoryMenu.cs index b5755521..5d9ae966 100644 --- a/src/inventory_menu/InventoryMenu.cs +++ b/src/inventory_menu/InventoryMenu.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; public interface IInventoryMenu : IControl { - public void PopulateItems(List items); + public void PopulateItems(List items); public void ClearItems(); } @@ -25,11 +25,11 @@ public partial class InventoryMenu : Control, IInventoryMenu private int _currentSelection = 0; - public void PopulateItems(List items) + public void PopulateItems(List items) { foreach (var item in items) { - var label = new ItemLabel(item) { Text = item.Name }; + var label = new ItemLabel(item) { Text = item.Info.Name }; ItemList.AddChild(label); } @@ -47,7 +47,7 @@ public partial class InventoryMenu : Control, IInventoryMenu foreach (ItemLabel item in ItemList.GetChildren()) { - if (item.InventoryItem == GameRepo.EquippedWeapon || item.InventoryItem == GameRepo.EquippedArmor) + if (item.InventoryItem == GameRepo.EquippedWeapon || item.InventoryItem == GameRepo.EquippedArmor || item.InventoryItem == GameRepo.EquippedAccessory) item.EquipItem(); } } @@ -110,62 +110,78 @@ public partial class InventoryMenu : Control, IInventoryMenu var currentlySelectedItem = ItemList.GetChild(_currentSelection); - if (currentlySelectedItem.InventoryItem is WeaponInfo weapon && GameRepo.EquippedWeapon == weapon) + if (currentlySelectedItem.InventoryItem is Weapon weapon && GameRepo.EquippedWeapon == weapon) { UnequipItem(currentlySelectedItem); - GameRepo.OnWeaponEquipped(WeaponInfo.Default); + GameRepo.OnWeaponEquipped(new Weapon()); } - else if (currentlySelectedItem.InventoryItem is ArmorInfo armor && GameRepo.EquippedArmor == armor) + else if (currentlySelectedItem.InventoryItem is Armor armor && GameRepo.EquippedArmor == armor) { UnequipItem(currentlySelectedItem); GameRepo.OnArmorEquipped(null); } + else if (currentlySelectedItem.InventoryItem is Accessory accessory && GameRepo.EquippedAccessory == accessory) + { + UnequipItem(currentlySelectedItem); + GameRepo.OnAccessoryEquipped(null); + } else EquipItem(currentlySelectedItem); } - private void EquipItem(ItemLabel currentItem) - { - if (currentItem.InventoryItem is WeaponInfo weaponInfo) - { - foreach (ItemLabel item in ItemList.GetChildren()) - { - if (item.InventoryItem is WeaponInfo) - UnequipItem(item); - } - - GameRepo.OnWeaponEquipped(weaponInfo); - currentItem.EquipItem(); - } - - if (currentItem.InventoryItem is ArmorInfo armorInfo) - { - foreach (ItemLabel item in ItemList.GetChildren()) - { - if (item.InventoryItem is ArmorInfo) - UnequipItem(item); - } - - GameRepo.OnArmorEquipped(armorInfo); - currentItem.EquipItem(); - } - } + private void EquipItem(ItemLabel currentItem) => EquipItemInternal(currentItem, (dynamic)currentItem.InventoryItem); private void UnequipItem(ItemLabel item) { item.UnequipItem(); } + + private void EquipItemInternal(ItemLabel currentItem, Accessory accessory) + { + foreach (ItemLabel item in ItemList.GetChildren()) + { + if (item.InventoryItem is Accessory) + UnequipItem(item); + } + + GameRepo.OnAccessoryEquipped(accessory); + currentItem.EquipItem(); + } + + private void EquipItemInternal(ItemLabel currentItem, Armor armor) + { + foreach (ItemLabel item in ItemList.GetChildren()) + { + if (item.InventoryItem is Armor) + UnequipItem(item); + } + + GameRepo.OnArmorEquipped(armor); + currentItem.EquipItem(); + } + + private void EquipItemInternal(ItemLabel currentItem, Weapon weapon) + { + foreach (ItemLabel item in ItemList.GetChildren()) + { + if (item.InventoryItem is Weapon) + UnequipItem(item); + } + + GameRepo.OnWeaponEquipped(weapon); + currentItem.EquipItem(); + } } public partial class ItemLabel : Label { - public ItemLabel(InventoryItemInfo inventoryItem) + public ItemLabel(InventoryItem inventoryItem) { InventoryItem = inventoryItem; LabelSettings = UnequippedItemFont; } - public InventoryItemInfo InventoryItem { get; set; } = default!; + public InventoryItem InventoryItem { get; set; } = default!; private static LabelSettings UnequippedItemFont => GD.Load("res://src/inventory_menu/InventoryLabelSettings.tres"); private static LabelSettings EquippedItemFont => GD.Load("res://src/inventory_menu/EquippedInventoryLabelSettings.tres"); diff --git a/src/items/InventoryItem.cs b/src/items/InventoryItem.cs index 9499d6d1..3b7cb052 100644 --- a/src/items/InventoryItem.cs +++ b/src/items/InventoryItem.cs @@ -2,14 +2,11 @@ using Chickensoft.GodotNodeInterfaces; using Chickensoft.Introspection; using Godot; -using System.Linq; namespace GameJamDungeon { public interface IInventoryItem : INode3D { - public abstract InventoryItemInfo InventoryInfo { get; set; } - public IGameRepo GameRepo { get; } } @@ -17,10 +14,9 @@ namespace GameJamDungeon public abstract partial class InventoryItem : Node3D, IInventoryItem { public override void _Notification(int what) => this.Notify(what); - [Dependency] public IGameRepo GameRepo => this.DependOn(); - public abstract InventoryItemInfo InventoryInfo { get; set; } + internal abstract InventoryItemInfo Info { get; set; } [Node] public Area3D Pickup { get; set; } = default!; } diff --git a/src/items/InventoryItemInfo.cs b/src/items/InventoryItemInfo.cs index d6d5eeb9..dd07f495 100644 --- a/src/items/InventoryItemInfo.cs +++ b/src/items/InventoryItemInfo.cs @@ -1,4 +1,5 @@ using Godot; +using System; [GlobalClass] public partial class InventoryItemInfo : Resource diff --git a/src/items/accessory/Accessory.cs b/src/items/accessory/Accessory.cs new file mode 100644 index 00000000..60987576 --- /dev/null +++ b/src/items/accessory/Accessory.cs @@ -0,0 +1,30 @@ +using Chickensoft.AutoInject; +using Chickensoft.Introspection; +using GameJamDungeon; +using Godot; +using System; +using System.Linq; + +[Meta(typeof(IAutoNode))] +public partial class Accessory : InventoryItem +{ + public override void _Notification(int what) => this.Notify(what); + + public AccessoryInfo AccessoryInfo { get => (AccessoryInfo)Info; } + + [Export] + internal override InventoryItemInfo Info { get; set; } + + public void OnReady() + { + Pickup.BodyEntered += OnEntered; + } + + public void OnEntered(Node3D body) + { + var inventoryList = GameRepo.InventoryItems.Value.Append(this).ToList(); + GameRepo.InventoryItems.OnNext(inventoryList); + QueueFree(); + } + +} diff --git a/src/items/accessory/Accessory.tscn b/src/items/accessory/Accessory.tscn new file mode 100644 index 00000000..04124c10 --- /dev/null +++ b/src/items/accessory/Accessory.tscn @@ -0,0 +1,31 @@ +[gd_scene load_steps=6 format=3 uid="uid://1bbmod6680c2"] + +[ext_resource type="Script" path="res://src/items/accessory/Accessory.cs" id="1_jq0hu"] +[ext_resource type="Texture2D" uid="uid://d0yqm7ars827b" path="res://src/items/accessory/accessory.png" id="1_sfkuo"] +[ext_resource type="Script" path="res://src/items/accessory/AccessoryInfo.cs" id="2_kejmw"] + +[sub_resource type="Resource" id="Resource_lu6du"] +script = ExtResource("2_kejmw") +Name = "Basic Accessory" +Description = "" + +[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_uavx4"] +radius = 0.470016 +height = 0.940032 + +[node name="Accessory" type="Node3D"] +script = ExtResource("1_jq0hu") +Info = SubResource("Resource_lu6du") + +[node name="Sprite3D" type="Sprite3D" parent="."] +billboard = 2 +texture_filter = 0 +texture = ExtResource("1_sfkuo") + +[node name="Pickup" type="Area3D" parent="."] +unique_name_in_owner = true +collision_layer = 4 +collision_mask = 4 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Pickup"] +shape = SubResource("CapsuleShape3D_uavx4") diff --git a/src/items/accessory/AccessoryInfo.cs b/src/items/accessory/AccessoryInfo.cs new file mode 100644 index 00000000..af925d3e --- /dev/null +++ b/src/items/accessory/AccessoryInfo.cs @@ -0,0 +1,10 @@ +using Godot; +using System; + +namespace GameJamDungeon; + +[GlobalClass] +public partial class AccessoryInfo : InventoryItemInfo +{ + // TODO: List all possible status effects here +} diff --git a/src/items/accessory/accessory.png b/src/items/accessory/accessory.png new file mode 100644 index 0000000000000000000000000000000000000000..ae598adb3682dc6e157ff76b13d00db6c3c37009 GIT binary patch literal 3240 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 this.Notify(what); [Export] - public override InventoryItemInfo InventoryInfo { get; set; } + internal override InventoryItemInfo Info { get; set; } + + public ArmorInfo ArmorInfo { get => (ArmorInfo)Info; } public void OnReady() { @@ -19,7 +21,7 @@ public partial class Armor : InventoryItem public void OnEntered(Node3D body) { - var inventoryList = GameRepo.InventoryItems.Value.Append(InventoryInfo).ToList(); + var inventoryList = GameRepo.InventoryItems.Value.Append(this).ToList(); GameRepo.InventoryItems.OnNext(inventoryList); QueueFree(); } diff --git a/src/items/armor/Armor.tscn b/src/items/armor/Armor.tscn index ac1940e7..4aa3a6d9 100644 --- a/src/items/armor/Armor.tscn +++ b/src/items/armor/Armor.tscn @@ -1,14 +1,8 @@ -[gd_scene load_steps=6 format=3 uid="uid://dorr7v1tkeiy0"] +[gd_scene load_steps=5 format=3 uid="uid://dorr7v1tkeiy0"] [ext_resource type="Script" path="res://src/items/armor/Armor.cs" id="1_cmjpq"] [ext_resource type="Texture2D" uid="uid://cgoubcl86pib4" path="res://src/items/armor/armor.png" id="1_vpnem"] -[ext_resource type="Script" path="res://src/items/armor/ArmorInfo.cs" id="2_cuhrp"] - -[sub_resource type="Resource" id="Resource_o1cok"] -script = ExtResource("2_cuhrp") -Defense = 2 -Name = "Pathetic" -Description = "A pathetic coat." +[ext_resource type="Resource" uid="uid://chjmkb3aiomvr" path="res://src/items/armor/resources/PatheticCoat.tres" id="2_eftit"] [sub_resource type="CapsuleShape3D" id="CapsuleShape3D_1gpxo"] radius = 0.470016 @@ -16,7 +10,7 @@ height = 0.940032 [node name="Armor" type="Node3D"] script = ExtResource("1_cmjpq") -InventoryInfo = SubResource("Resource_o1cok") +Info = ExtResource("2_eftit") [node name="Sprite3D" type="Sprite3D" parent="."] billboard = 2 diff --git a/src/items/weapons/Weapon.cs b/src/items/weapons/Weapon.cs index edbacc14..1625944c 100644 --- a/src/items/weapons/Weapon.cs +++ b/src/items/weapons/Weapon.cs @@ -7,17 +7,17 @@ using System.Linq; [Meta(typeof(IAutoNode))] public partial class Weapon : InventoryItem { - public override void _Notification(int what) => this.Notify(what); - public Weapon() { - _inventoryInfo = WeaponInfo.Default; + Info = new WeaponInfo() { Damage = 1 }; } - [Export] - private WeaponInfo _inventoryInfo { get; set; } + public override void _Notification(int what) => this.Notify(what); - public override InventoryItemInfo InventoryInfo { get => _inventoryInfo; set => _inventoryInfo = value as WeaponInfo; } + [Export] + internal override InventoryItemInfo Info { get; set; } + + public WeaponInfo WeaponInfo { get => (WeaponInfo)Info; } public void OnReady() { @@ -26,7 +26,7 @@ public partial class Weapon : InventoryItem public void OnEntered(Node3D body) { - var inventoryList = GameRepo.InventoryItems.Value.Append(InventoryInfo).ToList(); + var inventoryList = GameRepo.InventoryItems.Value.Append(this).ToList(); GameRepo.InventoryItems.OnNext(inventoryList); QueueFree(); } diff --git a/src/items/weapons/WeaponInfo.cs b/src/items/weapons/WeaponInfo.cs index 03557b46..b9cc56b1 100644 --- a/src/items/weapons/WeaponInfo.cs +++ b/src/items/weapons/WeaponInfo.cs @@ -17,6 +17,4 @@ public partial class WeaponInfo : InventoryItemInfo [Export] public double IgneousDamageBonus { get; set; } - - public static WeaponInfo Default => new WeaponInfo() { Damage = 1 }; } diff --git a/src/items/weapons/models/CommonSword.tscn b/src/items/weapons/models/CommonSword.tscn index 96f97287..a4039233 100644 --- a/src/items/weapons/models/CommonSword.tscn +++ b/src/items/weapons/models/CommonSword.tscn @@ -10,7 +10,7 @@ height = 0.940032 [node name="CommonSword" type="Node3D"] script = ExtResource("1_sr3bh") -_inventoryInfo = ExtResource("2_krjts") +Info = ExtResource("2_krjts") [node name="Sprite3D" type="Sprite3D" parent="."] billboard = 2 diff --git a/src/items/weapons/models/RareSword.tscn b/src/items/weapons/models/RareSword.tscn index f6cd759b..e32d3a52 100644 --- a/src/items/weapons/models/RareSword.tscn +++ b/src/items/weapons/models/RareSword.tscn @@ -10,7 +10,7 @@ height = 0.940032 [node name="RareSword" type="Node3D"] script = ExtResource("1_f8v7v") -_inventoryInfo = ExtResource("2_6nmyd") +Info = ExtResource("2_6nmyd") [node name="Sprite3D" type="Sprite3D" parent="."] billboard = 2 diff --git a/src/items/weapons/models/UncommonSword.tscn b/src/items/weapons/models/UncommonSword.tscn index 35c232ce..b4e938ba 100644 --- a/src/items/weapons/models/UncommonSword.tscn +++ b/src/items/weapons/models/UncommonSword.tscn @@ -10,7 +10,7 @@ height = 0.940032 [node name="UncommonSword" type="Node3D"] script = ExtResource("1_3o4dy") -_inventoryInfo = ExtResource("2_ga52m") +Info = ExtResource("2_ga52m") [node name="Sprite3D" type="Sprite3D" parent="."] billboard = 2 diff --git a/src/map/dungeon/rooms/DungeonRoom.cs b/src/map/dungeon/rooms/DungeonRoom.cs index 28b46c6a..3926f4be 100644 --- a/src/map/dungeon/rooms/DungeonRoom.cs +++ b/src/map/dungeon/rooms/DungeonRoom.cs @@ -3,6 +3,7 @@ using Chickensoft.GodotNodeInterfaces; using Chickensoft.Introspection; using GameJamDungeon; using Godot; +using System; public interface IDungeonRoom : INode3D { @@ -59,7 +60,7 @@ public partial class DungeonRoom : Node3D, IDungeonRoom, IProvide(); instantiatedItem.Position = spawnPoint.Position; AddChild(instantiatedItem); - GD.Print(instantiatedItem.InventoryInfo.Name); + GD.Print(instantiatedItem.Info.Name); } } diff --git a/src/map/dungeon/rooms/Room1.tscn b/src/map/dungeon/rooms/Room1.tscn index 5666d02a..7fb4c033 100644 --- a/src/map/dungeon/rooms/Room1.tscn +++ b/src/map/dungeon/rooms/Room1.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://dhpwwqow1ahrc"] +[gd_scene load_steps=19 format=3 uid="uid://dhpwwqow1ahrc"] [ext_resource type="Script" path="res://addons/SimpleDungeons/DungeonRoom3D.gd" id="1_0tfda"] [ext_resource type="Script" path="res://src/map/dungeon/rooms/DungeonRoom.cs" id="1_ti7ur"] @@ -9,6 +9,7 @@ [ext_resource type="PackedScene" uid="uid://cbb1fxllrnlyr" path="res://src/items/weapons/models/UncommonSword.tscn" id="5_viqv4"] [ext_resource type="PackedScene" uid="uid://c10nhqq8su6pp" path="res://src/items/weapons/models/RareSword.tscn" id="6_c8gn4"] [ext_resource type="PackedScene" uid="uid://dorr7v1tkeiy0" path="res://src/items/armor/Armor.tscn" id="7_bm50w"] +[ext_resource type="PackedScene" uid="uid://1bbmod6680c2" path="res://src/items/accessory/Accessory.tscn" id="8_1psf1"] [ext_resource type="PackedScene" uid="uid://d4l4qutp8x40c" path="res://src/npc/goddess/Goddess.tscn" id="10_82rsb"] [sub_resource type="PlaneMesh" id="PlaneMesh_luhnj"] @@ -65,8 +66,8 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.053, -3, 0) [node name="ItemDatabase" parent="." instance=ExtResource("4_2mnb7")] unique_name_in_owner = true -ItemScene = Array[PackedScene]([ExtResource("7_bm50w"), ExtResource("4_chdi8"), ExtResource("5_viqv4"), ExtResource("6_c8gn4")]) -DropRate = PackedFloat32Array(0.25, 0.25, 0.25, 0.25) +ItemScene = Array[PackedScene]([ExtResource("7_bm50w"), ExtResource("4_chdi8"), ExtResource("5_viqv4"), ExtResource("6_c8gn4"), ExtResource("8_1psf1")]) +DropRate = PackedFloat32Array(0.25, 0.25, 0.25, 0.25, 0.25) [node name="EnemyDatabase" parent="." instance=ExtResource("5_owpbq")] unique_name_in_owner = true diff --git a/src/map/dungeon/rooms/Room2.tscn b/src/map/dungeon/rooms/Room2.tscn index 0023de57..30d5bceb 100644 --- a/src/map/dungeon/rooms/Room2.tscn +++ b/src/map/dungeon/rooms/Room2.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=18 format=3 uid="uid://bbwgmqy3evhh2"] +[gd_scene load_steps=19 format=3 uid="uid://bbwgmqy3evhh2"] [ext_resource type="Script" path="res://addons/SimpleDungeons/DungeonRoom3D.gd" id="1_o02dd"] [ext_resource type="Script" path="res://src/map/dungeon/rooms/DungeonRoom.cs" id="2_jrlll"] @@ -9,6 +9,7 @@ [ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="5_fabiq"] [ext_resource type="PackedScene" uid="uid://cbb1fxllrnlyr" path="res://src/items/weapons/models/UncommonSword.tscn" id="6_hb3sb"] [ext_resource type="PackedScene" uid="uid://c10nhqq8su6pp" path="res://src/items/weapons/models/RareSword.tscn" id="7_c5lye"] +[ext_resource type="PackedScene" uid="uid://1bbmod6680c2" path="res://src/items/accessory/Accessory.tscn" id="8_1fvbo"] [sub_resource type="PlaneMesh" id="PlaneMesh_j8q3j"] size = Vector2(50, 10) @@ -80,8 +81,8 @@ mesh = SubResource("PlaneMesh_j8q3j") [node name="ItemDatabase" parent="." instance=ExtResource("4_c51bx")] unique_name_in_owner = true -ItemScene = Array[PackedScene]([ExtResource("4_2bf0o"), ExtResource("4_wqpwj"), ExtResource("6_hb3sb"), ExtResource("7_c5lye")]) -DropRate = PackedFloat32Array(0.25, 0.25, 0.25, 0.25) +ItemScene = Array[PackedScene]([ExtResource("4_2bf0o"), ExtResource("4_wqpwj"), ExtResource("6_hb3sb"), ExtResource("7_c5lye"), ExtResource("8_1fvbo")]) +DropRate = PackedFloat32Array(0.25, 0.25, 0.25, 0.25, 0.25) [node name="EnemyDatabase" parent="." instance=ExtResource("5_fabiq")] unique_name_in_owner = true diff --git a/src/player/Player.cs b/src/player/Player.cs index 15d771b8..57884a57 100644 --- a/src/player/Player.cs +++ b/src/player/Player.cs @@ -75,7 +75,7 @@ namespace GameJamDungeon [Node] public IArea3D CollisionDetector { get; set; } = default!; - private IAutoProp EquippedWeapon { get; set; } = default!; + private IAutoProp EquippedWeapon { get; set; } = default!; private AutoProp _currentHP { get; set; } = default!; @@ -100,7 +100,7 @@ namespace GameJamDungeon GameRepo.SetPlayerGlobalPosition(GlobalPosition); GameRepo.PlayerGlobalPosition.Sync += OnPlayerPositionUpdated; - EquippedWeapon = new AutoProp(WeaponInfo.Default); + EquippedWeapon = new AutoProp(new Weapon()); EquippedWeapon.Sync += OnEquippedWeaponChanged; _currentHP = new AutoProp(PlayerStatInfo.MaximumHP); @@ -209,7 +209,7 @@ namespace GameJamDungeon AnimationPlayer.AnimationFinished -= OnAnimationFinished; } - private void OnEquippedWeaponChanged(WeaponInfo info) => Hitbox.Damage = info.Damage; + private void OnEquippedWeaponChanged(Weapon info) => Hitbox.Damage = info.WeaponInfo.Damage; private void OnHPChanged(double newHP) { diff --git a/src/system/stats/DamageCalculator.cs b/src/system/stats/DamageCalculator.cs index a59fb493..339595d5 100644 --- a/src/system/stats/DamageCalculator.cs +++ b/src/system/stats/DamageCalculator.cs @@ -4,27 +4,27 @@ namespace GameJamDungeon { public static class DamageCalculator { - public static double CalculatePlayerDamage(int attackDamage, PlayerStatInfo playerStatInfo, EnemyStatInfo enemyStatInfo, WeaponInfo weapon) + public static double CalculatePlayerDamage(int attackDamage, PlayerStatInfo playerStatInfo, EnemyStatInfo enemyStatInfo, Weapon weapon) { var baseDamage = attackDamage + playerStatInfo.BaseAttack; - var elementADamage = (weapon.BaseHydricDamageBonus > 0 ? weapon.BaseHydricDamageBonus - enemyStatInfo.HydricResistance : 0) / 100; - var elementBDamage = (weapon.IgneousDamageBonus > 0 ? weapon.IgneousDamageBonus - enemyStatInfo.IgneousResistance : 0) / 100; - var elementCDamage = (weapon.TelluricDamageBonus > 0 ? weapon.TelluricDamageBonus - enemyStatInfo.TelluricResistance : 0) / 100; - var elementDDamage = (weapon.AeolicDamageBonus > 0 ? weapon.AeolicDamageBonus - enemyStatInfo.AeolicResistance : 0) / 100; + var elementADamage = (weapon.WeaponInfo.BaseHydricDamageBonus > 0 ? weapon.WeaponInfo.BaseHydricDamageBonus - enemyStatInfo.HydricResistance : 0) / 100; + var elementBDamage = (weapon.WeaponInfo.IgneousDamageBonus > 0 ? weapon.WeaponInfo.IgneousDamageBonus - enemyStatInfo.IgneousResistance : 0) / 100; + var elementCDamage = (weapon.WeaponInfo.TelluricDamageBonus > 0 ? weapon.WeaponInfo.TelluricDamageBonus - enemyStatInfo.TelluricResistance : 0) / 100; + var elementDDamage = (weapon.WeaponInfo.AeolicDamageBonus > 0 ? weapon.WeaponInfo.AeolicDamageBonus - enemyStatInfo.AeolicResistance : 0) / 100; var elementalBonusDamage = baseDamage + (baseDamage * elementADamage) + (baseDamage * elementBDamage) + (baseDamage * elementCDamage) + (baseDamage * elementDDamage); var calculatedDamage = elementalBonusDamage - enemyStatInfo.BaseDefense; return calculatedDamage; } - public static double CalculateEnemyDamage(int attackDamage, PlayerStatInfo playerStatInfo, EnemyStatInfo enemyStatInfo, ArmorInfo armor) + public static double CalculateEnemyDamage(int attackDamage, PlayerStatInfo playerStatInfo, EnemyStatInfo enemyStatInfo, Armor armor) { var baseDamage = attackDamage + enemyStatInfo.BaseAttack; - var elementADamage = (enemyStatInfo.BaseHydricDamageBonus > 0 ? enemyStatInfo.BaseHydricDamageBonus - armor.HydricResistance : 0) / 100; - var elementBDamage = (enemyStatInfo.IgneousDamageBonus > 0 ? enemyStatInfo.IgneousDamageBonus - armor.IgneousResistance : 0) / 100; - var elementCDamage = (enemyStatInfo.TelluricDamageBonus > 0 ? enemyStatInfo.TelluricDamageBonus - armor.TelluricResistance : 0) / 100; - var elementDDamage = (enemyStatInfo.AeolicDamageBonus > 0 ? enemyStatInfo.AeolicDamageBonus - armor.AeolicResistance : 0) / 100; + var elementADamage = (enemyStatInfo.BaseHydricDamageBonus > 0 ? enemyStatInfo.BaseHydricDamageBonus - armor.ArmorInfo.HydricResistance : 0) / 100; + var elementBDamage = (enemyStatInfo.IgneousDamageBonus > 0 ? enemyStatInfo.IgneousDamageBonus - armor.ArmorInfo.IgneousResistance : 0) / 100; + var elementCDamage = (enemyStatInfo.TelluricDamageBonus > 0 ? enemyStatInfo.TelluricDamageBonus - armor.ArmorInfo.TelluricResistance : 0) / 100; + var elementDDamage = (enemyStatInfo.AeolicDamageBonus > 0 ? enemyStatInfo.AeolicDamageBonus - armor.ArmorInfo.AeolicResistance : 0) / 100; var elementalBonusDamage = baseDamage + (baseDamage * elementADamage) + (baseDamage * elementBDamage) + (baseDamage * elementCDamage) + (baseDamage * elementDDamage); - var calculatedDamage = elementalBonusDamage - playerStatInfo.BaseDefense - armor.Defense; + var calculatedDamage = elementalBonusDamage - playerStatInfo.BaseDefense - (armor != null ? armor.ArmorInfo.Defense : 0); return calculatedDamage; } }