//if gemms were deleted, drop remaining gems to fill in gaps private void SetupRemainingGemmsForDrop() { for (int y = 1; y < boardDimY; y++) { for (int x = 0; x < boardDimX; x++) { if (!GemmGridLayout[x, y].destroyed) { int dropDistance = 0; for (int i = 1; i <= y; i++) { if (GemmGridLayout[x, y - i].destroyed) { dropDistance++; } } if (dropDistance > 0) { Gemm temp = GemmGridLayout[x, y - dropDistance]; GemmGridLayout[x, y - dropDistance] = GemmGridLayout[x, y]; GemmGridLayout[x, y - dropDistance].dropDist = dropDistance; GemmGridLayout[x, y] = temp; } } } } }
//Instantiate Gemm in Setup Grid private void MakeGemm(GameObject gemmGObj, int x, int y) { int drop; if (isFirstDrop) { drop = 0; } else { drop = dropOffset; } GameObject currentGemm = (GameObject)Instantiate(gemmGObj, new Vector2((float)x, (float)y + (float)drop), Quaternion.identity); currentGemm.transform.parent = transform; GemmGridLayout[x, y] = new Gemm { gemmGObj = currentGemm, tagId = currentGemm.tag, floodVisited = false, floodMatched = false, destroyed = false, dropDist = drop, gridXLoc = x, gridYLoc = y, }; }
//adjusts gemm transparency (clone and gid) private Color ChangeGemmAlpha(Gemm gemm, float aVal) { Color gemmColor = gemm.gemmGObj.GetComponent <SpriteRenderer>().color; gemmColor.a = aVal; return(gemmColor); }
//makes gemm clone to display movement private void MakeGemmClone(Gemm origGemm, int x, int y) { gemmClone = new Gemm { gemmGObj = (GameObject)Instantiate(origGemm.gemmGObj, new Vector2(x, y), Quaternion.identity), }; gemmClone.gemmGObj.GetComponent <SpriteRenderer>().color = ChangeGemmAlpha(gemmClone, overlayAlpha); isGemmCloneAlive = true; }
//Mark blob of same colored gemms; track with Floodmatchdict private void FloodMark(int x, int y, string origTag) { //create ToDo List Stack gemmStack = new Stack(); gemmStack.Push(GemmGridLayout[x, y]); //while ToDo List not empty while (gemmStack.Count > 0) { Gemm gemmLFM = (Gemm)gemmStack.Pop(); GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc].floodVisited = true; if (gemmLFM.gemmGObj.tag == origTag) { GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc].floodMatched = true; //create key to add to running list GemmLoc key = new GemmLoc { gridXLoc = gemmLFM.gridXLoc, gridYLoc = gemmLFM.gridYLoc, }; if (!FloodMatchDict.ContainsKey(key)) { FloodMatchDict.Add(key, GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc]); } //add appropriate cells around current to the ToDoList if (gemmLFM.gridXLoc > 0) { if (!GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc - 1, gemmLFM.gridYLoc]); } } if (gemmLFM.gridXLoc < boardDimX - 1) { if (!GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc + 1, gemmLFM.gridYLoc]); } } if (gemmLFM.gridYLoc > 0) { if (!GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc - 1]); } } if (gemmLFM.gridYLoc < boardDimY - 1) { if (!GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1].floodVisited && !GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1].destroyed) { gemmStack.Push(GemmGridLayout[gemmLFM.gridXLoc, gemmLFM.gridYLoc + 1]); } } } } }
//shows rotation speed of gemm movement IEnumerator ShowGemmMovementEnum(int currTouchPosX, int currTouchPosY) { //inits movedGemm = true; isRotating = true; float rotatePercent = 0.0f; rotationAngle = new Vector3(0, 0, 180.0f); GameObject gemRotator = new GameObject(); gemRotator.transform.position = new Vector2((float)prevActiveTouchPos.x - (float)(prevActiveTouchPos.x - currTouchPosX) / 2.0f, (float)prevActiveTouchPos.y - (float)(prevActiveTouchPos.y - currTouchPosY) / 2.0f); // update involved gems's parent to gem Rotator GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y].gemmGObj.transform.Rotate(0.0f, 0.0f, 180.0f, Space.Self); GemmGridLayout[currTouchPosX, currTouchPosY].gemmGObj.transform.Rotate(0.0f, 0.0f, 180.0f, Space.Self); GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y].gemmGObj.transform.parent = GemmGridLayout[currTouchPosX, currTouchPosY].gemmGObj.transform.parent = null; GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y].gemmGObj.transform.parent = GemmGridLayout[currTouchPosX, currTouchPosY].gemmGObj.transform.parent = gemRotator.transform; //rotate to desired positions while (rotatePercent <= 1.0f) { gemRotator.transform.eulerAngles = Vector3.Lerp(Vector3.zero, rotationAngle, rotatePercent); rotatePercent += rotatePercentIncrease; yield return(new WaitForSeconds(rotationTimeInterval)); } //finalize rotation and movements gemRotator.transform.eulerAngles = rotationAngle; //reparent/unparent appropriately GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y].gemmGObj.transform.parent = GemmGridLayout[currTouchPosX, currTouchPosY].gemmGObj.transform.parent = null; GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y].gemmGObj.transform.parent = GemmGridLayout[currTouchPosX, currTouchPosY].gemmGObj.transform.parent = transform; //swap old gem and new gem in grid Gemm tempGem = GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y]; GemmGridLayout[prevActiveTouchPos.x, prevActiveTouchPos.y] = GemmGridLayout[currTouchPosX, currTouchPosY]; GemmGridLayout[currTouchPosX, currTouchPosY] = tempGem; //update touch position prevActiveTouchPos.x = currTouchPosX; prevActiveTouchPos.y = currTouchPosY; //Cleanup Destroy(gemRotator); isRotating = false; //Count Move if (currNumMoves > 0) { currNumMoves--; } GameEventsScript.countMoveOld.Invoke(new GameEventsScript.CountMoveOldData(currNumMoves, movesPerRound)); }
//Wrapper for showing gemm clone private void DisplayGemmClone(Vector2 touchPos) { //make gemm clone at cursor position int gridXPos = GetPosOnGrid(touchPos.x, boardDimX); int gridYPos = GetPosOnGrid(touchPos.y, boardDimY); prevActiveTouchPos = new Vector2Int(gridXPos, gridYPos); Gemm selectedGem = GemmGridLayout[gridXPos, gridYPos]; MakeGemmClone(selectedGem, gridXPos, gridYPos); selectedGem.gemmGObj.GetComponent <SpriteRenderer>().color = ChangeGemmAlpha(selectedGem, underlayAlpha); }
//animate move Gemms down IEnumerator MoveGemsDownEnum(Gemm gemm, Vector2 start, Vector2 end) { areGemmsFalling = true; float fallPercent = 0.0f; while (fallPercent <= 1.0f) { gemm.gemmGObj.transform.position = Vector2.Lerp(start, end, fallPercent); fallPercent += fallPercentIncrease; yield return(new WaitForSeconds(fallTimeInterval)); } gemm.gemmGObj.transform.position = end; areGemmsFalling = false; }
//Create Gemms in Standard Grid private void MakeGemmsInGrid() { GameObject randGemm; for (int y = 0; y < boardDimY; y++) { for (int x = 0; x < boardDimX; x++) { //List gemm options List <GameObject> availableGems = new List <GameObject>(); availableGems.AddRange(GemmOptions); //detect if 2 in a row left and down when in row/column 3+ //assign a random gemm that makes it so grid does not contain 3 in a rows while (true) { randGemm = availableGems[UnityEngine.Random.Range(0, availableGems.Count)]; if (x > 1) { leftGemm = GemmGridLayout[x - 1, y]; if (randGemm.tag == leftGemm.tagId) { leftGemm = GemmGridLayout[x - 2, y]; if (randGemm.tag == leftGemm.tagId) { availableGems.Remove(randGemm); continue; } } } if (y > 1) { downGemm = GemmGridLayout[x, y - 1]; if (randGemm.tag == downGemm.tagId) { downGemm = GemmGridLayout[x, y - 2]; if (randGemm.tag == downGemm.tagId) { availableGems.Remove(randGemm); continue; } } } break; } MakeGemm(randGemm, x, y); } } }
//Remake/Replace destroyed gemms private void RemakeDestroyedGemms() { for (int y = 0; y < boardDimY; y++) { for (int x = 0; x < boardDimX; x++) { if (GemmGridLayout[x, y].destroyed) { //randomize recreated gemms for last part of tutorial if (tutorialTransition05Lock) { GameObject randGemm; //List gemm options List <GameObject> availableGems = new List <GameObject>(); availableGems.AddRange(GemmOptions); //detect if 2 in a row left and down when in row/column 3+ //assign a random gemm that makes it so grid does not contain 3 in a rows while (true) { randGemm = availableGems[UnityEngine.Random.Range(0, availableGems.Count)]; if (x > 1) { leftGemm = GemmGridLayout[x - 1, y]; if (randGemm.tag == leftGemm.tagId) { leftGemm = GemmGridLayout[x - 2, y]; if (randGemm.tag == leftGemm.tagId) { availableGems.Remove(randGemm); continue; } } } if (y > 1) { downGemm = GemmGridLayout[x, y - 1]; if (randGemm.tag == downGemm.tagId) { downGemm = GemmGridLayout[x, y - 2]; if (randGemm.tag == downGemm.tagId) { availableGems.Remove(randGemm); continue; } } } break; } MakeGemm(randGemm, x, y); //setup tutorial for all-clear opportunity } else if (tutorialTransition02Lock) { GameObject tutGemm; if (y == 3 || y == 4) { tutGemm = GemmOptions[(x + 2) % GemmOptions.Count]; MakeGemm(tutGemm, x, y); } else if (y == 2) { tutGemm = GemmOptions[(x + 1) % GemmOptions.Count]; MakeGemm(tutGemm, x, y); } //do the normal drops } else { GameObject newGemm = GemmOptions[UnityEngine.Random.Range(0, GemmOptions.Count)]; MakeGemm(newGemm, x, y); } } } } }