robocode.robotinterfaces.IBasicEvents Maven / Gradle / Ivy
/*
* 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;
import robocode.*;
/**
* An event interface for receiving basic robot events with an
* {@link IBasicRobot}.
*
* @see IBasicRobot
*
* @author Pavel Savara (original)
* @author Flemming N. Larsen (contributor)
*
* @since 1.6
*/
public interface IBasicEvents {
/**
* This method is called every turn in a battle round in order to provide
* the robot status as a complete snapshot of the robot's current state at
* that specific time.
*
* The main benefit of this method is that you'll automatically receive all
* current data values of the robot like e.g. the x and y coordinate,
* heading, gun heat etc., which are grouped into the exact same time/turn.
*
* This is the only way to map the robots data values to a specific time.
* For example, it is not possible to determine the exact time of the
* robot's heading by calling first calling {@link Robot#getTime()} and then
* {@link Robot#getHeading()} afterwards, as the time might change
* after between the {@link Robot#getTime()} and {@link Robot#getHeading()}
* call.
*
* @param event the event containing the robot status at the time it occurred.
* @see StatusEvent
* @see Event
* @since 1.5
*/
void onStatus(StatusEvent event);
/**
* This method is called when one of your bullets hits another robot.
* You should override it in your robot if you want to be informed of this
* event.
*
* Example:
*
* public void onBulletHit(BulletHitEvent event) {
* out.println("I hit " + event.getName() + "!");
* }
*
*
* @param event the bullet-hit event set by the game
* @see BulletHitEvent
* @see Event
*/
void onBulletHit(BulletHitEvent event);
/**
* This method is called when one of your bullets hits another bullet.
* You should override it in your robot if you want to be informed of this
* event.
*
* Example:
*
* public void onBulletHitBullet(BulletHitBulletEvent event) {
* out.println("I hit a bullet fired by " + event.getBullet().getName() + "!");
* }
*
*
* @param event the bullet-hit-bullet event set by the game
* @see BulletHitBulletEvent
* @see Event
*/
void onBulletHitBullet(BulletHitBulletEvent event);
/**
* This method is called when one of your bullets misses, i.e. hits a wall.
* You should override it in your robot if you want to be informed of this
* event.
*
* Example:
*
* public void onBulletMissed(BulletMissedEvent event) {
* out.println("Drat, I missed.");
* }
*
*
* @param event the bullet-missed event set by the game
* @see BulletMissedEvent
* @see Event
*/
void onBulletMissed(BulletMissedEvent event);
/**
* This method is called if your robot dies.
*
* You should override it in your robot if you want to be informed of this
* event. Actions will have no effect if called from this section. The
* intent is to allow you to perform calculations or print something out
* when the robot is killed.
*
* @param event the death event set by the game
* @see DeathEvent
* @see WinEvent
* @see RoundEndedEvent
* @see BattleEndedEvent
* @see Event
*/
void onDeath(DeathEvent event);
/**
* This method is called when your robot is hit by a bullet.
* You should override it in your robot if you want to be informed of this
* event.
*
* Example:
*
* void onHitByBullet(HitByBulletEvent event) {
* out.println(event.getRobotName() + " hit me!");
* }
*
*
* @param event the hit-by-bullet event set by the game
* @see HitByBulletEvent
* @see Event
*/
void onHitByBullet(HitByBulletEvent event);
/**
* This method is called when your robot collides with another robot.
* You should override it in your robot if you want to be informed of this
* event.
*
* Example:
*
* void onHitRobot(HitRobotEvent event) {
* if (event.getBearing() > -90 && event.getBearing() <= 90) {
* back(100);
* } else {
* ahead(100);
* }
* }
*
* -- or perhaps, for a more advanced robot --
*
* public void onHitRobot(HitRobotEvent event) {
* if (event.getBearing() > -90 && event.getBearing() <= 90) {
* setBack(100);
* } else {
* setAhead(100);
* }
* }
*
*
* The angle is relative to your robot's facing. So 0 is straight ahead of
* you.
*
* This event can be generated if another robot hits you, in which case
* {@link HitRobotEvent#isMyFault() event.isMyFault()} will return
* {@code false}. In this case, you will not be automatically stopped by the
* game -- but if you continue moving toward the robot you will hit it (and
* generate another event). If you are moving away, then you won't hit it.
*
* @param event the hit-robot event set by the game
* @see HitRobotEvent
* @see Event
*/
void onHitRobot(HitRobotEvent event);
/**
* This method is called when your robot collides with a wall.
* You should override it in your robot if you want to be informed of this
* event.
*
* The wall at the top of the screen is 0 degrees, right is 90 degrees,
* bottom is 180 degrees, left is 270 degrees. But this event is relative to
* your heading, so: The bearing is such that {@link Robot#turnRight(double)
* turnRight} {@link HitWallEvent#getBearing() (event.getBearing())} will
* point you perpendicular to the wall.
*
* Example:
*
* void onHitWall(HitWallEvent event) {
* out.println("Ouch, I hit a wall bearing " + event.getBearing() + " degrees.");
* }
*
*
* @param event the hit-wall event set by the game
* @see HitWallEvent
* @see Event
*/
void onHitWall(HitWallEvent event);
/**
* This method is called when your robot sees another robot, i.e. when the
* robot's radar scan "hits" another robot.
* You should override it in your robot if you want to be informed of this
* event. (Almost all robots should override this!)
*
* This event is automatically called if there is a robot in range of your
* radar.
*
* Note that the robot's radar can only see robot within the range defined
* by {@link Rules#RADAR_SCAN_RADIUS} (1200 pixels).
*
* Also not that the bearing of the scanned robot is relative to your
* robot's heading.
*
* Example:
*
* void onScannedRobot(ScannedRobotEvent event) {
* // Assuming radar and gun are aligned...
* if (event.getDistance() < 100) {
* fire(3);
* } else {
* fire(1);
* }
* }
*
*
* Note:
* The game assists Robots in firing, as follows:
*
* - If the gun and radar are aligned (and were aligned last turn),
*
- and the event is current,
*
- and you call fire() before taking any other actions, {@link
* Robot#fire(double) fire()} will fire directly at the robot.
*
*
* In essence, this means that if you can see a robot, and it doesn't move,
* then fire will hit it.
*
* AdvancedRobots will NOT be assisted in this manner, and are expected to
* examine the event to determine if {@link Robot#fire(double) fire()} would
* hit. (i.e. you are spinning your gun around, but by the time you get the
* event, your gun is 5 degrees past the robot).
*
* @param event the scanned-robot event set by the game
* @see ScannedRobotEvent
* @see Event
* @see Rules#RADAR_SCAN_RADIUS
*/
void onScannedRobot(ScannedRobotEvent event);
/**
* This method is called when another robot dies.
* You should override it in your robot if you want to be informed of this
* event.
*
* @param event The robot-death event set by the game
* @see RobotDeathEvent
* @see Event
*/
void onRobotDeath(RobotDeathEvent event);
/**
* This method is called if your robot wins a battle.
*
* Your robot could perform a victory dance here! :-)
*
* @param event the win event set by the game
* @see DeathEvent
* @see RoundEndedEvent
* @see BattleEndedEvent
* @see Event
*/
void onWin(WinEvent event);
}