/// <summary>
        /// Populates a horizontal level of the arena
        /// </summary>
        /// <param name="startingPiece"> The first piece of the arena</param>
        /// <returns> The pieces placed during this method's process</returns>
        private List <ArenaPiece> MakeHorizontalArena(ArenaPiece startingPiece)
        {
            int placedAmount = 0;
            int jumpsTaken   = 0;

            uint maxFailures = _maxPieceCount;
            // Pieces placed by this method call
            List <ArenaPiece> arena = new List <ArenaPiece>();
            //List<ArenaPiece> spawnedArena = new List<ArenaPiece>();

            // Check what list of the sorted list the selected belongs to
            int myPieceList = 0;

            for (int i = -1; i < arena.Count; i++)
            {
                int failureCount = 0;
                if (i == -1)
                {
                    _selectedPiece = startingPiece;
                }
                else
                {
                    _selectedPiece = arena[i];
                    //placedAmount++;
                }

                // Pick a piece to evaluate against our selected placed one
selectPiece:

                int rng;
                int wideRng = Random.Range(0, _sortedPieces.Count);
                myPieceList = wideRng;
                if (_sortedPieces[myPieceList].Count != 0)
                {
                    rng = Random.Range(0, _sortedPieces[myPieceList].Count);
                }
                else
                {
                    goto selectPiece;
                }


                _evaluatingPiece = _sortedPieces[myPieceList][rng];



                GameObject spawnedPiece = Instantiate(_evaluatingPiece).gameObject;
                //spawnedPiece.name = arenaName;
                ArenaPiece spawnedScript = spawnedPiece.GetComponent <ArenaPiece>();

                (bool valid, Transform trn)evaluationResult =
                    _selectedPiece.EvaluatePiece(spawnedScript,
                                                 _pieceDistance,
                                                 _pinCountTolerance);

                // If things worked out, spawn the piece in the correct position
                if (evaluationResult.valid)
                {
                    spawnedPiece.name = $"{i}";
                    arena.Add(spawnedScript);
                    placedAmount++;
                    spawnedScript.gameObject.transform.SetParent(_selectedPiece.transform);

                    if (arena.Count >= _maxPieceCount)
                    {
                        return(arena);
                    }
                }
                else
                {
                    if (failureCount > maxFailures)
                    {
                        continue;
                    }

                    // No valid connectors in the given piece
                    Destroy(spawnedPiece);
                    failureCount++;

                    goto selectPiece;
                }


                // if this one has no more free connectors, move on to the next
                // placed piece
                switch (_generationMethod)
                {
                case GenerationTypes.CORRIDOR:
                    continue;

                // For some reason the first branch gets double pieces
                case GenerationTypes.STAR:
                    int[] multi    = new int[] { -1, 1 };
                    int   variance =
                        multi[Random.Range(0, 2)] * _branchSizeVariance;

                    if (placedAmount < _branchPieceCount + variance)
                    {
                        continue;
                    }


                    else if (placedAmount >= _branchPieceCount + variance &&
                             !startingPiece.IsFull())
                    {
                        print($"placed: {placedAmount}, arena: {arena.Count}");
                        placedAmount   = 0;
                        _selectedPiece = startingPiece;

                        // it works dont ask me why
                        i += 1;
                        print($"Selected piece is now {_selectedPiece.gameObject} - index {i}");
                        goto selectPiece;
                    }
                    return(arena);

                case GenerationTypes.BRANCH:
                    int[] mult       = new int[] { -1, 1 };
                    int   multiplier =
                        mult[Random.Range(0, 2)] * _branchSizeVariance;

                    if (placedAmount < _branchPieceCount + multiplier)
                    {
                        continue;
                    }
                    else if (placedAmount > _branchPieceCount + multiplier)
                    {
                        int variableVariance;
                        variableVariance = mult[(int)Random.Range(0,
                                                                  _PieceSkippingVariance + 1)];

                        int dist =
                            (int)_branchGenPieceSkipping + variableVariance * jumpsTaken;

                        int jump = (int)Mathf.Clamp(dist,
                                                    1, arena.Count - 1);

                        if (!arena[0 + jump].IsFull())
                        {
                            print($"{jumpsTaken} - {jump}");
                            placedAmount = 0;
                            //_selectedPiece = arena[jump];
                            i = jump;
                            //i = Mathf.Clamp(i, 0, arena.Count - 1);
                            jumpsTaken++;
                            continue;
                        }
                    }
                    break;
                }


                if (_selectedPiece.IsFull())
                {
                    continue;
                }
                else // else choose another piece to evaluate for this one
                {
                    goto selectPiece;
                }
            }

            return(arena);
        }