1 /**
  2  * A classic trick-based card game.
  3  */
  4 function Hearts() {
  5     var board = new Board({rootId : "Hearts", handId : "HeartsHand"}),
  6         scores = [0, 0, 0, 0],
  7         currentTrick = [],
  8         currentCardNumber = 0,
  9         ledSuit,
 10         highestRank;
 11 
 12     var main = new Deck();
 13     main.initialize(true);
 14     main.shuffle();
 15 
 16     var hands = [];
 17     for (var i = 0; i < 4; i++) {
 18         hands[i] = new Deck(board.defaultType);
 19         hands[i].setActive(i == 0);
 20         main.deal(hands[i], 13);
 21         board.addDeck(hands[i]);
 22     }
 23 
 24     var plays = [],
 25         locs = [1, 4, 0, 2, 1, 0, 2, 2]; 
 26     for (i = 0; i < 4; i++) {
 27         plays[i] = new Deck(board.defaultType, locs.pop(), locs.pop(),
 28                             {draggable : false});
 29         plays[i].setFilter((function (play) {
 30             return function () {return play.getCards().length < 1;};
 31         })(plays[i]));
 32         board.addDeck(plays[i]);
 33         plays[i].observe((function (n) {
 34             return function (event) {
 35                 if (currentCardNumber == 0) {
 36                     ledSuit = plays[n].peek().getSuit();
 37                     highestRank = plays[n].peek().getRank();
 38                     highestRank = highestRank == 1 ? 14 : highestRank;
 39                 }
 40 
 41                 currentTrick[n] = plays[n].peek().getSuit();
 42                 currentCardNumber++;
 43 
 44                 if (currentCardNumber == 4) {
 45                     endTrick();
 46                 }
 47             };
 48         })(i));
 49     }
 50 
 51     /**
 52      * Ends the current trick, tallying up the scores and resetting everything
 53      * as needed.
 54      */
 55     function endTrick() {
 56         var score = 0,
 57             winner;
 58 
 59         for (var i = 0; i < 4; i++) {
 60             var suit = currentTrick[i].getSuit(),
 61                 rank = currentTrick[i].getRank();
 62             rank = rank == 1 ? 14 : rank;
 63 
 64             if (suit == ledSuit && rank >= highestRank) {
 65                 winner = i;
 66             }
 67 
 68             if (suit == "s" && rank == 12) {
 69                 score += 13;
 70             } else if (suit == "h") {
 71                 score += 1;
 72             }
 73         }
 74 
 75         scores[winner] += score;
 76         currentTrick = [];
 77         currentCardNumber = 0;
 78         highestRank = 0;
 79         ledSuit = null;
 80 
 81         for (var i = 0; i < 4; i++) {
 82             plays[i].remove(plays[i].peek());
 83         }
 84     }
 85 }