/*******************************************************************************
* 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:
* Pavel Savara
* - Initial implementation
* Flemming N. Larsen
* - Added getPaintEvents()
*******************************************************************************/
package net.sf.robocode.host.proxies;
import net.sf.robocode.host.RobotStatics;
import net.sf.robocode.host.IHostManager;
import net.sf.robocode.peer.IRobotPeer;
import net.sf.robocode.repository.IRobotRepositoryItem;
import robocode.*;
import robocode.robotinterfaces.peer.IAdvancedRobotPeer;
import java.io.File;
import java.security.AccessControlException;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.List;
/**
* @author Pavel Savara (original)
* @author Flemming N. Larsen (contributor)
*/
public class AdvancedRobotProxy extends StandardRobotProxy implements IAdvancedRobotPeer {
public AdvancedRobotProxy(IRobotRepositoryItem specification, IHostManager hostManager, IRobotPeer peer, RobotStatics statics) {
super(specification, hostManager, peer, statics);
}
public boolean isAdjustGunForBodyTurn() {
getCall();
return commands.isAdjustGunForBodyTurn();
}
public boolean isAdjustRadarForGunTurn() {
getCall();
return commands.isAdjustRadarForGunTurn();
}
public boolean isAdjustRadarForBodyTurn() {
getCall();
return commands.isAdjustRadarForBodyTurn();
}
// asynchronous actions
public void setResume() {
setCall();
setResumeImpl();
}
public void setStop(boolean overwrite) {
setCall();
setStopImpl(overwrite);
}
public void setMove(double distance) {
setCall();
setMoveImpl(distance);
}
public void setTurnBody(double radians) {
setCall();
setTurnBodyImpl(radians);
}
public void setTurnGun(double radians) {
setCall();
setTurnGunImpl(radians);
}
public void setTurnRadar(double radians) {
setCall();
setTurnRadarImpl(radians);
}
// blocking actions
public void waitFor(Condition condition) {
waitCondition = condition;
do {
execute(); // Always tick at least once
} while (!condition.test());
waitCondition = null;
}
// fast setters
public void setMaxTurnRate(double newTurnRate) {
setCall();
if (Double.isNaN(newTurnRate)) {
println("You cannot setMaxTurnRate to: " + newTurnRate);
return;
}
commands.setMaxTurnRate(newTurnRate);
}
public void setMaxVelocity(double newVelocity) {
setCall();
if (Double.isNaN(newVelocity)) {
println("You cannot setMaxVelocity to: " + newVelocity);
return;
}
commands.setMaxVelocity(newVelocity);
}
// events manipulation
public void setInterruptible(boolean interruptable) {
setCall();
eventManager.setInterruptible(eventManager.getCurrentTopEventPriority(), interruptable);
}
public void setEventPriority(String eventClass, int priority) {
setCall();
eventManager.setEventPriority(eventClass, priority);
}
public int getEventPriority(String eventClass) {
getCall();
return eventManager.getEventPriority(eventClass);
}
public void removeCustomEvent(Condition condition) {
setCall();
eventManager.removeCustomEvent(condition);
}
public void addCustomEvent(Condition condition) {
setCall();
eventManager.addCustomEvent(condition);
}
public void clearAllEvents() {
setCall();
eventManager.clearAllEvents(false);
}
public List<Event> getAllEvents() {
getCall();
return eventManager.getAllEvents();
}
public List<StatusEvent> getStatusEvents() {
getCall();
return eventManager.getStatusEvents();
}
public List<BulletMissedEvent> getBulletMissedEvents() {
getCall();
return eventManager.getBulletMissedEvents();
}
public List<BulletHitBulletEvent> getBulletHitBulletEvents() {
getCall();
return eventManager.getBulletHitBulletEvents();
}
public List<BulletHitEvent> getBulletHitEvents() {
getCall();
return eventManager.getBulletHitEvents();
}
public List<HitByBulletEvent> getHitByBulletEvents() {
getCall();
return eventManager.getHitByBulletEvents();
}
public List<HitRobotEvent> getHitRobotEvents() {
getCall();
return eventManager.getHitRobotEvents();
}
public List<HitWallEvent> getHitWallEvents() {
getCall();
return eventManager.getHitWallEvents();
}
public List<RobotDeathEvent> getRobotDeathEvents() {
getCall();
return eventManager.getRobotDeathEvents();
}
public List<ScannedRobotEvent> getScannedRobotEvents() {
getCall();
return eventManager.getScannedRobotEvents();
}
// data
public File getDataDirectory() {
getCall();
commands.setIORobot();
return robotFileSystemManager.getWritableDirectory();
}
public File getDataFile(final String filename) {
getCall();
commands.setIORobot();
if (filename.contains("..")) {
throw new AccessControlException("no relative path allowed");
}
return AccessController.doPrivileged(new PrivilegedAction<File>() {
public File run() {
return robotFileSystemManager.getDataFile(filename);
}
});
}
public long getDataQuotaAvailable() {
getCall();
return robotFileSystemManager.getMaxQuota() - robotFileSystemManager.getQuotaUsed();
}
}