diff --git a/Assets/Scripts/Boss/ElementalHealth.cs b/Assets/Scripts/Boss/ElementalHealth.cs index a8b995bfcd9b99e4d301f1ccf3f35db26c2addbf..9701e425f19409f99ffb24fb2c3faa2a5fa1137c 100644 --- a/Assets/Scripts/Boss/ElementalHealth.cs +++ b/Assets/Scripts/Boss/ElementalHealth.cs @@ -1,6 +1,6 @@ using UnityEngine; -public class ElementalHealth : MonoBehaviour +public class ElementalHealth : MonoBehaviour, IEnemyHealthHandler { public int startingHealth = 500; public int currentHealth; diff --git a/Assets/Scripts/Enemy/EnemyHealth.cs b/Assets/Scripts/Enemy/EnemyHealth.cs index f9ba8eaa92c649c890242126a0e4f49721b38565..7174196242dec53cb9edb5c6a0ed5b01f080c41d 100644 --- a/Assets/Scripts/Enemy/EnemyHealth.cs +++ b/Assets/Scripts/Enemy/EnemyHealth.cs @@ -1,6 +1,6 @@ using UnityEngine; -public class EnemyHealth : MonoBehaviour +public class EnemyHealth : MonoBehaviour, IEnemyHealthHandler { public int startingHealth = 100; public int currentHealth; @@ -9,6 +9,8 @@ public class EnemyHealth : MonoBehaviour public AudioClip deathClip; public EnemyType enemyType; + GameObject pet; + PetHealth petHealth; PetType petType; Animator anim; AudioSource enemyAudio; @@ -28,6 +30,12 @@ public class EnemyHealth : MonoBehaviour currentHealth = startingHealth; questTemple = FindObjectOfType<Temple>(); + pet = GameObject.FindGameObjectWithTag("Pet"); + if (pet != null) + { + petHealth = pet.GetComponent<PetHealth>(); + petType = petHealth.GetPetType(); + } } diff --git a/Assets/Scripts/GameOver/GameOverCanvas.cs b/Assets/Scripts/GameOver/GameOverCanvas.cs index 954256e873de70a01003c1d52c8ffa5607e9d3ff..f5c66899ad28a7d420a8573fbe8d85af2090f50f 100644 --- a/Assets/Scripts/GameOver/GameOverCanvas.cs +++ b/Assets/Scripts/GameOver/GameOverCanvas.cs @@ -30,6 +30,7 @@ public class GameOverCanvas : MonoBehaviour public void OnClickLatestSave() { + GlobalManager.Instance.IsFirstLoad = true; SceneManager.LoadScene("Quest"); IsSet = true; } diff --git a/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs b/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs new file mode 100644 index 0000000000000000000000000000000000000000..8c3471976afe9ae3670c7012a23050c757142770 --- /dev/null +++ b/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using UnityEngine; + +public interface IEnemyHealthHandler +{ + public void TakeDamage(int amount, Vector3 hitPoint); + + public Transform transform { get; } +} diff --git a/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs.meta b/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs.meta new file mode 100644 index 0000000000000000000000000000000000000000..1270a9ac6c246bcb5d0a18cf29cc233fd808cd64 --- /dev/null +++ b/Assets/Scripts/Interfaces/IEnemyHealthHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e83f67c5f57e60d42bd9a210c6144486 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Managers/EnemyManager.cs b/Assets/Scripts/Managers/EnemyManager.cs index 9353fffc9382b1a138403bebc2d0544673b67403..7cc72627406b2c260b61c5dc7deab6882697032e 100644 --- a/Assets/Scripts/Managers/EnemyManager.cs +++ b/Assets/Scripts/Managers/EnemyManager.cs @@ -21,7 +21,7 @@ public class EnemyManager : MonoBehaviour void Start() { - + isBoss = GlobalStateManager.Instance.IdxQuest == 3; } diff --git a/Assets/Scripts/Managers/GlobalManager.cs b/Assets/Scripts/Managers/GlobalManager.cs index d1ba4a5c914b491152dd1d552152a5b9bddfd5cd..acfa9b7fee806ec87d0912d0a9c9d3ac3dce5e32 100644 --- a/Assets/Scripts/Managers/GlobalManager.cs +++ b/Assets/Scripts/Managers/GlobalManager.cs @@ -12,7 +12,7 @@ public class GlobalManager : MonoBehaviour private string defaultName = "PLAYER"; private string playerName; private double totalTime; - private int volume = 60; + private float volume = 60; public bool isFromEnding = false; public string PlayerName @@ -35,7 +35,7 @@ public class GlobalManager : MonoBehaviour totalTime = value; } } - public int Volume + public float Volume { get => volume; set diff --git a/Assets/Scripts/Managers/SettingManager.cs b/Assets/Scripts/Managers/SettingManager.cs index acf3fe2a38e03ac53448bcf0829a484c9a0b0e5e..b6cfb2e77b353b0383cf359b4a605d262b64682d 100644 --- a/Assets/Scripts/Managers/SettingManager.cs +++ b/Assets/Scripts/Managers/SettingManager.cs @@ -21,7 +21,10 @@ public class SettingManager : MonoBehaviour void Update() { GlobalManager.Instance.PlayerName = nameInput.text; - GlobalManager.Instance.Volume = (int) (volumeInput.GetComponent<Slider>()).value; + var volume = (volumeInput.GetComponent<Slider>()).value * 0.1f; + GlobalManager.Instance.Volume = volume; + AudioListener.volume = volume; + Debug.Log("PLAYER NAME: " + GlobalManager.Instance.PlayerName); Debug.Log("VOLUME: " + GlobalManager.Instance.Volume); if (Input.GetKeyDown(KeyCode.Escape)) diff --git a/Assets/Scripts/Pet/AnglerAttack.cs b/Assets/Scripts/Pet/AnglerAttack.cs index 7d6d06050fefb41628d15184c16d733b3c0c2e5a..dbc5a79186600e68a0f25a8ce800bfc0fc98e622 100644 --- a/Assets/Scripts/Pet/AnglerAttack.cs +++ b/Assets/Scripts/Pet/AnglerAttack.cs @@ -47,7 +47,10 @@ public class AnglerAttack : MonoBehaviour shootRay.direction = transform.forward; if (timer >= timeBetweenBullets && !GameControl.control.cantShoot && Physics.Raycast(shootRay, out shootHit, range, shootableMask)) { - Shoot(); + if (!shootHit.collider.CompareTag("Player")) + { + Shoot(); + } } if (timer >= timeBetweenBullets * effectsDisplayTime) diff --git a/Assets/Scripts/Pet/PetMovement.cs b/Assets/Scripts/Pet/PetMovement.cs index 1cdb399e508686a6dbd7e8441555ff4627c93ce8..7791e1e09a4092e653c5520c41fbc97f555ecf1b 100644 --- a/Assets/Scripts/Pet/PetMovement.cs +++ b/Assets/Scripts/Pet/PetMovement.cs @@ -51,6 +51,13 @@ public class PetMovement : MonoBehaviour if (enemyHealth.currentHealth > 0) { nav.SetDestination (enemyPosition.position); + var damping = 2; + var target = enemy.transform; + + var lookPos = target.position - transform.position; + lookPos.y = 0; + var rotation = Quaternion.LookRotation(lookPos); + transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping); } } else diff --git a/Assets/Scripts/Player/PlayerHealth.cs b/Assets/Scripts/Player/PlayerHealth.cs index 7ebbd46cac4fccafc6703ac726c7d1f9179cf708..367a65399bbe6de3e4cd7446f617934d40bf609f 100644 --- a/Assets/Scripts/Player/PlayerHealth.cs +++ b/Assets/Scripts/Player/PlayerHealth.cs @@ -70,6 +70,8 @@ public class PlayerHealth : MonoBehaviour damaged = false; frozen = false; + + healthSlider.value = currentHealth; } public void TakeDamage(int amount) diff --git a/Assets/Scripts/Player/PlayerShotGunning.cs b/Assets/Scripts/Player/PlayerShotGunning.cs index bbcaa887a41f2ca26e7eafd07b20a1d585ab46b3..ef02c547ccf22e0b873a552546a662e6ce860fdf 100644 --- a/Assets/Scripts/Player/PlayerShotGunning.cs +++ b/Assets/Scripts/Player/PlayerShotGunning.cs @@ -7,7 +7,7 @@ public class PlayerShotGunning : MonoBehaviour, WeaponHandler [SerializeField] private float damagePerShot = 30f; [SerializeField] - private float timeBetweenBullets = 0.15f; + private float timeBetweenBullets = 1f; [SerializeField] private float range = 100f; public GameObject prefabEffect; @@ -22,7 +22,7 @@ public class PlayerShotGunning : MonoBehaviour, WeaponHandler Light gunLight; readonly float effectsDisplayTime = 0.2f; - private readonly float maxDist = 8f; + private readonly float maxDist = 10f; int numBullet = 3; List<GameObject> effects = new List<GameObject>(); @@ -36,6 +36,13 @@ public class PlayerShotGunning : MonoBehaviour, WeaponHandler } set { + var diff = value - level; + for (int i = 0; i < diff; i++) + { + AddBullet(); + numBullet++; + } + level = value; } } @@ -116,14 +123,16 @@ public class PlayerShotGunning : MonoBehaviour, WeaponHandler if (Physics.Raycast(shootRay, out shootHit, range, shootableMask)) { - EnemyHealth enemyHealth = shootHit.collider.GetComponent<EnemyHealth>(); + IEnemyHealthHandler enemyHealth = shootHit.collider.GetComponent<ElementalHealth>(); + enemyHealth ??= shootHit.collider.GetComponent< EnemyHealth>(); + if (enemyHealth != null) { var dist = Vector3.Distance(shootHit.transform.position, transform.position); if (dist <= maxDist) { Debug.Log("Enemy is On Distance"); - int finalDamage = (int)(damagePerShot / Math.Sqrt(range)); + int finalDamage = (int)(damagePerShot / Math.Sqrt(dist)); enemyHealth.TakeDamage(finalDamage, shootHit.point); } else diff --git a/Assets/Scripts/Player/Weapons/PlayerArrow.cs b/Assets/Scripts/Player/Weapons/PlayerArrow.cs index bf6587dc8c990f260d0dd55bbdf47f32a0b1e940..cc98fc3a04b47b6e60304ad51988d5d02ae0fc09 100644 --- a/Assets/Scripts/Player/Weapons/PlayerArrow.cs +++ b/Assets/Scripts/Player/Weapons/PlayerArrow.cs @@ -35,18 +35,17 @@ public class PlayerArrow : MonoBehaviour if (didHit) return; didHit = true; - if (other.gameObject.TryGetComponent<EnemyHealth>(out var enemyHealth)) + + IEnemyHealthHandler enemyHealth = other.gameObject.GetComponent<ElementalHealth>(); + enemyHealth ??= other.gameObject.GetComponent<EnemyHealth>(); + + if (enemyHealth != null) { var energy = 0.5 * rb.mass * rb.velocity.magnitude * rb.velocity.magnitude; var damage = energy * damageMultiplier; Debug.Log("damage: "+ damage); enemyHealth.TakeDamage((int)damage, enemyHealth.transform.position); } - - /* rb.velocity = Vector3.zero; - rb.angularVelocity = Vector3.zero; - rb.isKinematic = true; - transform.parent = other.transform;*/ Destroy(gameObject); } } diff --git a/Assets/Scripts/Player/Weapons/PlayerSword.cs b/Assets/Scripts/Player/Weapons/PlayerSword.cs index 3fafc2974234002728b85e645f04ea5531ca6631..76af46b28313890f3ba72e15c1d06db627c04a28 100644 --- a/Assets/Scripts/Player/Weapons/PlayerSword.cs +++ b/Assets/Scripts/Player/Weapons/PlayerSword.cs @@ -28,7 +28,10 @@ public class PlayerSword : MonoBehaviour, WeaponHandler void OnTriggerEnter(Collider other) { - if (other.gameObject.TryGetComponent<EnemyHealth>(out var enemyHealth)) + IEnemyHealthHandler enemyHealth = other.gameObject.GetComponent<ElementalHealth>(); + enemyHealth ??= other.gameObject.GetComponent<EnemyHealth>(); + + if (enemyHealth != null) { if (this.animator.GetCurrentAnimatorStateInfo(0).IsName("SwordSwing")) { diff --git a/Assets/Scripts/Quest/Temple/Temple.cs b/Assets/Scripts/Quest/Temple/Temple.cs index c1343fc340471aba0efa9f12dea799d3d9429b2f..f2e2d99e71185a023d984387f8b1903beb97f8e2 100644 --- a/Assets/Scripts/Quest/Temple/Temple.cs +++ b/Assets/Scripts/Quest/Temple/Temple.cs @@ -111,7 +111,10 @@ public class Temple : MonoBehaviour GlobalManager.Instance.TotalTime += questTime; ToastManager.Instance.ShowToastQueue(System.TimeSpan.FromSeconds(GlobalManager.Instance.TotalTime).ToString("mm':'ss"), 1); - StartCoroutine(saveDialogHandler()); + if (idxCurrentQuest != 4) + { + StartCoroutine(saveDialogHandler()); + } } private void OnTriggerEnter(Collider other) @@ -163,7 +166,7 @@ public class Temple : MonoBehaviour if (questNumberEnemy.IsEmpty()) { ExitingQuest(); - if (idxCurrentQuest == 1) + if (idxCurrentQuest == 4) { ToastManager.Instance.ShowToast("YOU WIN", 1); StartCoroutine(winHandler()); diff --git a/Assets/Scripts/SaveLoad/SaveLoadManager.cs b/Assets/Scripts/SaveLoad/SaveLoadManager.cs index cad9cacdcb0b20601fa3edc762880a4fc60b7cf6..d189dfe21e95c645e7ec98aa78e86eb747bbef71 100644 --- a/Assets/Scripts/SaveLoad/SaveLoadManager.cs +++ b/Assets/Scripts/SaveLoad/SaveLoadManager.cs @@ -76,6 +76,7 @@ public class SaveLoadManager : MonoBehaviour public void LoadState(int Id) { var state = GetSavedStateFromFile(Id); + state.playerStateSave.playerName = GlobalManager.Instance.PlayerName; if (state != null) { Debug.Log("Load State " + Id); diff --git a/Assets/Scripts/SaveLoad/SavePlace.cs b/Assets/Scripts/SaveLoad/SavePlace.cs index 05e35ec24d56825249d36dc7a89e62649a4a1b5e..d73dc564ed1b8ae50c111b8011332ab4ca997123 100644 --- a/Assets/Scripts/SaveLoad/SavePlace.cs +++ b/Assets/Scripts/SaveLoad/SavePlace.cs @@ -24,11 +24,6 @@ public class SavePlace : MonoBehaviour } SaveLoadManager.Instance.ShowUI(); } - - if (onArea && Input.GetKeyDown(KeyCode.N)) - { - SaveLoadManager.Instance.LoadState(2); - } } private void OnTriggerEnter(Collider other) diff --git a/README.md b/README.md index de72e9d2a92f7a21e1e774f882646e784d29f3fb..e87c1583389233f8f2a114419f2a6c2e90009e80 100644 --- a/README.md +++ b/README.md @@ -131,7 +131,7 @@ All the specifications were implemented. | 2. | Angelica Winasta Sinisuka | Shopkeeper, Cheat, Enemy | 000 | 3. | Averrous Saloom | Main Menu, Game Over, HUD, Story Mode | 000 | 4. | Malik Akbar Hashemi Rafsanjani | Weapon, Story Mode | 000 -| 5. | Nelsen Putra | Initialitazion, Local Scoreboard, ReadMe | 000 +| 5. | Nelsen Putra | Initialization, Local Scoreboard, README | 000 ## Contact