/** * 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.server.model; import java.util.List; import java.util.Random; import java.util.logging.Logger; import net.sf.freecol.common.model.Ability; import net.sf.freecol.common.model.AbstractUnit; import net.sf.freecol.common.model.Europe; import net.sf.freecol.common.model.FeatureContainer; import net.sf.freecol.common.model.Game; import net.sf.freecol.common.model.Player; import net.sf.freecol.common.model.Specification; import net.sf.freecol.common.model.Unit; import net.sf.freecol.common.model.UnitType; import net.sf.freecol.common.option.UnitListOption; import net.sf.freecol.common.util.RandomChoice; import net.sf.freecol.server.control.ChangeSet; /** * The server version of Europe. */ public class ServerEurope extends Europe implements ServerModelObject { private static final Logger logger = Logger.getLogger(ServerEurope.class.getName()); /** * Trivial constructor required for all ServerModelObjects. */ public ServerEurope(Game game, String id) { super(game, id); } /** * Creates a new ServerEurope. * * @param game The <code>Game</code> in which this object belong. * @param owner The <code>Player</code> that will be using this object of * <code>Europe</code>. */ public ServerEurope(Game game, Player owner) { super(game, owner); FeatureContainer featureContainer = new FeatureContainer(); // TODO: put this in the specification featureContainer.addAbility(new Ability("model.ability.dressMissionary")); setFeatureContainer(featureContainer); } /** * Generates the initial recruits for this player. Recruits may * be determined by the difficulty level, or generated randomly. * * @param random A pseudo-random number source. */ public void initializeMigration(Random random) { Specification spec = getGame().getSpecification(); ServerPlayer player = (ServerPlayer) getOwner(); List<RandomChoice<UnitType>> recruits = player.generateRecruitablesList(); if (spec.hasOption("model.option.immigrants")) { List<AbstractUnit> immigrants = ((UnitListOption) spec.getOption("model.option.immigrants")).getOptionValues(); for (int index = 0; index < Europe.RECRUIT_COUNT; index++) { UnitType immigrant = (index < immigrants.size()) ? immigrants.get(index).getUnitType(getSpecification()) : RandomChoice.getWeightedRandom(null, null, random, recruits); setRecruitable(index, immigrant); } } else { // @compat 0.10.3 for (int index = 0; index < Europe.RECRUIT_COUNT; index++) { String optionId = "model.option.recruitable.slot" + index; if (spec.hasOption(optionId)) { String unitTypeId = spec.getStringOption(optionId).getValue(); if (unitTypeId != null) { setRecruitable(index, spec.getUnitType(unitTypeId)); continue; } } setRecruitable(index, RandomChoice.getWeightedRandom(null, null, random, recruits)); } // end compatibility code } } /** * Increases the price for a unit. * * @param unitType The <code>UnitType</code>, trained or purchased * @param price The current price of the unit */ public void increasePrice(UnitType unitType, int price) { Specification spec = getSpecification(); String baseOption = "model.option.priceIncreasePerType"; String name = unitType.getId().substring(unitType.getId().lastIndexOf('.')); String option = (spec.getBooleanOption(baseOption).getValue()) ? "model.option.priceIncrease" + name : "model.option.priceIncrease"; int increase = (spec.hasOption(option)) ? spec.getIntegerOption(option).getValue() : 0; if (increase != 0) { unitPrices.put(unitType, new Integer(price + increase)); } } /** * New turn for this colony tile. * TODO: give Europe a shipyard and remove this * * @param random A <code>Random</code> number source. * @param cs A <code>ChangeSet</code> to update. */ public void csNewTurn(Random random, ChangeSet cs) { logger.finest("ServerEurope.csNewTurn, for " + toString()); for (Unit unit : getUnitList()) { if (unit.isNaval() && unit.isUnderRepair()) { ((ServerUnit) unit).csRepairUnit(cs); } } } /** * Returns the tag name of the root element representing this object. * * @return "serverEurope" */ public String getServerXMLElementTagName() { return "serverEurope"; } }