From 24e478dd7a953e066cf093ec99587039330e0af2 Mon Sep 17 00:00:00 2001
From: MuhamadAjiW <16521119@mahasiswa.itb.ac.id>
Date: Thu, 18 Apr 2024 19:30:05 +0700
Subject: [PATCH] fix: game state controller

---
 .../Scripts/Core/Game/GameStateController.cs  | 19 +++++++++++++------
 Assets/Scripts/Library/Enum/GameEventType.cs  |  3 +++
 .../Library/Enum/GameEventType.cs.meta        | 11 +++++++++++
 Assets/Scripts/Library/Events/GameEvent.cs    | 10 ++++++++++
 .../Scripts/Library/Events/GameEvent.cs.meta  | 11 +++++++++++
 .../Library/Events/GameStateChangeEvent.cs    |  5 +++++
 .../Events/GameStateChangeEvent.cs.meta       | 11 +++++++++++
 7 files changed, 64 insertions(+), 6 deletions(-)
 create mode 100644 Assets/Scripts/Library/Enum/GameEventType.cs
 create mode 100644 Assets/Scripts/Library/Enum/GameEventType.cs.meta
 create mode 100644 Assets/Scripts/Library/Events/GameEvent.cs
 create mode 100644 Assets/Scripts/Library/Events/GameEvent.cs.meta
 create mode 100644 Assets/Scripts/Library/Events/GameStateChangeEvent.cs
 create mode 100644 Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta

diff --git a/Assets/Scripts/Core/Game/GameStateController.cs b/Assets/Scripts/Core/Game/GameStateController.cs
index b63e3fd1..29bb07cb 100644
--- a/Assets/Scripts/Core/Game/GameStateController.cs
+++ b/Assets/Scripts/Core/Game/GameStateController.cs
@@ -6,15 +6,22 @@ using UnityEngine;
 public class GameStateController {
     // Attributes
     private readonly Stack<GameState> gameStateStack = new();
-    event StackChangeEvent<GameState> OnGameStateChange;
+    event GameStateChangeEvent OnGameStateChange;
     event Action OnPaused;
 
     // Constructor
     public GameStateController(){
         gameStateStack.Push(GameState.NULL);
+        gameStateStack.Push(GameState.RUNNING);
+        OnGameStateChange += LogGameStateStack;
     }
 
     // Functions
+    private void LogGameStateStack(StackChangeEventArgs<GameState> e){
+        Debug.Log(e.EventType);
+        Debug.Log(gameStateStack);
+    }
+
     public void PushState(GameState gameState){
         switch(gameState){
             case GameState.PAUSED:
@@ -23,7 +30,7 @@ public class GameStateController {
             case GameState.RUNNING:
                 Time.timeScale = 1;
                 break;
-            //TODO: Review cutscenes behaviour
+            //TODO: Review cutscenes and menu behaviour
             case GameState.CUTSCENE:
                 Time.timeScale = 0;
                 break;
@@ -34,7 +41,7 @@ public class GameStateController {
                 throw new Exception("Invalid gameState pushed to GameStateController, please refer to enum GameState for valid states");
         }
         gameStateStack.Push(gameState);
-        OnGameStateChange.Invoke(new StackChangeEventArgs<GameState>(
+        OnGameStateChange?.Invoke(new GameStateChangeArgs(
             StackChangeEventType.PUSH,
             gameStateStack.Count,
             gameState
@@ -59,8 +66,8 @@ public class GameStateController {
                 Time.timeScale = 0;
                 break;
         }
-        OnGameStateChange.Invoke(new StackChangeEventArgs<GameState>(
-            StackChangeEventType.PUSH,
+        OnGameStateChange?.Invoke(new GameStateChangeArgs(
+            StackChangeEventType.POP,
             gameStateStack.Count,
             gameState
         ));
@@ -70,7 +77,7 @@ public class GameStateController {
         switch (gameStateStack.Peek()){
             case GameState.RUNNING:
                 PushState(GameState.PAUSED);
-                OnPaused.Invoke();
+                OnPaused?.Invoke();
                 return;
 
             case GameState.PAUSED:
diff --git a/Assets/Scripts/Library/Enum/GameEventType.cs b/Assets/Scripts/Library/Enum/GameEventType.cs
new file mode 100644
index 00000000..0252b7bb
--- /dev/null
+++ b/Assets/Scripts/Library/Enum/GameEventType.cs
@@ -0,0 +1,3 @@
+public enum GameEventType{
+    CHEAT
+}
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Enum/GameEventType.cs.meta b/Assets/Scripts/Library/Enum/GameEventType.cs.meta
new file mode 100644
index 00000000..e4f0d1ae
--- /dev/null
+++ b/Assets/Scripts/Library/Enum/GameEventType.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 41b332ae7187a124789afd290f85cee9
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Library/Events/GameEvent.cs b/Assets/Scripts/Library/Events/GameEvent.cs
new file mode 100644
index 00000000..10086a83
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameEvent.cs
@@ -0,0 +1,10 @@
+using System;
+
+public class GameEventArgs : EventArgs{
+    public GameEventType EventType { get; }
+    public GameEventArgs(GameEventType eventType){
+        EventType = eventType;
+    }
+}
+
+public delegate void GameEvent(GameEventArgs e);
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Events/GameEvent.cs.meta b/Assets/Scripts/Library/Events/GameEvent.cs.meta
new file mode 100644
index 00000000..c3bb62b9
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 5230c920e65b9b34ea68dd5e60ccf3e7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Library/Events/GameStateChangeEvent.cs b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs
new file mode 100644
index 00000000..ead0a904
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs
@@ -0,0 +1,5 @@
+
+public class GameStateChangeArgs : StackChangeEventArgs<GameState>{
+    public GameStateChangeArgs(StackChangeEventType eventType, int index, GameState value) : base(eventType, index, value){}
+}
+public delegate void GameStateChangeEvent(GameStateChangeArgs e);
\ No newline at end of file
diff --git a/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta
new file mode 100644
index 00000000..54c950b9
--- /dev/null
+++ b/Assets/Scripts/Library/Events/GameStateChangeEvent.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 25f336313940bf846bb06897a34c073c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
-- 
GitLab