summaryrefslogtreecommitdiff
path: root/Thronefall_v1.0/Decompile/ScreenMarkerManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Thronefall_v1.0/Decompile/ScreenMarkerManager.cs')
-rw-r--r--Thronefall_v1.0/Decompile/ScreenMarkerManager.cs284
1 files changed, 284 insertions, 0 deletions
diff --git a/Thronefall_v1.0/Decompile/ScreenMarkerManager.cs b/Thronefall_v1.0/Decompile/ScreenMarkerManager.cs
new file mode 100644
index 0000000..155aae9
--- /dev/null
+++ b/Thronefall_v1.0/Decompile/ScreenMarkerManager.cs
@@ -0,0 +1,284 @@
+using System.Collections.Generic;
+using UnityEngine;
+
+public class ScreenMarkerManager : MonoBehaviour
+{
+ public enum MarkerMode
+ {
+ Direction,
+ ClampedPos
+ }
+
+ private class ComparePositionX : IComparer<ScreenMarker>
+ {
+ public int Compare(ScreenMarker a, ScreenMarker b)
+ {
+ if (!object.Equals(a.UnclampedScreenPos.x, b.UnclampedScreenPos.x))
+ {
+ return Comparer<float>.Default.Compare(a.UnclampedScreenPos.x, b.UnclampedScreenPos.x);
+ }
+ return Comparer<float>.Default.Compare(a.MyRandomVal - (float)a.Number, b.MyRandomVal - (float)b.Number);
+ }
+ }
+
+ private class ComparePositionY : IComparer<ScreenMarker>
+ {
+ public int Compare(ScreenMarker a, ScreenMarker b)
+ {
+ if (!object.Equals(a.UnclampedScreenPos.y, b.UnclampedScreenPos.y))
+ {
+ return Comparer<float>.Default.Compare(a.UnclampedScreenPos.y, b.UnclampedScreenPos.y);
+ }
+ return Comparer<float>.Default.Compare(a.MyRandomVal - (float)a.Number, b.MyRandomVal - (float)b.Number);
+ }
+ }
+
+ public static ScreenMarkerManager instance;
+
+ private List<ScreenMarker> screenMarkersActive = new List<ScreenMarker>();
+
+ private List<ScreenMarker> screenMarkersToShow = new List<ScreenMarker>();
+
+ private Dictionary<ScreenMarker, int> screenMarkerInGroup = new Dictionary<ScreenMarker, int>();
+
+ private List<List<ScreenMarker>> screenMarkerGroups = new List<List<ScreenMarker>>();
+
+ private Camera cam;
+
+ private float ratio;
+
+ private float clampY;
+
+ private float clampX;
+
+ private int frame;
+
+ [SerializeField]
+ private MarkerMode markerMode;
+
+ private float FIXED_CANVAS_HEIGHT => ScreenMarkerCanvasHelper.instance.Height;
+
+ private void Awake()
+ {
+ instance = this;
+ }
+
+ private void Start()
+ {
+ cam = Camera.main;
+ UpdateCam();
+ }
+
+ private void UpdateCam()
+ {
+ ratio = cam.pixelRect.width / cam.pixelRect.height;
+ clampY = FIXED_CANVAS_HEIGHT / 2f;
+ clampX = FIXED_CANVAS_HEIGHT / 2f * ratio;
+ }
+
+ public void RegisterScreenMarker(ScreenMarker _sm)
+ {
+ if (!screenMarkersActive.Contains(_sm))
+ {
+ screenMarkersActive.Add(_sm);
+ }
+ }
+
+ public void UnregisterScreenMarker(ScreenMarker _sm)
+ {
+ if (screenMarkersActive.Contains(_sm))
+ {
+ screenMarkersActive.Remove(_sm);
+ }
+ }
+
+ private void Update()
+ {
+ frame++;
+ if (frame < 2)
+ {
+ return;
+ }
+ UpdateCam();
+ screenMarkersToShow.Clear();
+ for (int num = screenMarkersActive.Count - 1; num >= 0; num--)
+ {
+ UpdateMarkerPosition(screenMarkersActive[num]);
+ }
+ for (int i = 0; i < screenMarkerGroups.Count; i++)
+ {
+ screenMarkerGroups[i].Clear();
+ }
+ screenMarkerInGroup.Clear();
+ while (screenMarkerGroups.Count < screenMarkersToShow.Count)
+ {
+ screenMarkerGroups.Add(new List<ScreenMarker>());
+ }
+ for (int j = 0; j < screenMarkersToShow.Count; j++)
+ {
+ screenMarkerGroups[j].Add(screenMarkersToShow[j]);
+ screenMarkerInGroup.Add(screenMarkersToShow[j], j);
+ }
+ bool flag = true;
+ int num2 = 30;
+ while (flag && num2 > 0)
+ {
+ num2--;
+ bool flag2 = false;
+ for (int k = 0; k < screenMarkersToShow.Count; k++)
+ {
+ ScreenMarker screenMarker = screenMarkersToShow[k];
+ for (int l = k + 1; l < screenMarkersToShow.Count; l++)
+ {
+ ScreenMarker screenMarker2 = screenMarkersToShow[l];
+ if (!CheckOverlap(screenMarker, screenMarker2))
+ {
+ continue;
+ }
+ int num3 = screenMarkerInGroup[screenMarker];
+ int num4 = screenMarkerInGroup[screenMarker2];
+ if (num3 != num4)
+ {
+ flag2 = true;
+ for (int m = 0; m < screenMarkerGroups[num4].Count; m++)
+ {
+ ScreenMarker screenMarker3 = screenMarkerGroups[num4][m];
+ screenMarkerGroups[num4].Remove(screenMarker3);
+ screenMarkerGroups[num3].Add(screenMarker3);
+ screenMarkerInGroup[screenMarker3] = num3;
+ }
+ }
+ }
+ }
+ flag = flag2;
+ if (flag2)
+ {
+ for (int n = 0; n < screenMarkerGroups.Count; n++)
+ {
+ FormatGroup(screenMarkerGroups[n]);
+ }
+ }
+ }
+ for (int num5 = 0; num5 < screenMarkersToShow.Count; num5++)
+ {
+ ScreenMarker screenMarker4 = screenMarkersToShow[num5];
+ if (screenMarker4.rotateTowardsTargetWhenOffscreen)
+ {
+ if (screenMarker4.OnScreen)
+ {
+ screenMarker4.ImageRotation = 0f;
+ }
+ else
+ {
+ screenMarker4.ImageRotation = Vector2.SignedAngle(Vector2.down, screenMarker4.UnclampedScreenPos - screenMarker4.Position);
+ }
+ }
+ }
+ }
+
+ private bool CheckOverlap(ScreenMarker _sm1, ScreenMarker _sm2)
+ {
+ if (_sm1.Rect != _sm2.Rect)
+ {
+ return false;
+ }
+ if (_sm1.UnclampedScreenPos == _sm2.UnclampedScreenPos)
+ {
+ return true;
+ }
+ Rect rect = _sm1.Rect;
+ Rect rect2 = _sm2.Rect;
+ if (Mathf.Abs(_sm1.Position.x - _sm2.Position.x) > Mathf.Abs(rect.width + rect2.width) / 2f)
+ {
+ return false;
+ }
+ if (Mathf.Abs(_sm1.Position.y - _sm2.Position.y) > Mathf.Abs(rect.height + rect2.height) / 2f)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ private void FormatGroup(List<ScreenMarker> _group)
+ {
+ if (_group.Count <= 0)
+ {
+ return;
+ }
+ Vector2 zero = Vector2.zero;
+ float num = 0f;
+ float num2 = 0f;
+ float num3 = 0f;
+ float num4 = 0f;
+ for (int i = 0; i < _group.Count; i++)
+ {
+ zero += _group[i].ClampedScreenPos;
+ num3 += _group[i].Rect.width;
+ num4 += _group[i].Rect.height;
+ if (i > 0)
+ {
+ num -= _group[i].Rect.width / 2f;
+ num2 -= _group[i].Rect.height / 2f;
+ }
+ }
+ zero /= (float)_group.Count;
+ if (Mathf.Abs(zero.x / clampX) < Mathf.Abs(zero.y / clampY))
+ {
+ zero = new Vector2(Mathf.Clamp(zero.x, 0f - clampX + num3 / 2f, clampX - num3 / 2f), zero.y);
+ _group.Sort(new ComparePositionX());
+ for (int j = 0; j < _group.Count; j++)
+ {
+ _group[j].Position = zero + Vector2.right * (_group[j].Rect.width * (float)j + num);
+ }
+ }
+ else
+ {
+ zero = new Vector2(zero.x, Mathf.Clamp(zero.y, 0f - clampY + num4 / 2f, clampY - num4 / 2f));
+ _group.Sort(new ComparePositionY());
+ for (int k = 0; k < _group.Count; k++)
+ {
+ _group[k].Position = zero + Vector2.down * (_group[k].Rect.height * (float)k + num2);
+ }
+ }
+ }
+
+ public void UpdateMarkerPosition(ScreenMarker _sm)
+ {
+ float num = cam.pixelRect.height / FIXED_CANVAS_HEIGHT;
+ Vector3 vector = cam.WorldToScreenPoint(_sm.transform.position);
+ Vector2 vector3 = (_sm.UnclampedScreenPos = new Vector2(vector.x - cam.pixelRect.width * 0.5f, vector.y - cam.pixelRect.height * 0.5f) / num);
+ bool flag = true;
+ if (Mathf.Abs(vector3.y) > clampY - _sm.checkOnScreenRect.height / 2f)
+ {
+ flag = false;
+ }
+ else if (Mathf.Abs(vector3.x) > clampX - _sm.checkOnScreenRect.width / 2f)
+ {
+ flag = false;
+ }
+ _sm.OnScreen = flag;
+ if ((flag && _sm.showWhenOnScreen) || (!flag && _sm.showWhenOffScreen))
+ {
+ screenMarkersToShow.Add(_sm);
+ _sm.Show(_show: true);
+ if (markerMode == MarkerMode.Direction)
+ {
+ float num2 = (clampX - _sm.Rect.width / 2f) / Mathf.Abs(vector3.x);
+ float num3 = (clampY - _sm.Rect.height / 2f) / Mathf.Abs(vector3.y);
+ float num4 = Mathf.Min(num2, num3, 1f);
+ vector3 = new Vector2(vector3.x, vector3.y) * num4;
+ }
+ else
+ {
+ Rect rect = _sm.Rect;
+ vector3 = new Vector2(Mathf.Clamp(vector3.x, 0f - clampX + rect.width / 2f, clampX - rect.width / 2f), Mathf.Clamp(vector3.y, 0f - clampY + rect.height / 2f, clampY - rect.height / 2f));
+ }
+ _sm.Position = vector3;
+ _sm.ClampedScreenPos = vector3;
+ }
+ else
+ {
+ _sm.Show(_show: false);
+ }
+ }
+}