/******************************************************************************* * 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 & Flemming N. Larsen * - Initial implementation *******************************************************************************/ package net.sf.robocode.recording; import net.sf.robocode.battle.BaseBattle; import net.sf.robocode.battle.IBattleManager; import net.sf.robocode.battle.events.BattleEventDispatcher; import net.sf.robocode.battle.snapshot.RobotSnapshot; import net.sf.robocode.settings.ISettingsManager; import robocode.BattleResults; import robocode.control.events.*; import robocode.control.snapshot.IRobotSnapshot; import robocode.control.snapshot.ITurnSnapshot; import java.util.List; /** * @author Pavel Savara (original) * @author Flemming N. Larsen (original) */ public final class BattlePlayer extends BaseBattle { private final RecordManager recordManager; private boolean[] paint; public BattlePlayer(ISettingsManager properties, IBattleManager battleManager, RecordManager recordManager, BattleEventDispatcher eventDispatcher) { super(properties, battleManager, eventDispatcher); this.recordManager = recordManager; recordManager.prepareInputStream(); } @Override protected void initializeBattle() { super.initializeBattle(); battleRules = recordManager.recordInfo.battleRules; paint = new boolean[recordManager.recordInfo.robotCount]; eventDispatcher.onBattleStarted(new BattleStartedEvent(battleRules, recordManager.recordInfo.robotCount, true)); if (isPaused()) { eventDispatcher.onBattlePaused(new BattlePausedEvent()); } } @Override protected void finalizeBattle() { boolean aborted = recordManager.recordInfo.results == null || isAborted(); eventDispatcher.onBattleFinished(new BattleFinishedEvent(aborted)); if (!aborted) { final List<BattleResults> res = recordManager.recordInfo.results; eventDispatcher.onBattleCompleted( new BattleCompletedEvent(battleRules, res.toArray(new BattleResults[res.size()]))); } super.finalizeBattle(); cleanup(); } @Override protected void initializeRound() { super.initializeRound(); final ITurnSnapshot snapshot = recordManager.readSnapshot(currentTime); if (snapshot != null) { eventDispatcher.onRoundStarted(new RoundStartedEvent(snapshot, getRoundNum())); } } @Override protected void finalizeRound() { super.finalizeRound(); eventDispatcher.onRoundEnded(new RoundEndedEvent(getRoundNum(), getTime(), totalTurns)); } @Override protected void initializeTurn() { super.initializeTurn(); eventDispatcher.onTurnStarted(new TurnStartedEvent()); } @Override protected void finalizeTurn() { final ITurnSnapshot snapshot = recordManager.readSnapshot(currentTime); if (snapshot != null) { final IRobotSnapshot[] robots = snapshot.getRobots(); for (int i = 0; i < robots.length; i++) { RobotSnapshot robot = (RobotSnapshot) robots[i]; robot.setPaintEnabled(paint[i]); } eventDispatcher.onTurnEnded(new TurnEndedEvent(snapshot)); } super.finalizeTurn(); } @Override protected boolean isRoundOver() { final boolean end = getTime() >= recordManager.recordInfo.turnsInRounds[getRoundNum()] - 1; if (end) { if (recordManager.recordInfo.turnsInRounds.length > getRoundNum() && recordManager.recordInfo.turnsInRounds[getRoundNum()] == 0) { isAborted = true; } } return (isAborted || end); } public void setPaintEnabled(int robotIndex, boolean enable) { sendCommand(new EnableRobotPaintCommand(robotIndex, enable)); } private class EnableRobotPaintCommand extends RobotCommand { final boolean enablePaint; EnableRobotPaintCommand(int robotIndex, boolean enablePaint) { super(robotIndex); this.enablePaint = enablePaint; } public void execute() { paint[robotIndex] = enablePaint; } } }