private void MatchingProcess() { Block moveBlock = startHexaBlockUnit.GetBlock(); Block targetBlock = targetHexaBlockUnit.GetBlock(); mapModel.SwapBlocks(moveBlock, targetBlock); SwapDirectionType swapDirectionType = GetSwapBlockType(); bool isBoom = matchingModel.CheckUFOBlocks(moveBlock, targetBlock); isBoom |= matchingModel.CheckNormalMatching(moveBlock, swapDirectionType); isBoom |= matchingModel.CheckNormalMatching(targetBlock, swapDirectionType); if (isBoom) { moveCount++; stageTopMenuUnit.RefreshMoveCount(mapModel.MaxMoveCount - moveCount); StartCoroutine(BoomBlockProcess()); } else { mapModel.SwapBlocks(moveBlock, targetBlock); PlaySwapBlockProcess(isRevert: true); } }
private void SetFirecrackerBoom(int y, int x, int directionK, SwapDirectionType swapDirectionType) { if (mapModel.CheckRangeOver(y, x)) { return; } if (mapModel.CheckFixedBlock(y, x)) { return; } if (!mapModel.CheckShowBlock(y, x)) { return; } if (mapModel.CheckEmptyBlock(y, x)) { return; } if (!mapModel.CompareBlockType(y, x, BlockType.UFO) && !mapModel.CheckQuestBlock(y, x)) { mapModel.SetBoomFlag(y, x, isBoom: true); } int directionIndex = (x % 2); Vector2Int direction = mapModel.GetDirection(directionIndex, (int)swapDirectionType, directionK); int nextY = y + direction.y; int nextX = x + direction.x; SetFirecrackerBoom(nextY, nextX, directionK, swapDirectionType); }
public bool CheckFirecrackerBoom() { bool isBoom = false; for (int y = (mapModel.LengthY - 1); y >= 0; --y) { for (int x = 0; x < mapModel.LengthX; ++x) { Block block = mapModel.GetBlock(y, x); SwapDirectionType swapDirectionType = SwapDirectionType.None; if (block.ItemType == ItemType.Firecracker_Diagonal_Left) { swapDirectionType = SwapDirectionType.Left; } else if (block.ItemType == ItemType.Firecracker_Diagonal_Right) { swapDirectionType = SwapDirectionType.Right; } else if (block.ItemType == ItemType.Firecracker_UpDown) { swapDirectionType = SwapDirectionType.UpDown; } if (swapDirectionType == SwapDirectionType.None) { continue; } if (!block.IsBoom) { continue; } for (int directionK = 0; directionK < mapModel.DirectionLengthX; ++directionK) { SetFirecrackerBoom(block.Y, block.X, directionK, swapDirectionType); } isBoom = true; } } return(isBoom); }
public bool CheckNormalMatching(Block moveBlock, SwapDirectionType swapDirectionType) { bool isBoom = false; if (moveBlock.BlockType > BlockType.Red) { return(false); } if (!moveBlock.IsShow) { return(false); } if (moveBlock.IsBoom) { return(false); } int directionIndex = (moveBlock.X % 2); for (int j = 0; j < mapModel.DirectionLengthY; ++j) { Queue <Block> blocks = new Queue <Block>(); blocks.Enqueue(moveBlock); for (int k = 0; k < mapModel.DirectionLengthX; ++k) { Vector2Int direction = mapModel.GetDirection(directionIndex, j, k); int nextY = moveBlock.Y + direction.y; int nextX = moveBlock.X + direction.x; DFSMatchingBlock(nextY, nextX, j, k, blocks); } if (blocks.Count >= MATCH_COUNT_MIN) { if (blocks.Count >= MATCH_COUNT_UFO) { blocks.Dequeue(); moveBlock.SetBlockType(BlockType.UFO); moveBlock.SetBoomFlag(false); } else if (blocks.Count >= MATCH_COUNT_FIRECRACKER) { blocks.Dequeue(); Block nextBlock = blocks.Peek(); if (swapDirectionType == SwapDirectionType.None) { swapDirectionType = GetSwapDirectionType(moveBlock, nextBlock); } if (swapDirectionType == SwapDirectionType.Left) { moveBlock.SetItemType(ItemType.Firecracker_Diagonal_Right); } else if (swapDirectionType == SwapDirectionType.Right) { moveBlock.SetItemType(ItemType.Firecracker_Diagonal_Left); } else { moveBlock.SetItemType(ItemType.Firecracker_UpDown); } moveBlock.SetBoomFlag(false); } while (blocks.Count > 0) { Block boomBlock = blocks.Dequeue(); boomBlock.SetBoomFlag(true); } isBoom = true; } } return(isBoom); }