Implement BGM and SFX event system

This commit is contained in:
2024-09-14 16:01:55 -07:00
parent 0a71339bbe
commit cd8806a9fe
38 changed files with 718 additions and 116 deletions

View File

@@ -4,11 +4,9 @@ namespace GameJamDungeon;
using Chickensoft.AutoInject;
using Chickensoft.GodotNodeInterfaces;
using Chickensoft.Introspection;
using DialogueManagerRuntime;
using Godot;
using System;
public interface IGame : IProvide<IGameRepo>, IProvide<IGame>, INode3D
public interface IGame : IProvide<IGameRepo>, IProvide<IGameEventDepot>, IProvide<IGame>, INode3D
{
event Game.StatRaisedAlertEventHandler StatRaisedAlert;
}
@@ -22,10 +20,14 @@ public partial class Game : Node3D, IGame
IGame IProvide<IGame>.Value() => this;
IGameEventDepot IProvide<IGameEventDepot>.Value() => GameEventDepot;
public IInstantiator Instantiator { get; set; } = default!;
public IGameLogic GameLogic { get; set; } = default!;
public IGameEventDepot GameEventDepot { get; set; } = default!;
public IGameRepo GameRepo { get; set; } = default!;
public GameLogic.IBinding GameBinding { get; set; } = default!;
@@ -47,14 +49,18 @@ public partial class Game : Node3D, IGame
[Node] public DeathMenu DeathMenu { get; set; } = default!;
[Node] public IPauseMenu PauseMenu { get; set; } = default!;
[Node] public InGameAudio InGameAudio { get; set; } = default!;
#endregion
public void Setup()
{
GameRepo = new GameRepo();
GameLogic = new GameLogic();
GameEventDepot = new GameEventDepot();
GameLogic.Set(GameRepo);
GameLogic.Set(AppRepo);
GameLogic.Set(GameEventDepot);
Instantiator = new Instantiator(GetTree());
}
@@ -66,6 +72,10 @@ public partial class Game : Node3D, IGame
{
InGameUI.Show();
})
.Handle((in GameLogic.Output.GoToOverworld _) =>
{
GameEventDepot.OnOverworldEntered();
})
.Handle((in GameLogic.Output.SetPauseMode output) => CallDeferred(nameof(SetPauseMode), output.IsPaused))
.Handle((in GameLogic.Output.ShowPauseMenu _) =>
{
@@ -93,12 +103,13 @@ public partial class Game : Node3D, IGame
GameLogic.Start();
GameLogic.Input(new GameLogic.Input.Initialize());
InGameAudio.OverworldBgm.FadeIn();
this.Provide();
PauseMenu.TransitionCompleted += OnPauseMenuTransitioned;
PauseMenu.UnpauseButtonPressed += PauseMenu_UnpauseButtonPressed;
Map.TeleportReached += Map_TeleportReached;
GameEventDepot.TeleportEntered += Map_TeleportReached;
Map.DungeonFinishedGenerating += Map_DungeonFinishedGenerating;
InGameUI.InventoryMenu.ClosedMenu += InventoryMenu_CloseInventory;
InGameUI.MinimapButtonReleased += Player_MinimapButtonReleased;
@@ -115,6 +126,13 @@ public partial class Game : Node3D, IGame
Player.InventoryButtonPressed += Player_InventoryButtonPressed;
Player.MinimapButtonHeld += Player_MinimapButtonHeld;
Player.PauseButtonPressed += Player_PauseButtonPressed;
GameRepo.PlayerData.Inventory.EquippedItem += Inventory_EquippedItem;
}
private void Inventory_EquippedItem()
{
GameEventDepot.OnEquippedItem();
}
private void UseTeleportPrompt_CloseTeleportPrompt()
@@ -125,6 +143,7 @@ public partial class Game : Node3D, IGame
private void UseTeleportPrompt_TeleportToNextFloor()
{
GameLogic.Input(new GameLogic.Input.FloorExitReached());
GameEventDepot.OnDungeonAThemeAreaEntered();
}
private void PauseMenu_UnpauseButtonPressed()
@@ -170,10 +189,6 @@ public partial class Game : Node3D, IGame
GameLogic.Input(new GameLogic.Input.HideFloorClearMenu());
}
public void GoToNextFloor()
{
GameLogic.Input(new GameLogic.Input.FloorExitReached());
}
private void Inventory_RaiseStatRequest(ConsumableItemStats consumableItemStats)
{
@@ -186,6 +201,8 @@ public partial class Game : Node3D, IGame
RaiseVT(consumableItemStats.RaiseVTAmount);
else if (consumableItemStats.HealVTAmount > 0)
HealVT(consumableItemStats.HealVTAmount);
GameEventDepot.OnHealingItemConsumed(consumableItemStats);
}
private void RaiseHP(int amountToRaise)

View File

@@ -34,6 +34,7 @@ script = ExtResource("4_f5pye")
unique_name_in_owner = true
[node name="InGameAudio" parent="." instance=ExtResource("6_qc71l")]
unique_name_in_owner = true
[node name="DialogueController" type="Node" parent="."]
unique_name_in_owner = true

View File

@@ -0,0 +1,77 @@
using System;
namespace GameJamDungeon
{
public interface IGameEventDepot : IDisposable
{
event Action? OverworldEntered;
public void OnOverworldEntered();
event Action? DungeonAThemeAreaEntered;
public void OnDungeonAThemeAreaEntered();
event Action? DungeonBThemeAreaEntered;
public void OnDungeonBThemeAreaEntered();
event Action? DungeonCThemeAreaEntered;
public void OnDungeonCThemeAreaEntered();
event Action? TeleportEntered;
public void OnTeleportEntered();
event Action? MenuScrolled;
public void OnMenuScrolled();
event Action? MenuBackedOut;
public void OnMenuBackedOut();
event Action? EquippedItem;
public void OnEquippedItem();
event Action? UnequippedItem;
public void OnUnequippedItem();
event Action? InventorySorted;
public void OnInventorySorted();
event Action<ConsumableItemStats>? HealingItemConsumed;
public void OnHealingItemConsumed(ConsumableItemStats item);
}
public class GameEventDepot : IGameEventDepot
{
public event Action? OverworldEntered;
public event Action? DungeonAThemeAreaEntered;
public event Action? DungeonBThemeAreaEntered;
public event Action? DungeonCThemeAreaEntered;
public event Action? TeleportEntered;
public event Action? MenuScrolled;
public event Action? MenuBackedOut;
public event Action? EquippedItem;
public event Action? UnequippedItem;
public event Action? InventorySorted;
public event Action<ConsumableItemStats>? HealingItemConsumed;
public void OnOverworldEntered() => OverworldEntered?.Invoke();
public void OnDungeonAThemeAreaEntered() => DungeonAThemeAreaEntered?.Invoke();
public void OnDungeonBThemeAreaEntered() => DungeonBThemeAreaEntered?.Invoke();
public void OnDungeonCThemeAreaEntered() => DungeonCThemeAreaEntered?.Invoke();
public void OnTeleportEntered() => TeleportEntered?.Invoke();
public void OnMenuScrolled() => MenuScrolled?.Invoke();
public void OnMenuBackedOut() => MenuBackedOut?.Invoke();
public void OnEquippedItem() => EquippedItem?.Invoke();
public void OnUnequippedItem() => UnequippedItem?.Invoke();
public void OnInventorySorted() => InventorySorted?.Invoke();
public void OnHealingItemConsumed(ConsumableItemStats item) => HealingItemConsumed?.Invoke(item);
public void Dispose()
{
GC.SuppressFinalize(this);
}
}
}

View File

@@ -8,6 +8,8 @@
public readonly record struct Initialize;
public readonly record struct GoToOverworld;
public readonly record struct OpenInventory;
public readonly record struct CloseInventory;

View File

@@ -37,6 +37,8 @@ namespace GameJamDungeon
public readonly record struct ShowAskForTeleport;
public readonly record struct HideAskForTeleport;
public readonly record struct GoToOverworld;
}
}
}

View File

@@ -9,6 +9,6 @@ namespace GameJamDungeon
[LogicBlock(typeof(State), Diagram = true)]
public partial class GameLogic : LogicBlock<GameLogic.State>, IGameLogic
{
public override Transition GetInitialState() => To<State.Playing>();
public override Transition GetInitialState() => To<State.GameStarted>();
}
}

View File

@@ -24,6 +24,7 @@ GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_AskFor
GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_InventoryOpened : OpenInventory
GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_MinimapOpen : MiniMapButtonPressed
GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_Paused : PauseGame
GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_Playing : GoToOverworld
GameJamDungeon_GameLogic_State_Playing --> GameJamDungeon_GameLogic_State_Quit : GameOver
GameJamDungeon_GameLogic_State_Resuming --> GameJamDungeon_GameLogic_State_Playing : PauseMenuTransitioned
@@ -36,8 +37,9 @@ GameJamDungeon_GameLogic_State_MinimapOpen : OnEnter → ShowMiniMap
GameJamDungeon_GameLogic_State_MinimapOpen : OnExit → HideMiniMap
GameJamDungeon_GameLogic_State_Paused : OnEnter → ShowPauseMenu
GameJamDungeon_GameLogic_State_Paused : OnExit → ExitPauseMenu
GameJamDungeon_GameLogic_State_Playing : OnGoToOverworld → GoToOverworld
GameJamDungeon_GameLogic_State_Quit : OnEnter → ShowLostScreen
GameJamDungeon_GameLogic_State_Resuming : OnExit → HidePauseMenu
[*] --> GameJamDungeon_GameLogic_State_Playing
[*] --> GameJamDungeon_GameLogic_State_GameStarted
@enduml

View File

@@ -23,10 +23,6 @@ public interface IGameRepo : IDisposable
public int MaxItemSize { get; }
public int CurrentFloor { get; set; }
public void OnGameEnded();
event Action? Ended;
}
public class GameRepo : IGameRepo

View File

@@ -13,12 +13,11 @@ namespace GameJamDungeon
IGet<Input.MiniMapButtonPressed>,
IGet<Input.GameOver>,
IGet<Input.AskForTeleport>,
IGet<Input.PauseGame>
IGet<Input.PauseGame>,
IGet<Input.GoToOverworld>
{
public Playing()
{
this.OnEnter(() => Get<IGameRepo>().Ended += OnEnded);
this.OnExit(() => Get<IGameRepo>().Ended -= OnEnded);
}
public void OnEnded() => Input(new Input.GameOver());
@@ -32,6 +31,12 @@ namespace GameJamDungeon
public Transition On(in Input.AskForTeleport input) => To<AskForTeleport>();
public Transition On(in Input.PauseGame input) => To<Paused>();
public Transition On(in Input.GoToOverworld input)
{
Output(new Output.GoToOverworld());
return ToSelf();
}
}
}
}