//------------------------------------------Protected Functions------------------------------------------ protected BlockPuzzleTileInfo[] GetTilePositions() { BlockPuzzleTileInfo[] tiles = new BlockPuzzleTileInfo[TileCountX * TileCountY]; Vector3 startPoint = transform.position - (new Vector3(GridDims.x, 0f, GridDims.y) / 2f) + (new Vector3(pTileDims.x, 0f, pTileDims.y) / 2f); for (int i = 0; i < TileCountX; i++) { for (int j = 0; j < TileCountY; j++) { var tilePos = startPoint + new Vector3(pTileDims.x * i, 0f, pTileDims.y * j); tiles[i * TileCountY + j].Pos = tilePos; tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Valid; RaycastHit hit; if (Physics.BoxCast(tilePos + Vector3.up * 10f, new Vector3(pTileDims.x, 1f, pTileDims.y) * 0.4f, Vector3.down, out hit, Quaternion.identity, 9.5f)) { tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Invalid; if (hit.collider.tag == "Player") { tiles[i * TileCountY + j].TileState = BlockPuzzleTileState.Player; } } } } return(tiles); }
public bool BlockMoveIsValid(Vector3 blockPos, BlockDirection dir, out BlockPuzzleTileInfo tileInfo) { tileInfo = new BlockPuzzleTileInfo(); var tiles = GetTilePositions(); BlockPuzzleTileInfo newTile = new BlockPuzzleTileInfo(); newTile.Pos = Vector3.one * float.PositiveInfinity; newTile.TileState = BlockPuzzleTileState.Invalid; float alignThreshold = 0.1f; foreach (var tile in tiles) { bool tileAlignsCorrectly = false; switch (dir) { case BlockDirection.Forward: if (tile.Pos.z > blockPos.z && Mathf.Abs(tile.Pos.x - blockPos.x) < alignThreshold) { tileAlignsCorrectly = true; } break; case BlockDirection.Right: if (tile.Pos.x > blockPos.x && Mathf.Abs(tile.Pos.z - blockPos.z) < alignThreshold) { tileAlignsCorrectly = true; } break; case BlockDirection.Backward: if (tile.Pos.z < blockPos.z && Mathf.Abs(tile.Pos.x - blockPos.x) < alignThreshold) { tileAlignsCorrectly = true; } break; case BlockDirection.Left: if (tile.Pos.x < blockPos.x && Mathf.Abs(tile.Pos.z - blockPos.z) < alignThreshold) { tileAlignsCorrectly = true; } break; case BlockDirection.Null: return(false); } if (tileAlignsCorrectly && Vector3.Distance(blockPos, tile.Pos) < Vector3.Distance(blockPos, newTile.Pos)) { newTile = tile; } } tileInfo = newTile; // Checking that if Tia is pushed back she wont be forced into an invalid tile. if (tileInfo.TileState == BlockPuzzleTileState.Player) { BlockPuzzleTileInfo tempTile; bool validMove = BlockMoveIsValid(newTile.Pos, dir, out tempTile); bool onGrid = GridContainsPoint(tileInfo.Pos + new Vector3(DirectionToVector(dir).x *pTileDims.x, 0f, DirectionToVector(dir).z *pTileDims.y)); return(validMove || !onGrid); } if (tileInfo.TileState == BlockPuzzleTileState.Valid) { return(true); } return(false); }