/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Flemming N. Larsen * - Added setSelectedRobots(RobotSpecification[]) * - Added property for specifying initial positions and headings of the * selected robots *******************************************************************************/ package net.sf.robocode.battle; import robocode.AdvancedRobot; import robocode.Robot; import robocode.control.RobotSpecification; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.Serializable; import java.util.Properties; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) */ public class BattleProperties implements Serializable { private static final long serialVersionUID = 1L; private final static String BATTLEFIELD_WIDTH = "robocode.battleField.width", BATTLEFIELD_HEIGHT = "robocode.battleField.height", BATTLE_NUMROUNDS = "robocode.battle.numRounds", BATTLE_GUNCOOLINGRATE = "robocode.battle.gunCoolingRate", BATTLE_RULES_INACTIVITYTIME = "robocode.battle.rules.inactivityTime", BATTLE_HIDE_ENEMY_NAMES = "robocode.battle.hideEnemyNames", BATTLE_SELECTEDROBOTS = "robocode.battle.selectedRobots", BATTLE_INITIAL_POSITIONS = "robocode.battle.initialPositions"; private int battlefieldWidth = 800; private int battlefieldHeight = 600; private int numRounds = 10; private double gunCoolingRate = 0.1; private long inactivityTime = 450; private boolean hideEnemyNames; private String selectedRobots; private String initialPositions; private final Properties props = new Properties(); /** * Gets the battlefieldWidth. * * @return Returns a int */ public int getBattlefieldWidth() { return battlefieldWidth; } /** * Sets the battlefieldWidth. * * @param battlefieldWidth The battlefieldWidth to set */ public void setBattlefieldWidth(int battlefieldWidth) { this.battlefieldWidth = battlefieldWidth; props.setProperty(BATTLEFIELD_WIDTH, "" + battlefieldWidth); } /** * Gets the battlefieldHeight. * * @return Returns a int */ public int getBattlefieldHeight() { return battlefieldHeight; } /** * Sets the battlefieldHeight. * * @param battlefieldHeight The battlefieldHeight to set */ public void setBattlefieldHeight(int battlefieldHeight) { this.battlefieldHeight = battlefieldHeight; props.setProperty(BATTLEFIELD_HEIGHT, "" + battlefieldHeight); } /** * Gets the numRounds. * * @return Returns a int */ public int getNumRounds() { return numRounds; } /** * Sets the numRounds. * * @param numRounds The numRounds to set */ public void setNumRounds(int numRounds) { this.numRounds = numRounds; props.setProperty(BATTLE_NUMROUNDS, "" + numRounds); } /** * Returns the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. * <p/> * The gun cooling rate is default 0.1 per turn, but can be changed by the battle setup. * So don't count on the cooling rate being 0.1! * * @return the gun cooling rate * @see #setGunCoolingRate(double) * @see Robot#getGunHeat() * @see Robot#fire(double) * @see Robot#fireBullet(double) * @see robocode.BattleRules#getGunCoolingRate() */ public double getGunCoolingRate() { return gunCoolingRate; } /** * Sets the rate at which the gun will cool down, i.e. the amount of heat the gun heat will drop per turn. * * @param gunCoolingRate the new gun cooling rate * @see #getGunCoolingRate * @see Robot#getGunHeat() * @see Robot#fire(double) * @see Robot#fireBullet(double) * @see robocode.BattleRules#getGunCoolingRate() */ public void setGunCoolingRate(double gunCoolingRate) { this.gunCoolingRate = gunCoolingRate; props.setProperty(BATTLE_GUNCOOLINGRATE, "" + gunCoolingRate); } /** * Returns the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. * The inactivity time is measured in turns, and is the allowed time that a robot is allowed to omit taking * action before being punished by the game by zapping. * <p/> * When a robot is zapped by the game, it will loose 0.1 energy points per turn. Eventually the robot will be * killed by zapping until the robot takes action. When the robot takes action, the inactivity time counter is * reset. * <p/> * The allowed inactivity time is per default 450 turns, but can be changed by the battle setup. * So don't count on the inactivity time being 450 turns! * * @return the allowed inactivity time. * @see robocode.BattleRules#getInactivityTime() * @see Robot#doNothing() * @see AdvancedRobot#execute() */ public long getInactivityTime() { return inactivityTime; } /** * Sets the allowed inactivity time, where the robot is not taking any action, before will begin to be zapped. * * @param inactivityTime the new allowed inactivity time. * @see robocode.BattleRules#getInactivityTime() * @see Robot#doNothing() * @see AdvancedRobot#execute() */ public void setInactivityTime(long inactivityTime) { this.inactivityTime = inactivityTime; props.setProperty(BATTLE_RULES_INACTIVITYTIME, "" + inactivityTime); } /** * Sets the flag defining if enemy names are hidden for robots during a battle. * * @param hideEnemyNames true if the enemy names must be hidden for a robot; false otherwise. */ public void setHideEnemyNames(boolean hideEnemyNames) { this.hideEnemyNames = hideEnemyNames; props.setProperty(BATTLE_HIDE_ENEMY_NAMES, "" + hideEnemyNames); } /** * Returns true if the enemy names are hidden for robots during a battle; false otherwise. */ public boolean getHideEnemyNames() { return hideEnemyNames; } /** * Gets the selectedRobots. * * @return Returns a String */ public String getSelectedRobots() { return selectedRobots; } /** * Sets the selectedRobots. * * @param selectedRobots The selectedRobots to set */ public void setSelectedRobots(String selectedRobots) { this.selectedRobots = selectedRobots; props.setProperty(BATTLE_SELECTEDROBOTS, "" + selectedRobots); } /** * Sets the selectedRobots. * * @param robots The robots to set */ public void setSelectedRobots(RobotSpecification[] robots) { StringBuffer robotString = new StringBuffer(); RobotSpecification robot; for (int i = 0; i < robots.length; i++) { robot = robots[i]; if (robot == null) { continue; } robotString.append(robot.getClassName()); if (!(robot.getVersion() == null || robot.getVersion().length() == 0)) { robotString.append(' ').append(robot.getVersion()); } if (i < robots.length - 1) { robotString.append(','); } } setSelectedRobots(robotString.toString()); } /** * Gets the initial robot positions and heading. * * @return a comma-separated string */ public String getInitialPositions() { return initialPositions; } public void setInitialPositions(String initialPositions) { this.initialPositions = initialPositions; } public void store(FileOutputStream out, String desc) throws IOException { props.store(out, desc); } public void load(FileInputStream in) throws IOException { props.load(in); battlefieldWidth = Integer.parseInt(props.getProperty(BATTLEFIELD_WIDTH, "800")); battlefieldHeight = Integer.parseInt(props.getProperty(BATTLEFIELD_HEIGHT, "600")); gunCoolingRate = Double.parseDouble(props.getProperty(BATTLE_GUNCOOLINGRATE, "0.1")); inactivityTime = Long.parseLong(props.getProperty(BATTLE_RULES_INACTIVITYTIME, "450")); hideEnemyNames = Boolean.parseBoolean(props.getProperty(BATTLE_HIDE_ENEMY_NAMES, "false")); numRounds = Integer.parseInt(props.getProperty(BATTLE_NUMROUNDS, "10")); selectedRobots = props.getProperty(BATTLE_SELECTEDROBOTS, ""); initialPositions = props.getProperty(BATTLE_INITIAL_POSITIONS, ""); } }