summaryrefslogtreecommitdiff
path: root/Client/Assembly-CSharp/CrystalMinigame.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Client/Assembly-CSharp/CrystalMinigame.cs')
-rw-r--r--Client/Assembly-CSharp/CrystalMinigame.cs120
1 files changed, 120 insertions, 0 deletions
diff --git a/Client/Assembly-CSharp/CrystalMinigame.cs b/Client/Assembly-CSharp/CrystalMinigame.cs
new file mode 100644
index 0000000..6e749f0
--- /dev/null
+++ b/Client/Assembly-CSharp/CrystalMinigame.cs
@@ -0,0 +1,120 @@
+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));
+ }
+}