/******************************************************************************* * 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: * Flemming N. Larsen & Luis Crespo * - Initial API and implementation *******************************************************************************/ package robocode; import static java.lang.Math.abs; import static java.lang.Math.max; /** * Constants and methods that defines the rules of Robocode. * Constants are used for rules that will not change. * Methods are provided for rules that can be changed between battles or which depends * on some other factor. * * @author Luis Crespo (original) * @author Flemming N. Larsen (original) * @since 1.1.4 */ public final class Rules { // Hide the constructor in the Javadocs as it should not be used private Rules() {} /** * The acceleration of a robot, i.e. the increase of velocity when the * robot moves forward, which is 1 pixel/turn. */ public static final double ACCELERATION = 1; /** * The deceleration of a robot, i.e. the decrease of velocity when the * robot moves backwards (or brakes), which is 2 pixels/turn. */ public static final double DECELERATION = 2; /** * The maximum velocity of a robot, which is 8 pixels/turn. */ public static final double MAX_VELOCITY = 8; /** * The radar scan radius, which is 1200 pixels. * Robots which is more than 1200 pixels away cannot be seen on the radar. */ public static final double RADAR_SCAN_RADIUS = 1200; /** * The minimum bullet power, i.e the amount of energy required for firing a * bullet, which is 0.1 energy points. */ public static final double MIN_BULLET_POWER = 0.1; /** * The maximum bullet power, i.e. the maximum amount of energy that can be * transferred to a bullet when it is fired, which is 3 energy points. */ public static final double MAX_BULLET_POWER = 3; /** * The maximum turning rate of the robot, in degrees, which is * 10 degress/turn. * Note, that the turn rate of the robot depends on it's velocity. * * @see #MAX_TURN_RATE_RADIANS * @see #getTurnRate(double) * @see #getTurnRateRadians(double) */ public static final double MAX_TURN_RATE = 10; /** * The maximum turning rate of the robot measured in radians instead of * degrees. * * @see #MAX_TURN_RATE * @see #getTurnRate(double) * @see #getTurnRateRadians(double) */ public static final double MAX_TURN_RATE_RADIANS = Math.toRadians(MAX_TURN_RATE); /** * The turning rate of the gun measured in degrees, which is * 20 degrees/turn. * Note, that if setAdjustGunForRobotTurn(true) has been called, the gun * turn is independent of the robot turn. * In this case the gun moves relatively to the screen. If * setAdjustGunForRobotTurn(false) has been called or * setAdjustGunForRobotTurn() has not been called at all (this is the * default), then the gun turn is dependent on the robot turn, and in this * case the gun moves relatively to the robot body. * * @see #GUN_TURN_RATE_RADIANS * @see Robot#setAdjustGunForRobotTurn(boolean) */ public static final double GUN_TURN_RATE = 20; /** * The turning rate of the gun measured in radians instead of degrees. * * @see #GUN_TURN_RATE */ public static final double GUN_TURN_RATE_RADIANS = Math.toRadians(GUN_TURN_RATE); /** * The turning rate of the radar measured in degrees, which is * 45 degrees/turn. * Note, that if setAdjustRadarForRobotTurn(true) and/or * setAdjustRadarForGunTurn(true) has been called, the radar turn is * independent of the robot and/or gun turn. If both methods has been set to * true, the radar moves relatively to the screen. * If setAdjustRadarForRobotTurn(false) and/or setAdjustRadarForGunTurn(false) * has been called or not called at all (this is the default), then the * radar turn is dependent on the robot and/or gun turn, and in this case * the radar moves relatively to the gun and/or robot body. * * @see #RADAR_TURN_RATE_RADIANS * @see Robot#setAdjustGunForRobotTurn(boolean) * @see Robot#setAdjustRadarForGunTurn(boolean) */ public static final double RADAR_TURN_RATE = 45; /** * The turning rate of the radar measured in radians instead of degrees. * * @see #RADAR_TURN_RATE */ public static final double RADAR_TURN_RATE_RADIANS = Math.toRadians(RADAR_TURN_RATE); /** * The amount of damage taken when a robot hits or is hit by another robot, * which is 0.6 energy points. */ public static final double ROBOT_HIT_DAMAGE = 0.6; /** * The amount of bonus given when a robot moving forward hits an opponent * robot (ramming), which is 1.2 energy points. */ public static final double ROBOT_HIT_BONUS = 1.2; /** * Returns the turn rate of a robot given a specific velocity measured in * degrees/turn. * * @param velocity the velocity of the robot. * @return turn rate in degrees/turn. * @see #getTurnRateRadians(double) */ public static double getTurnRate(double velocity) { return MAX_TURN_RATE - 0.75 * abs(velocity); } /** * Returns the turn rate of a robot given a specific velocity measured in * radians/turn. * * @param velocity the velocity of the robot. * @return turn rate in radians/turn. * @see #getTurnRate(double) */ public static double getTurnRateRadians(double velocity) { return Math.toRadians(getTurnRate(velocity)); } /** * Returns the amount of damage taken when robot hits a wall with a * specific velocity. * * @param velocity the velocity of the robot. * @return wall hit damage in energy points. */ public static double getWallHitDamage(double velocity) { return max(abs(velocity) / 2 - 1, 0); } /** * Returns the amount of damage of a bullet given a specific bullet power. * * @param bulletPower the energy power of the bullet. * @return bullet damage in energy points. */ public static double getBulletDamage(double bulletPower) { double damage = 4 * bulletPower; if (bulletPower > 1) { damage += 2 * (bulletPower - 1); } return damage; } /** * Returns the amount of bonus given when a robot's bullet hits an opponent * robot given a specific bullet power. * * @param bulletPower the energy power of the bullet. * @return bullet hit bonus in energy points. */ public static double getBulletHitBonus(double bulletPower) { return 3 * bulletPower; } /** * Returns the speed of a bullet given a specific bullet power measured in pixels/turn. * * @param bulletPower the energy power of the bullet. * @return bullet speed in pixels/turn */ public static double getBulletSpeed(double bulletPower) { bulletPower = Math.min(Math.max(bulletPower, MIN_BULLET_POWER), MAX_BULLET_POWER); return 20 - 3 * bulletPower; } /** * Returns the heat produced by firing the gun given a specific bullet * power. * * @param bulletPower the energy power of the bullet. * @return gun heat */ public static double getGunHeat(double bulletPower) { return 1 + (bulletPower / 5); } }