All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.threerings.parlor.card.data.Card Maven / Gradle / Ivy

The newest version!
//
// $Id$
//
// Vilya library - tools for developing networked games
// Copyright (C) 2002-2012 Three Rings Design, Inc., All Rights Reserved
// http://code.google.com/p/vilya/
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published
// by the Free Software Foundation; either version 2.1 of the License, or
// (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

package com.threerings.parlor.card.data;

import com.threerings.util.ActionScript;

import com.threerings.presents.dobj.DSet;

/**
 * Instances of this class represent individual playing cards.
 */
public class Card implements DSet.Entry, Comparable, CardCodes
{
    /**
     * No-arg constructor for deserialization.
     */
    public Card ()
    {}

    /**
     * Creates a new card.
     *
     * @param number the number of the card
     * @param suit the suit of the card
     */
    public Card (int number, int suit)
    {
        _value = (byte)((suit << 5) | number);
    }

    /**
     * Returns the value of the card, either from 2 to 11 or KING, QUEEN, JACK, ACE, RED_JOKER, or
     * BLACK_JOKER.
     *
     * @return the value of the card
     */
    public int getNumber ()
    {
        return (_value & 0x1F);
    }

    /**
     * Returns the suit of the card: SPADES, HEARTS, DIAMONDS, or CLUBS. If the card is the joker,
     * the suit is undefined.
     *
     * @return the suit of the card
     */
    public int getSuit ()
    {
        return (_value >> 5);
    }

    /**
     * Checks whether the card is a number card (2 to 10).
     *
     * @return true if the card is a number card, false otherwise
     */
    public boolean isNumber ()
    {
        int number = getNumber();

        return number >= 2 && number <= 10;
    }

    /**
     * Checks whether the card is a face card (KING, QUEEN, or JACK).
     *
     * @return true if the card is a face card, false otherwise
     */
    public boolean isFace ()
    {
        int number = getNumber();

        return number == KING || number == QUEEN || number == JACK;
    }

    /**
     * Checks whether the card is an ace.
     *
     * @return true if the card is an ace, false otherwise
     */
    public boolean isAce ()
    {
        return getNumber() == ACE;
    }

    /**
     * Checks whether the card is a joker.
     *
     * @return true if the card is a joker, false otherwise
     */
    public boolean isJoker ()
    {
        int number = getNumber();

        return number == RED_JOKER || number == BLACK_JOKER;
    }

    /**
     * Checks whether or not this card is valid. The no-arg public constructor for deserialization
     * creates an invalid card.
     *
     * @return true if this card is valid, false if not
     */
    public boolean isValid ()
    {
        int number = getNumber(), suit = getSuit();

        return number == RED_JOKER || number == BLACK_JOKER ||
               (number >= 2 && number <= ACE &&
                suit >= SPADES && suit <= DIAMONDS);
    }

    // Documentation inherited.
    public Comparable getKey ()
    {
        if (_key == null) {
            _key = Byte.valueOf(_value);
        }

        return _key;
    }

    @Override
    public int hashCode ()
    {
        return _value;
    }

    @Override
    public boolean equals (Object other)
    {
        if (other instanceof Card) {
            return _value == ((Card)other)._value;
        }
        else {
            return false;
        }
    }

    /**
     * Compares this card to another. The card order is the same as the initial deck ordering: two
     * through ten, jack, queen, king, ace for spades, hearts, clubs, and diamonds, then the red
     * joker and the black joker.
     *
     * @param other the other card to compare this to
     * @return -1, 0, or +1, depending on whether this card is less than, equal to, or greater
     * than the other card
     */
    public int compareTo (Card other)
    {
        int otherValue = other._value;

        if (_value > otherValue) {
            return +1;
        } else if(_value < otherValue) {
            return -1;
        } else {
            return 0;
        }
    }

    @Override
    public String toString ()
    {
        int number = getNumber();

        if (number == RED_JOKER) {
            return "RJ";
        }
        else if (number == BLACK_JOKER) {
            return "BJ";
        }
        else {
            StringBuilder sb = new StringBuilder();

            if (number >= 2 && number <= 9) {
                sb.append(Integer.toString(number));
            }
            else {
                switch (number) {
                    case 10: sb.append('T'); break;
                    case JACK: sb.append('J'); break;
                    case QUEEN: sb.append('Q'); break;
                    case KING: sb.append('K'); break;
                    case ACE: sb.append('A'); break;
                    default: sb.append('?'); break;
                }
            }

            switch (getSuit()) {
                case SPADES: sb.append('s'); break;
                case HEARTS: sb.append('h'); break;
                case CLUBS: sb.append('c'); break;
                case DIAMONDS: sb.append('d'); break;
                default: sb.append('?'); break;
            }

            return sb.toString();
        }
    }

    /** The number of the card. */
    protected byte _value;

    /** The comparison key. */
    @ActionScript(omit=true)
    protected transient Byte _key;
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy