private List<CardMove> movesFromWorkingStacksRevealsCard(GameModelView pModel) {
    ArrayList<CardMove> moves = new ArrayList<CardMove>();
    for (StackIndex index : StackIndex.values()) {
      CardView[] stack = pModel.getStack(index);
      for (int i = 0; i < stack.length; i++) {
        if (stack[i].isVisible() && i > 0 && !stack[i - 1].isVisible()) {
          for (StackIndex index2 : StackIndex.values()) {
            if (pModel.isLegalMove(stack[i].getCard(), index2)) {
              moves.add(new CardMove(stack[i].getCard(), index2));
            }
          }
        } else if (stack[i].isVisible() && i == 0) {
          for (StackIndex index2 : StackIndex.values()) {
            // we don't want to just move a card around
            if (pModel.isLegalMove(stack[i].getCard(), index2)
                && pModel.getStack(index2).length > 0) {
              moves.add(new CardMove(stack[i].getCard(), index2));
            }
          }
        }
      }
    }

    return moves;
  }
 private List<CardMove> movesFromDiscardPileToWorkingStacks(GameModelView pModel) {
   ArrayList<CardMove> moves = new ArrayList<CardMove>();
   if (!pModel.isEmptyDiscardPile()) {
     for (StackIndex index : StackIndex.values()) {
       if (pModel.isLegalMove(pModel.peekDiscardPile(), index)) {
         moves.add(new CardMove(pModel.peekDiscardPile(), index));
       }
     }
   }
   return moves;
 }
 private List<CardMove> movesFromWorkingStacksToSuitStacks(GameModelView pModel) {
   ArrayList<CardMove> moves = new ArrayList<CardMove>();
   for (StackIndex index : StackIndex.values()) {
     CardView[] stack = pModel.getStack(index);
     if (stack.length > 0) {
       Card card = stack[stack.length - 1].getCard();
       for (SuitStackIndex index2 : SuitStackIndex.values()) {
         if (pModel.isLegalMove(card, index2)) {
           moves.add(new CardMove(card, index2));
           if (pModel.isEmptySuitStack(index2)) {
             break; // we take the first possible blank space
           }
         }
       }
     }
   }
   return moves;
 }