/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.util;


import java.util.*;


/**NOTE: this class could not be in logic* dir since it used by static code today (Prototypes)*/
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();
	}


}