/
codebase/src/net/sourceforge/pain/admin/console/command/
codebase/src/net/sourceforge/pain/data/role/
codebase/src/net/sourceforge/pain/network/console/telnet/
codebase/src/net/sourceforge/pain/network/guitool/
codebase/src/net/sourceforge/pain/plugin/
codebase/src/net/sourceforge/pain/util/
db/src/net/sourceforge/pain/util/
gui/
gui/lib/
gui/src/net/sourceforge/pain/tools/guitool/dbbrowse/
gui/src/net/sourceforge/pain/tools/guitool/dialog/
gui/src/net/sourceforge/pain/tools/guitool/menu/
gui/src/net/sourceforge/pain/tools/guitool/resources/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/
gui/src/net/sourceforge/pain/tools/guitool/resources/images/explorer/
mudlibs/tinylib/
mudlibs/tinylib/area/
mudlibs/tinylib/etc/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/prototype/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/data/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/affect/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/deploy/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/event/guitool/event/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/fn/util/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/logic/trigger/impl/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/command/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/reset/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/shutdown/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/plugin/social/
mudlibs/tinylib/src/net/sourceforge/pain/tinylib/util/
tests/
tests/src/
tests/src/net/sourceforge/pain/db/data/
package net.sourceforge.pain.util;


import java.util.*;


/**
 * Simple impl of dice
 */
public final class Dice {

    private static Random random = new Random();

    private final int[] dice;

    public Dice(int numDice, int numSides, int add) {
        dice = new int[]{numDice, numSides, add};
    }

    public Dice(int[] dice) {
        this.dice = dice;
    }

    /**
     * format: XdY+Z
     */
    public Dice(String diceStr) {
        dice = new int[3];
        int d = diceStr.indexOf('d');
        if (d < 1) {
            throw new IllegalArgumentException("Invalid dice string:" + diceStr);
        }
        dice[0] = Integer.parseInt(diceStr.substring(0, d));
        int p = diceStr.indexOf('+', d);
        if (p < d + 1 || p > diceStr.length() - 1) {
            throw new IllegalArgumentException("Invalid dice string:" + diceStr);
        }
        dice[1] = Integer.parseInt(diceStr.substring(d + 1, p));
        dice[2] = Integer.parseInt(diceStr.substring(p + 1));
    }

    public int roll() {
        return roll(dice);
    }

    public static int roll(int[] dice) {
        return roll(dice[0], dice[1], dice[2]);
    }

    public static int roll(int numDice, int numSides) {
        return roll(numDice, numSides, 0);
    }

    public static int roll(int numDice, int numSides, int add) {
        if (numDice == 0 || numSides == 0) {
            return add;
        }
        int max = numDice * numSides;
        int randRange = max - numDice;
        return add + numDice + (randRange == 0 ? 0 : random.nextInt(randRange));
    }

    public int getMaxRoll() {
        return getMaxRoll(dice);
    }

    public static int getMaxRoll(int[] dice) {
        return dice[0] * dice[1] + dice[2];
    }

    public int[] data() {
        return dice;
    }

    public String toString() {
        return format(dice);
    }

    public static String format(int[] dice) {
        return new StringBuffer("Dice(").append(dice == null ? "NULL" : dice[0] + "d" + dice[1] + "+" + dice[2]).append(")").toString();
    }


}