![JAR search and dependency download from the Maven repository](/logo.png)
robocode.robotinterfaces.peer.IBasicRobotPeer Maven / Gradle / Ivy
Show all versions of robocode.api Show documentation
/*
* Copyright (c) 2001-2023 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
* https://robocode.sourceforge.io/license/epl-v10.html
*/
package robocode.robotinterfaces.peer;
import robocode.*;
import robocode.robotinterfaces.IBasicEvents;
import java.awt.*;
/**
* The basic robot peer for all robot types.
*
* NOTE: This is private interface. You should build any external component (or robot)
* based on it's current methods because it will change in the future.
*
* A robot peer is the object that deals with game mechanics and rules, and
* makes sure your robot abides by them.
*
* @see IStandardRobotPeer
* @see IAdvancedRobotPeer
* @see ITeamRobotPeer
* @see IJuniorRobotPeer
*
* @author Pavel Savara (original)
* @author Flemming N. Larsen (contributor)
*
* @since 1.6
*/
public interface IBasicRobotPeer {
/**
* Returns the robot's name.
*
* @return the robot's name.
*/
String getName();
/**
* Returns the game time of the current round, where the time is equal to
* the current turn in the round.
*
* A battle consists of multiple rounds.
*
* Time is reset to 0 at the beginning of every round.
*
* @return the game time/turn of the current round.
*/
long getTime();
/**
* Returns the robot's current energy.
*
* @return the robot's current energy.
*/
double getEnergy();
/**
* Returns the X position of the robot. (0,0) is at the bottom left of the
* battlefield.
*
* @return the X position of the robot.
* @see #getY()
*/
double getX();
/**
* Returns the Y position of the robot. (0,0) is at the bottom left of the
* battlefield.
*
* @return the Y position of the robot.
* @see #getX()
*/
double getY();
/**
* Returns the velocity of the robot measured in pixels/turn.
*
* The maximum velocity of a robot is defined by
* {@link Rules#MAX_VELOCITY} (8 pixels / turn).
*
* @return the velocity of the robot measured in pixels/turn.
* @see Rules#MAX_VELOCITY
*/
double getVelocity();
/**
* Returns the direction that the robot's body is facing, in radians.
* The value returned will be between 0 and 2 * PI (is excluded).
*
* Note that the heading in Robocode is like a compass, where 0 means North,
* PI / 2 means East, PI means South, and 3 * PI / 2 means West.
*
* @return the direction that the robot's body is facing, in radians.
* @see #getGunHeading()
* @see #getRadarHeading()
*/
double getBodyHeading();
/**
* Returns the direction that the robot's gun is facing, in radians.
* The value returned will be between 0 and 2 * PI (is excluded).
*
* Note that the heading in Robocode is like a compass, where 0 means North,
* PI / 2 means East, PI means South, and 3 * PI / 2 means West.
*
* @return the direction that the robot's gun is facing, in radians.
* @see #getBodyHeading()
* @see #getRadarHeading()
*/
double getGunHeading();
/**
* Returns the direction that the robot's radar is facing, in radians.
* The value returned will be between 0 and 2 * PI (is excluded).
*
* Note that the heading in Robocode is like a compass, where 0 means North,
* PI / 2 means East, PI means South, and 3 * PI / 2 means West.
*
* @return the direction that the robot's radar is facing, in radians.
* @see #getBodyHeading()
* @see #getGunHeading()
*/
double getRadarHeading();
/**
* Returns the current heat of the gun. The gun cannot fire unless this is
* 0. (Calls to fire will succeed, but will not actually fire unless
* getGunHeat() == 0).
*
* The amount of gun heat generated when the gun is fired is
* 1 + (firePower / 5). Each turn the gun heat drops by the amount returned
* by {@link #getGunCoolingRate()}, which is a battle setup.
*
* Note that all guns are "hot" at the start of each round, where the gun
* heat is 3.
*
* @return the current gun heat
* @see #getGunCoolingRate()
* @see #setFire(double)
*/
double getGunHeat();
/**
* Returns the width of the current battlefield measured in pixels.
*
* @return the width of the current battlefield measured in pixels.
*/
double getBattleFieldWidth();
/**
* Returns the height of the current battlefield measured in pixels.
*
* @return the height of the current battlefield measured in pixels.
*/
double getBattleFieldHeight();
/**
* Returns how many opponents that are left in the current round.
*
* @return how many opponents that are left in the current round.
* @see #getNumSentries()
*/
int getOthers();
/**
* Returns how many sentry robots that are left in the current round.
*
* @return how many sentry robots that are left in the current round.
* @see #getOthers()
* @since 1.9.1.0
*/
int getNumSentries();
/**
* Returns the number of rounds in the current battle.
*
* @return the number of rounds in the current battle.
* @see #getRoundNum()
*/
int getNumRounds();
/**
* Returns the number of the current round (0 to {@link #getNumRounds()} - 1)
* in the battle.
*
* @return the number of the current round in the battle (zero indexed).
* @see #getNumRounds()
*/
int getRoundNum();
/**
* 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.
* Hence, the sentry border size defines the width/range of the border area surrounding the battlefield that
* BorderSentrys cannot leave (sentry robots robots must stay in the border area), but it also define the
* distance from the border edges where BorderSentrys are allowed/able to make damage to robots entering this
* border area.
*
* @return the border size in units/pixels.
*
* @since 1.9.0.0
*/
int getSentryBorderSize();
/**
* Returns the rate at which the gun will cool down, i.e. the amount of heat
* the gun heat will drop per turn.
*
* The gun cooling rate is default 0.1 / 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 #getGunHeat()
* @see #setFire(double)
*/
double getGunCoolingRate();
/**
* Returns the distance remaining in the robot's current move measured in
* pixels.
*
* This call returns both positive and negative values. Positive values
* means that the robot is currently moving forwards. Negative values means
* that the robot is currently moving backwards. If the returned value is 0,
* the robot currently stands still.
*
* @return the distance remaining in the robot's current move measured in
* pixels.
* @see #getBodyTurnRemaining()
* @see #getGunTurnRemaining()
* @see #getRadarTurnRemaining()
*/
double getDistanceRemaining();
/**
* Returns the angle remaining in the robot's turn, in radians.
*
* This call returns both positive and negative values. Positive values
* means that the robot is currently turning to the right. Negative values
* means that the robot is currently turning to the left.
*
* @return the angle remaining in the robot's turn, in radians
* @see #getDistanceRemaining()
* @see #getGunTurnRemaining()
* @see #getRadarTurnRemaining()
*/
double getBodyTurnRemaining();
/**
* Returns the angle remaining in the gun's turn, in radians.
*
* This call returns both positive and negative values. Positive values
* means that the gun is currently turning to the right. Negative values
* means that the gun is currently turning to the left.
*
* @return the angle remaining in the gun's turn, in radians
* @see #getDistanceRemaining()
* @see #getBodyTurnRemaining()
* @see #getRadarTurnRemaining()
*/
double getGunTurnRemaining();
/**
* Returns the angle remaining in the radar's turn, in radians.
*
* This call returns both positive and negative values. Positive values
* means that the radar is currently turning to the right. Negative values
* means that the radar is currently turning to the left.
*
* @return the angle remaining in the radar's turn, in radians
* @see #getDistanceRemaining()
* @see #getBodyTurnRemaining()
* @see #getGunTurnRemaining()
*/
double getRadarTurnRemaining();
/**
* Executes any pending actions, or continues executing actions that are
* in process. This call returns after the actions have been started.
*
* Note that advanced robots must call this function in order to
* execute pending set* calls like e.g. {@link
* IAdvancedRobotPeer#setMove(double) setMove(double)},
* {@link IAdvancedRobotPeer#setFire(double) setFire(double)}, {@link
* IAdvancedRobotPeer#setTurnBody(double) setTurnBody(double)} etc.
* Otherwise, these calls will never get executed.
*
* In this example the robot will move while turning:
*
* setTurnBody(90);
* setMove(100);
* execute();
*
* while (getDistanceRemaining() > 0 && getTurnRemaining() > 0) {
* execute();
* }
*
*/
void execute();
/**
* Immediately moves your robot forward or backward by distance measured in
* pixels.
*
* This call executes immediately, and does not return until it is complete,
* i.e. when the remaining distance to move is 0.
*
* If the robot collides with a wall, the move is complete, meaning that the
* robot will not move any further. If the robot collides with another
* robot, the move is complete if you are heading toward the other robot.
*
* Note that both positive and negative values can be given as input, where
* positive values means that the robot is set to move forward, and negative
* values means that the robot is set to move backward.
*
* Example:
*
* // Move the robot 100 pixels forward
* ahead(100);
*
* // Afterwards, move the robot 50 pixels backward
* ahead(-50);
*
*
* @param distance the distance to move measured in pixels.
* If {@code distance} > 0 the robot is set to move forward.
* If {@code distance} < 0 the robot is set to move backward.
* If {@code distance} = 0 the robot will not move anywhere, but just
* finish its turn.
* @see robocode.robotinterfaces.IBasicEvents#onHitWall(robocode.HitWallEvent)
* @see robocode.robotinterfaces.IBasicEvents#onHitRobot(robocode.HitRobotEvent)
*/
void move(double distance);
/**
* Immediately turns the robot's body to the right or left by radians.
* This call executes immediately, and does not return until it is complete,
* i.e. when the angle remaining in the body's turn is 0.
*
* Note that both positive and negative values can be given as input, where
* positive values means that the robot's body is set to turn right, and
* negative values means that the robot's body is set to turn left.
* If 0 is given as input, the robot's body will stop turning.
*
* Example:
*
* // Turn the robot's body 180 degrees to the right
* turnBody(Math.PI);
*
* // Afterwards, turn the robot's body 90 degrees to the left
* turnBody(-Math.PI / 2);
*
*
* @param radians the amount of radians to turn the robot's body.
* If {@code radians} > 0 the robot's body is set to turn right.
* If {@code radians} < 0 the robot's body is set to turn left.
* If {@code radians} = 0 the robot's body is set to stop turning.
* @see #turnGun(double)
* @see IStandardRobotPeer#turnRadar(double) turnRadar(double)
* @see #move(double)
*/
void turnBody(double radians);
/**
* Immediately turns the robot's gun to the right or left by radians.
* This call executes immediately, and does not return until it is complete,
* i.e. when the angle remaining in the gun's turn is 0.
*
* Note that both positive and negative values can be given as input, where
* positive values means that the robot's gun is set to turn right, and
* negative values means that the robot's gun is set to turn left.
* If 0 is given as input, the robot's gun will stop turning.
*
* Example:
*
* // Turn the robot's gun 180 degrees to the right
* turnGun(Math.PI);
*
* // Afterwards, turn the robot's gun 90 degrees to the left
* turnGun(-Math.PI / 2);
*
*
* @param radians the amount of radians to turn the robot's gun.
* If {@code radians} > 0 the robot's gun is set to turn right.
* If {@code radians} < 0 the robot's gun is set to turn left.
* If {@code radians} = 0 the robot's gun is set to stop turning.
* @see #turnBody(double)
* @see IStandardRobotPeer#turnRadar(double) turnRadar(double)
* @see #move(double)
*/
void turnGun(double radians);
/**
* Immediately fires a bullet. The bullet will travel in the direction the
* gun is pointing.
*
* The specified bullet power is an amount of energy that will be taken from
* the robot's energy. Hence, the more power you want to spend on the
* bullet, the more energy is taken from your robot.
*
* The bullet will do (4 * power) damage if it hits another robot. If power
* is greater than 1, it will do an additional 2 * (power - 1) damage.
* You will get (3 * power) back if you hit the other robot. You can call
* {@link Rules#getBulletDamage(double)} for getting the damage that a
* bullet with a specific bullet power will do.
*
* The specified bullet power should be between
* {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}.
*
* Note that the gun cannot fire if the gun is overheated, meaning that
* {@link #getGunHeat()} returns a value > 0.
*
* A event is generated when the bullet hits a robot
* ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another
* bullet ({@link BulletHitBulletEvent}).
*
* Example:
*
* // Fire a bullet with maximum power if the gun is ready
* if (getGunHeat() == 0) {
* Bullet bullet = fire(Rules.MAX_BULLET_POWER);
*
* // Get the velocity of the bullet
* if (bullet != null) {
* double bulletVelocity = bullet.getVelocity();
* }
* }
*
*
* @param power the amount of energy given to the bullet, and subtracted
* from the robot's energy.
* @return a {@link Bullet} that contains information about the bullet if it
* was actually fired, which can be used for tracking the bullet after it
* has been fired. If the bullet was not fired, {@code null} is returned.
* @see #setFire(double)
* @see Bullet
* @see #getGunHeat()
* @see #getGunCoolingRate()
* @see robocode.robotinterfaces.IBasicEvents#onBulletHit(BulletHitEvent)
* onBulletHit(BulletHitEvent)
* @see robocode.robotinterfaces.IBasicEvents#onBulletHitBullet(BulletHitBulletEvent)
* onBulletHitBullet(BulletHitBulletEvent)
* @see robocode.robotinterfaces.IBasicEvents#onBulletMissed(BulletMissedEvent)
* onBulletMissed(BulletMissedEvent)
*/
Bullet fire(double power);
/**
* Sets the gun to fire a bullet when the next execution takes place.
* The bullet will travel in the direction the gun is pointing.
*
* This call returns immediately, and will not execute until you call
* execute() or take an action that executes.
*
* The specified bullet power is an amount of energy that will be taken from
* the robot's energy. Hence, the more power you want to spend on the
* bullet, the more energy is taken from your robot.
*
* The bullet will do (4 * power) damage if it hits another robot. If power
* is greater than 1, it will do an additional 2 * (power - 1) damage.
* You will get (3 * power) back if you hit the other robot. You can call
* {@link Rules#getBulletDamage(double)} for getting the damage that a
* bullet with a specific bullet power will do.
*
* The specified bullet power should be between
* {@link Rules#MIN_BULLET_POWER} and {@link Rules#MAX_BULLET_POWER}.
*
* Note that the gun cannot fire if the gun is overheated, meaning that
* {@link #getGunHeat()} returns a value > 0.
*
* A event is generated when the bullet hits a robot
* ({@link BulletHitEvent}), wall ({@link BulletMissedEvent}), or another
* bullet ({@link BulletHitBulletEvent}).
*
* Example:
*
* Bullet bullet = null;
*
* // Fire a bullet with maximum power if the gun is ready
* if (getGunHeat() == 0) {
* bullet = setFireBullet(Rules.MAX_BULLET_POWER);
* }
* ...
* execute();
* ...
* // Get the velocity of the bullet
* if (bullet != null) {
* double bulletVelocity = bullet.getVelocity();
* }
*
*
* @param power the amount of energy given to the bullet, and subtracted
* from the robot's energy.
* @return a {@link Bullet} that contains information about the bullet if it
* was actually fired, which can be used for tracking the bullet after it
* has been fired. If the bullet was not fired, {@code null} is returned.
* @see #fire(double)
* @see Bullet
* @see #getGunHeat()
* @see #getGunCoolingRate()
* @see robocode.robotinterfaces.IBasicEvents#onBulletHit(BulletHitEvent)
* onBulletHit(BulletHitEvent)
* @see robocode.robotinterfaces.IBasicEvents#onBulletHitBullet(BulletHitBulletEvent)
* onBulletHitBullet(BulletHitBulletEvent)
* @see robocode.robotinterfaces.IBasicEvents#onBulletMissed(BulletMissedEvent)
* onBulletMissed(BulletMissedEvent)
*/
Bullet setFire(double power);
/**
* Sets the color of the robot's body.
*
* A {@code null} indicates the default (blue) color.
*
*
* Example:
* // Don't forget to import java.awt.Color at the top...
* import java.awt.Color;
* ...
*
* public void run() {
* setBodyColor(Color.BLACK);
* ...
* }
*
*
* @param color the new body color
* @see #setGunColor(Color)
* @see #setRadarColor(Color)
* @see #setBulletColor(Color)
* @see #setScanColor(Color)
* @see Color
* @since 1.1.2
*/
void setBodyColor(Color color);
/**
* Sets the color of the robot's gun.
*
* A {@code null} indicates the default (blue) color.
*
*
* Example:
* // Don't forget to import java.awt.Color at the top...
* import java.awt.Color;
* ...
*
* public void run() {
* setGunColor(Color.RED);
* ...
* }
*
*
* @param color the new gun color
* @see #setBodyColor(Color)
* @see #setRadarColor(Color)
* @see #setBulletColor(Color)
* @see #setScanColor(Color)
* @see Color
* @since 1.1.2
*/
void setGunColor(Color color);
/**
* Sets the color of the robot's radar.
*
* A {@code null} indicates the default (blue) color.
*
*
* Example:
* // Don't forget to import java.awt.Color at the top...
* import java.awt.Color;
* ...
*
* public void run() {
* setRadarColor(Color.YELLOW);
* ...
* }
*
*
* @param color the new radar color
* @see #setBodyColor(Color)
* @see #setGunColor(Color)
* @see #setBulletColor(Color)
* @see #setScanColor(Color)
* @see Color
* @since 1.1.2
*/
void setRadarColor(Color color);
/**
* Sets the color of the robot's bullets.
*
* A {@code null} indicates the default white color.
*
*
* Example:
* // Don't forget to import java.awt.Color at the top...
* import java.awt.Color;
* ...
*
* public void run() {
* setBulletColor(Color.GREEN);
* ...
* }
*
*
* @param color the new bullet color
* @see #setBodyColor(Color)
* @see #setGunColor(Color)
* @see #setRadarColor(Color)
* @see #setScanColor(Color)
* @see Color
* @since 1.1.2
*/
void setBulletColor(Color color);
/**
* Sets the color of the robot's scan arc.
*
* A {@code null} indicates the default (blue) color.
*
*
* Example:
* // Don't forget to import java.awt.Color at the top...
* import java.awt.Color;
* ...
*
* public void run() {
* setScanColor(Color.WHITE);
* ...
* }
*
*
* @param color the new scan arc color
* @see #setBodyColor(Color)
* @see #setGunColor(Color)
* @see #setRadarColor(Color)
* @see #setBulletColor(Color)
* @see Color
* @since 1.1.2
*/
void setScanColor(Color color);
/**
* This call must be made from a robot call to inform the game
* that the robot made a {@code get*} call like e.g. {@link #getX()} or
* {@link #getVelocity()}.
*
* This method is used by the game to determine if the robot is inactive or
* not. Note: You should only make this call once in a {@code get*} method!
*
* @see #setCall()
*/
void getCall();
/**
* This call must be made from a robot call to inform the game
* that the robot made a {@code set*} call like e.g. {@link
* #setFire(double)} or {@link #setBodyColor(Color)}.
*
* This method is used by the game to determine if the robot is inactive or
* not. Note: You should only make this call once in a {@code set*} method!
*
* @see #getCall()
*/
void setCall();
/**
* Returns a graphics context used for painting graphical items for the robot.
*
* This method is very useful for debugging your robot.
*
* Note that the robot will only be painted if the "Paint" is enabled on the
* robot's console window; otherwise the robot will never get painted (the
* reason being that all robots might have graphical items that must be
* painted, and then you might not be able to tell what graphical items that
* have been painted for your robot).
*
* Also note that the coordinate system for the graphical context where you
* paint items fits for the Robocode coordinate system where (0, 0) is at
* the bottom left corner of the battlefield, where X is towards right and Y
* is upwards.
*
* @return a graphics context used for painting graphical items for the robot.
* @see robocode.robotinterfaces.IPaintEvents#onPaint(Graphics2D)
* @since 1.6.1
*/
Graphics2D getGraphics();
/**
* Sets the debug property with the specified key to the specified value.
*
* This method is very useful when debugging or reviewing your robot as you
* will be able to see this property displayed in the robot console for your
* robots under the Debug Properties tab page.
*
* @param key the name/key of the debug property.
* @param value the new value of the debug property, where {@code null} or
* the empty string is used for removing this debug property.
* @since 1.6.2
*/
void setDebugProperty(String key, String value);
/**
* Rescan for other robots. This method is called automatically by the game,
* as long as the robot is moving, turning its body, turning its gun, or
* turning its radar.
*
* Rescan will cause {@link IBasicEvents#onScannedRobot(ScannedRobotEvent)
* onScannedRobot(ScannedRobotEvent)} to be called if you see a robot.
*
* There are 2 reasons to call {@code rescan()} manually:
*
* - You want to scan after you stop moving.
*
- You want to interrupt the {@code onScannedRobot} event. This is more
* likely. If you are in {@code onScannedRobot} and call {@code scan()},
* and you still see a robot, then the system will interrupt your
* {@code onScannedRobot} event immediately and start it from the top.
*
*
* This call executes immediately.
*
* @see IBasicEvents#onScannedRobot(ScannedRobotEvent)
* onScannedRobot(ScannedRobotEvent)
* @see ScannedRobotEvent
*
* @since 1.7.2
*/
void rescan();
}