BlockToMove FindFreeBlockInAxis(int searchedDimLength, int constAxis, MovingBlocksOption option) { if (option == MovingBlocksOption.Horizontal) { for (int i = 1; i < searchedDimLength - 1; i++) { if (board[i, constAxis] is Block && ((board[i, constAxis].direction == Direction.West) || (board[i, constAxis].direction == Direction.East))) { Block b = (Block)board[i, constAxis]; Vector2 targetCoords = ReturnTargetCoordinates2(b); if (ThereIsPlaceForBlockToMove(b, targetCoords)) { return(new BlockToMove(b, targetCoords, CoordsAreOutOfBoard(targetCoords))); } } } } else if (option == MovingBlocksOption.Vertical) { for (int i = 1; i < searchedDimLength - 1; i++) { if (board[constAxis, i] is Block && ((board[constAxis, i].direction == Direction.North) || (board[constAxis, i].direction == Direction.South))) { Block b = (Block)board[constAxis, i]; Vector2 targetCoords = ReturnTargetCoordinates2(b); if (ThereIsPlaceForBlockToMove(b, targetCoords)) { return(new BlockToMove(b, targetCoords, CoordsAreOutOfBoard(targetCoords))); } } } } return(null); }
public List <BlockToMove> ReturnAllMovingBlocks(MovingBlocksOption option) { switch (option) { case MovingBlocksOption.Horizontal: return(ReturnAllMovingBlocksInDimension(width, height, option)); case MovingBlocksOption.Vertical: return(ReturnAllMovingBlocksInDimension(height, width, option)); } return(null); }
public IEnumerator MoveBlocksToFreeSpaces(MovingBlocksOption movingOption) { currentlyMovingBlocks = generator.ReturnAllMovingBlocks(movingOption); foreach (BlockToMove b in currentlyMovingBlocks) { Vector2 blockCoords = b.Block.GetPos(); generator.CleanBlockOnBoard(blockCoords); view.FillContainerWithEntity(blockCoords, new Entity((int)blockCoords.x, (int)blockCoords.y)); if (!b.OutOfBoard) { b.Block.x = (int)b.EndCoords.x; b.Block.y = (int)b.EndCoords.y; generator.InsertBlockOnBoard(b.Block); } } yield return(StartCoroutine(view.AnimateBlocksMovement(currentlyMovingBlocks))); }
void FindAllBlocksInDimWithTheSameDirectionBehindBlock(BlockToMove b, ref List <BlockToMove> BlocksInRow, MovingBlocksOption option) { bool keepLooking = true; int dir = -1 * ((int)dict[b.Block.direction].x + (int)dict[b.Block.direction].y); int j = 1; if (option == MovingBlocksOption.Horizontal) { int constAxis = b.Block.y; while (keepLooking) { if (board[b.Block.x + dir * j, constAxis] is Block && board[b.Block.x + dir * j, constAxis].direction == b.Block.direction) { BlockToMove nextBlockToMove = new BlockToMove((Block)board[b.Block.x + dir * j, constAxis]); if (CoordsAreOutOfBoard(b.EndCoords)) { nextBlockToMove.EndCoords = b.EndCoords; } else { nextBlockToMove.EndCoords += b.EndCoords + new Vector2(dir * j, 0); } nextBlockToMove.OutOfBoard = CoordsAreOutOfBoard(nextBlockToMove.EndCoords); BlocksInRow.Add(nextBlockToMove); j++; } else { return; } } return; } else if (option == MovingBlocksOption.Vertical) { int constAxis = b.Block.x; while (keepLooking) { if (board[constAxis, b.Block.y + dir * j] is Block && board[constAxis, b.Block.y + dir * j].direction == b.Block.direction) { BlockToMove nextBlockToMove = new BlockToMove((Block)board[constAxis, b.Block.y + dir * j]); if (CoordsAreOutOfBoard(b.EndCoords)) { nextBlockToMove.EndCoords = b.EndCoords; } else { nextBlockToMove.EndCoords += b.EndCoords + new Vector2(0, dir * j); } nextBlockToMove.OutOfBoard = CoordsAreOutOfBoard(nextBlockToMove.EndCoords); BlocksInRow.Add(nextBlockToMove); j++; } else { return; } } return; } }
void FindBlocksInAxis(ref List <BlockToMove> BlocksToMoveInDimension, int searchedDimLength, int constAxis, MovingBlocksOption option) { List <BlockToMove> blocksToMoveInDim = new List <BlockToMove>(); BlockToMove b = FindFreeBlockInAxis(searchedDimLength, constAxis, option); if (b != null) { blocksToMoveInDim.Add(b); FindAllBlocksInDimWithTheSameDirectionBehindBlock(b, ref blocksToMoveInDim, option); BlocksToMoveInDimension.AddRange(blocksToMoveInDim); } else { return; } }
public List <BlockToMove> ReturnAllMovingBlocksInDimension(int searchedDimLength, int anotherDimLength, MovingBlocksOption option) { List <BlockToMove> BlocksToMoveInDimension = new List <BlockToMove>(); for (int i = 1; i < anotherDimLength - 1; i++) { FindBlocksInAxis(ref BlocksToMoveInDimension, searchedDimLength, i, option); } return(BlocksToMoveInDimension); }