/**
* Copyright (c) 2001-2017 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
*/
package robocode.control;
/**
* A BattleSpecification defines a battle configuration used by the {@link RobocodeEngine}.
*
* @author Mathew A. Nelson (original)
* @author Flemming N. Larsen (contributor)
*/
public class BattleSpecification implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private final int battlefieldWidth;
private final int battlefieldHeight;
private final int numRounds;
private final double gunCoolingRate;
private final long inactivityTime;
private final boolean hideEnemyNames;
private final int sentryBorderSize;
private final RobotSpecification[] robots;
private final RobotSetup[] initialSetups;
/**
* Creates a new BattleSpecification with the given number of rounds, battlefield size, and robots.
* Inactivity time for the robots defaults to 450, and the gun cooling rate defaults to 0.1.
*
* @param numRounds is the number of rounds in this battle.
* @param battlefieldSize is the battlefield size.
* @param robots is the robots participating in this battle.
*/
public BattleSpecification(int numRounds, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) {
this(numRounds, 450, 0.1, battlefieldSize, robots);
}
/**
* Creates a new BattleSpecification with the given settings.
*
* @param numRounds is the number of rounds in this battle.
* @param inactivityTime is the inactivity time allowed for the robots before they will loose energy.
* @param gunCoolingRate is the gun cooling rate for the robots.
* @param battlefieldSize is the battlefield size.
* @param robots is the robots participating in this battle.
*/
public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) {
this(numRounds, inactivityTime, gunCoolingRate, false, battlefieldSize, robots);
}
/**
* Creates a new BattleSpecification with the given settings.
*
* @param numRounds is the number of rounds in this battle.
* @param inactivityTime is the inactivity time allowed for the robots before they will loose energy.
* @param gunCoolingRate is the gun cooling rate for the robots.
* @param hideEnemyNames flag specifying if enemy names are hidden from robots.
* @param battlefieldSize is the battlefield size.
* @param robots is the robots participating in this battle.
*
* @since 1.7.3
*/
public BattleSpecification(int numRounds, long inactivityTime, double gunCoolingRate, boolean hideEnemyNames, BattlefieldSpecification battlefieldSize, RobotSpecification[] robots) {
this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots);
}
/**
* Creates a new BattleSpecification with the given settings.
*
* @param battlefieldSize is the battlefield size.
* @param numRounds is the number of rounds in this battle.
* @param inactivityTime is the inactivity time allowed for the robots before they will loose energy.
* @param gunCoolingRate is the gun cooling rate for the robots.
* @param sentryBorderSize is the sentry border size for a {@link robocode.BorderSentry BorderSentry}.
* @param hideEnemyNames flag specifying if enemy names are hidden from robots.
* @param robots is the robots participating in this battle.
*
* @since 1.9.0.0
*/
public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, boolean hideEnemyNames, RobotSpecification[] robots) {
this(battlefieldSize, numRounds, inactivityTime, gunCoolingRate, 100, hideEnemyNames, robots, null);
}
/**
* Creates a new BattleSpecification with the given settings.
*
* @param battlefieldSize is the battlefield size.
* @param numRounds is the number of rounds in this battle.
* @param inactivityTime is the inactivity time allowed for the robots before they will loose energy.
* @param gunCoolingRate is the gun cooling rate for the robots.
* @param sentryBorderSize is the sentry border size for a {@link robocode.BorderSentry BorderSentry}.
* @param hideEnemyNames flag specifying if enemy names are hidden from robots.
* @param robots is the robots participating in this battle.
* @param initialSetup is the initial position and heading of the robots, where the indices matches the indices from the {@code robots} parameter.
*
* @since 1.9.2.0
*/
public BattleSpecification(BattlefieldSpecification battlefieldSize, int numRounds, long inactivityTime, double gunCoolingRate, int sentryBorderSize, boolean hideEnemyNames, RobotSpecification[] robots, RobotSetup[] initialSetups) {
if (battlefieldSize == null) {
throw new IllegalArgumentException("battlefieldSize cannot be null");
}
if (robots == null) {
throw new IllegalArgumentException("robots cannot be null");
}
if (robots.length < 1) {
throw new IllegalArgumentException("robots.length must be > 0");
}
if (initialSetups != null && initialSetups.length != robots.length) {
throw new IllegalArgumentException("initialSetups.length must be == robots.length");
}
if (numRounds < 1) {
throw new IllegalArgumentException("numRounds must be >= 1");
}
if (inactivityTime < 1) {
throw new IllegalArgumentException("inactivityTime must be >= 1");
}
if (gunCoolingRate < 0.1) {
throw new IllegalArgumentException("inactivityTime must be >= 0.1");
}
if (sentryBorderSize < 50) {
throw new IllegalArgumentException("sentryBorderSize must be >= 50");
}
this.battlefieldWidth = battlefieldSize.getWidth();
this.battlefieldHeight = battlefieldSize.getHeight();
this.numRounds = numRounds;
this.inactivityTime = inactivityTime;
this.gunCoolingRate = gunCoolingRate;
this.sentryBorderSize = sentryBorderSize;
this.hideEnemyNames = hideEnemyNames;
this.robots = robots;
this.initialSetups = initialSetups;
}
/**
* Returns the allowed inactivity time for the robots in this battle.
*
* @return the allowed inactivity time for the robots in this battle.
*/
public long getInactivityTime() {
return inactivityTime;
}
/**
* Returns the gun cooling rate of the robots in this battle.
*
* @return the gun cooling rate of the robots in this battle.
*/
public double getGunCoolingRate() {
return gunCoolingRate;
}
/**
* Returns the battlefield size for this battle.
*
* @return the battlefield size for this battle.
*/
public BattlefieldSpecification getBattlefield() {
return new BattlefieldSpecification(battlefieldWidth, battlefieldHeight);
}
/**
* Returns the number of rounds in this battle.
*
* @return the number of rounds in this battle.
*/
public int getNumRounds() {
return numRounds;
}
/**
* Returns the flag specifying if the enemy names must be hidden from events sent to robots.
*
* @return {@code true} if the enemy names must be hidden; {@code false} otherwise.
*
* @since 1.7.3
*/
public boolean getHideEnemyNames() {
return hideEnemyNames;
}
/**
* Returns the sentry border size for a {@link robocode.BorderSentry BorderSentry} that defines the how
* far a BorderSentry is allowed to move from the border edges measured in units.<br>
* Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that
* border sentry robots cannot leave (they must stay in the border area), but it also define the
* distance from the border edges where border sentry robots are allowed/able to make damage to robots entering this
* border area.
*
* @return the border size in units/pixels that border sentry robots are restricted to.
*
* @since 1.9.0.0
*/
public int getSentryBorderSize() {
return sentryBorderSize;
}
/**
* Returns the specifications of the robots participating in this battle.
*
* @return an array of {@link RobotSpecification} instances - one entry for each robot.
*
* @see #getInitialSetups()
*/
public RobotSpecification[] getRobots() {
if (robots == null) {
return null;
}
RobotSpecification[] robotsCopy = new RobotSpecification[robots.length];
System.arraycopy(robots, 0, robotsCopy, 0, robots.length);
return robotsCopy;
}
/**
* Returns the initial position and heading of each robot participating in this battle.
*
* @return an array of {@link RobotSetup} instances - one entry for each robot.
* The the indices of this array matches the array indices from the robot specifications (see {@link #getRobots()}).
*
* @see #getRobots()
*/
public RobotSetup[] getInitialSetups() {
if (initialSetups == null) {
return null;
}
RobotSetup[] setupsCopy = new RobotSetup[initialSetups.length];
System.arraycopy(initialSetups, 0, setupsCopy, 0, initialSetups.length);
return setupsCopy;
}
}