From 7c5cab538816c3e9ca01e71cef26f8ec5478c609 Mon Sep 17 00:00:00 2001
From: hanifmz07 <13521157@std.stei.itb.ac.id>
Date: Sat, 11 May 2024 14:01:17 +0700
Subject: [PATCH] refactor: refactor speed and damage behaviour

---
 .../Assets/Code/Scripts/BaseBehaviour.cs      | 16 +++++
 .../Assets/Code/Scripts/BaseBehaviour.cs.meta | 11 ++++
 .../Code/Scripts/BaseWeaponController.cs      | 15 +++++
 .../Code/Scripts/BaseWeaponController.cs.meta | 11 ++++
 .../Assets/Code/Scripts/FPSController.cs      | 15 +++--
 .../Assets/Code/Scripts/Gun/GunSystem.cs      | 10 +--
 .../Code/Scripts/Gun/ShortWeaponController.cs |  7 +-
 .../Code/Scripts/Gun/SwordController.cs       |  7 +-
 .../Assets/Code/Scripts/Mobs/KingBehaviour.cs | 64 ++++++++++++++++---
 .../Code/Scripts/Pet/PetAttackerBehaviour.cs  |  7 +-
 .../Code/Scripts/Pet/PetFollowerBehaviour.cs  |  7 +-
 .../Assets/Level/Scenes/TestJup3.unity        | 25 +++++++-
 12 files changed, 164 insertions(+), 31 deletions(-)
 create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs
 create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta
 create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs
 create mode 100644 IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta

diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs
new file mode 100644
index 00000000..a925c788
--- /dev/null
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs
@@ -0,0 +1,16 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BaseBehaviour : MonoBehaviour
+{
+
+    protected bool isSpeedCrippled;
+    protected float speedCrippleMultiplier;
+
+    public void adjustCripplingSpeed(bool isCrippled, float speedMultiplier)
+    {
+        isSpeedCrippled = isCrippled;
+        speedCrippleMultiplier = speedMultiplier;
+    }
+}
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta
new file mode 100644
index 00000000..232dc214
--- /dev/null
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseBehaviour.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 70238c8911501ff41b6e55d55907f8b0
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs
new file mode 100644
index 00000000..1992932c
--- /dev/null
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs
@@ -0,0 +1,15 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class BaseWeaponController : MonoBehaviour
+{
+    protected bool isDamageCrippled;
+    protected float damageCrippledMultiplier;
+
+    public void adjustCripplingDamage(bool isCrippled, float damageMultiplier)
+    {
+        isDamageCrippled = isCrippled;
+        damageCrippledMultiplier = damageMultiplier;
+    }
+}
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta
new file mode 100644
index 00000000..f8486a18
--- /dev/null
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/BaseWeaponController.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 2a07891f144b83641b2ab05039edc900
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs
index 47832d30..95deac67 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/FPSController.cs
@@ -4,7 +4,7 @@ using UnityEngine;
 using UnityEngine.InputSystem;
 
 [RequireComponent(typeof(CharacterController))]
-public class FPSController : MonoBehaviour
+public class FPSController : BaseBehaviour
 {
     public Camera playerCamera;
     public float walkSpeed = 6f;
@@ -13,6 +13,8 @@ public class FPSController : MonoBehaviour
     public float gravity = 10f;
     public int money = 1000000; // change (if needed)
 
+    private float finalWalkSpeed, finalRunSpeed;
+
     public float lookSpeed = 2f;
     public float lookXLimit = 45f;
 
@@ -66,10 +68,6 @@ public class FPSController : MonoBehaviour
         HandleMovement();
         HandleRotation();
 
-        //if (Input.GetKeyDown(KeyCode.P))
-        //    GameObject.Find("Controller").GetComponent<PetController>().AddPetHeal();
-        //if (Input.GetKeyDown(KeyCode.L))
-        //    GameObject.Find("Controller").GetComponent<PetController>().AddPetAttack();
     }
 
     private void OnEnable()
@@ -99,9 +97,12 @@ public class FPSController : MonoBehaviour
         Vector3 forward = transform.TransformDirection(Vector3.forward);
         Vector3 right = transform.TransformDirection(Vector3.right);
 
+        finalRunSpeed = base.isSpeedCrippled ? runSpeed * base.speedCrippleMultiplier : runSpeed;
+        finalWalkSpeed = base.isSpeedCrippled ? walkSpeed * base.speedCrippleMultiplier : walkSpeed;
+
         bool isRunning = Input.GetKey(KeyCode.LeftShift);
-        float curSpeedX = canMove ? (isRunning ? runSpeed : walkSpeed) * Input.GetAxis("Vertical") : 0;
-        float curSpeedY = canMove ? (isRunning ? runSpeed : walkSpeed) * Input.GetAxis("Horizontal") : 0;
+        float curSpeedX = canMove ? (isRunning ? finalRunSpeed : finalWalkSpeed) * Input.GetAxis("Vertical") : 0;
+        float curSpeedY = canMove ? (isRunning ? finalRunSpeed : finalWalkSpeed) * Input.GetAxis("Horizontal") : 0;
         float movementDirectionY = moveDirection.y;
         moveDirection = (forward * curSpeedX) + (right * curSpeedY);
 
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs
index 747a6d32..1e41dd70 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/GunSystem.cs
@@ -3,13 +3,14 @@ using System.Collections;
 using UnityEngine;
 using TMPro;
 
-public class GunSystem : MonoBehaviour
+public class GunSystem : BaseWeaponController
 {
     // Gun Stats
     public float timeBetweenShooting, spread, range, reloadTime, timeBetweenShots;
     public bool allowButtonHold, ShootingMultipleAtOnce;
 
     public int magazineSize, bulletsPerTap, baseDamage, damage;
+    private int finalDamage;
 
     int bulletsLeft, bulletsShot;
     bool shooting, readyToShoot, reloading;
@@ -59,6 +60,7 @@ public class GunSystem : MonoBehaviour
 
     private void Update()
     {
+        finalDamage = base.isDamageCrippled ? (int) (damage * base.damageCrippledMultiplier) : damage;
         if (IsGamePaused) return;
         UserInput();
 
@@ -78,7 +80,7 @@ public class GunSystem : MonoBehaviour
             Shoot();
         }
 
-        if (bulletsLeft <= 0 && shooting && !reloading)
+        if (bulletsLeft <= 0 && shooting && !reloading) ;
             PlayOutOfAmmo();
     }
 
@@ -127,7 +129,7 @@ public class GunSystem : MonoBehaviour
             int enemyLayer = 8;
             if (rayhit.collider.gameObject.layer == enemyLayer)
             {
-                rayhit.collider.GetComponent<CombatBehavior>().TakeDamage(damage);
+                rayhit.collider.GetComponent<CombatBehavior>().TakeDamage(finalDamage);
                 Instantiate(enemyEffect, rayhit.point, Quaternion.Euler(0, 180, 0));
                 hit = true;
             } 
@@ -152,9 +154,9 @@ public class GunSystem : MonoBehaviour
                 hit = false;
             }
             PlayShootSound();
+            Invoke("ResetShot", timeBetweenShooting);
         }
 
-        Invoke("ResetShot", timeBetweenShooting);
 
         if (bulletsShot > 0 && bulletsLeft > 0)
             Invoke("Shoot", timeBetweenShots);
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs
index b688bb00..a464c4c6 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/ShortWeaponController.cs
@@ -2,7 +2,7 @@ using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
-public class ShortWeaponController : MonoBehaviour
+public class ShortWeaponController : BaseWeaponController
 {
     private float weaponLength;
     public int baseDamage;
@@ -27,6 +27,9 @@ public class ShortWeaponController : MonoBehaviour
     // Update is called once per frame
     void Update()
     {
+
+        int FinalWeaponDamage = base.isDamageCrippled ? (int) (WeaponDamage * base.damageCrippledMultiplier) : WeaponDamage;
+
         if (!canAttack)
         {
             cooldownTimer += Time.deltaTime;
@@ -72,7 +75,7 @@ public class ShortWeaponController : MonoBehaviour
             {
                 canAttack = false;
                 Debug.Log("hitt");
-                targetCombatBehavior.TakeDamage(WeaponDamage);
+                targetCombatBehavior.TakeDamage(FinalWeaponDamage);
                 Debug.Log("target health: " + targetCombatBehavior.health);
             }
         }
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs
index b4d99db5..68b784c5 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Gun/SwordController.cs
@@ -3,7 +3,7 @@ using System.Collections.Generic;
 using JetBrains.Annotations;
 using UnityEngine;
 
-public class SwordController : MonoBehaviour
+public class SwordController : BaseWeaponController
 {
     [SerializeField]
     private float cooldown = 0.5f;
@@ -18,10 +18,13 @@ public class SwordController : MonoBehaviour
 
     public int damage;
 
+    private int finalDamage;
+
     private bool canAttack = true;
 
     void Update()
     {
+        finalDamage = base.isDamageCrippled? (int) (damage * base.damageCrippledMultiplier) : damage;
         if (Input.GetMouseButton(0))
         {
             if (canAttack)
@@ -57,7 +60,7 @@ public class SwordController : MonoBehaviour
             if (rayhit.collider.gameObject.layer == enemyLayer)
             { 
                 GameObject enemy = rayhit.collider.gameObject;
-                enemy.GetComponent<CombatBehavior>().TakeDamage(damage);
+                enemy.GetComponent<CombatBehavior>().TakeDamage(finalDamage);
                 Debug.Log("Sword hit enemy");
             }
         }
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs
index cce4225e..6ffebac4 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Mobs/KingBehaviour.cs
@@ -23,9 +23,11 @@ public class KingBehaviour : MonoBehaviour
     public float speed = 1.0f;
     public float spawnKerocoCooldown = 15.0f;
 
+    public GameObject[] playerWeapons;
+
     private float crippleCooldownTimer = 0f;
     public float crippleCooldownDuration = 1f;
-    private bool isCrippleActive = true;
+    private bool isCrippleDamageActive = true;
 
     private GameObject enemyController;
     CharacterController movementController;
@@ -50,6 +52,7 @@ public class KingBehaviour : MonoBehaviour
     void Update()
     {
         Collider[] hitCollidersArea = Physics.OverlapSphere(transform.position, attackArea, targetLayer);
+        Collider[] hitCrippleArea = Physics.OverlapSphere(transform.position, crippleAttackRange, targetLayer);
         if (hitCollidersArea.Length > 0)
         {
             // Chase the enemy and attack
@@ -65,25 +68,70 @@ public class KingBehaviour : MonoBehaviour
 
         timer();
 
-        Collider[] hitCrippleArea = Physics.OverlapSphere(transform.position, crippleAttackRange, targetLayer);
-        if (isCrippleActive)
+        if (isCrippleDamageActive)
         {
-            isCrippleActive = false;
+            isCrippleDamageActive = false;
             crippleCooldownTimer = 0f;
             for (int i = 0; i < hitCrippleArea.Length; i++)
             {
                 if (!hitCrippleArea[i].GetComponent<CombatBehavior>())
                 {
-                    if (!hitCrippleArea[i].GetComponent<CombatBehavior>())
+                    hitCrippleArea[i].GetComponent<CombatBehavior>().TakeDamage(crippleDamage);
+                }
+            }
+        }
+
+        // Check cripple area
+        GameObject[] players = GameObject.FindGameObjectsWithTag("Player");
+
+        foreach (GameObject player in players)
+        {
+            Debug.Log(player.name);
+            float distance = Vector3.Distance(transform.position, player.transform.position);
+            if (distance <= crippleAttackRange)
+            {
+
+                // Cripple Speed
+                if (player.GetComponent<BaseBehaviour>())
+                {
+                    player.GetComponent<BaseBehaviour>().adjustCripplingSpeed(true, slownessMultiplier);
+                }
+
+                // Cripple Attack Power
+                if (player.Equals(MainPlayer))
+                {
+                    foreach (GameObject weapon in playerWeapons)
                     {
-                        continue;
+                        weapon.GetComponent<BaseWeaponController>().adjustCripplingDamage(true, weaknessMultiplier);
+                    }
+
+                }
+
+            }
+            else
+            {
+
+                // Cripple Speed
+                if (player.GetComponent<BaseBehaviour>())
+                {
+                    player.GetComponent<BaseBehaviour>().adjustCripplingSpeed(false, 1.0f);
+                }
+
+                // Cripple Attack Power
+                if (player.Equals(MainPlayer))
+                {
+
+                    foreach (GameObject weapon in playerWeapons)
+                    {
+                        weapon.GetComponent<BaseWeaponController>().adjustCripplingDamage(false, 1.0f);
                     }
 
-                    hitCrippleArea[i].GetComponent<CombatBehavior>().TakeDamage(crippleDamage);
                 }
             }
         }
 
+
+
         ReloadAnimation();
     }
 
@@ -168,7 +216,7 @@ public class KingBehaviour : MonoBehaviour
         crippleCooldownTimer += Time.deltaTime;
         if (crippleCooldownTimer >= crippleCooldownDuration)
         {
-            isCrippleActive = true;
+            isCrippleDamageActive = true;
         }
     }
 
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs
index 0a99fe4e..151e9238 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetAttackerBehaviour.cs
@@ -3,13 +3,14 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.AI;
 
-public class PetAttackerBehaviour : MonoBehaviour
+public class PetAttackerBehaviour : BaseBehaviour
 {
     public Transform owner;
     public Transform mouth;
     public float attackDistance = 1.5f; // Distance at which the pet will attack enemies
     public float attackArea = 10f; // Area in which the pet will chase enemies to attack
     private float speed;
+
     public LayerMask enemyLayer;
 
     private NavMeshAgent agent;
@@ -37,7 +38,7 @@ public class PetAttackerBehaviour : MonoBehaviour
         if (distanceToOwner > attackArea)
         {
             agent.SetDestination(owner.position);
-            agent.speed = speed;
+            agent.speed = isSpeedCrippled ? speed * speedCrippleMultiplier : speed;
             petAnimator.SetBool(moveAnimation, true);
             petAnimator.SetBool(idleAnimation, false);
             petAnimator.SetBool(attackAnimation, false);
@@ -52,7 +53,7 @@ public class PetAttackerBehaviour : MonoBehaviour
                 {
                     // Move towards the enemy
                     agent.SetDestination(hitCollidersArea[0].transform.position);
-                    agent.speed = speed;
+                    agent.speed = isSpeedCrippled ? speed * speedCrippleMultiplier : speed;
                     petAnimator.SetBool(moveAnimation, true);
                     petAnimator.SetBool(idleAnimation, false);
                     petAnimator.SetBool(attackAnimation, false);
diff --git a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs
index 4f571756..8800e708 100644
--- a/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs
+++ b/IF3210-2024-Unity-AFK/Assets/Code/Scripts/Pet/PetFollowerBehaviour.cs
@@ -2,7 +2,7 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.AI;
 
-public class PetFollowerBehaviour : MonoBehaviour {
+public class PetFollowerBehaviour : BaseBehaviour {
     public Transform target;
     public float distanceToStop = 2f;
     protected float speed;
@@ -20,8 +20,9 @@ public class PetFollowerBehaviour : MonoBehaviour {
 
     protected virtual void Update()
     {
-        // set the speed and destination 
-        agent.speed = speed;
+        // set the speed and destination
+        agent.speed = base.isSpeedCrippled ? speed * base.speedCrippleMultiplier : speed;
+
         agent.SetDestination(target.position);
 
         float distanceToTarget = Vector3.Distance(transform.position, target.position);
diff --git a/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity b/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity
index cf9b01b4..dd29d2c3 100644
--- a/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity
+++ b/IF3210-2024-Unity-AFK/Assets/Level/Scenes/TestJup3.unity
@@ -6460,8 +6460,24 @@ PrefabInstance:
       objectReference: {fileID: 0}
     - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
       propertyPath: spawnKerocoCooldown
-      value: 300
+      value: 1000
       objectReference: {fileID: 0}
+    - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
+      propertyPath: playerWeapons.Array.size
+      value: 3
+      objectReference: {fileID: 0}
+    - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
+      propertyPath: playerWeapons.Array.data[0]
+      value: 
+      objectReference: {fileID: 236008272}
+    - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
+      propertyPath: playerWeapons.Array.data[1]
+      value: 
+      objectReference: {fileID: 705761236}
+    - target: {fileID: 348045508547534544, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
+      propertyPath: playerWeapons.Array.data[2]
+      value: 
+      objectReference: {fileID: 8450388614318271695}
     - target: {fileID: 356863305189137741, guid: c98aeaa500ff50d48ac11ae3f232869a, type: 3}
       propertyPath: m_Layer
       value: 8
@@ -16532,6 +16548,10 @@ PrefabInstance:
     serializedVersion: 3
     m_TransformParent: {fileID: 0}
     m_Modifications:
+    - target: {fileID: 1811799765733253915, guid: 190a7c8932647e14eaf2c5935c71bca7, type: 3}
+      propertyPath: m_TagString
+      value: Weapon
+      objectReference: {fileID: 0}
     - target: {fileID: 2241956317736864890, guid: 190a7c8932647e14eaf2c5935c71bca7, type: 3}
       propertyPath: owner
       value: 
@@ -17414,7 +17434,8 @@ PrefabInstance:
       value: 
       objectReference: {fileID: 294113754}
     m_RemovedComponents: []
-    m_RemovedGameObjects: []
+    m_RemovedGameObjects:
+    - {fileID: 2535268216919818447, guid: 96674196a45debf4ba0a3fada63f2b22, type: 3}
     m_AddedGameObjects: []
     m_AddedComponents:
     - targetCorrespondingSourceObject: {fileID: 3639945069243096317, guid: 96674196a45debf4ba0a3fada63f2b22, type: 3}
-- 
GitLab