diff --git a/Assets/Scenes/Wave_Mode.unity b/Assets/Scenes/Wave_Mode.unity
index a7a08b59449eb547f3144e04f33d279116ecb36a..abd0baa8c8f5b8071daf9a5811bd6cf8b7a9b2fd 100644
--- a/Assets/Scenes/Wave_Mode.unity
+++ b/Assets/Scenes/Wave_Mode.unity
@@ -563,6 +563,7 @@ RectTransform:
   - {fileID: 732164004}
   - {fileID: 1401845283}
   - {fileID: 1733453808}
+  - {fileID: 1569865516}
   m_Father: {fileID: 0}
   m_RootOrder: 6
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
@@ -682,7 +683,7 @@ GameObject:
   m_Icon: {fileID: 0}
   m_NavMeshLayer: 0
   m_StaticEditorFlags: 0
-  m_IsActive: 1
+  m_IsActive: 0
 --- !u!114 &180263585
 MonoBehaviour:
   m_ObjectHideFlags: 0
@@ -6850,6 +6851,98 @@ Transform:
   m_Father: {fileID: 0}
   m_RootOrder: 10
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!1 &1569865515
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1569865516}
+  - component: {fileID: 1569865518}
+  - component: {fileID: 1569865517}
+  - component: {fileID: 1569865519}
+  m_Layer: 5
+  m_Name: Wave
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1569865516
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1569865515}
+  m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_Children: []
+  m_Father: {fileID: 38786128}
+  m_RootOrder: 7
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 0.5, y: 0.5}
+  m_AnchorMax: {x: 0.5, y: 0.5}
+  m_AnchoredPosition: {x: 418.8, y: 233.39}
+  m_SizeDelta: {x: 120, y: 50}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1569865517
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1569865515}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 1
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_FontData:
+    m_Font: {fileID: 12800000, guid: 46238fb1ad7a7a84ba8954c1c860994c, type: 3}
+    m_FontSize: 30
+    m_FontStyle: 2
+    m_BestFit: 0
+    m_MinSize: 2
+    m_MaxSize: 40
+    m_Alignment: 3
+    m_AlignByGeometry: 0
+    m_RichText: 1
+    m_HorizontalOverflow: 0
+    m_VerticalOverflow: 0
+    m_LineSpacing: 1
+  m_Text: 'Wave: '
+--- !u!222 &1569865518
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1569865515}
+  m_CullTransparentMesh: 1
+--- !u!114 &1569865519
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1569865515}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: c28f4cf9025a6694b85720e383356c21, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
 --- !u!1001 &1687477066
 PrefabInstance:
   m_ObjectHideFlags: 0
@@ -7295,17 +7388,44 @@ MonoBehaviour:
   m_Name: 
   m_EditorClassIdentifier: 
   waves:
-  - name: ZomBunny
-    enemy: {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
-    count: 2
-    rate: 1
-  - name: ZomBear
-    enemy: {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
-    count: 3
+  - name: Wave 1
+    enemyPool:
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 3
+    rate: 5
+  - name: Wave 2
+    enemyPool:
+    - {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 5
     rate: 1.5
-  - name: Hellephant
-    enemy: {fileID: 1206665596, guid: f264ab47e25d0374ba89abced0b94b2a, type: 3}
-    count: 5
+  - name: Wave 3
+    enemyPool:
+    - {fileID: 1206665596, guid: f264ab47e25d0374ba89abced0b94b2a, type: 3}
+    - {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 10
+    rate: 2
+  - name: Wave 4
+    enemyPool:
+    - {fileID: 1206665596, guid: f264ab47e25d0374ba89abced0b94b2a, type: 3}
+    - {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 3
+    rate: 2
+  - name: Wave 5
+    enemyPool:
+    - {fileID: 1206665596, guid: f264ab47e25d0374ba89abced0b94b2a, type: 3}
+    - {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 3
+    rate: 2
+  - name: Wave 6
+    enemyPool:
+    - {fileID: 1206665596, guid: f264ab47e25d0374ba89abced0b94b2a, type: 3}
+    - {fileID: 1914384318, guid: 3688f3f3f312c984fa78e00c09819e6c, type: 3}
+    - {fileID: 2022850303, guid: 73871ddf5c8d02442be00d9671a9d510, type: 3}
+    weight: 3
     rate: 2
   spawnPoints:
   - {fileID: 9083842937541373870, guid: 6bbf9ef8fcce5114482d813a9b680d17, type: 3}
diff --git a/Assets/Scripts/WaveMode.meta b/Assets/Scripts/WaveMode.meta
new file mode 100644
index 0000000000000000000000000000000000000000..579a1ba9aca3e2ec635ed10c37134bdfe4c87da6
--- /dev/null
+++ b/Assets/Scripts/WaveMode.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 19389e43b76c8cc4cb80864831522d40
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/WaveMode/WaveManager.cs b/Assets/Scripts/WaveMode/WaveManager.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9ebb6c90747b6a66f40debf4beaae5d14903789d
--- /dev/null
+++ b/Assets/Scripts/WaveMode/WaveManager.cs
@@ -0,0 +1,23 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.UI;
+
+public class WaveManager : MonoBehaviour
+{
+    public static int wave;
+
+    Text text;
+
+
+    void Awake()
+    {
+        text = GetComponent<Text>();
+        wave = 0;
+    }
+
+    void Update()
+    {
+        text.text = "Wave: " + wave;
+    }
+}
diff --git a/Assets/Scripts/WaveMode/WaveManager.cs.meta b/Assets/Scripts/WaveMode/WaveManager.cs.meta
new file mode 100644
index 0000000000000000000000000000000000000000..f7dac7b9728da144273f78a78bba20d6373b79c2
--- /dev/null
+++ b/Assets/Scripts/WaveMode/WaveManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: c28f4cf9025a6694b85720e383356c21
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/WaveSpawner.cs b/Assets/Scripts/WaveMode/WaveSpawner.cs
similarity index 75%
rename from Assets/Scripts/WaveSpawner.cs
rename to Assets/Scripts/WaveMode/WaveSpawner.cs
index 1b85d9f7aae45f16983a49001a5343d9bf07f5e5..6f00a6ad572c7843933f290edadacd6fe329eadf 100644
--- a/Assets/Scripts/WaveSpawner.cs
+++ b/Assets/Scripts/WaveMode/WaveSpawner.cs
@@ -10,8 +10,8 @@ public class WaveSpawner : MonoBehaviour
     public class Wave
     {
         public string name;
-        public Transform enemy;
-        public int count;
+        public Transform[] enemyPool;
+        public int weight;
         public float rate;
     }
 
@@ -80,10 +80,13 @@ public class WaveSpawner : MonoBehaviour
 
         if (nextWave + 1 > waves.Length - 1)
         {
-            nextWave = -1; // biar pas di-increment jadi 0
+            //nextWave = -1; // biar pas di-increment jadi 0
             Debug.Log("All Waves Completed! Looping...");
+            return;
         }
 
+        // TODO kondisi wave completed
+
         nextWave++;
     }
 
@@ -107,13 +110,30 @@ public class WaveSpawner : MonoBehaviour
         Debug.Log("Spawning Wave: " + _wave.name);
         state = SpawnState.SPAWNING;
 
+        // increment wave UI
+        WaveManager.wave++;
+
+        // menangani enemy pool kosong
+        if (_wave.enemyPool.Length == 0)
+        {
+            Debug.LogError("Enemy pool is empty!");
+        }
+
         // spawn
-        for (int i=0; i<_wave.count; i++)
+        for (int i=0; i<_wave.weight; i++)
         {
-            SpawnEnemy(_wave.enemy);
+            SpawnEnemy(RandomizeEnemy(_wave));
             yield return new WaitForSeconds(1f / _wave.rate);
         }
 
+        // wave dengan nomor kelipatan 3
+        if ((nextWave + 1) % 3 == 0)
+        {
+            Debug.Log("SPAWN BOSS WAVE " + (nextWave + 1));
+            // TODO Spawn boss
+            SpawnEnemy(_wave.enemyPool[0]);
+        }
+
         // balik set jadi waiting
         state = SpawnState.WAITING;
 
@@ -125,7 +145,13 @@ public class WaveSpawner : MonoBehaviour
         // spawn enemy
         Debug.Log("Spawning Enemy: " + _enemy.name);
 
+        // TODO setiap enemy ada spawn point masing2?
         Transform _sp = spawnPoints[Random.Range(0, spawnPoints.Length)];
         Instantiate(_enemy, _sp.position, _sp.rotation);
     }
+
+    Transform RandomizeEnemy (Wave _wave)
+    {
+        return _wave.enemyPool[Random.Range(0, _wave.enemyPool.Length)];
+    }
 }
diff --git a/Assets/Scripts/WaveSpawner.cs.meta b/Assets/Scripts/WaveMode/WaveSpawner.cs.meta
similarity index 100%
rename from Assets/Scripts/WaveSpawner.cs.meta
rename to Assets/Scripts/WaveMode/WaveSpawner.cs.meta