public void
    genDragMoves(MoveList result,
    long p_start_bb, long p_dest_bb, long e_start_bb, long e_dest_bb) {

    // Phase 1
    // Determine all possible suicides on traps
    calculate_trap_info();

    // Phase Three
    // Generate non rabbit moves
    long weaker_enemy_bb = piece_bb[enemy];

    for (int pt = player + 2, et = enemy + 2; pt <= 11; pt += 2, et += 2) {

      // Get all unfrozen player pieces of type pt
      long temp_bb = piece_bb[pt] & p_start_bb;
      long unfrozen_sq_bb = touching_bb(colour_bb[player]) |
        ~touching_bb(stronger_enemy_bb[pt]);
      long unfrozen_pieces_bb = temp_bb & unfrozen_sq_bb;

      // Examine each player piece one at a time
      while (unfrozen_pieces_bb != 0) {
        long lsb_bb = unfrozen_pieces_bb & -unfrozen_pieces_bb;
        unfrozen_pieces_bb ^= lsb_bb; // Remove the piece

        // Get possible destination squares
        long to_bb = touching_bb(lsb_bb) & empty_bb & p_dest_bb;

        // Get possible victim squares
        long victim_bb = weaker_enemy_bb & touching_bb(lsb_bb) & e_start_bb;

        // Try all victim pieces one at a time
        while (victim_bb != 0) {
          long lsb3_bb = victim_bb & -victim_bb;
          victim_bb ^= lsb3_bb; // Remove the piece

          // Get the victim piece type
          int victim_pt = getPieceType(lsb3_bb, enemy);

          // Handle pull moves
          // Try all destination squares one at a time
          // Test if epiece can be pulled to desired location
          if ((lsb_bb & e_dest_bb) != 0) {
            long temp_to_bb = to_bb;
            while (temp_to_bb != 0) {
              long lsb2_bb = temp_to_bb & -temp_to_bb;
              temp_to_bb ^= lsb2_bb; // Remove the piece

              // Record the move
              ArimaaMove move = result.getMove();
              move.clear();

              // Handles moving the pieces
              move.piece_bb[pt] = lsb_bb | lsb2_bb;
              move.piece_bb[victim_pt] = lsb3_bb | lsb_bb;

              // Handles suicide captures
              move.piece_bb[pt] ^= (lsb2_bb & player_suicide_bb);
              move.piece_bb[victim_pt] ^= (lsb_bb & enemy_suicide_bb);

              // Handle loss of protection captures for *BOTH* colours
              do_protection_captures(move, lsb_bb | lsb3_bb);

              // Record number of steps used
              move.steps = 2;
            }
          }

          // Handle push moves
          // Try all destination squares one at a time
          if ((lsb3_bb & p_dest_bb) != 0) {
            long victim_dest_bb = touching_bb(lsb3_bb) & empty_bb & e_dest_bb;
            while (victim_dest_bb != 0) {
              long lsb4_bb = victim_dest_bb & -victim_dest_bb;
              victim_dest_bb ^= lsb4_bb; // Remove the piece

              // Record the move
              ArimaaMove move = result.getMove();
              move.clear();

              // Handles moving the pieces
              move.piece_bb[pt] = lsb_bb | lsb3_bb;
              move.piece_bb[victim_pt] = lsb3_bb | lsb4_bb;

              // Handles suicide captures
              move.piece_bb[pt] ^= (lsb3_bb & player_suicide_bb);
              move.piece_bb[victim_pt] ^= (lsb4_bb & enemy_suicide_bb);

              // Handle loss of protection captures for *BOTH* colours
              do_protection_captures(move, lsb_bb | lsb3_bb);

              // Record number of steps used
              move.steps = 2;
            }
          }
        }
      }

      // Loop post operations
      weaker_enemy_bb |= piece_bb[et]; // Add enemy pieces of lesser value

    }

  }