From 192f2eb316f4d0527e6cd64054d37a3fe59efee4 Mon Sep 17 00:00:00 2001 From: Zenny Date: Mon, 10 Mar 2025 22:13:09 -0700 Subject: [PATCH] Reorganize SFX --- .../Audio/state/InGameAudioLogic.Output.cs | 2 + .../Game/GameRepo.cs | 11 + Zennysoft.Game.Ma/src/app/App.cs | 158 ++--- Zennysoft.Game.Ma/src/audio/InGameAudio.cs | 5 +- Zennysoft.Game.Ma/src/audio/InGameAudio.tscn | 14 +- .../{TempFFVII/junction.ogg => EquipSFX.ogg} | Bin .../src/audio/sfx/EquipSFX.ogg.import | 19 + .../{TempFFVII/teleport.ogg => ExitSFX.ogg} | Bin .../src/audio/sfx/ExitSFX.ogg.import | 19 + .../something-earned.ogg => HealSFX.ogg} | Bin .../src/audio/sfx/HealSFX.ogg.import | 19 + .../menu-back.ogg => MenuBackSFX.ogg} | Bin .../src/audio/sfx/MenuBackSFX.ogg.import | 19 + .../menu-move.ogg => MenuScrollSFX.ogg} | Bin .../src/audio/sfx/MenuScrollSFX.ogg.import | 19 + .../sfx/{TempFFVII/sort.ogg => SortSFX.ogg} | Bin .../src/audio/sfx/SortSFX.ogg.import | 19 + .../src/audio/sfx/TempFFVII/Equip.wav.import | 23 - .../audio/sfx/TempFFVII/junction.ogg.import | 19 - .../audio/sfx/TempFFVII/menu-back.ogg.import | 19 - .../audio/sfx/TempFFVII/menu-move.ogg.import | 19 - .../src/audio/sfx/TempFFVII/menu.wav | Bin 22096 -> 0 bytes .../src/audio/sfx/TempFFVII/menu.wav.import | 24 - .../sfx/TempFFVII/something-earned.ogg.import | 19 - .../src/audio/sfx/TempFFVII/sort.ogg.import | 19 - .../audio/sfx/TempFFVII/teleport.ogg.import | 19 - .../enemy_types/01. sproingy/Sproingy.cs | 54 +- .../enemy_types/01. sproingy/Sproingy.tscn | 58 +- Zennysoft.Game.Ma/src/player/Player.cs | 624 +++++++++--------- 29 files changed, 590 insertions(+), 611 deletions(-) rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/junction.ogg => EquipSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg.import rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/teleport.ogg => ExitSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg.import rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/something-earned.ogg => HealSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg.import rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/menu-back.ogg => MenuBackSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg.import rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/menu-move.ogg => MenuScrollSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg.import rename Zennysoft.Game.Ma/src/audio/sfx/{TempFFVII/sort.ogg => SortSFX.ogg} (100%) create mode 100644 Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/Equip.wav.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu.wav delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu.wav.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/something-earned.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/sort.ogg.import delete mode 100644 Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/teleport.ogg.import diff --git a/Zennysoft.Game.Ma.Implementation/Audio/state/InGameAudioLogic.Output.cs b/Zennysoft.Game.Ma.Implementation/Audio/state/InGameAudioLogic.Output.cs index 32b64ac2..925aa2d1 100644 --- a/Zennysoft.Game.Ma.Implementation/Audio/state/InGameAudioLogic.Output.cs +++ b/Zennysoft.Game.Ma.Implementation/Audio/state/InGameAudioLogic.Output.cs @@ -15,6 +15,8 @@ public partial class InGameAudioLogic public readonly record struct PlayPlayerAttackWallSound; + public readonly record struct PlayPlayerAttackEnemySound; + public readonly record struct PlayMenuScrollSound; public readonly record struct PlayEquipSound; diff --git a/Zennysoft.Game.Ma.Implementation/Game/GameRepo.cs b/Zennysoft.Game.Ma.Implementation/Game/GameRepo.cs index 42ec9bb7..3fad5786 100644 --- a/Zennysoft.Game.Ma.Implementation/Game/GameRepo.cs +++ b/Zennysoft.Game.Ma.Implementation/Game/GameRepo.cs @@ -23,6 +23,8 @@ public interface IGameRepo : IDisposable event Action? PlayerAttackedWall; + event Action? PlayerAttackedEnemy; + void Pause(); void Resume(); @@ -43,6 +45,8 @@ public interface IGameRepo : IDisposable public void OnPlayerAttackedWall(); + public void OnPlayerAttackedEnemy(); + public void CloseInventory(); public void GameEnded(); @@ -61,6 +65,7 @@ public class GameRepo : IGameRepo public event Action? RemoveItemFromInventoryEvent; public event Action? PlayerAttack; public event Action? PlayerAttackedWall; + public event Action? PlayerAttackedEnemy; public IAutoProp IsPaused => _isPaused; private readonly AutoProp _isPaused; @@ -97,6 +102,7 @@ public class GameRepo : IGameRepo public void EndDoubleExp() { AnnounceMessageOnMainScreen("Experience points effect wore off."); + DoubleExpTimeEnd?.Invoke(); ExpRate = 1; } @@ -125,6 +131,11 @@ public class GameRepo : IGameRepo PlayerAttackedWall?.Invoke(); } + public void OnPlayerAttackedEnemy() + { + PlayerAttackedEnemy?.Invoke(); + } + public void CloseInventory() { CloseInventoryEvent?.Invoke(); diff --git a/Zennysoft.Game.Ma/src/app/App.cs b/Zennysoft.Game.Ma/src/app/App.cs index 27f13589..2d427618 100644 --- a/Zennysoft.Game.Ma/src/app/App.cs +++ b/Zennysoft.Game.Ma/src/app/App.cs @@ -1,4 +1,4 @@ -using Chickensoft.AutoInject; +using Chickensoft.AutoInject; using Chickensoft.GodotNodeInterfaces; using Chickensoft.Introspection; using Godot; @@ -38,80 +38,80 @@ public partial class App : CanvasLayer, IApp public void Initialize() { - var container = new SimpleInjector.Container(); - container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle(); - container.Register(Lifestyle.Singleton); - container.Register(Lifestyle.Singleton); - container.Verify(); + var container = new SimpleInjector.Container(); + container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle(); + container.Register(Lifestyle.Singleton); + container.Register(Lifestyle.Singleton); + container.Verify(); - Instantiator = new Instantiator(GetTree()); + Instantiator = new Instantiator(GetTree()); - AppRepo = container.GetInstance(); - AppLogic = container.GetInstance(); + AppRepo = container.GetInstance(); + AppLogic = container.GetInstance(); - AppLogic.Set(AppRepo); - AppLogic.Set(new AppLogic.Data()); + AppLogic.Set(AppRepo); + AppLogic.Set(new AppLogic.Data()); - Menu.NewGame += OnNewGame; - Menu.LoadGame += OnLoadGame; - Menu.Quit += OnQuit; + Menu.NewGame += OnNewGame; + Menu.LoadGame += OnLoadGame; + Menu.Quit += OnQuit; - AnimationPlayer.AnimationFinished += OnAnimationFinished; + AnimationPlayer.AnimationFinished += OnAnimationFinished; - Input.MouseMode = Input.MouseModeEnum.Visible; - this.Provide(); + Input.MouseMode = Input.MouseModeEnum.Visible; + this.Provide(); } public void OnReady() { - AppBinding = AppLogic.Bind(); + AppBinding = AppLogic.Bind(); - AppBinding - .Handle((in AppLogic.Output.ShowSplashScreen _) => - { - HideMenus(); - BlankScreen.Hide(); - Splash.Show(); - }) - .Handle((in AppLogic.Output.HideSplashScreen _) => - { - BlankScreen.Show(); - FadeToBlack(); - }) - .Handle((in AppLogic.Output.SetupGameScene _) => - { - Game = Instantiator.LoadAndInstantiate(GAME_SCENE_PATH); - GameWindow.AddChildEx(Game); - Instantiator.SceneTree.Paused = false; - }) - .Handle((in AppLogic.Output.ShowMainMenu _) => - { - // Load everything while we're showing a black screen, then fade in. - HideMenus(); - Menu.Show(); + AppBinding + .Handle((in AppLogic.Output.ShowSplashScreen _) => + { + HideMenus(); + BlankScreen.Hide(); + Splash.Show(); + }) + .Handle((in AppLogic.Output.HideSplashScreen _) => + { + BlankScreen.Show(); + FadeToBlack(); + }) + .Handle((in AppLogic.Output.SetupGameScene _) => + { + Game = Instantiator.LoadAndInstantiate(GAME_SCENE_PATH); + GameWindow.AddChildEx(Game); + Instantiator.SceneTree.Paused = false; + }) + .Handle((in AppLogic.Output.ShowMainMenu _) => + { + // Load everything while we're showing a black screen, then fade in. + HideMenus(); + Menu.Show(); - FadeInFromBlack(); - Menu.NewGameButton.GrabFocus(); - }) - .Handle((in AppLogic.Output.FadeToBlack _) => FadeToBlack()) - .Handle((in AppLogic.Output.HideGame _) => FadeToBlack()) - .Handle((in AppLogic.Output.ShowGame _) => - { - HideMenus(); - FadeInFromBlack(); - }) - .Handle((in AppLogic.Output.StartLoadingSaveFile _) => - { - Game.SaveFileLoaded += OnSaveFileLoaded; - Game.LoadExistingGame(); - }) - .Handle((in AppLogic.Output.ExitGame _) => - { - GetTree().Quit(); - }); + FadeInFromBlack(); + Menu.NewGameButton.GrabFocus(); + }) + .Handle((in AppLogic.Output.FadeToBlack _) => FadeToBlack()) + .Handle((in AppLogic.Output.HideGame _) => FadeToBlack()) + .Handle((in AppLogic.Output.ShowGame _) => + { + HideMenus(); + FadeInFromBlack(); + }) + .Handle((in AppLogic.Output.StartLoadingSaveFile _) => + { + Game.SaveFileLoaded += OnSaveFileLoaded; + Game.LoadExistingGame(); + }) + .Handle((in AppLogic.Output.ExitGame _) => + { + GetTree().Quit(); + }); - AppLogic.Start(); + AppLogic.Start(); } public void OnNewGame() => AppLogic.Input(new AppLogic.Input.NewGame()); @@ -122,44 +122,44 @@ public partial class App : CanvasLayer, IApp public void OnSaveFileLoaded() { - Game.SaveFileLoaded -= OnSaveFileLoaded; - AppLogic.Input(new AppLogic.Input.SaveFileLoaded()); + Game.SaveFileLoaded -= OnSaveFileLoaded; + AppLogic.Input(new AppLogic.Input.SaveFileLoaded()); } public void FadeInFromBlack() { - BlankScreen.Show(); - AnimationPlayer.Play("fade_in"); + BlankScreen.Show(); + AnimationPlayer.Play("fade_in"); } public void FadeToBlack() { - BlankScreen.Show(); - AnimationPlayer.Play("fade_out"); + BlankScreen.Show(); + AnimationPlayer.Play("fade_out"); } public void HideMenus() { - Splash.Hide(); - Menu.Hide(); + Splash.Hide(); + Menu.Hide(); } public void OnAnimationFinished(StringName animation) { - if (animation == "fade_in") - { - AppLogic.Input(new AppLogic.Input.FadeInFinished()); - BlankScreen.Hide(); - return; - } + if (animation == "fade_in") + { + AppLogic.Input(new AppLogic.Input.FadeInFinished()); + BlankScreen.Hide(); + return; + } - AppLogic.Input(new AppLogic.Input.FadeOutFinished()); + AppLogic.Input(new AppLogic.Input.FadeOutFinished()); } public void OnExitTree() { - AppLogic.Stop(); - AppBinding.Dispose(); - AppRepo.Dispose(); + AppLogic.Stop(); + AppBinding.Dispose(); + AppRepo.Dispose(); } } diff --git a/Zennysoft.Game.Ma/src/audio/InGameAudio.cs b/Zennysoft.Game.Ma/src/audio/InGameAudio.cs index aa6fb9d5..8db09312 100644 --- a/Zennysoft.Game.Ma/src/audio/InGameAudio.cs +++ b/Zennysoft.Game.Ma/src/audio/InGameAudio.cs @@ -37,6 +37,8 @@ public partial class InGameAudio : Node [Node] public IAudioStreamPlayer PlayerAttackWallSFX { get; set; } = default!; + [Node] public IAudioStreamPlayer PlayerAttackEnemySFX { get; set; } = default!; + [Node] public IAudioStreamPlayer MenuScrollSFX { get; set; } = default!; [Node] public IAudioStreamPlayer EquipSFX { get; set; } = default!; @@ -77,7 +79,8 @@ public partial class InGameAudio : Node .Handle((in InGameAudioLogic.Output.PlayHealingItemSound _) => PlayHealingItemSound()) .Handle((in InGameAudioLogic.Output.PlayTeleportSound _) => PlayTeleportSound()) .Handle((in InGameAudioLogic.Output.PlayPlayerAttackSound _) => { PlayerAttackSFX.Stop(); PlayerAttackSFX.Play(); }) - .Handle((in InGameAudioLogic.Output.PlayPlayerAttackWallSound _) => { PlayerAttackWallSFX.Stop(); PlayerAttackWallSFX.Play(); }); + .Handle((in InGameAudioLogic.Output.PlayPlayerAttackWallSound _) => { PlayerAttackWallSFX.Stop(); PlayerAttackWallSFX.Play(); }) + .Handle((in InGameAudioLogic.Output.PlayPlayerAttackEnemySound _) => { PlayerAttackEnemySFX.Stop(); PlayerAttackEnemySFX.Play(); }); InGameAudioLogic.Start(); } diff --git a/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn b/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn index ae6b0efb..394afc34 100644 --- a/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn +++ b/Zennysoft.Game.Ma/src/audio/InGameAudio.tscn @@ -3,17 +3,17 @@ [ext_resource type="Script" uid="uid://2mnouyn1jcqs" path="res://src/audio/InGameAudio.cs" id="1_gpmcr"] [ext_resource type="AudioStream" uid="uid://dfu0fksb6slhx" path="res://src/audio/music/droney.mp3" id="2_8hfyr"] [ext_resource type="AudioStream" uid="uid://d2jrktp06xsba" path="res://src/audio/music/crossing-the-gate.mp3" id="3_wbmd6"] -[ext_resource type="Script" path="res://src/audio/BGMPlayer.cs" id="3_wtvpb"] +[ext_resource type="Script" uid="uid://d2usinntpmcry" path="res://src/audio/BGMPlayer.cs" id="3_wtvpb"] [ext_resource type="AudioStream" uid="uid://dn2e2hqujlia1" path="res://src/audio/music/tar-winds.mp3" id="4_surnl"] [ext_resource type="AudioStream" uid="uid://t3g04u722f2k" path="res://src/audio/music/useless immune system-1.mp3" id="6_agr3r"] [ext_resource type="AudioStream" uid="uid://cn8cugshq3o8k" path="res://src/audio/sfx/PlayerHitWallSFX.wav" id="7_8vh2f"] -[ext_resource type="AudioStream" uid="uid://dor0in0x2fg48" path="res://src/audio/sfx/TempFFVII/menu-move.ogg" id="7_777nl"] +[ext_resource type="AudioStream" uid="uid://dor0in0x2fg48" path="res://src/audio/sfx/MenuScrollSFX.ogg" id="7_777nl"] [ext_resource type="AudioStream" uid="uid://d1mlduwauechv" path="res://src/audio/sfx/PlayerAttackSFX.wav" id="7_wtvpb"] -[ext_resource type="AudioStream" uid="uid://r1tryiit38i8" path="res://src/audio/sfx/TempFFVII/menu-back.ogg" id="8_1xcgo"] -[ext_resource type="AudioStream" uid="uid://bjj61s8q2gwb8" path="res://src/audio/sfx/TempFFVII/junction.ogg" id="8_kwybb"] -[ext_resource type="AudioStream" uid="uid://myx4s8lmarc2" path="res://src/audio/sfx/TempFFVII/something-earned.ogg" id="10_3lcw5"] -[ext_resource type="AudioStream" uid="uid://dci08kmwsu6k1" path="res://src/audio/sfx/TempFFVII/teleport.ogg" id="11_offhc"] -[ext_resource type="AudioStream" uid="uid://d3sn7c614uj2n" path="res://src/audio/sfx/TempFFVII/sort.ogg" id="12_wprjr"] +[ext_resource type="AudioStream" uid="uid://r1tryiit38i8" path="res://src/audio/sfx/MenuBackSFX.ogg" id="8_1xcgo"] +[ext_resource type="AudioStream" uid="uid://bjj61s8q2gwb8" path="res://src/audio/sfx/EquipSFX.ogg" id="8_kwybb"] +[ext_resource type="AudioStream" uid="uid://myx4s8lmarc2" path="res://src/audio/sfx/HealSFX.ogg" id="10_3lcw5"] +[ext_resource type="AudioStream" uid="uid://dci08kmwsu6k1" path="res://src/audio/sfx/ExitSFX.ogg" id="11_offhc"] +[ext_resource type="AudioStream" uid="uid://d3sn7c614uj2n" path="res://src/audio/sfx/SortSFX.ogg" id="12_wprjr"] [node name="InGameAudio" type="Node"] process_mode = 3 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg b/Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg.import new file mode 100644 index 00000000..19e16920 --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/EquipSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://bjj61s8q2gwb8" +path="res://.godot/imported/EquipSFX.ogg-6a8dd8843f1eb38662d6d370e4b2f930.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/EquipSFX.ogg" +dest_files=["res://.godot/imported/EquipSFX.ogg-6a8dd8843f1eb38662d6d370e4b2f930.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/teleport.ogg b/Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/teleport.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg.import new file mode 100644 index 00000000..bf97ba35 --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/ExitSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dci08kmwsu6k1" +path="res://.godot/imported/ExitSFX.ogg-c16c2cdec4e3d13c44aa79cc98a70d7b.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/ExitSFX.ogg" +dest_files=["res://.godot/imported/ExitSFX.ogg-c16c2cdec4e3d13c44aa79cc98a70d7b.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/something-earned.ogg b/Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/something-earned.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg.import new file mode 100644 index 00000000..67dc3cf7 --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/HealSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://myx4s8lmarc2" +path="res://.godot/imported/HealSFX.ogg-8e33fc432d3aa613fb5d921400562a51.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/HealSFX.ogg" +dest_files=["res://.godot/imported/HealSFX.ogg-8e33fc432d3aa613fb5d921400562a51.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg b/Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg.import new file mode 100644 index 00000000..3a228a4e --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/MenuBackSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://r1tryiit38i8" +path="res://.godot/imported/MenuBackSFX.ogg-940782881d58f1c4c5f95977b5f42009.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/MenuBackSFX.ogg" +dest_files=["res://.godot/imported/MenuBackSFX.ogg-940782881d58f1c4c5f95977b5f42009.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg b/Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg.import new file mode 100644 index 00000000..345edf7e --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/MenuScrollSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://dor0in0x2fg48" +path="res://.godot/imported/MenuScrollSFX.ogg-b1800108be1a856f464e62089f5b0279.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/MenuScrollSFX.ogg" +dest_files=["res://.godot/imported/MenuScrollSFX.ogg-b1800108be1a856f464e62089f5b0279.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/sort.ogg b/Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg similarity index 100% rename from Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/sort.ogg rename to Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg diff --git a/Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg.import new file mode 100644 index 00000000..16754a1a --- /dev/null +++ b/Zennysoft.Game.Ma/src/audio/sfx/SortSFX.ogg.import @@ -0,0 +1,19 @@ +[remap] + +importer="oggvorbisstr" +type="AudioStreamOggVorbis" +uid="uid://d3sn7c614uj2n" +path="res://.godot/imported/SortSFX.ogg-7f616a0a2af3902cddc2ea22947a5f02.oggvorbisstr" + +[deps] + +source_file="res://src/audio/sfx/SortSFX.ogg" +dest_files=["res://.godot/imported/SortSFX.ogg-7f616a0a2af3902cddc2ea22947a5f02.oggvorbisstr"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/Equip.wav.import b/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/Equip.wav.import deleted file mode 100644 index a139220f..00000000 --- a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/Equip.wav.import +++ /dev/null @@ -1,23 +0,0 @@ -[remap] - -importer="wav" -type="AudioStreamWAV" -uid="uid://t28qhjuibv3f" -valid=false - -[deps] - -source_file="res://src/audio/sfx/TempFFVII/Equip.wav" - -[params] - -force/8_bit=false -force/mono=false -force/max_rate=false -force/max_rate_hz=44100 -edit/trim=false -edit/normalize=false -edit/loop_mode=0 -edit/loop_begin=0 -edit/loop_end=-1 -compress/mode=0 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg.import deleted file mode 100644 index 5f7076b7..00000000 --- a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/junction.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://bjj61s8q2gwb8" -path="res://.godot/imported/junction.ogg-f4350086a08e048d3008edcdc25abf96.oggvorbisstr" - -[deps] - -source_file="res://src/audio/sfx/TempFFVII/junction.ogg" -dest_files=["res://.godot/imported/junction.ogg-f4350086a08e048d3008edcdc25abf96.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg.import deleted file mode 100644 index cb391b1d..00000000 --- a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-back.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://r1tryiit38i8" -path="res://.godot/imported/menu-back.ogg-3ec385c1a9cfaaa1be4ba85197708f0c.oggvorbisstr" - -[deps] - -source_file="res://src/audio/sfx/TempFFVII/menu-back.ogg" -dest_files=["res://.godot/imported/menu-back.ogg-3ec385c1a9cfaaa1be4ba85197708f0c.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg.import b/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg.import deleted file mode 100644 index eb4805b6..00000000 --- a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu-move.ogg.import +++ /dev/null @@ -1,19 +0,0 @@ -[remap] - -importer="oggvorbisstr" -type="AudioStreamOggVorbis" -uid="uid://dor0in0x2fg48" -path="res://.godot/imported/menu-move.ogg-d71b0989e00dd1d4488a72c7dde3d41d.oggvorbisstr" - -[deps] - -source_file="res://src/audio/sfx/TempFFVII/menu-move.ogg" -dest_files=["res://.godot/imported/menu-move.ogg-d71b0989e00dd1d4488a72c7dde3d41d.oggvorbisstr"] - -[params] - -loop=false -loop_offset=0 -bpm=0 -beat_count=0 -bar_beats=4 diff --git a/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu.wav b/Zennysoft.Game.Ma/src/audio/sfx/TempFFVII/menu.wav deleted file mode 100644 index 2505d92d645cf8769ba70341328f8a89198802bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22096 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 ZyzkFPuttovjh&76iyz}> 30f) - _enemyLogic.Input(new EnemyLogic.Input.LostPlayer()); - if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 3f) - _enemyLogic.Input(new EnemyLogic.Input.Alerted()); + if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) < 1.5f) + _enemyLogic.Input(new EnemyLogic.Input.StartAttacking()); + if (_enemyLogic.Value is EnemyLogic.State.FollowPlayer && GlobalPosition.DistanceTo(_player.CurrentPosition) > 30f) + _enemyLogic.Input(new EnemyLogic.Input.LostPlayer()); + if (_enemyLogic.Value is EnemyLogic.State.Attacking && GlobalPosition.DistanceTo(_player.CurrentPosition) > 3f) + _enemyLogic.Input(new EnemyLogic.Input.Alerted()); - _navigationAgentClient.CalculateVelocity(GlobalPosition, true); + _navigationAgentClient.CalculateVelocity(GlobalPosition, true); - base._PhysicsProcess(delta); + base._PhysicsProcess(delta); } public override void TakeAction() { - PrimaryAttack(); + PrimaryAttack(); } public void PrimaryAttack() { - _enemyModelView.PlayPrimaryAttackAnimation(); + _enemyModelView.PlayPrimaryAttackAnimation(); } public override void SetTarget(Vector3 target) => _navigationAgentClient.SetTarget(target); public void Patrol() { - var rng = new RandomNumberGenerator(); - rng.Randomize(); - var randomizedSpot = new Vector3(rng.RandfRange(-5.0f, 5.0f), 0, rng.RandfRange(-5.0f, 5.0f)); - _enemyLogic.Input(new EnemyLogic.Input.PatrolToRandomSpot(GlobalPosition + randomizedSpot)); - _enemyLogic.Input(new EnemyLogic.Input.StartPatrol()); + var rng = new RandomNumberGenerator(); + rng.Randomize(); + var randomizedSpot = new Vector3(rng.RandfRange(-5.0f, 5.0f), 0, rng.RandfRange(-5.0f, 5.0f)); + _enemyLogic.Input(new EnemyLogic.Input.PatrolToRandomSpot(GlobalPosition + randomizedSpot)); + _enemyLogic.Input(new EnemyLogic.Input.StartPatrol()); } private void Hitbox_AreaEntered(Area3D area) { - var target = area.GetOwner(); - if (target is IPlayer player) - { - var damage = _enemyStatResource.CurrentAttack * PrimaryAttackElementalDamageBonus; - player.TakeDamage(damage, PrimaryAttackElementalType, BattleExtensions.IsCriticalHit(_enemyStatResource.Luck)); - } + var target = area.GetOwner(); + if (target is IPlayer player) + { + var damage = _enemyStatResource.CurrentAttack * PrimaryAttackElementalDamageBonus; + player.TakeDamage(damage, PrimaryAttackElementalType, BattleExtensions.IsCriticalHit(_enemyStatResource.Luck)); + } } -} \ No newline at end of file +} diff --git a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn index 9f0346b1..5c0849e8 100644 --- a/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn +++ b/Zennysoft.Game.Ma/src/enemy/enemy_types/01. sproingy/Sproingy.tscn @@ -27,13 +27,13 @@ metadata/_custom_type_script = ExtResource("2_oln85") radius = 0.106078 height = 1.23076 +[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"] +radius = 0.57308 + [sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"] height = 5.0 radius = 1.0 -[sub_resource type="SphereShape3D" id="SphereShape3D_8vcnq"] -radius = 0.57308 - [node name="Sproingy" type="CharacterBody3D"] process_mode = 1 collision_layer = 10 @@ -44,46 +44,54 @@ axis_lock_angular_z = true script = ExtResource("1_xsluo") _enemyStatResource = SubResource("Resource_oln85") -[node name="NavigationAgentClient" parent="." instance=ExtResource("3_ut5m2")] -unique_name_in_owner = true - [node name="CollisionShape" type="CollisionShape3D" parent="."] unique_name_in_owner = true transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0) shape = SubResource("CapsuleShape3D_cwfph") -[node name="LineOfSight" type="Area3D" parent="."] +[node name="Navigation" type="Node3D" parent="."] + +[node name="NavigationAgentClient" parent="Navigation" instance=ExtResource("3_ut5m2")] +unique_name_in_owner = true + +[node name="Collision" type="Node3D" parent="."] + +[node name="Collision" type="Area3D" parent="Collision"] +collision_layer = 2048 +collision_mask = 0 + +[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/Collision"] +shape = SubResource("SphereShape3D_8vcnq") + +[node name="LineOfSight" type="Area3D" parent="Collision"] unique_name_in_owner = true transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0) collision_layer = 2 collision_mask = 2 -[node name="CollisionShape3D" type="CollisionShape3D" parent="LineOfSight"] +[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/LineOfSight"] transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -2) shape = SubResource("CylinderShape3D_jbgmx") -[node name="PatrolTimer" type="Timer" parent="."] -unique_name_in_owner = true -wait_time = 10.0 -autostart = true - -[node name="AttackTimer" type="Timer" parent="."] -unique_name_in_owner = true -wait_time = 0.8 -autostart = true - -[node name="Raycast" type="RayCast3D" parent="."] +[node name="Raycast" type="RayCast3D" parent="Collision"] unique_name_in_owner = true target_position = Vector3(0, 0, -5) collision_mask = 3 -[node name="EnemyModelView" parent="." instance=ExtResource("4_o3b7p")] +[node name="Visual" type="Node3D" parent="."] + +[node name="EnemyModelView" parent="Visual" instance=ExtResource("4_o3b7p")] unique_name_in_owner = true transform = Transform3D(1.5, 0, 0, 0, 1.5, 0, 0, 0, 1.5, 0, 0.0862446, 0) -[node name="Collision" type="Area3D" parent="."] -collision_layer = 2048 -collision_mask = 0 +[node name="Timers" type="Node" parent="."] -[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"] -shape = SubResource("SphereShape3D_8vcnq") +[node name="PatrolTimer" type="Timer" parent="Timers"] +unique_name_in_owner = true +wait_time = 10.0 +autostart = true + +[node name="AttackTimer" type="Timer" parent="Timers"] +unique_name_in_owner = true +wait_time = 0.8 +autostart = true diff --git a/Zennysoft.Game.Ma/src/player/Player.cs b/Zennysoft.Game.Ma/src/player/Player.cs index 191e7145..50666fe0 100644 --- a/Zennysoft.Game.Ma/src/player/Player.cs +++ b/Zennysoft.Game.Ma/src/player/Player.cs @@ -106,506 +106,508 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide - { - { 2, 12 }, - { 3, 39 }, - { 4, 87 }, - { 5, 162 }, - { 6, 270 }, - { 7, 417 }, - { 8, 609 } - }; + AnimationPlayer.AnimationFinished += OnAnimationFinished; + _expToNextLevel = new Dictionary + { + { 2, 12 }, + { 3, 39 }, + { 4, 87 }, + { 5, 162 }, + { 6, 270 }, + { 7, 417 }, + { 8, 609 } + }; } public void Setup() { - var container = new SimpleInjector.Container(); - container.Register(Lifestyle.Singleton); - container.Verify(); + var container = new SimpleInjector.Container(); + container.Register(Lifestyle.Singleton); + container.Verify(); - Settings = new PlayerLogic.Settings() { RotationSpeed = PlayerStatResource.RotationSpeed, MoveSpeed = PlayerStatResource.MoveSpeed, Acceleration = PlayerStatResource.Acceleration }; - Stats = new PlayerStatController(); - Stats.Init( - new PlayerStats - { - CurrentHP = PlayerStatResource.CurrentHP, - MaximumHP = PlayerStatResource.MaximumHP, - CurrentVT = PlayerStatResource.CurrentVT, - MaximumVT = PlayerStatResource.MaximumVT, - CurrentAttack = PlayerStatResource.CurrentAttack, - BonusAttack = PlayerStatResource.BonusAttack, - MaxAttack = PlayerStatResource.MaxAttack, - CurrentDefense = PlayerStatResource.CurrentDefense, - BonusDefense = PlayerStatResource.BonusDefense, - MaxDefense = PlayerStatResource.MaxDefense, - CurrentExp = PlayerStatResource.CurrentExp, - CurrentLevel = PlayerStatResource.CurrentLevel, - ExpToNextLevel = PlayerStatResource.ExpToNextLevel, - Luck = PlayerStatResource.Luck - }); + Settings = new PlayerLogic.Settings() { RotationSpeed = PlayerStatResource.RotationSpeed, MoveSpeed = PlayerStatResource.MoveSpeed, Acceleration = PlayerStatResource.Acceleration }; + Stats = new PlayerStatController(); + Stats.Init( + new PlayerStats + { + CurrentHP = PlayerStatResource.CurrentHP, + MaximumHP = PlayerStatResource.MaximumHP, + CurrentVT = PlayerStatResource.CurrentVT, + MaximumVT = PlayerStatResource.MaximumVT, + CurrentAttack = PlayerStatResource.CurrentAttack, + BonusAttack = PlayerStatResource.BonusAttack, + MaxAttack = PlayerStatResource.MaxAttack, + CurrentDefense = PlayerStatResource.CurrentDefense, + BonusDefense = PlayerStatResource.BonusDefense, + MaxDefense = PlayerStatResource.MaxDefense, + CurrentExp = PlayerStatResource.CurrentExp, + CurrentLevel = PlayerStatResource.CurrentLevel, + ExpToNextLevel = PlayerStatResource.ExpToNextLevel, + Luck = PlayerStatResource.Luck + }); - Inventory = new Inventory(); + Inventory = new Inventory(); - PlayerLogic = container.GetInstance(); - PlayerLogic.Set(this as IPlayer); - PlayerLogic.Set(Settings); - PlayerLogic.Set(Stats); - PlayerLogic.Set(_gameRepo); + PlayerLogic = container.GetInstance(); + PlayerLogic.Set(this as IPlayer); + PlayerLogic.Set(Settings); + PlayerLogic.Set(Stats); + PlayerLogic.Set(_gameRepo); - var defaultWeapon = new Weapon(); - defaultWeapon.Stats = _defaultWeapon; - var defaultArmor = new Armor(); - defaultArmor.Stats = _defaultArmor; - Inventory.TryAdd(defaultWeapon); - Inventory.TryAdd(defaultArmor); + var defaultWeapon = new Weapon(); + defaultWeapon.Stats = _defaultWeapon; + var defaultArmor = new Armor(); + defaultArmor.Stats = _defaultArmor; + Inventory.TryAdd(defaultWeapon); + Inventory.TryAdd(defaultArmor); - EquippedWeapon.Sync += EquippedWeapon_Sync; - EquippedArmor.Sync += EquippedArmor_Sync; - EquippedAccessory.Sync += EquippedAccessory_Sync; - Stats.CurrentHP.Sync += CurrentHP_Sync; - Stats.CurrentExp.Sync += CurrentEXP_Sync; + EquippedWeapon.Sync += EquippedWeapon_Sync; + EquippedArmor.Sync += EquippedArmor_Sync; + EquippedAccessory.Sync += EquippedAccessory_Sync; + Stats.CurrentHP.Sync += CurrentHP_Sync; + Stats.CurrentExp.Sync += CurrentEXP_Sync; - Equip(defaultWeapon); - Equip(defaultArmor); + Equip(defaultWeapon); + Equip(defaultArmor); - HealthTimer.WaitTime = _healthTimerWaitTime; - HealthTimer.Timeout += OnHealthTimerTimeout; - Hitbox.AreaEntered += Hitbox_AreaEntered; - CollisionDetector.AreaEntered += CollisionDetector_AreaEntered; + HealthTimer.WaitTime = _healthTimerWaitTime; + HealthTimer.Timeout += OnHealthTimerTimeout; + Hitbox.AreaEntered += Hitbox_AreaEntered; + CollisionDetector.AreaEntered += CollisionDetector_AreaEntered; } public void OnResolved() { - PlayerChunk = new SaveChunk( - onSave: (chunk) => new PlayerData() - { - PlayerStats = new PlayerStats() - { - CurrentHP = Stats.CurrentHP.Value, - MaximumHP = Stats.MaximumHP.Value, - CurrentVT = Stats.CurrentVT.Value, - MaximumVT = Stats.MaximumVT.Value, - CurrentAttack = Stats.CurrentAttack.Value, - BonusAttack = Stats.BonusAttack.Value, - MaxAttack = Stats.MaxAttack.Value, - CurrentDefense = Stats.CurrentDefense.Value, - BonusDefense = Stats.BonusDefense.Value, - MaxDefense = Stats.MaxDefense.Value, - CurrentExp = Stats.CurrentExp.Value, - CurrentLevel = Stats.CurrentLevel.Value, - ExpToNextLevel = Stats.ExpToNextLevel.Value, - Luck = Stats.Luck.Value - }, - Inventory = Inventory - }, - onLoad: (chunk, data) => - { - Stats.Init(data.PlayerStats); - Inventory = data.Inventory; - } - ); + PlayerChunk = new SaveChunk( + onSave: (chunk) => new PlayerData() + { + PlayerStats = new PlayerStats() + { + CurrentHP = Stats.CurrentHP.Value, + MaximumHP = Stats.MaximumHP.Value, + CurrentVT = Stats.CurrentVT.Value, + MaximumVT = Stats.MaximumVT.Value, + CurrentAttack = Stats.CurrentAttack.Value, + BonusAttack = Stats.BonusAttack.Value, + MaxAttack = Stats.MaxAttack.Value, + CurrentDefense = Stats.CurrentDefense.Value, + BonusDefense = Stats.BonusDefense.Value, + MaxDefense = Stats.MaxDefense.Value, + CurrentExp = Stats.CurrentExp.Value, + CurrentLevel = Stats.CurrentLevel.Value, + ExpToNextLevel = Stats.ExpToNextLevel.Value, + Luck = Stats.Luck.Value + }, + Inventory = Inventory + }, + onLoad: (chunk, data) => + { + Stats.Init(data.PlayerStats); + Inventory = data.Inventory; + } + ); - PlayerBinding = PlayerLogic.Bind(); + PlayerBinding = PlayerLogic.Bind(); - PlayerBinding - .Handle((in PlayerLogic.Output.Animations.Attack output) => - { - if (PlayerIsHittingGeometry()) - { - AnimationPlayer.Play("hit_wall"); - _gameRepo.OnPlayerAttackedWall(); - } - else - { - var attackSpeed = ((Weapon)EquippedWeapon.Value).AttackSpeed; - AnimationPlayer.SetSpeedScale((float)attackSpeed); - AnimationPlayer.Play("attack"); - _gameRepo.OnPlayerAttack(); - } - }) - .Handle((in PlayerLogic.Output.ThrowItem output) => - { - }) - .Handle((in PlayerLogic.Output.Move output) => - { - Move(output.delta); - }); + PlayerBinding + .Handle((in PlayerLogic.Output.Animations.Attack output) => + { + if (PlayerIsHittingGeometry()) + { + AnimationPlayer.Play("hit_wall"); + _gameRepo.OnPlayerAttackedWall(); + } + else + { + var attackSpeed = ((Weapon)EquippedWeapon.Value).AttackSpeed; + AnimationPlayer.SetSpeedScale((float)attackSpeed); + AnimationPlayer.Play("attack"); + _gameRepo.OnPlayerAttack(); + } + }) + .Handle((in PlayerLogic.Output.ThrowItem output) => + { + }) + .Handle((in PlayerLogic.Output.Move output) => + { + Move(output.delta); + }); - GameChunk.AddChunk(PlayerChunk); + GameChunk.AddChunk(PlayerChunk); - PlayerLogic.Start(); - this.Provide(); + PlayerLogic.Start(); + this.Provide(); } public void OnReady() { - SetPhysicsProcess(true); - SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2; + SetPhysicsProcess(true); + SwordSlashAnimation.Position = GetViewport().GetVisibleRect().Size / 2; } #endregion public void Attack() { - PlayerLogic.Input(new PlayerLogic.Input.Attack()); + PlayerLogic.Input(new PlayerLogic.Input.Attack()); } public void PlayerPause() { - Game.TogglePause(); + Game.TogglePause(); } public void RaiseHP(int amountToRaise) { - Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise); - Stats.SetCurrentHP(Stats.MaximumHP.Value); - _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXHP Up."); + Stats.SetMaximumHP(Stats.MaximumHP.Value + amountToRaise); + Stats.SetCurrentHP(Stats.MaximumHP.Value); + _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXHP Up."); } public void HealHP(int amountToRestore) { - Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore); - var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; - _gameRepo.AnnounceMessageInInventory($"{raiseString}HP Restored."); + Stats.SetCurrentHP(Stats.CurrentHP.Value + amountToRestore); + var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; + _gameRepo.AnnounceMessageInInventory($"{raiseString}HP Restored."); } public void RaiseVT(int amountToRaise) { - if (Stats.CurrentVT == Stats.MaximumVT) - { - Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise); - Stats.SetCurrentVT(Stats.MaximumVT.Value); - _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXVT Up."); - } + if (Stats.CurrentVT == Stats.MaximumVT) + { + Stats.SetMaximumVT(Stats.MaximumVT.Value + amountToRaise); + Stats.SetCurrentVT(Stats.MaximumVT.Value); + _gameRepo.AnnounceMessageInInventory($"{amountToRaise}MAXVT Up."); + } } public void HealVT(int amountToRestore) { - Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore); - var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; - _gameRepo.AnnounceMessageInInventory($"{raiseString}VT Restored."); + Stats.SetCurrentVT(Stats.CurrentVT.Value + amountToRestore); + var raiseString = amountToRestore == 1000 ? "MAX" : $"{amountToRestore}"; + _gameRepo.AnnounceMessageInInventory($"{raiseString}VT Restored."); } public void ModifyBonusAttack(int amount) { - Stats.SetBonusAttack(Stats.BonusAttack.Value + amount); + Stats.SetBonusAttack(Stats.BonusAttack.Value + amount); } public void ModifyBonusDefense(int amount) { - Stats.SetBonusDefense(Stats.BonusDefense.Value + amount); + Stats.SetBonusDefense(Stats.BonusDefense.Value + amount); } public void ModifyMaximumHP(int amount) { - Stats.SetMaximumHP(Stats.MaximumHP.Value + amount); + Stats.SetMaximumHP(Stats.MaximumHP.Value + amount); } public void ModifyMaximumVT(int amount) { - Stats.SetMaximumVT(Stats.MaximumVT.Value + amount); + Stats.SetMaximumVT(Stats.MaximumVT.Value + amount); } public void ModifyBonusLuck(double amount) { - Stats.SetLuck(Stats.Luck.Value + amount); + Stats.SetLuck(Stats.Luck.Value + amount); } public void Move(float delta) { - var rawInput = GlobalInputVector; - var strafeLeftInput = LeftStrafeInputVector; - var strafeRightInput = RightStrafeInputVector; + var rawInput = GlobalInputVector; + var strafeLeftInput = LeftStrafeInputVector; + var strafeRightInput = RightStrafeInputVector; - var transform = Transform; - transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis; - var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized(); - var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration; - _knockbackStrength = _knockbackStrength * 0.9f; - Transform = Transform with { Basis = transform.Basis }; - Velocity = velocity + (_knockbackDirection * _knockbackStrength); - MoveAndSlide(); + var transform = Transform; + transform.Basis = new Basis(Vector3.Up, Settings.RotationSpeed * -rawInput.X * delta) * transform.Basis; + var moveDirection = new Vector3(strafeRightInput - strafeLeftInput, 0, rawInput.Z).Normalized(); + var velocity = Basis * moveDirection * Settings.MoveSpeed * Settings.Acceleration; + _knockbackStrength = _knockbackStrength * 0.9f; + Transform = Transform with { Basis = transform.Basis }; + Velocity = velocity + (_knockbackDirection * _knockbackStrength); + MoveAndSlide(); } public void TeleportPlayer(Transform3D newTransform) { - Transform = newTransform; + Transform = newTransform; } public void TakeDamage(double damage, ElementType elementType, bool isCriticalHit = false) { - if (Stats.CurrentHP.Value > 0) - { - damage = CalculateDefenseResistance(damage); - if (isCriticalHit) - damage *= 2; - Stats.SetCurrentHP(Stats.CurrentHP.Value - (int)damage); - } + if (Stats.CurrentHP.Value > 0) + { + damage = CalculateDefenseResistance(damage); + if (isCriticalHit) + damage *= 2; + Stats.SetCurrentHP(Stats.CurrentHP.Value - (int)damage); + } } public void Knockback(float impulse) { - _knockbackStrength = impulse; - _knockbackDirection = GlobalBasis.Z.Normalized(); + _knockbackStrength = impulse; + _knockbackDirection = GlobalBasis.Z.Normalized(); } public void GainExp(double expGained) { - Stats.SetCurrentExp(Stats.CurrentExp.Value + expGained); + Stats.SetCurrentExp(Stats.CurrentExp.Value + expGained); } public void LevelUp() { - var nextLevel = Stats.CurrentLevel.Value + 1; - var expToNextLevel = _expToNextLevel[nextLevel]; - var newCurrentExp = Mathf.Max(Stats.CurrentExp.Value - Stats.ExpToNextLevel.Value, 0); - Stats.SetCurrentLevel(nextLevel); - Stats.SetExpToNextLevel(expToNextLevel); - Stats.SetCurrentExp(newCurrentExp); + var nextLevel = Stats.CurrentLevel.Value + 1; + var expToNextLevel = _expToNextLevel[nextLevel]; + var newCurrentExp = Mathf.Max(Stats.CurrentExp.Value - Stats.ExpToNextLevel.Value, 0); + Stats.SetCurrentLevel(nextLevel); + Stats.SetExpToNextLevel(expToNextLevel); + Stats.SetCurrentExp(newCurrentExp); } public void Die() => PlayerLogic.Input(new PlayerLogic.Input.Die()); public override void _UnhandledInput(InputEvent @event) { - if (@event.IsActionPressed(GameInputs.Pause)) - PlayerPause(); + if (@event.IsActionPressed(GameInputs.Pause)) + PlayerPause(); - if (@event.IsActionPressed(GameInputs.Attack)) - Attack(); + if (@event.IsActionPressed(GameInputs.Attack)) + Attack(); } public void OnPhysicsProcess(double delta) { - PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta)); - PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform)); + PlayerLogic.Input(new PlayerLogic.Input.PhysicsTick(delta)); + PlayerLogic.Input(new PlayerLogic.Input.Moved(GlobalPosition, GlobalTransform)); } public void Equip(EquipableItem equipable) { - if (equipable is Weapon weapon) - { - Unequip(_equippedWeapon.Value); - weapon.IsEquipped = true; - _equippedWeapon.OnNext(weapon); - } - else if (equipable is Armor armor) - { - Unequip(_equippedArmor.Value); - armor.IsEquipped = true; - _equippedArmor.OnNext(armor); - } - else if (equipable is Accessory accessory) - { - Unequip(_equippedAccessory.Value); - accessory.IsEquipped = true; - _equippedAccessory.OnNext(accessory); - } - else - throw new NotImplementedException("Item type is not supported."); + if (equipable is Weapon weapon) + { + Unequip(_equippedWeapon.Value); + weapon.IsEquipped = true; + _equippedWeapon.OnNext(weapon); + } + else if (equipable is Armor armor) + { + Unequip(_equippedArmor.Value); + armor.IsEquipped = true; + _equippedArmor.OnNext(armor); + } + else if (equipable is Accessory accessory) + { + Unequip(_equippedAccessory.Value); + accessory.IsEquipped = true; + _equippedAccessory.OnNext(accessory); + } + else + throw new NotImplementedException("Item type is not supported."); } public void Unequip(EquipableItem equipable) { - if (equipable is Weapon weapon) - { - weapon.IsEquipped = false; - ModifyBonusAttack(-weapon.Damage); - _equippedWeapon.OnNext(new Weapon()); - } - else if (equipable is Armor armor) - { - armor.IsEquipped = false; - ModifyBonusDefense(-armor.Defense); - _equippedArmor.OnNext(new Armor()); - } - else if (equipable is Accessory accessory) - { - accessory.IsEquipped = false; - ModifyMaximumHP(-accessory.MaxHPUp); - ModifyMaximumVT(-accessory.MaxVTUp); - ModifyBonusAttack(-accessory.ATKUp); - ModifyBonusDefense(-accessory.DEFUp); - ModifyBonusLuck(-accessory.LuckUp); - _equippedAccessory.OnNext(new Accessory()); - } - else - throw new NotImplementedException("Item type is not supported."); + if (equipable is Weapon weapon) + { + weapon.IsEquipped = false; + ModifyBonusAttack(-weapon.Damage); + _equippedWeapon.OnNext(new Weapon()); + } + else if (equipable is Armor armor) + { + armor.IsEquipped = false; + ModifyBonusDefense(-armor.Defense); + _equippedArmor.OnNext(new Armor()); + } + else if (equipable is Accessory accessory) + { + accessory.IsEquipped = false; + ModifyMaximumHP(-accessory.MaxHPUp); + ModifyMaximumVT(-accessory.MaxVTUp); + ModifyBonusAttack(-accessory.ATKUp); + ModifyBonusDefense(-accessory.DEFUp); + ModifyBonusLuck(-accessory.LuckUp); + _equippedAccessory.OnNext(new Accessory()); + } + else + throw new NotImplementedException("Item type is not supported."); - if (equipable.ItemTag == ItemTag.BreaksOnChange) - Inventory.Remove(equipable); + if (equipable.ItemTag == ItemTag.BreaksOnChange) + Inventory.Remove(equipable); } private static Vector3 GlobalInputVector { - get - { - var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown); - var input = new Vector3 - { - X = rawInput.X, - Z = rawInput.Y - }; - return input with { Y = 0f }; - } + get + { + var rawInput = Input.GetVector(GameInputs.MoveLeft, GameInputs.MoveRight, GameInputs.MoveUp, GameInputs.MoveDown); + var input = new Vector3 + { + X = rawInput.X, + Z = rawInput.Y + }; + return input with { Y = 0f }; + } } private static float LeftStrafeInputVector { - get - { - return Input.GetActionStrength(GameInputs.StrafeLeft); - } + get + { + return Input.GetActionStrength(GameInputs.StrafeLeft); + } } private static float RightStrafeInputVector { - get - { - return Input.GetActionStrength(GameInputs.StrafeRight); - } + get + { + return Input.GetActionStrength(GameInputs.StrafeRight); + } } private void ThrowItem() { - var itemScene = GD.Load("res://src/items/throwable/ThrowableItem.tscn"); - var throwItem = itemScene.Instantiate(); - GetTree().Root.AddChildEx(throwItem); - throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0); - throwItem.GlobalRotation = GlobalRotation; + var itemScene = GD.Load("res://src/items/throwable/ThrowableItem.tscn"); + var throwItem = itemScene.Instantiate(); + GetTree().Root.AddChildEx(throwItem); + throwItem.GlobalPosition = CurrentPosition + new Vector3(0, 3.5f, 0); + throwItem.GlobalRotation = GlobalRotation; } private void OnAnimationFinished(StringName animation) { - PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); + PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); } private void OnExitTree() { - PlayerLogic.Stop(); - PlayerBinding.Dispose(); - AnimationPlayer.AnimationFinished -= OnAnimationFinished; + PlayerLogic.Stop(); + PlayerBinding.Dispose(); + AnimationPlayer.AnimationFinished -= OnAnimationFinished; } private void OnPlayerPositionUpdated(Vector3 globalPosition) => GlobalPosition = globalPosition; private void OnHealthTimerTimeout() { - if (Stats.CurrentHP.Value <= 0) - return; + if (Stats.CurrentHP.Value <= 0) + return; - if (Stats.CurrentVT.Value > 0) - { - if (((Accessory)EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption) - { - reduceOnTick = !reduceOnTick; - } - Stats.SetCurrentHP(Stats.CurrentHP.Value + 1); - if (reduceOnTick) - Stats.SetCurrentVT(Stats.CurrentVT.Value - 1); - } - else - Stats.SetCurrentHP(Stats.CurrentHP.Value - 1); + if (Stats.CurrentVT.Value > 0) + { + if (((Accessory)EquippedAccessory.Value).AccessoryTag == AccessoryTag.HalfVTConsumption) + { + reduceOnTick = !reduceOnTick; + } + Stats.SetCurrentHP(Stats.CurrentHP.Value + 1); + if (reduceOnTick) + Stats.SetCurrentVT(Stats.CurrentVT.Value - 1); + } + else + Stats.SetCurrentHP(Stats.CurrentHP.Value - 1); } private void EquippedWeapon_Sync(EquipableItem obj) { - ModifyBonusAttack(((Weapon)obj).Damage); + ModifyBonusAttack(((Weapon)obj).Damage); } private void EquippedArmor_Sync(EquipableItem obj) { - ModifyBonusDefense(((Armor)obj).Defense); + ModifyBonusDefense(((Armor)obj).Defense); } private void EquippedAccessory_Sync(EquipableItem accessory) { - ModifyMaximumHP(((Accessory)accessory).MaxHPUp); - ModifyMaximumVT(((Accessory)accessory).MaxVTUp); - ModifyBonusAttack(((Accessory)accessory).ATKUp); - ModifyBonusDefense(((Accessory)accessory).DEFUp); - ModifyBonusLuck(((Accessory)accessory).LuckUp); + ModifyMaximumHP(((Accessory)accessory).MaxHPUp); + ModifyMaximumVT(((Accessory)accessory).MaxVTUp); + ModifyBonusAttack(((Accessory)accessory).ATKUp); + ModifyBonusDefense(((Accessory)accessory).DEFUp); + ModifyBonusLuck(((Accessory)accessory).LuckUp); } private void CurrentHP_Sync(int newHealth) { - if (newHealth <= 0) - Die(); + if (newHealth <= 0) + Die(); } private void CurrentEXP_Sync(double newExp) { - if (Stats.CurrentExp.Value >= Stats.ExpToNextLevel.Value) - LevelUp(); + if (Stats.CurrentExp.Value >= Stats.ExpToNextLevel.Value) + LevelUp(); } private double CalculateDefenseResistance(double incomingDamage) { - return Mathf.Max(incomingDamage - Stats.CurrentDefense.Value - Stats.BonusDefense.Value, 0.0); + return Mathf.Max(incomingDamage - Stats.CurrentDefense.Value - Stats.BonusDefense.Value, 0.0); } private void Hitbox_AreaEntered(Area3D area) { - var target = area.GetOwner(); - if (target is IEnemy enemy) - HitEnemy(enemy); + var target = area.GetOwner(); + if (target is IEnemy enemy) + HitEnemy(enemy); } private void HitEnemy(IEnemy enemy) { - var attackValue = Stats.CurrentAttack.Value + Stats.BonusAttack.Value; - var ignoreElementalResistance = ((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.IgnoreAffinity; - var isCriticalHit = BattleExtensions.IsCriticalHit(Stats.Luck.Value); - var element = ((Weapon)EquippedWeapon.Value).WeaponElement; + var attackValue = Stats.CurrentAttack.Value + Stats.BonusAttack.Value; + var ignoreElementalResistance = ((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.IgnoreAffinity; + var isCriticalHit = BattleExtensions.IsCriticalHit(Stats.Luck.Value); + var element = ((Weapon)EquippedWeapon.Value).WeaponElement; - enemy.TakeDamage( - attackValue * ((Weapon)EquippedWeapon.Value).ElementalDamageBonus, - element, - isCriticalHit, - false, - ignoreElementalResistance); + enemy.TakeDamage( + attackValue * ((Weapon)EquippedWeapon.Value).ElementalDamageBonus, + element, + isCriticalHit, + false, + ignoreElementalResistance); - if (((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.Knockback) - enemy.Knockback(0.3f, -CurrentBasis.Z.Normalized()); + if (((Weapon)EquippedWeapon.Value).WeaponTag == WeaponTag.Knockback) + enemy.Knockback(0.3f, -CurrentBasis.Z.Normalized()); + + _gameRepo.OnPlayerAttackedEnemy(); } private void CollisionDetector_AreaEntered(Area3D area) { - if (area.GetParent() is InventoryItem inventoryItem) - { - var isAdded = Inventory.TryAdd(inventoryItem); - if (isAdded) - { - _gameRepo.AnnounceMessageOnMainScreen($"{inventoryItem.ItemName} picked up."); - inventoryItem.QueueFree(); - } - else - _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {inventoryItem.ItemName}."); - } - if (area.GetParent() is DroppedItem droppedItem) - { - var isAdded = Inventory.TryAdd(droppedItem.Item); - if (isAdded) - { - _gameRepo.AnnounceMessageOnMainScreen($"{droppedItem.Item.ItemName} picked up."); - droppedItem.QueueFree(); - } - else - _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}."); - } + if (area.GetParent() is InventoryItem inventoryItem) + { + var isAdded = Inventory.TryAdd(inventoryItem); + if (isAdded) + { + _gameRepo.AnnounceMessageOnMainScreen($"{inventoryItem.ItemName} picked up."); + inventoryItem.QueueFree(); + } + else + _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {inventoryItem.ItemName}."); + } + if (area.GetParent() is DroppedItem droppedItem) + { + var isAdded = Inventory.TryAdd(droppedItem.Item); + if (isAdded) + { + _gameRepo.AnnounceMessageOnMainScreen($"{droppedItem.Item.ItemName} picked up."); + droppedItem.QueueFree(); + } + else + _gameRepo.AnnounceMessageOnMainScreen($"Could not pick up {droppedItem.Item.ItemName}."); + } } private bool PlayerIsHittingGeometry() { - var collisions = WallCheck.GetCollidingBodies(); - return collisions.Count > 0; + var collisions = WallCheck.GetCollidingBodies(); + return collisions.Count > 0; } private void WallCheck_BodyEntered(Node body) { - PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); - GD.Print("Hit wall"); - AnimationPlayer.Stop(); + PlayerLogic.Input(new PlayerLogic.Input.AttackAnimationFinished()); + GD.Print("Hit wall"); + AnimationPlayer.Stop(); } }