From a1c66df038cea72decbb377c6d90ae12405102bb Mon Sep 17 00:00:00 2001 From: Zenny Date: Wed, 12 Feb 2025 00:49:16 -0800 Subject: [PATCH] Add more floors, light refactoring --- .editorconfig | 3 + src/audio/InGameAudio.cs | 3 + .../states/InGameAudioLogic.State.Enabled.cs | 14 ++-- src/enemy/WeaponTag.cs | 4 + src/enemy/state/EnemyLogic.g.puml | 1 - .../states/EnemyLogic.State.FollowPlayer.cs | 7 +- src/game/Game.cs | 73 ++++++------------- src/game/GameEventDepot.cs | 33 --------- src/game/IGame.cs | 12 +-- src/inventory_menu/InventoryMenu.cs | 7 +- src/items/IEquipableItem.cs | 8 +- src/items/Inventory.cs | 50 ++++++++----- src/items/InventoryItemStats.cs | 3 + src/items/accessory/Accessory.cs | 12 +-- src/items/armor/Armor.cs | 15 +--- src/items/consumable/ConsumableItem.cs | 15 ++-- src/items/dropped/DroppedItem.cs | 4 +- src/items/throwable/ThrowableItem.cs | 4 +- src/items/weapons/Weapon.cs | 12 +-- src/map/dungeon/floors/Floor00.tscn | 1 - src/map/dungeon/floors/Floor01.tscn | 8 +- src/map/dungeon/floors/Floor02.tscn | 8 +- src/map/dungeon/floors/Floor03.tscn | 2 +- src/map/dungeon/floors/Floor04.tscn | 41 +++++++++++ src/map/dungeon/floors/Floor05.tscn | 42 +++++++++++ src/map/dungeon/floors/Floor06.tscn | 41 +++++++++++ src/map/dungeon/floors/Floor07.tscn | 42 +++++++++++ src/map/dungeon/floors/Floor08.tscn | 40 ++++++++++ src/map/dungeon/floors/Floor09.tscn | 42 +++++++++++ src/player/IPlayer.cs | 14 ++++ src/player/Player.cs | 47 +++++++++++- 31 files changed, 422 insertions(+), 186 deletions(-) create mode 100644 src/map/dungeon/floors/Floor04.tscn create mode 100644 src/map/dungeon/floors/Floor05.tscn create mode 100644 src/map/dungeon/floors/Floor06.tscn create mode 100644 src/map/dungeon/floors/Floor07.tscn create mode 100644 src/map/dungeon/floors/Floor08.tscn create mode 100644 src/map/dungeon/floors/Floor09.tscn diff --git a/.editorconfig b/.editorconfig index 374a7e35..12c18476 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,3 +5,6 @@ dotnet_diagnostic.CS8632.severity = silent # CS1998: Async method lacks 'await' operators and will run synchronously dotnet_diagnostic.CS1998.severity = silent + +# IDE1006: Naming Styles +dotnet_diagnostic.IDE1006.severity = none diff --git a/src/audio/InGameAudio.cs b/src/audio/InGameAudio.cs index 6f515999..8d0e77a5 100644 --- a/src/audio/InGameAudio.cs +++ b/src/audio/InGameAudio.cs @@ -14,6 +14,8 @@ public partial class InGameAudio : Node [Dependency] public IGameEventDepot GameEventDepot => this.DependOn(); + [Dependency] public IPlayer Player => this.DependOn(); + #region BGM Nodes [Node] public IDimmableAudioStreamPlayer MenuBgm { get; set; } = default!; @@ -54,6 +56,7 @@ public partial class InGameAudio : Node { InGameAudioLogic.Set(AppRepo); InGameAudioLogic.Set(GameEventDepot); + InGameAudioLogic.Set(Player); InGameAudioBinding = InGameAudioLogic.Bind(); diff --git a/src/audio/state/states/InGameAudioLogic.State.Enabled.cs b/src/audio/state/states/InGameAudioLogic.State.Enabled.cs index 7ca91adb..214de34a 100644 --- a/src/audio/state/states/InGameAudioLogic.State.Enabled.cs +++ b/src/audio/state/states/InGameAudioLogic.State.Enabled.cs @@ -11,15 +11,16 @@ public partial class InGameAudioLogic { OnAttach(() => { + var player = Get(); OnOverworldEntered(); var gameEventDepot = Get(); gameEventDepot.OverworldEntered += OnOverworldEntered; gameEventDepot.DungeonAThemeAreaEntered += OnDungeonAThemeEntered; gameEventDepot.MenuScrolled += OnMenuScrolled; gameEventDepot.MenuBackedOut += OnMenuBackedOut; - gameEventDepot.EquippedWeapon += OnEquippedItem; - gameEventDepot.EquippedArmor += OnEquippedItem; - gameEventDepot.EquippedAccessory += OnEquippedItem; + player.Inventory.EquippedWeapon.Changed += OnEquippedItem; + player.Inventory.EquippedArmor.Changed += OnEquippedItem; + player.Inventory.EquippedAccessory.Changed += OnEquippedItem; gameEventDepot.InventorySorted += OnInventorySorted; gameEventDepot.HealingItemConsumed += OnHealingItemConsumed; gameEventDepot.RestorativePickedUp += OnRestorativePickedUp; @@ -28,13 +29,14 @@ public partial class InGameAudioLogic OnDetach(() => { var gameEventDepot = Get(); + var player = Get(); gameEventDepot.OverworldEntered -= OnOverworldEntered; gameEventDepot.DungeonAThemeAreaEntered -= OnDungeonAThemeEntered; gameEventDepot.MenuScrolled -= OnMenuScrolled; gameEventDepot.MenuBackedOut -= OnMenuBackedOut; - gameEventDepot.EquippedWeapon -= OnEquippedItem; - gameEventDepot.EquippedArmor -= OnEquippedItem; - gameEventDepot.EquippedAccessory -= OnEquippedItem; + player.Inventory.EquippedWeapon.Changed -= OnEquippedItem; + player.Inventory.EquippedArmor.Changed -= OnEquippedItem; + player.Inventory.EquippedAccessory.Changed -= OnEquippedItem; gameEventDepot.InventorySorted -= OnInventorySorted; gameEventDepot.TeleportEntered -= OnTeleportEntered; }); diff --git a/src/enemy/WeaponTag.cs b/src/enemy/WeaponTag.cs index f5770662..bc1766a8 100644 --- a/src/enemy/WeaponTag.cs +++ b/src/enemy/WeaponTag.cs @@ -5,5 +5,9 @@ public enum WeaponTag SelfDamage, IgnoreAffinity, Knockback, +} + +public enum ItemTag +{ BreaksOnChange } diff --git a/src/enemy/state/EnemyLogic.g.puml b/src/enemy/state/EnemyLogic.g.puml index a0374ec7..72ff7d28 100644 --- a/src/enemy/state/EnemyLogic.g.puml +++ b/src/enemy/state/EnemyLogic.g.puml @@ -19,7 +19,6 @@ GameJamDungeon_EnemyLogic_State_Alive --> GameJamDungeon_EnemyLogic_State_Idle : GameJamDungeon_EnemyLogic_State_Attacking --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_FollowPlayer : PhysicsTick GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_Idle : LostPlayer -GameJamDungeon_EnemyLogic_State_FollowPlayer --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving GameJamDungeon_EnemyLogic_State_Idle --> GameJamDungeon_EnemyLogic_State_Patrolling : StartPatrol GameJamDungeon_EnemyLogic_State_Patrolling --> GameJamDungeon_EnemyLogic_State_Idle : StopMoving GameJamDungeon_EnemyLogic_State_Patrolling --> GameJamDungeon_EnemyLogic_State_Patrolling : PatrolToRandomSpot diff --git a/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs b/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs index 322fe2a2..0eeee090 100644 --- a/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs +++ b/src/enemy/state/states/EnemyLogic.State.FollowPlayer.cs @@ -7,7 +7,7 @@ public partial class EnemyLogic public partial record State { [Meta, Id("enemy_logic_state_followplayer")] - public partial record FollowPlayer : Activated, IGet, IGet, IGet + public partial record FollowPlayer : Activated, IGet, IGet { public Transition On(in Input.PhysicsTick input) { @@ -23,11 +23,6 @@ public partial class EnemyLogic { return To(); } - - public Transition On(in Input.StopMoving _) - { - return To(); - } } } } diff --git a/src/game/Game.cs b/src/game/Game.cs index 9319e755..8c683046 100644 --- a/src/game/Game.cs +++ b/src/game/Game.cs @@ -35,21 +35,21 @@ public partial class Game : Node3D, IGame [Dependency] public IAppRepo AppRepo => this.DependOn(); #region Nodes - [Node] public IMap Map { get; set; } = default!; + [Node] private IMap Map { get; set; } = default!; - [Node] public IPlayer Player { get; set; } = default!; + [Node] private InGameUI InGameUI { get; set; } = default!; - [Node] public InGameUI InGameUI { get; set; } = default!; + [Node] private IFloorClearMenu FloorClearMenu { get; set; } = default!; - [Node] public IFloorClearMenu FloorClearMenu { get; set; } = default!; + [Node] private DeathMenu DeathMenu { get; set; } = default!; - [Node] public DeathMenu DeathMenu { get; set; } = default!; + [Node] private IPauseMenu PauseMenu { get; set; } = default!; - [Node] public IPauseMenu PauseMenu { get; set; } = default!; + [Node] private InGameAudio InGameAudio { get; set; } = default!; - [Node] public InGameAudio InGameAudio { get; set; } = default!; + [Node] private Timer DoubleEXPTimer { get; set; } = default!; - [Node] public Timer DoubleEXPTimer { get; set; } = default!; + [Node] private IPlayer Player { get; set; } = default!; #endregion public RescuedItemDatabase RescuedItems { get; set; } = default!; @@ -121,7 +121,6 @@ public partial class Game : Node3D, IGame Player.Inventory.InventoryAtCapacity += PlayerInventory_InventoryAtCapacity; Player.Inventory.PickedUpItem += Inventory_PickedUpItem; - Player.Inventory.RaiseStatRequest += Inventory_RaiseStatRequest; FloorClearMenu.GoToNextFloor += FloorClearMenu_GoToNextFloor; FloorClearMenu.SaveAndExit += FloorClearMenu_SaveAndExit; FloorClearMenu.TransitionCompleted += FloorClearMenu_TransitionCompleted; @@ -166,6 +165,16 @@ public partial class Game : Node3D, IGame thrown.Throw(); } + public void AnnounceMessageOnInventoryScreen(string message) + { + InGameUI.InventoryMenu.ShowMessage(message); + } + + public void AnnounceMessageOnMainScreen(string message) + { + InGameUI.PlayerInfoUI.DisplayMessage(message); + } + private void OnEnemyDefeated(Vector3 vector, EnemyStatResource resource) { Player.GainExp(resource.ExpFromDefeat * GameRepo.EXPRate); @@ -209,8 +218,12 @@ public partial class Game : Node3D, IGame private void FloorClearMenu_TransitionCompleted() { GameRepo.Resume(); - if (Player.Inventory.EquippedWeapon.Value.WeaponTags.Contains(WeaponTag.BreaksOnChange)) + if (Player.Inventory.EquippedWeapon.Value.ItemTags.Contains(ItemTag.BreaksOnChange)) Player.Inventory.Unequip(Player.Inventory.EquippedWeapon.Value); + if (Player.Inventory.EquippedArmor.Value.ItemTags.Contains(ItemTag.BreaksOnChange)) + Player.Inventory.Unequip(Player.Inventory.EquippedArmor.Value); + if (Player.Inventory.EquippedAccessory.Value.ItemTags.Contains(ItemTag.BreaksOnChange)) + Player.Inventory.Unequip(Player.Inventory.EquippedAccessory.Value); } private void FloorClearMenu_GoToNextFloor() @@ -228,52 +241,12 @@ public partial class Game : Node3D, IGame private void GameEventDepot_RestorativePickedUp(Restorative obj) => Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + obj.VTRestoreAmount); - private void Inventory_RaiseStatRequest(InventoryItemStats itemStats) - { - HealHP(itemStats.HealHPAmount); - HealVT(itemStats.HealVTAmount); - } - private void SetPauseMode(bool isPaused) { if (GetTree() != null) GetTree().Paused = isPaused; } - public void RaiseHP(int amountToRaise) - { - if (Player.Stats.CurrentHP.Value == Player.Stats.MaximumHP.Value) - { - Player.Stats.SetMaximumHP(Player.Stats.MaximumHP.Value + amountToRaise); - Player.Stats.SetCurrentHP(Player.Stats.MaximumHP.Value); - EmitSignal(SignalName.StatRaisedAlert, $"{amountToRaise}MAXHP Up."); - } - } - - public void HealHP(int amountToRestore) - { - Player.Stats.SetCurrentHP(Player.Stats.CurrentHP.Value + amountToRestore); - var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; - EmitSignal(SignalName.StatRaisedAlert, $"{raiseString}HP Restored."); - } - - public void RaiseVT(int amountToRaise) - { - if (Player.Stats.CurrentVT.Value == Player.Stats.MaximumVT.Value) - { - Player.Stats.SetMaximumVT(Player.Stats.MaximumVT.Value + amountToRaise); - Player.Stats.SetCurrentVT(Player.Stats.MaximumVT.Value); - EmitSignal(SignalName.StatRaisedAlert, $"{amountToRaise}MAXVT Up."); - } - } - - public void HealVT(int amountToRestore) - { - Player.Stats.SetCurrentVT(Player.Stats.CurrentVT.Value + amountToRestore); - var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; - EmitSignal(SignalName.StatRaisedAlert, $"{raiseString}VT Restored."); - } - public async void DoubleEXP(TimeSpan lengthOfEffect) { InventoryMenu_CloseInventory(); diff --git a/src/game/GameEventDepot.cs b/src/game/GameEventDepot.cs index 74e6ddc4..10097851 100644 --- a/src/game/GameEventDepot.cs +++ b/src/game/GameEventDepot.cs @@ -26,24 +26,6 @@ public interface IGameEventDepot : IDisposable event Action? MenuBackedOut; public void OnMenuBackedOut(); - event Action? EquippedWeapon; - public void OnEquippedWeapon(Weapon equippedWeapon); - - event Action? UnequippedWeapon; - public void OnUnequippedWeapon(); - - event Action? EquippedArmor; - public void OnEquippedArmor(Armor equippedArmor); - - event Action? UnequippedArmor; - public void OnUnequippedArmor(); - - event Action? EquippedAccessory; - public void OnEquippedAccessory(Accessory equippedAccessory); - - event Action? UnequippedAccessory; - public void OnUnequippedAccessory(); - event Action? InventorySorted; public void OnInventorySorted(); @@ -69,12 +51,6 @@ public class GameEventDepot : IGameEventDepot public event Action? MenuScrolled; public event Action? MenuBackedOut; - public event Action? EquippedWeapon; - public event Action? UnequippedWeapon; - public event Action? EquippedArmor; - public event Action? UnequippedArmor; - public event Action? EquippedAccessory; - public event Action? UnequippedAccessory; public event Action? InventorySorted; public event Action? HealingItemConsumed; public event Action? RestorativePickedUp; @@ -91,15 +67,6 @@ public class GameEventDepot : IGameEventDepot public void OnMenuScrolled() => MenuScrolled?.Invoke(); public void OnMenuBackedOut() => MenuBackedOut?.Invoke(); - public void OnEquippedWeapon(Weapon equippedWeapon) => EquippedWeapon?.Invoke(equippedWeapon); - public void OnUnequippedWeapon() => UnequippedWeapon?.Invoke(); - - public void OnEquippedArmor(Armor equippedArmor) => EquippedArmor?.Invoke(equippedArmor); - public void OnUnequippedArmor() => UnequippedArmor?.Invoke(); - - public void OnEquippedAccessory(Accessory equippedAccessory) => EquippedAccessory?.Invoke(equippedAccessory); - public void OnUnequippedAccessory() => UnequippedAccessory?.Invoke(); - public void OnInventorySorted() => InventorySorted?.Invoke(); public void OnHealingItemConsumed(ConsumableItemStats item) => HealingItemConsumed?.Invoke(item); public void OnRestorativePickedUp(Restorative restorative) => RestorativePickedUp?.Invoke(restorative); diff --git a/src/game/IGame.cs b/src/game/IGame.cs index c40792d3..6dfe6430 100644 --- a/src/game/IGame.cs +++ b/src/game/IGame.cs @@ -9,23 +9,19 @@ public interface IGame : IProvide, IProvide, IProvid { event Game.StatRaisedAlertEventHandler StatRaisedAlert; - public IPlayer Player { get; } - public RescuedItemDatabase RescuedItems { get; } public void DropItem(IInventoryItem item); public void ThrowItem(IInventoryItem item); - public void HealHP(int amountToRaise); - public void RaiseHP(int amountToRaise); - - public void HealVT(int amountToRaise); - public void RaiseVT(int amountToRaise); - public void DoubleEXP(TimeSpan lengthOfEffect); public void ToggleInventory(); public void ToggleMinimap(); + + public void AnnounceMessageOnInventoryScreen(string message); + + public void AnnounceMessageOnMainScreen(string message); } diff --git a/src/inventory_menu/InventoryMenu.cs b/src/inventory_menu/InventoryMenu.cs index 70e99f86..75ef6998 100644 --- a/src/inventory_menu/InventoryMenu.cs +++ b/src/inventory_menu/InventoryMenu.cs @@ -11,6 +11,8 @@ public interface IInventoryMenu : IControl { public Task RedrawInventory(); + public Task ShowMessage(string message); + event InventoryMenu.ClosedMenuEventHandler ClosedMenu; } @@ -93,16 +95,15 @@ public partial class InventoryMenu : Control, IInventoryMenu Player.Inventory.EquippedArmor.Sync += EquippedArmor_Sync; Player.Inventory.EquippedAccessory.Sync += EquippedAccessory_Sync; - Game.StatRaisedAlert += Game_StatRaisedAlert; SetProcessInput(false); } - private async void Game_StatRaisedAlert(string statRaisedAlert) + public async Task ShowMessage(string message) { SetProcessInput(false); await HideUserActionPrompt(); await ShowInventoryInfo(); - ItemEffectLabel.Text = statRaisedAlert; + ItemEffectLabel.Text = message; await ToSignal(GetTree().CreateTimer(1f), "timeout"); await RedrawInventory(); SetProcessInput(true); diff --git a/src/items/IEquipableItem.cs b/src/items/IEquipableItem.cs index d6c04193..813e7a58 100644 --- a/src/items/IEquipableItem.cs +++ b/src/items/IEquipableItem.cs @@ -1,8 +1,8 @@ -namespace GameJamDungeon; +using System.Collections.Immutable; + +namespace GameJamDungeon; public interface IEquipableItem : IInventoryItem { - public void Equip(); - - public void Unequip(); + public ImmutableList ItemTags { get; } } diff --git a/src/items/Inventory.cs b/src/items/Inventory.cs index 059b8e11..6a92d845 100644 --- a/src/items/Inventory.cs +++ b/src/items/Inventory.cs @@ -1,4 +1,5 @@ -using Chickensoft.Collections; +using Chickensoft.AutoInject; +using Chickensoft.Collections; using Chickensoft.GodotNodeInterfaces; using Godot; using System; @@ -31,24 +32,18 @@ public interface IInventory : INode event Inventory.InventoryAtCapacityEventHandler InventoryAtCapacity; event Inventory.PickedUpItemEventHandler PickedUpItem; - - event Inventory.AccessoryUnequippedEventHandler AccessoryUnequipped; - - event Inventory.RaiseStatRequestEventHandler RaiseStatRequest; } public partial class Inventory : Node, IInventory { + public override void _Notification(int what) => this.Notify(what); + // TODO: Constants class with export private const int _maxInventorySize = 20; [Signal] public delegate void InventoryAtCapacityEventHandler(string rejectedItemName); [Signal] - public delegate void AccessoryUnequippedEventHandler(Accessory unequippedAccessory); - [Signal] - public delegate void RaiseStatRequestEventHandler(ConsumableItemStats consumableItemStats); - [Signal] public delegate void PickedUpItemEventHandler(string pickedUpItemName); public Inventory() @@ -56,6 +51,27 @@ public partial class Inventory : Node, IInventory Items = []; } + public void Setup() + { + EquippedWeapon.Changed += EquippedWeapon_Changed; + EquippedArmor.Changed += EquippedArmor_Changed; + EquippedAccessory.Changed += EquippedAccessory_Changed; + } + + private void EquippedAccessory_Changed(Accessory obj) + { + } + + private void EquippedArmor_Changed(Armor obj) + { + throw new NotImplementedException(); + } + + private void EquippedWeapon_Changed(Weapon obj) + { + throw new NotImplementedException(); + } + public List Items { get; private set; } public IAutoProp EquippedWeapon => _equippedWeapon; @@ -96,21 +112,17 @@ public partial class Inventory : Node, IInventory public void Unequip(IEquipableItem equipable) { - if (equipable is Weapon weapon) - { + if (equipable is Weapon) _equippedWeapon.OnNext(new Weapon()); - if (weapon.WeaponTags.Contains(WeaponTag.BreaksOnChange)) - Items.Remove(weapon); - } - else if (equipable is Armor armor) + else if (equipable is Armor) _equippedArmor.OnNext(new Armor()); - else if (equipable is Accessory accessory) - { - EmitSignal(SignalName.AccessoryUnequipped, _equippedAccessory.Value); + else if (equipable is Accessory) _equippedAccessory.OnNext(new Accessory()); - } else throw new NotImplementedException("Item type is not supported."); + + if (equipable.ItemTags.Contains(ItemTag.BreaksOnChange)) + Remove(equipable); } public bool IsEquipped(IEquipableItem equipable) diff --git a/src/items/InventoryItemStats.cs b/src/items/InventoryItemStats.cs index 78a6e8b0..6517ab15 100644 --- a/src/items/InventoryItemStats.cs +++ b/src/items/InventoryItemStats.cs @@ -26,4 +26,7 @@ public partial class InventoryItemStats : Resource [Export(PropertyHint.Range, "0, 999, 1")] public int ThrowDamage { get; set; } = 5; + + [Export] + public Godot.Collections.Array ItemTags { get; set; } = new Godot.Collections.Array(); } \ No newline at end of file diff --git a/src/items/accessory/Accessory.cs b/src/items/accessory/Accessory.cs index bed3a7c7..ae849d25 100644 --- a/src/items/accessory/Accessory.cs +++ b/src/items/accessory/Accessory.cs @@ -43,6 +43,8 @@ public partial class Accessory : Node3D, IEquipableItem public ImmutableList AccessoryTags => [.. _accessoryStats.AccessoryTags]; + public ImmutableList ItemTags => [.. _accessoryStats.ItemTags]; + public void OnReady() { Pickup.BodyEntered += OnEntered; @@ -54,16 +56,6 @@ public partial class Accessory : Node3D, IEquipableItem _accessoryStats = (AccessoryStats)inventoryItemStats; } - public void Equip() - { - GameEventDepot.OnEquippedAccessory(this); - } - - public void Unequip() - { - GameEventDepot.OnUnequippedAccessory(); - } - public void Throw() { Player.Inventory.Remove(this); diff --git a/src/items/armor/Armor.cs b/src/items/armor/Armor.cs index be64fbfd..f5c632c3 100644 --- a/src/items/armor/Armor.cs +++ b/src/items/armor/Armor.cs @@ -2,6 +2,7 @@ using Chickensoft.AutoInject; using Chickensoft.Introspection; using Godot; using System; +using System.Collections.Immutable; namespace GameJamDungeon; @@ -10,8 +11,6 @@ public partial class Armor : Node3D, IEquipableItem { public override void _Notification(int what) => this.Notify(what); - [Dependency] public IGameEventDepot GameEventDepot => this.DependOn(); - [Dependency] public IPlayer Player => this.DependOn(); [Export] private ArmorStats _armorStats { get; set; } = new ArmorStats(); @@ -36,6 +35,8 @@ public partial class Armor : Node3D, IEquipableItem public int Defense => _armorStats.Defense; + public ImmutableList ItemTags => [.. _armorStats.ItemTags]; + public void OnReady() { Pickup.BodyEntered += OnEntered; @@ -47,16 +48,6 @@ public partial class Armor : Node3D, IEquipableItem _armorStats = (ArmorStats)inventoryItemStats; } - public void Equip() - { - GameEventDepot.OnEquippedArmor(this); - } - - public void Unequip() - { - GameEventDepot.OnUnequippedArmor(); - } - public void Throw() { Player.Inventory.Remove(this); diff --git a/src/items/consumable/ConsumableItem.cs b/src/items/consumable/ConsumableItem.cs index 7a81826c..8290d134 100644 --- a/src/items/consumable/ConsumableItem.cs +++ b/src/items/consumable/ConsumableItem.cs @@ -10,9 +10,6 @@ public partial class ConsumableItem : Node3D, IUsableItem { public override void _Notification(int what) => this.Notify(what); - [Signal] - public delegate void RaiseStatRequestEventHandler(ConsumableItemStats consumableItemStats); - [Dependency] public IGame Game => this.DependOn(); [Dependency] public IPlayer Player => this.DependOn(); @@ -40,15 +37,15 @@ public partial class ConsumableItem : Node3D, IUsableItem public void Use() { - if (_consumableItemStats.RaiseHPAmount > 0) - Game.RaiseHP(_consumableItemStats.RaiseHPAmount); - if (_consumableItemStats.RaiseVTAmount > 0) - Game.RaiseVT(_consumableItemStats.RaiseVTAmount); + if (Player.Stats.CurrentHP.Value == Player.Stats.MaximumHP.Value && _consumableItemStats.RaiseHPAmount > 0) + Player.RaiseHP(_consumableItemStats.RaiseHPAmount); + if (Player.Stats.CurrentVT.Value == Player.Stats.MaximumVT.Value && _consumableItemStats.RaiseVTAmount > 0) + Player.RaiseVT(_consumableItemStats.RaiseVTAmount); if (_consumableItemStats.HealHPAmount > 0 && Player.Stats.CurrentHP.Value != Player.Stats.MaximumHP.Value) - Game.HealHP(_consumableItemStats.HealHPAmount); + Player.HealHP(_consumableItemStats.HealHPAmount); if (_consumableItemStats.HealVTAmount > 0 && Player.Stats.CurrentVT.Value != Player.Stats.MaximumVT.Value) - Game.HealVT(_consumableItemStats.HealVTAmount); + Player.HealVT(_consumableItemStats.HealVTAmount); } public void SetItemStats(InventoryItemStats inventoryItemStats) diff --git a/src/items/dropped/DroppedItem.cs b/src/items/dropped/DroppedItem.cs index 0f34885e..1c83219c 100644 --- a/src/items/dropped/DroppedItem.cs +++ b/src/items/dropped/DroppedItem.cs @@ -32,11 +32,11 @@ public partial class DroppedItem : RigidBody3D, IDroppedItem public async void Drop() { - AddCollisionExceptionWith((Node)Game.Player); + AddCollisionExceptionWith((Node)Player); GlobalPosition = Player.CurrentPosition + Vector3.Up; ApplyCentralImpulse(-Player.CurrentBasis.Z.Normalized() * 5.0f); await ToSignal(GetTree().CreateTimer(1.5), "timeout"); - RemoveCollisionExceptionWith((Node)Game.Player); + RemoveCollisionExceptionWith((Node)Player); } public void RescueItem() diff --git a/src/items/throwable/ThrowableItem.cs b/src/items/throwable/ThrowableItem.cs index 12ddc881..34658bb7 100644 --- a/src/items/throwable/ThrowableItem.cs +++ b/src/items/throwable/ThrowableItem.cs @@ -63,9 +63,9 @@ public partial class ThrowableItem : Node3D, IUsableItem public void Use() { if (_throwableItemStats.HealHPAmount > 0) - Game.HealHP(_throwableItemStats.HealHPAmount); + Player.HealHP(_throwableItemStats.HealHPAmount); if (_throwableItemStats.HealVTAmount > 0) - Game.HealVT(_throwableItemStats.HealVTAmount); + Player.HealVT(_throwableItemStats.HealVTAmount); if (_throwableItemStats.UsableItemTags.Contains(UsableItemTag.DoubleEXP)) Game.DoubleEXP(TimeSpan.FromSeconds(30)); diff --git a/src/items/weapons/Weapon.cs b/src/items/weapons/Weapon.cs index c6bb77a3..b76e5570 100644 --- a/src/items/weapons/Weapon.cs +++ b/src/items/weapons/Weapon.cs @@ -45,6 +45,8 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem public ImmutableList WeaponTags => [.. _weaponStats.WeaponTags]; + public ImmutableList ItemTags => [.. _weaponStats.ItemTags]; + public ElementType WeaponElement => _weaponStats.WeaponElement; public double ElementalDamageBonus => _weaponStats.ElementalDamageBonus; @@ -62,16 +64,6 @@ public partial class Weapon : Node3D, IInventoryItem, IEquipableItem Sprite.Texture = texture; } - public void Equip() - { - EmitSignal(SignalName.EquippedItem, this); - } - - public void Unequip() - { - - } - public void Throw() { Player.Inventory.Remove(this); diff --git a/src/map/dungeon/floors/Floor00.tscn b/src/map/dungeon/floors/Floor00.tscn index a2e95c3b..51c87137 100644 --- a/src/map/dungeon/floors/Floor00.tscn +++ b/src/map/dungeon/floors/Floor00.tscn @@ -750,7 +750,6 @@ mesh = SubResource("ArrayMesh_xh2ej") [node name="StaticBody3D" type="StaticBody3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION"] [node name="CollisionShape3D" type="CollisionShape3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION/StaticBody3D"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("ConcavePolygonShape3D_aqomv") [node name="CollisionShape3D2" type="CollisionShape3D" parent="02_ALTAR_FLOOR_ZER0_VER_1/COLLISION/StaticBody3D"] diff --git a/src/map/dungeon/floors/Floor01.tscn b/src/map/dungeon/floors/Floor01.tscn index 81d77136..6a61949d 100644 --- a/src/map/dungeon/floors/Floor01.tscn +++ b/src/map/dungeon/floors/Floor01.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=17 format=3 uid="uid://bc1sp6xwe0j65"] +[gd_scene load_steps=16 format=3 uid="uid://bc1sp6xwe0j65"] [ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_0ecnn"] [ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_cxmwa"] @@ -14,13 +14,12 @@ [ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="12_aw26s"] [ext_resource type="PackedScene" uid="uid://bksq62muhk3h5" path="res://src/enemy/enemy_types/1. sproingy/Sproingy.tscn" id="13_kwaga"] [ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="14_gkkr3"] -[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="15_kwaga"] [sub_resource type="NavigationMesh" id="NavigationMesh_4d8mx"] sample_partition_type = 2 geometry_parsed_geometry_type = 0 -[node name="Floor1" type="Node3D"] +[node name="Floor01" type="Node3D"] script = ExtResource("1_0ecnn") [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] @@ -41,5 +40,4 @@ hide_debug_visuals_for_all_generated_rooms = false [node name="EnemyDatabase" parent="." instance=ExtResource("12_aw26s")] unique_name_in_owner = true -EnemyList = Array[PackedScene]([ExtResource("13_kwaga"), ExtResource("14_gkkr3"), ExtResource("15_kwaga")]) -SpawnRate = PackedFloat32Array(1, 1, 10) +EnemyList = Array[PackedScene]([ExtResource("13_kwaga"), ExtResource("14_gkkr3")]) diff --git a/src/map/dungeon/floors/Floor02.tscn b/src/map/dungeon/floors/Floor02.tscn index 32af80ad..5d28cdd8 100644 --- a/src/map/dungeon/floors/Floor02.tscn +++ b/src/map/dungeon/floors/Floor02.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=3 uid="uid://dmiqwmivkjgmq"] +[gd_scene load_steps=16 format=3 uid="uid://dmiqwmivkjgmq"] [ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="1_afeds"] [ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_7txs6"] @@ -13,13 +13,14 @@ [ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_yvj8v"] [ext_resource type="PackedScene" uid="uid://bksq62muhk3h5" path="res://src/enemy/enemy_types/1. sproingy/Sproingy.tscn" id="12_pmbic"] [ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="13_eyrkc"] +[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_pmbic"] [sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] border_size = 1.0 agent_height = 3.0 agent_radius = 0.1 -[node name="Floor1" type="Node3D"] +[node name="Floor02" type="Node3D"] script = ExtResource("5_ld0kt") [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] @@ -37,4 +38,5 @@ generate_on_ready = false [node name="EnemyDatabase" parent="." instance=ExtResource("11_yvj8v")] unique_name_in_owner = true -EnemyList = Array[PackedScene]([ExtResource("12_pmbic"), ExtResource("13_eyrkc")]) +EnemyList = Array[PackedScene]([ExtResource("12_pmbic"), ExtResource("13_eyrkc"), ExtResource("14_pmbic")]) +SpawnRate = PackedFloat32Array(1, 1, 0.05) diff --git a/src/map/dungeon/floors/Floor03.tscn b/src/map/dungeon/floors/Floor03.tscn index b010b17e..b82b2d64 100644 --- a/src/map/dungeon/floors/Floor03.tscn +++ b/src/map/dungeon/floors/Floor03.tscn @@ -20,7 +20,7 @@ border_size = 1.0 agent_height = 3.0 agent_radius = 0.1 -[node name="Floor1" type="Node3D"] +[node name="Floor03" type="Node3D"] script = ExtResource("5_mo2td") [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] diff --git a/src/map/dungeon/floors/Floor04.tscn b/src/map/dungeon/floors/Floor04.tscn new file mode 100644 index 00000000..e58a7bb3 --- /dev/null +++ b/src/map/dungeon/floors/Floor04.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=15 format=3 uid="uid://cikq7vuorlpbl"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_8amoj"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_p7nwd"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_te0rp"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_i5hjj"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_katpr"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_8pmtc"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_5wyu4"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_36gcj"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_gn1yf"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_he2ag"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_f4225"] +[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="13_5kttw"] +[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="14_h5hhw"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor04" type="Node3D"] +script = ExtResource("1_8amoj") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_p7nwd") +room_scenes = Array[PackedScene]([ExtResource("3_te0rp"), ExtResource("4_i5hjj"), ExtResource("5_katpr"), ExtResource("6_8pmtc"), ExtResource("7_5wyu4"), ExtResource("8_36gcj"), ExtResource("9_gn1yf")]) +corridor_room_scene = ExtResource("10_he2ag") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_f4225")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("13_5kttw"), ExtResource("14_h5hhw")]) +SpawnRate = PackedFloat32Array(0.5, 1) diff --git a/src/map/dungeon/floors/Floor05.tscn b/src/map/dungeon/floors/Floor05.tscn new file mode 100644 index 00000000..7e1cf572 --- /dev/null +++ b/src/map/dungeon/floors/Floor05.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=16 format=3 uid="uid://t7cac7801bnk"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_8l7r7"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_ksplq"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_b3rou"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_duhq4"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_ut4ij"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_lposy"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_mb8sd"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_573ke"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_puq45"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_slkpn"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_l2dei"] +[ext_resource type="PackedScene" uid="uid://b0gwivt7cw7nd" path="res://src/enemy/enemy_types/2. michael/Michael.tscn" id="12_uv3l4"] +[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="13_v44hk"] +[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_ksplq"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor05" type="Node3D"] +script = ExtResource("1_8l7r7") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_ksplq") +room_scenes = Array[PackedScene]([ExtResource("3_b3rou"), ExtResource("4_duhq4"), ExtResource("5_ut4ij"), ExtResource("6_lposy"), ExtResource("7_mb8sd"), ExtResource("8_573ke"), ExtResource("9_puq45")]) +corridor_room_scene = ExtResource("10_slkpn") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_l2dei")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("12_uv3l4"), ExtResource("13_v44hk"), ExtResource("14_ksplq")]) +SpawnRate = PackedFloat32Array(0.5, 1, 0.05) diff --git a/src/map/dungeon/floors/Floor06.tscn b/src/map/dungeon/floors/Floor06.tscn new file mode 100644 index 00000000..1f4e2dae --- /dev/null +++ b/src/map/dungeon/floors/Floor06.tscn @@ -0,0 +1,41 @@ +[gd_scene load_steps=15 format=3 uid="uid://da107mywg18x1"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_51vs0"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_ixj2e"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_rgrkc"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_ltey6"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_xalbn"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_yfjr1"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_wnhhx"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_7s220"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_twkiu"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_xh2mp"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_vn8cd"] +[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_0tmnj"] +[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="13_gb3sg"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor06" type="Node3D"] +script = ExtResource("1_51vs0") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_ixj2e") +room_scenes = Array[PackedScene]([ExtResource("3_rgrkc"), ExtResource("4_ltey6"), ExtResource("5_xalbn"), ExtResource("6_yfjr1"), ExtResource("7_wnhhx"), ExtResource("8_7s220"), ExtResource("9_twkiu")]) +corridor_room_scene = ExtResource("10_xh2mp") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_vn8cd")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("13_gb3sg"), ExtResource("13_0tmnj")]) +SpawnRate = PackedFloat32Array(1, 0.5) diff --git a/src/map/dungeon/floors/Floor07.tscn b/src/map/dungeon/floors/Floor07.tscn new file mode 100644 index 00000000..e98e5a47 --- /dev/null +++ b/src/map/dungeon/floors/Floor07.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=16 format=3 uid="uid://cgtqjgh1f5fqi"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_un5rc"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_purgj"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_67qnt"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_ogmgc"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_fjqnq"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_bji1g"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_sqvag"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_c5i81"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_lo82o"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_xvcp8"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_xast8"] +[ext_resource type="PackedScene" uid="uid://cvk007twac22c" path="res://src/enemy/enemy_types/3. filth_eater/FilthEater.tscn" id="12_tr8km"] +[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_43euk"] +[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="14_purgj"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor07" type="Node3D"] +script = ExtResource("1_un5rc") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_purgj") +room_scenes = Array[PackedScene]([ExtResource("3_67qnt"), ExtResource("4_ogmgc"), ExtResource("5_fjqnq"), ExtResource("6_bji1g"), ExtResource("7_sqvag"), ExtResource("8_c5i81"), ExtResource("9_lo82o")]) +corridor_room_scene = ExtResource("10_xvcp8") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_xast8")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("12_tr8km"), ExtResource("13_43euk"), ExtResource("14_purgj")]) +SpawnRate = PackedFloat32Array(0.5, 1, 0.25) diff --git a/src/map/dungeon/floors/Floor08.tscn b/src/map/dungeon/floors/Floor08.tscn new file mode 100644 index 00000000..da103635 --- /dev/null +++ b/src/map/dungeon/floors/Floor08.tscn @@ -0,0 +1,40 @@ +[gd_scene load_steps=15 format=3 uid="uid://dg20ovvj2m2lp"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_qs20c"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_6ps7u"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_pn3nc"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_esh22"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_mir7f"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_1elux"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_c68jx"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_3lecr"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_dtrr3"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_vtwmp"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_uflod"] +[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="13_c8dl5"] +[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="13_qs20c"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor08" type="Node3D"] +script = ExtResource("1_qs20c") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_6ps7u") +room_scenes = Array[PackedScene]([ExtResource("3_pn3nc"), ExtResource("4_esh22"), ExtResource("5_mir7f"), ExtResource("6_1elux"), ExtResource("7_c68jx"), ExtResource("8_3lecr"), ExtResource("9_dtrr3")]) +corridor_room_scene = ExtResource("10_vtwmp") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_uflod")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("13_c8dl5"), ExtResource("13_qs20c")]) diff --git a/src/map/dungeon/floors/Floor09.tscn b/src/map/dungeon/floors/Floor09.tscn new file mode 100644 index 00000000..a77872ca --- /dev/null +++ b/src/map/dungeon/floors/Floor09.tscn @@ -0,0 +1,42 @@ +[gd_scene load_steps=16 format=3 uid="uid://b5jk743ng6fqg"] + +[ext_resource type="Script" uid="uid://dwt6302nsf4vq" path="res://src/map/dungeon/code/DungeonFloor.cs" id="1_ah6eb"] +[ext_resource type="Script" uid="uid://b1x125h0tya2w" path="res://addons/SimpleDungeons/DungeonGenerator3D.gd" id="2_2l5nt"] +[ext_resource type="PackedScene" uid="uid://dpec2lbt83dhe" path="res://src/map/dungeon/scenes/Antechamber.tscn" id="3_f55jb"] +[ext_resource type="PackedScene" uid="uid://b82dx66mgs2d7" path="res://src/map/dungeon/scenes/BasinRoom.tscn" id="4_iljqd"] +[ext_resource type="PackedScene" uid="uid://b7111krf365x0" path="res://src/map/dungeon/scenes/InnerBalcony.tscn" id="5_2admg"] +[ext_resource type="PackedScene" uid="uid://c1qicmrcg6q6x" path="res://src/map/dungeon/scenes/ColumnRoom.tscn" id="6_fuh3g"] +[ext_resource type="PackedScene" uid="uid://dfpyfpnya0f4u" path="res://src/map/dungeon/scenes/WaterRoom.tscn" id="7_lk05i"] +[ext_resource type="PackedScene" uid="uid://vdhl32je6hq2" path="res://src/map/dungeon/scenes/Antechamber_2.tscn" id="8_b81ow"] +[ext_resource type="PackedScene" uid="uid://cam640h4euewx" path="res://src/map/dungeon/scenes/PitRoom2.tscn" id="9_tl40f"] +[ext_resource type="PackedScene" uid="uid://bn4gslp2gk8ds" path="res://src/map/dungeon/corridor/Corridor.tscn" id="10_glh5y"] +[ext_resource type="PackedScene" uid="uid://dbvr8ewajja6a" path="res://src/enemy/EnemyDatabase.tscn" id="11_xxd5b"] +[ext_resource type="PackedScene" uid="uid://feegakykn3fv" path="res://src/enemy/enemy_types/5. ballos/Ballos.tscn" id="12_mhyau"] +[ext_resource type="PackedScene" uid="uid://dlw5cvutvypxn" path="res://src/enemy/enemy_types/6. chariot/Chariot.tscn" id="13_v2ihw"] +[ext_resource type="PackedScene" uid="uid://bkj1kyqu7reul" path="res://src/enemy/enemy_types/13. gold sproingy/GoldSproingy.tscn" id="14_2l5nt"] + +[sub_resource type="NavigationMesh" id="NavigationMesh_gqi8w"] +border_size = 1.0 +agent_height = 3.0 +agent_radius = 0.1 + +[node name="Floor09" type="Node3D"] +script = ExtResource("1_ah6eb") + +[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] +unique_name_in_owner = true +navigation_mesh = SubResource("NavigationMesh_gqi8w") + +[node name="DungeonGenerator" type="Node3D" parent="NavigationRegion3D"] +unique_name_in_owner = true +script = ExtResource("2_2l5nt") +room_scenes = Array[PackedScene]([ExtResource("3_f55jb"), ExtResource("4_iljqd"), ExtResource("5_2admg"), ExtResource("6_fuh3g"), ExtResource("7_lk05i"), ExtResource("8_b81ow"), ExtResource("9_tl40f")]) +corridor_room_scene = ExtResource("10_glh5y") +dungeon_size = Vector3i(60, 1, 60) +voxel_scale = Vector3(4, 4, 4) +generate_on_ready = false + +[node name="EnemyDatabase" parent="." instance=ExtResource("11_xxd5b")] +unique_name_in_owner = true +EnemyList = Array[PackedScene]([ExtResource("12_mhyau"), ExtResource("13_v2ihw"), ExtResource("14_2l5nt")]) +SpawnRate = PackedFloat32Array(1, 1, 0.05) diff --git a/src/player/IPlayer.cs b/src/player/IPlayer.cs index 8367073e..387e0952 100644 --- a/src/player/IPlayer.cs +++ b/src/player/IPlayer.cs @@ -24,6 +24,20 @@ public interface IPlayer : IKillable public void TeleportPlayer(Vector3 newPosition); + public void HealHP(int amount); + + public void RaiseHP(int amount); + + public void HealVT(int amount); + + public void RaiseVT(int amount); + + public void RaiseBonusAttack(int amount); + + public void RaiseBonusDefense(int amount); + + public void RaiseBonusLuck(int amount); + public IInventory Inventory { get; } public PlayerStats Stats { get; } diff --git a/src/player/Player.cs b/src/player/Player.cs index e5a8fbc5..c776c8aa 100644 --- a/src/player/Player.cs +++ b/src/player/Player.cs @@ -162,7 +162,6 @@ public partial class Player : CharacterBody3D, IPlayer this.Provide(); PlayerLogic.Start(); HealthTimer.Timeout += OnHealthTimerTimeout; - Inventory.AccessoryUnequipped += Inventory_AccessoryUnequipped; Hitbox.AreaEntered += Hitbox_AreaEntered; } @@ -193,6 +192,52 @@ public partial class Player : CharacterBody3D, IPlayer EmitSignal(SignalName.PauseButtonPressed); } + public void RaiseHP(int amountToRaise) + { + Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise); + Stats.SetCurrentHP(Stats.MaximumHP.Value); + Game.AnnounceMessageOnInventoryScreen($"{amountToRaise}MAXHP Up."); + } + + public void HealHP(int amountToRestore) + { + Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore); + var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; + Game.AnnounceMessageOnInventoryScreen($"{raiseString}HP Restored."); + } + + public void RaiseVT(int amountToRaise) + { + if (Stats.CurrentVT.Value == Stats.MaximumVT.Value) + { + Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise); + Stats.SetCurrentVT(Stats.MaximumVT.Value); + Game.AnnounceMessageOnInventoryScreen($"{amountToRaise}MAXVT Up."); + } + } + + public void HealVT(int amountToRestore) + { + Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore); + var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; + Game.AnnounceMessageOnInventoryScreen($"{raiseString}VT Restored."); + } + + public void RaiseBonusAttack(int amount) + { + Stats.SetBonusAttack(Stats.BonusAttack.Value + amount); + } + + public void RaiseBonusDefense(int amount) + { + Stats.SetBonusDefense(Stats.BonusDefense.Value + amount); + } + + public void RaiseBonusLuck(int amount) + { + Stats.SetLuck(amount); + } + public void Move(float delta) { var rawInput = GlobalInputVector;