aboutsummaryrefslogtreecommitdiffstats
path: root/Assets/Scripts/Items/Whip.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Items/Whip.cs')
-rw-r--r--Assets/Scripts/Items/Whip.cs73
1 files changed, 73 insertions, 0 deletions
diff --git a/Assets/Scripts/Items/Whip.cs b/Assets/Scripts/Items/Whip.cs
new file mode 100644
index 0000000..b482f8d
--- /dev/null
+++ b/Assets/Scripts/Items/Whip.cs
@@ -0,0 +1,73 @@
+using MontanaJohns.Actors;
+using MontanaJohns.Core;
+using System.Collections;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+namespace MontanaJohns.Items
+{
+ public class Whip : Active
+ {
+ [SerializeField] protected GameObject hook;
+ [SerializeField] protected GameObject hookNoSwing;
+ [SerializeField] protected float maxRopeLength = 20f;
+ protected GameObject player;
+ protected GameObject currentHook;
+ protected LayerMask ropeLayers;
+ protected bool ropeExists = false;
+
+ private void Awake()
+ {
+ stats.damage = 1;
+ }
+
+ private void Start()
+ {
+ player = GameObject.FindGameObjectWithTag("Player");
+ ropeLayers = LayerMask.GetMask("Grapple", "Enemy");
+ }
+
+ public override Vector2? Use()
+ {
+ if (!ropeExists)
+ {
+ Vector2 clickLocation = Camera.main.ScreenToWorldPoint(Mouse.current.position.ReadValue());
+ Vector2 playerPos = player.transform.position;
+ Vector2 direction = clickLocation - playerPos;
+ RaycastHit2D hit = Physics2D.Raycast(playerPos, direction, maxRopeLength, ropeLayers);
+ if(hit.collider != null)
+ {
+ GameObject collisionGameObject = hit.collider.gameObject;
+ ropeExists = true;
+ if (LayerMask.LayerToName(collisionGameObject.layer) == "Grapple")
+ {
+ currentHook = Instantiate(hook, collisionGameObject.transform.position, Quaternion.identity);
+ FindObjectOfType<AudioManager>().Play("WhipSwoosh");
+ return clickLocation;
+ }
+ else
+ {
+ StartCoroutine(WhipSmack(collisionGameObject));
+ }
+ }
+ return null;
+ }
+ else
+ {
+ Destroy(currentHook);
+ ropeExists = false;
+ return null;
+ }
+ }
+
+ private IEnumerator WhipSmack(GameObject collisionGameObject)
+ {
+ currentHook = Instantiate(hookNoSwing, collisionGameObject.transform.position, Quaternion.identity);
+ collisionGameObject.GetComponent<Actor>().TakeDamage(player.GetComponent<Player>().stats.damage);
+ FindObjectOfType<AudioManager>().Play("WhipSwoosh");
+ yield return new WaitForSeconds(0.1f);
+ Destroy(currentHook);
+ ropeExists = false;
+ }
+ }
+} \ No newline at end of file