package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.logging.Logger; import org.freecolandroid.xml.stream.XMLStreamConstants; import org.freecolandroid.xml.stream.XMLStreamException; import org.freecolandroid.xml.stream.XMLStreamReader; import org.freecolandroid.xml.stream.XMLStreamWriter; import net.sf.freecol.common.util.Utils; public class RandomRange { private static Logger logger = Logger.getLogger(RandomRange.class.getName()); /** * Probability that the result is not zero. */ private int probability = 0; /** * Minimum value. */ private int minimum = 0; /** * Maximum value. */ private int maximum = 0; /** * Factor to multiply the value with. */ private int factor = 1; /** * A list of Scopes limiting the applicability of this Feature. */ private List<Scope> scopes = new ArrayList<Scope>(); public RandomRange() { // empty constructor } /** * Creates a new <code>RandomRange</code> instance. * * @param probability an <code>int</code> value * @param minimum an <code>int</code> value * @param maximum an <code>int</code> value * @param factor an <code>int</code> value */ public RandomRange(int probability, int minimum, int maximum, int factor) { this.probability = probability; this.minimum = minimum; this.maximum = maximum; this.factor = factor; } /** * Creates a new <code>RandomRange</code> instance. * * @param in a <code>XMLStreamReader</code> value */ public RandomRange(XMLStreamReader in) throws XMLStreamException { readFromXML(in); } /** * Get the <code>Probability</code> value. * * @return an <code>int</code> value */ public final int getProbability() { return probability; } /** * Set the <code>Probability</code> value. * * @param newProbability The new Probability value. */ public final void setProbability(final int newProbability) { this.probability = newProbability; } /** * Get the <code>Minimum</code> value. * * @return an <code>int</code> value */ public final int getMinimum() { return minimum; } /** * Set the <code>Minimum</code> value. * * @param newMinimum The new Minimum value. */ public final void setMinimum(final int newMinimum) { this.minimum = newMinimum; } /** * Get the <code>Maximum</code> value. * * @return an <code>int</code> value */ public final int getMaximum() { return maximum; } /** * Set the <code>Maximum</code> value. * * @param newMaximum The new Maximum value. */ public final void setMaximum(final int newMaximum) { this.maximum = newMaximum; } /** * Get the <code>Factor</code> value. * * @return an <code>int</code> value */ public final int getFactor() { return factor; } /** * Set the <code>Factor</code> value. * * @param newFactor The new Factor value. */ public final void setFactor(final int newFactor) { this.factor = newFactor; } /** * Describe <code>getRange</code> method here. * * @return an <code>int</code> value */ public int getRange() { return maximum - minimum; } /** * Describe <code>getRandomLimit</code> method here. * * @return an <code>int</code> value */ public int getRandomLimit() { return getRange() * 100 / factor; } /** * Describe <code>getAmount</code> method here. * * @param random an <code>int</code> value * @return an <code>int</code> value */ public int getAmount(int random) { int value = minimum + random; if (value <= maximum) { return value * factor; } else { return 0; } } /** * Gets the amount of plunder. * * @param prefix A logger prefix. * @param random A pseudo-random number source. * @param continuous Choose a continuous or discrete result. * @return A random amount of plunder as defined by this RandomRange. */ public int getAmount(String prefix, Random random, boolean continuous) { if (probability >= 100 || (probability > 0 && Utils.randomInt(logger, prefix + " check-for-zero", random, 100) < probability)) { if (continuous) { int r = Utils.randomInt(logger, prefix + " random-range", random, getRange() * factor); return r + minimum * factor; } else { int r = Utils.randomInt(logger, prefix + " random-range", random, getRange()); return getAmount(r); } } return 0; } /** * Return the scopes of this RandomRange. * * @return the scopes of this RandomRange */ public List<Scope> getScopes() { return scopes; } public RandomRange clone() { return new RandomRange(probability, maximum, minimum, factor); } public void readFromXML(XMLStreamReader in) throws XMLStreamException { probability = Integer.parseInt(in.getAttributeValue(null, "probability")); minimum = Integer.parseInt(in.getAttributeValue(null, "minimum")); maximum = Integer.parseInt(in.getAttributeValue(null, "maximum")); factor = Integer.parseInt(in.getAttributeValue(null, "factor")); scopes.clear(); while (in.nextTag() != XMLStreamConstants.END_ELEMENT) { String nodeName = in.getLocalName(); if ("scope".equals(nodeName)) { scopes.add(new Scope(in)); } } } public void toXML(XMLStreamWriter out, String tag) throws XMLStreamException { out.writeStartElement(tag); out.writeAttribute("probability", Integer.toString(probability)); out.writeAttribute("minimum", Integer.toString(minimum)); out.writeAttribute("maximum", Integer.toString(maximum)); out.writeAttribute("factor", Integer.toString(factor)); for (Scope scope : scopes) { scope.toXML(out); } out.writeEndElement(); } }