/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.List; import org.freecolandroid.xml.stream.XMLStreamException; import org.freecolandroid.xml.stream.XMLStreamReader; import org.freecolandroid.xml.stream.XMLStreamWriter; public class SettlementType extends FreeColGameObjectType { /** * Whether this SettlementType is a capital. */ private boolean capital = false; /** * How many tiles this SettlementType can see. */ private int visibleRadius = 2; /** * How many tiles this SettlementType can claim. */ private int claimableRadius = 1; /** * The extra radius beyond the claimableRadius where wandering * units may claim as yet unclaimed tiles. */ private int extraClaimableRadius = 2; /** * How far units from this SettlementType may roam. */ private int wanderingRadius = 4; /** * The plunder this SettlementType generates when destroyed. */ private List<RandomRange> plunder = new ArrayList<RandomRange>(); /** * The gifts this SettlementType generates when visited by a * scout. */ private List<RandomRange> gifts = new ArrayList<RandomRange>(); /** * The minimum number of units for this SettlementType. */ private int minimumSize = 3; /** * The maximum number of units for this SettlementType. */ private int maximumSize = 10; /** * The minimum number of tiles to grow this SettlementType. */ private int minimumGrowth = 1; /** * The maximum number of tiles to grown this SettlementType. */ private int maximumGrowth = 10; /** * The general trade bonus, roughly proportional to the settlement * size and general sophistication. */ private int tradeBonus = 1; /** * Creates a new <code>SettlementType</code> instance. * * @param id a <code>String</code> value * @param specification a <code>Specification</code> value */ public SettlementType(String id, Specification specification) { super(id, specification); } /** * Get the <code>Capital</code> value. * * @return a <code>boolean</code> value */ public final boolean isCapital() { return capital; } /** * Set the <code>Capital</code> value. * * @param newCapital The new Capital value. */ public final void setCapital(final boolean newCapital) { this.capital = newCapital; } /** * Get the <code>MinimumSize</code> value. * * @return an <code>int</code> value */ public final int getMinimumSize() { return minimumSize; } /** * Set the <code>MinimumSize</code> value. * * @param newMinimumSize The new MinimumSize value. */ public final void setMinimumSize(final int newMinimumSize) { this.minimumSize = newMinimumSize; } /** * Get the <code>MaximumSize</code> value. * * @return an <code>int</code> value */ public final int getMaximumSize() { return maximumSize; } /** * Set the <code>MaximumSize</code> value. * * @param newMaximumSize The new MaximumSize value. */ public final void setMaximumSize(final int newMaximumSize) { this.maximumSize = newMaximumSize; } /** * Get the <code>VisibleRadius</code> value. * * @return an <code>int</code> value */ public final int getVisibleRadius() { return visibleRadius; } /** * Set the <code>VisibleRadius</code> value. * * @param newVisibleRadius The new VisibleRadius value. */ public final void setVisibleRadius(final int newVisibleRadius) { this.visibleRadius = newVisibleRadius; } /** * Get the <code>ClaimableRadius</code> value. * * @return an <code>int</code> value */ public final int getClaimableRadius() { return claimableRadius; } /** * Get the <code>extraClaimableRadius</code> value. * * @return The extra claimable radius. */ public final int getExtraClaimableRadius() { return extraClaimableRadius; } /** * Set the <code>ClaimableRadius</code> value. * * @param newClaimableRadius The new ClaimableRadius value. */ public final void setClaimableRadius(final int newClaimableRadius) { this.claimableRadius = newClaimableRadius; } /** * Get the <code>WanderingRadius</code> value. * * @return an <code>int</code> value */ public final int getWanderingRadius() { return wanderingRadius; } /** * Set the <code>WanderingRadius</code> value. * * @param newWanderingRadius The new WanderingRadius value. */ public final void setWanderingRadius(final int newWanderingRadius) { this.wanderingRadius = newWanderingRadius; } /** * Get the minimum growth value. * * @return The minimum number of tiles to try to grow this * settlement type by. */ public final int getMinimumGrowth() { return minimumGrowth; } /** * Get the maximum growth value. * * @return The maximum number of tiles to try to grow this * settlement type by. */ public final int getMaximumGrowth() { return maximumGrowth; } /** * Gets the trade bonus. * * @return The general bonus to trade. */ public final int getTradeBonus() { return tradeBonus; } /** * Gets the plunder range available for the supplied unit. * * @param unit The <code>Unit</code> to check. * @return The plunder range. */ public final RandomRange getPlunderRange(Unit unit) { for (RandomRange range : plunder) { List<Scope> scopes = range.getScopes(); if (scopes.isEmpty()) { return range; } else { for (Scope scope : scopes) { if (scope.appliesTo(unit)) { return range; } } } } return null; } /** * Set the <code>Plunder</code> value. * * @param newPlunder The new Plunder value. */ public final void setPlunder(final RandomRange newPlunder) { plunder.add(newPlunder); } /** * Get the <code>Gifts</code> value. * * @param unit an <code>Unit</code> value * @return a <code>RandomRange</code> value */ public final RandomRange getGifts(Unit unit) { for (RandomRange range : gifts) { List<Scope> scopes = range.getScopes(); if (scopes.isEmpty()) { return range; } else { for (Scope scope : scopes) { if (scope.appliesTo(unit)) { return range; } } } } return null; } /** * Set the <code>Gifts</code> value. * * @param newGifts The new Gifts value. */ public final void setGifts(final RandomRange newGifts) { gifts.add(newGifts); } /** * Gets the warehouse capacity of this settlement. * * @return The warehouse capacity of this settlement. */ public int getWarehouseCapacity() { return GoodsContainer.CARGO_SIZE * getClaimableRadius(); } /** * This method writes an XML-representation of this object to * the given stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing * to the stream. */ protected void toXMLImpl(XMLStreamWriter out) throws XMLStreamException { super.toXMLImpl(out, getXMLElementTagName()); } /** * Write the attributes of this object to a stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing to * the stream. */ @Override protected void writeAttributes(XMLStreamWriter out) throws XMLStreamException { super.writeAttributes(out); out.writeAttribute("capital", Boolean.toString(capital)); out.writeAttribute("minimumSize", Integer.toString(minimumSize)); out.writeAttribute("maximumSize", Integer.toString(maximumSize)); out.writeAttribute("visibleRadius", Integer.toString(visibleRadius)); out.writeAttribute("claimableRadius", Integer.toString(claimableRadius)); out.writeAttribute("extraClaimableRadius", Integer.toString(extraClaimableRadius)); out.writeAttribute("wanderingRadius", Integer.toString(wanderingRadius)); out.writeAttribute("minimumGrowth", Integer.toString(minimumGrowth)); out.writeAttribute("maximumGrowth", Integer.toString(maximumGrowth)); out.writeAttribute("tradeBonus", Integer.toString(tradeBonus)); } /** * Write the children of this object to a stream. * * @param out The target stream. * @throws XMLStreamException if there are any problems writing to * the stream. */ @Override protected void writeChildren(XMLStreamWriter out) throws XMLStreamException { super.writeChildren(out); for (RandomRange range : plunder) { range.toXML(out, "plunder"); } for (RandomRange range : gifts) { range.toXML(out, "gifts"); } } /** * Reads the attributes of this object from an XML stream. * * @param in The XML input stream. * @throws XMLStreamException if a problem was encountered * during parsing. */ @Override protected void readAttributes(XMLStreamReader in) throws XMLStreamException { super.readAttributes(in); capital = getAttribute(in, "capital", capital); minimumSize = getAttribute(in, "minimumSize", minimumSize); maximumSize = getAttribute(in, "maximumSize", maximumSize); visibleRadius = getAttribute(in, "visibleRadius", visibleRadius); claimableRadius = getAttribute(in, "claimableRadius", claimableRadius); extraClaimableRadius = getAttribute(in, "extraClaimableRadius", extraClaimableRadius); wanderingRadius = getAttribute(in, "wanderingRadius", wanderingRadius); minimumGrowth = getAttribute(in, "minimumGrowth", minimumGrowth); maximumGrowth = getAttribute(in, "maximumGrowth", maximumGrowth); tradeBonus = getAttribute(in, "tradeBonus", tradeBonus); } /** * Reads a child object. * * @param in The XML stream to read. * @exception XMLStreamException if an error occurs */ @Override protected void readChild(XMLStreamReader in) throws XMLStreamException { if ("plunder".equals(in.getLocalName())) { RandomRange range = new RandomRange(); range.readFromXML(in); plunder.add(range); } else if ("gifts".equals(in.getLocalName())) { RandomRange range = new RandomRange(); range.readFromXML(in); gifts.add(range); } else { super.readChild(in); } } /** * Returns the tag name of the root element representing this object. * * @return "settlementType". */ public static String getXMLElementTagName() { return "settlementType"; } }