package games.strategy.triplea.delegate; /** * A single roll of a die. */ public class Die implements java.io.Serializable { private static final long serialVersionUID = 8766753280669636980L; public enum DieType { MISS, HIT, IGNORED } private final DieType m_type; // the value of the dice, 0 based private final int m_value; // this value is 1 based private final int m_rolledAt; public Die(final int value) { this(value, -1, DieType.MISS); } public Die(final int value, final int rolledAt, final DieType type) { m_type = type; m_value = value; m_rolledAt = rolledAt; } public Die.DieType getType() { return m_type; } public int getValue() { return m_value; } int getRolledAt() { return m_rolledAt; } // compress to an int // we write a lot of dice over the network and to the saved // game, so we want to make this fairly efficient int getCompressedValue() { if (m_value > 255 || m_rolledAt > 255) { throw new IllegalStateException("too big to serialize"); } return (m_rolledAt << 8) + (m_value << 16) + (m_type.ordinal()); } // read from an int static Die getFromWriteValue(final int value) { final int rolledAt = (value & 0x0FF00) >> 8; final int roll = (value & 0x0FF0000) >> 16; final DieType type = DieType.values()[(value & 0x0F)]; return new Die(roll, rolledAt, type); } @Override public boolean equals(final Object o) { if (!(o instanceof Die)) { return false; } final Die other = (Die) o; return other.m_type == this.m_type && other.m_value == this.m_value && other.m_rolledAt == this.m_rolledAt; } @Override public int hashCode() { return m_value + 37 * m_rolledAt; } @Override public String toString() { if (m_rolledAt < 0) { return "Die roll:" + m_value + (m_type == DieType.IGNORED ? " type:" + m_type : ""); } return "Die roll:" + m_value + " rolled at:" + m_rolledAt + " type:" + m_type; } }