diff options
Diffstat (limited to 'GameCode/BrodalAIController.cs')
-rw-r--r-- | GameCode/BrodalAIController.cs | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/GameCode/BrodalAIController.cs b/GameCode/BrodalAIController.cs new file mode 100644 index 0000000..1d0d60f --- /dev/null +++ b/GameCode/BrodalAIController.cs @@ -0,0 +1,164 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +public class BrodalAIController : MonoBehaviour +{ + private PlayerAPI m_playerAPI; + + private int m_sampleCount = 250; + + private float m_sampleSize; + + private LayerMask m_layerMask; + + private Dictionary<Guid, Platform> m_platforms = new Dictionary<Guid, Platform>(); + + private Platform m_currentPlatform; + + private Vector2 m_pointOnLine; + + private bool inited; + + private void Start() + { + m_playerAPI = GetComponentInParent<PlayerAPI>(); + HealthHandler healthHandler = m_playerAPI.player.data.healthHandler; + healthHandler.delayedReviveAction = (Action)Delegate.Combine(healthHandler.delayedReviveAction, new Action(Init)); + } + + public void Init() + { + m_platforms.Clear(); + m_currentPlatform = null; + PlotPlatforms(); + RaycastMap(); + PostProcessPlatforms(); + inited = true; + Debug.Log("Revived"); + } + + private void PostProcessPlatforms() + { + foreach (KeyValuePair<Guid, Platform> platform in m_platforms) + { + platform.Value.PostProcessPlatformPoints(); + } + } + + private void PlotPlatforms() + { + BoxCollider2D[] array = UnityEngine.Object.FindObjectsOfType<BoxCollider2D>(); + foreach (BoxCollider2D boxCollider2D in array) + { + if (boxCollider2D.gameObject.layer == LayerMask.GetMask("Player")) + { + continue; + } + bool flag = false; + foreach (KeyValuePair<Guid, Platform> platform in m_platforms) + { + foreach (BoxCollider2D boxCollider in platform.Value.BoxColliders) + { + bool flag2 = false; + if (boxCollider2D.bounds.Intersects(boxCollider.bounds)) + { + flag2 = true; + } + if (flag2) + { + m_platforms[platform.Key].AddCollider(boxCollider2D); + flag = true; + break; + } + } + if (flag) + { + break; + } + } + if (!flag) + { + Guid key = Guid.NewGuid(); + m_platforms.Add(key, new Platform()); + m_platforms[key].AddCollider(boxCollider2D); + } + } + } + + private void MergePlatforms() + { + } + + private void RaycastMap() + { + m_layerMask = LayerMask.GetMask("Default"); + Camera component = MainCam.instance.transform.GetComponent<Camera>(); + Vector3 vector = component.ViewportToWorldPoint(new Vector2(0f, 1f)); + Vector3 vector2 = component.ViewportToWorldPoint(new Vector2(1f, 1f)); + m_sampleSize = (vector2.x - vector.x) / (float)m_sampleCount; + for (float num = vector.x; num < vector2.x; num += m_sampleSize) + { + RaycastHit2D[] array = Physics2D.RaycastAll(new Vector3(num, vector.y, 0f), Vector2.down, 9999f, m_layerMask); + for (int i = 0; i < array.Length; i++) + { + RaycastHit2D raycastHit2D = array[i]; + foreach (KeyValuePair<Guid, Platform> platform in m_platforms) + { + if (platform.Value.ContainsCollider((BoxCollider2D)raycastHit2D.collider)) + { + m_platforms[platform.Key].AddPlatformPoint(raycastHit2D.point); + break; + } + } + } + } + } + + private void Update() + { + if (inited) + { + FindClosestPlatform(base.transform.position); + Vector2 vector = m_playerAPI.OtherPlayerPosition() - base.transform.position; + float magnitude = vector.magnitude; + vector.Normalize(); + Vector2 normalized = (vector + new Vector2(0f, 0.15f)).normalized; + m_playerAPI.SetAimDirection(normalized); + Vector2 position = new Vector2(base.transform.position.x, base.transform.position.y) + vector * 1.5f; + bool num = m_currentPlatform.IsPositionOutsidePlatform(position); + m_playerAPI.Move(m_playerAPI.TowardsOtherPlayer()); + if (num) + { + m_playerAPI.Jump(); + } + vector.y = 0f; + vector.Normalize(); + RaycastHit2D raycastHit2D = Physics2D.Raycast(base.transform.position, vector, 0.85f, m_layerMask); + RaycastHit2D raycastHit2D2 = Physics2D.Raycast(base.transform.position, vector, magnitude, m_layerMask); + if ((bool)raycastHit2D.collider) + { + m_playerAPI.Jump(); + } + if (raycastHit2D2.collider == null) + { + m_playerAPI.Attack(); + } + m_playerAPI.Block(); + } + } + + private void FindClosestPlatform(Vector2 position) + { + float num = float.MaxValue; + foreach (KeyValuePair<Guid, Platform> platform in m_platforms) + { + float closestDistance = platform.Value.GetClosestDistance(position); + if (closestDistance < num) + { + m_currentPlatform = platform.Value; + num = closestDistance; + } + } + } +} |