package games.strategy.engine.random; import java.util.StringTokenizer; /** * A random source for use while debugging. * * <p> * Returns the random numbers designated in the system property triplea.scriptedRandom * </p> * * <p> * for example, to roll 1,2,3 use -Dtriplea.scriptedRandom=1,2,3 * </p> * * <p> * When scripted random runs out of numbers, the numbers will repeat. * </p> * * <p> * Special characters are also allowed in the sequence. * e - the random source will throw an error p - the random source will pause and never return. * </p> */ public class ScriptedRandomSource implements IRandomSource { public static final int PAUSE = -2; public static final int ERROR = -3; private static final String SCRIPTED_RANDOM_PROPERTY = "triplea.scriptedRandom"; private final int[] m_numbers; private int m_currentIndex = 0; private int m_rolled; /** * Should we use a scripted random sourcce. */ public static boolean useScriptedRandom() { return System.getProperty(SCRIPTED_RANDOM_PROPERTY) != null && System.getProperty(SCRIPTED_RANDOM_PROPERTY).trim().length() > 0; } /** * Create a scripted random source from the system property triplea.scriptedRandom. */ public ScriptedRandomSource() { final String property = System.getProperty(SCRIPTED_RANDOM_PROPERTY, "1,2,3"); final int length = property.split(",").length; final StringTokenizer tokenizer = new StringTokenizer(property, ","); m_numbers = new int[length]; for (int i = 0; i < m_numbers.length; i++) { final String token = tokenizer.nextToken(); if (token.equals("e")) { m_numbers[i] = ERROR; } else if (token.equals("p")) { m_numbers[i] = PAUSE; } else { m_numbers[i] = Integer.parseInt(token) - 1; } } } /** * Create a scripted random from the given numbers. The scripted random will return * the numbers supplied in order. When the scripted source runs out of random numbers, it * starts returning elements from the beginning. */ public ScriptedRandomSource(final int[] numbers) { m_numbers = numbers; } public ScriptedRandomSource(final Integer... numbers) { m_numbers = new int[numbers.length]; for (int i = 0; i < numbers.length; i++) { m_numbers[i] = numbers[i]; } } @Override public int getRandom(final int max, final String annotation) throws IllegalStateException { return getRandom(max, 1, null)[0]; } @Override public int[] getRandom(final int max, final int count, final String annotation) throws IllegalArgumentException, IllegalStateException { if (count <= 0) { throw new IllegalArgumentException("count must be > 0, annotation:" + annotation); } m_rolled += count; final int[] rVal = new int[count]; for (int i = 0; i < count; i++) { if (m_numbers[m_currentIndex] == ERROR) { throw new IllegalStateException("Random number generator generating scripted error"); } rVal[i] = m_numbers[m_currentIndex]; m_currentIndex++; if (m_currentIndex >= m_numbers.length) { m_currentIndex = 0; } } return rVal; } public int getTotalRolled() { return m_rolled; } }