public static void AddAllPossibleKnightMoves(List <FastMove> moves, FastIndex start, Team team, FastBoardNode boardNode, bool generateQuiet = true)
 {
     foreach (var target in PrecomputedMoveData.knightMoves[start.ToByte()])
     {
         if (boardNode.TryGetPiece(target, out (Team team, FastPiece piece)occupier))
         {
             if (occupier.team != team)
             {
                 moves.Add(new FastMove(start, target, MoveType.Attack));
             }
         }
         else if (generateQuiet)
         {
             moves.Add(new FastMove(start, target, MoveType.Move));
         }
     }
 }
    public static void AddAllPossibleRookMoves(List <FastMove> moves, FastIndex start, Team team, FastBoardNode boardNode, bool generateQuiet = true)
    {
        AddAllPossibleRookDirectionalMoves(moves, start, team, boardNode, generateQuiet);

        if (generateQuiet)
        {
            foreach (var target in PrecomputedMoveData.kingMoves[start.ToByte()])
            {
                if (boardNode.TryGetPiece(target, out (Team team, FastPiece piece)occupier))
                {
                    if (occupier.team == team && Contains(DefendableTypes, occupier.piece))
                    {
                        moves.Add(new FastMove(start, target, MoveType.Defend));
                    }
                }
            }
        }
    }