diff options
Diffstat (limited to 'Client/Assembly-CSharp/CrystalMinigame.cs')
-rw-r--r-- | Client/Assembly-CSharp/CrystalMinigame.cs | 120 |
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)); + } +} |