diff options
Diffstat (limited to 'GameCode/PlayerAIZorro.cs')
| -rw-r--r-- | GameCode/PlayerAIZorro.cs | 208 | 
1 files changed, 208 insertions, 0 deletions
| diff --git a/GameCode/PlayerAIZorro.cs b/GameCode/PlayerAIZorro.cs new file mode 100644 index 0000000..c475f3f --- /dev/null +++ b/GameCode/PlayerAIZorro.cs @@ -0,0 +1,208 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEngine; + +public class PlayerAIZorro : MonoBehaviour +{ +	public AnimationCurve m_AimCompensastionCurve; + +	public LayerMask m_MapMask; + +	public LayerMask m_PlayerMask; + +	private PlayerAPI api; + +	private Camera m_camera; + +	private int framesSinceShot; + +	private Vector3[] surfacesToHideOn; + +	private Vector3 m_CurrentHidePos; + +	private float tiemSpentOverDeath; + +	private float timeSinceCouldShoot; + +	private void Start() +	{ +		api = GetComponentInParent<PlayerAPI>(); +		m_camera = Camera.main; +		HealthHandler healthHandler = api.player.data.healthHandler; +		healthHandler.delayedReviveAction = (Action)Delegate.Combine(healthHandler.delayedReviveAction, new Action(Init)); +	} + +	public void Init() +	{ +		StopAllCoroutines(); +		BakeMapSurfaces(); +		StartCoroutine(GetNewPos()); +	} + +	private void Update() +	{ +		framesSinceShot++; +		if (api.CanShoot()) +		{ +			timeSinceCouldShoot += TimeHandler.deltaTime; +		} +		else +		{ +			timeSinceCouldShoot = 0f; +		} +		Vector3 vector = api.OtherPlayerPosition() + (Vector3)api.GetOtherPlayer().data.playerVel.velocity * Vector3.Distance(base.transform.position, api.OtherPlayerPosition()) * 0.01f + Vector3.down * api.GetOtherPlayer().data.playerVel.velocity.y * Vector3.Distance(base.transform.position, api.OtherPlayerPosition()) * 0.005f; +		bool flag = false; +		if (Physics2D.Raycast(base.transform.position, Vector3.down, 18f, m_MapMask).transform == null) +		{ +			flag = false; +			tiemSpentOverDeath += TimeHandler.deltaTime; +		} +		else +		{ +			flag = true; +			tiemSpentOverDeath = 0f; +		} +		if (api.CanBlock() && Vector3.Distance(base.transform.position, api.OtherPlayerPosition()) > 5f && (flag || tiemSpentOverDeath < 0.25f)) +		{ +			api.Move(vector - base.transform.position + new Vector3(Mathf.PerlinNoise(Time.time, 0f) * 5f * Mathf.Sin(Time.time * 2f), 0f, 0f)); +		} +		else +		{ +			api.Move(m_CurrentHidePos - base.transform.position + new Vector3(Mathf.PerlinNoise(Time.time, 0f) * 8f * Mathf.Sin(Time.time * 3f), 0f, 0f)); +		} +		api.Jump(); +		ShootAt(vector); +		MakeSureToBlock(); +	} + +	public void MakeSureToBlock() +	{ +		BulletWrapper[] array = api.GetAllBullets().ToArray(); +		for (int i = 0; i < array.Length; i++) +		{ +			float num = Vector3.Distance(array[i].projectileMovement.transform.position, base.transform.position); +			float num2 = Vector3.Angle(array[i].velocity.normalized, base.transform.position - array[i].projectileMovement.transform.position); +			if (num < 1.3f && num2 < 65f && framesSinceShot >= 4) +			{ +				api.Block(); +			} +		} +	} + +	public BulletWrapper GetMostDangerousBullet(BulletWrapper[] bullets, out bool exsists) +	{ +		float num = 999999f; +		int num2 = -1; +		for (int i = 0; i < bullets.Length; i++) +		{ +			float num3 = Vector3.Distance(bullets[i].projectileMovement.transform.position, base.transform.position); +			if (num3 < num && num3 < 5f) +			{ +				num = num3; +				num2 = i; +			} +		} +		if (num2 != -1) +		{ +			exsists = true; +			return bullets[num2]; +		} +		exsists = false; +		return new BulletWrapper(); +	} + +	public BulletWrapper[] GetAllBulletsComingAtMe() +	{ +		List<BulletWrapper> list = new List<BulletWrapper>(); +		BulletWrapper[] array = api.GetAllBullets().ToArray(); +		for (int i = 0; i < array.Length; i++) +		{ +			if (Vector3.Angle(array[i].velocity.normalized, base.transform.position - array[i].projectileMovement.transform.position) < 35f) +			{ +				list.Add(array[i]); +			} +		} +		return list.ToArray(); +	} + +	public void ShootAt(Vector3 point) +	{ +		api.SetAimDirection(GetAimDirForHitting(point)); +		api.Attack(); +	} + +	private Vector2 GetAimDirForHitting(Vector3 point) +	{ +		Vector3 vector = point - base.transform.position; +		api.SetAimDirection(vector); +		api.GetMyBullet(); +		float time = Mathf.Abs(point.x - base.transform.position.x); +		Vector3 vector2 = point + Vector3.up * m_AimCompensastionCurve.Evaluate(time); +		Debug.DrawLine(point, vector2, Color.red, 0.2f); +		return vector2 - base.transform.position; +	} + +	public void BakeMapSurfaces() +	{ +		Vector2 vector = m_camera.ViewportToWorldPoint(new Vector3(1f, 1f)); +		Vector2 vector2 = m_camera.ViewportToWorldPoint(new Vector3(0f, 1f)); +		Vector2 vector3 = m_camera.ViewportToWorldPoint(new Vector3(1f, 0f)); +		Vector2 vector4 = m_camera.ViewportToWorldPoint(new Vector3(0f, 0f)); +		Vector3 v = m_camera.ViewportToWorldPoint(new Vector3(0.5f, 0.5f)); +		Debug.DrawLine(vector, v, Color.cyan); +		Debug.DrawLine(vector2, v, Color.cyan); +		Debug.DrawLine(vector3, v, Color.cyan); +		Debug.DrawLine(vector4, v, Color.cyan); +		List<Vector3> list = new List<Vector3>(); +		for (int i = 0; i < 360; i++) +		{ +			for (int j = 0; j < 40; j++) +			{ +				RaycastHit2D raycastHit2D = Physics2D.Raycast(new Vector2(Mathf.Lerp(vector2.x, vector.x, (float)i / 359f), Mathf.Lerp(vector3.y, vector.y, (float)j / 39f)), Vector3.down, 6f, m_MapMask); +				if ((bool)raycastHit2D.transform) +				{ +					list.Add(raycastHit2D.point); +				} +			} +		} +		List<Vector3> list2 = new List<Vector3>(); +		for (int k = 0; k < list.Count; k++) +		{ +			if (Physics2D.OverlapCircleAll(list[k] + Vector3.up * 0.26f, 0.1f, m_MapMask).Length != 0) +			{ +				list2.Add(list[k]); +			} +		} +		for (int l = 0; l < list2.Count; l++) +		{ +			list.Remove(list2[l]); +		} +		Debug.Log("Points: " + list.Count); +		for (int m = 0; m < list.Count; m++) +		{ +			Debug.DrawLine(list[m], list[m] + Vector3.up * 0.2f, Color.magenta, 1000f); +		} +		surfacesToHideOn = list.ToArray(); +	} + +	private IEnumerator GetNewPos() +	{ +		while (true) +		{ +			m_CurrentHidePos = GetPosAwayFrom(api.OtherPlayerPosition()); +			yield return new WaitForSeconds(4f); +		} +	} + +	public Vector3 GetPosAwayFrom(Vector3 point) +	{ +		Vector3 result; +		do +		{ +			result = surfacesToHideOn[UnityEngine.Random.Range(0, surfacesToHideOn.Length)]; +		} +		while (!(Mathf.Abs(result.x - point.x) > 13f)); +		return result; +	} +} | 
