using System; using UnityEngine; public class CrystalMinigame : Minigame { public CrystalBehaviour[] CrystalPieces; public FloatRange XRange; public FloatRange YRange; private Controller myController = new Controller(); public override void Begin(PlayerTask task) { base.Begin(task); for (int i = 0; i < this.CrystalPieces.Length; i++) { this.CrystalPieces[i].transform.localPosition = new Vector3(this.XRange.Next(), this.YRange.Next(), ((float)i - (float)this.CrystalPieces.Length / 2f) / 100f); } } public void Update() { this.myController.Update(); for (int i = 0; i < this.CrystalPieces.Length; i++) { CrystalBehaviour crystalBehaviour = this.CrystalPieces[i]; switch (this.myController.CheckDrag(crystalBehaviour.Collider, false)) { case DragState.TouchStart: this.Spread(i); break; case DragState.Dragging: { Vector3 position = this.myController.DragPosition; position.z = base.transform.position.z; crystalBehaviour.transform.position = position; break; } case DragState.Released: this.CheckSolution(); break; } } } private void Spread(int parent) { for (int i = 0; i < this.CrystalPieces.Length; i++) { if (i < parent) { this.CrystalPieces[i].ParentSide = CrystalBehaviour.Parentness.Below; } else if (i > parent) { this.CrystalPieces[i].ParentSide = CrystalBehaviour.Parentness.Above; } else { this.CrystalPieces[i].ParentSide = CrystalBehaviour.Parentness.None; } } } private void CheckSolution() { bool flag = false; for (int i = 0; i < this.CrystalPieces.Length; i++) { CrystalBehaviour crystalBehaviour = this.CrystalPieces[i]; Vector3 position = crystalBehaviour.transform.position; if (!crystalBehaviour.Above && i - 1 > -1) { CrystalBehaviour crystalBehaviour2 = this.CrystalPieces[i - 1]; if (CrystalMinigame.AreTouching(crystalBehaviour2.Collider, crystalBehaviour.Collider)) { crystalBehaviour.Above = crystalBehaviour2; crystalBehaviour2.Below = crystalBehaviour; crystalBehaviour.FlashUp(0f); } else { flag = true; } } if (!crystalBehaviour.Below && i + 1 < this.CrystalPieces.Length) { CrystalBehaviour crystalBehaviour3 = this.CrystalPieces[i + 1]; if (CrystalMinigame.AreTouching(crystalBehaviour3.Collider, crystalBehaviour.Collider)) { crystalBehaviour.Below = crystalBehaviour3; crystalBehaviour3.Above = crystalBehaviour; crystalBehaviour.FlashDown(0f); } else { flag = true; } } } if (!flag) { this.MyNormTask.Complete(); base.StartCoroutine(base.CoStartClose(0.75f)); } } private static bool AreTouching(BoxCollider2D a, BoxCollider2D b) { Vector2 a2 = a.transform.position + a.offset; Vector2 a3 = b.transform.position + b.offset; Vector2 vector = a2 - a.size / 2f; Vector2 vector2 = a3 - b.size / 2f; Vector2 vector3 = a2 + a.size / 2f; Vector2 vector4 = a3 + b.size / 2f; return ((vector.y < vector4.y && vector.y > vector2.y) || (vector3.y < vector4.y && vector3.y > vector2.y)) && ((vector.x < vector4.x && vector.x > vector2.x) || (vector3.x < vector4.x && vector3.x > vector2.x)); } }