package Factory.Visualization; import EnvironmentPluginAPI.Service.AbstractVisualizeReplayPanel; import EnvironmentPluginAPI.Service.ICycleReplay; import Factory.GameLogic.Enums.Faction; import Factory.GameLogic.TransportTypes.*; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.List; import java.util.ListIterator; import java.util.Timer; import java.util.TimerTask; public class VisualizeReplay extends AbstractVisualizeReplayPanel { BufferedImage normalField; BufferedImage factoryFieldNeutral; BufferedImage factoryFieldBlue; BufferedImage factoryFieldRed; BufferedImage influenceField; BufferedImage unitBlue; BufferedImage unitRed; private ICycleReplay replay; private ListIterator<TGameState> gameStateIterator; private boolean doStep; private Timer playTimer; private long replaySpeed; private TGameState gameStateToPaint; /** * A JPanel derived class which utilizes Java's Graphics Library to draw a GameReplay for the Factory Game */ public VisualizeReplay() { try { // TODO: Get Imagepaths right normalField = ImageIO.read(new File("OverseerGUI/src/resources/images/normalField.png")); factoryFieldBlue = ImageIO.read(new File("OverseerGUI/src/resources/images/factoryFieldBlue.png")); factoryFieldRed = ImageIO.read(new File("OverseerGUI/src/resources/images/factoryFieldRed.png")); factoryFieldNeutral = ImageIO.read(new File("OverseerGUI/src/resources/images/factoryFieldNeutral.png")); unitBlue = ImageIO.read(new File("OverseerGUI/src/resources/images/unitBlue.png")); unitRed = ImageIO.read(new File("OverseerGUI/src/resources/images/unitRed.png")); influenceField = ImageIO.read(new File("OverseerGUI/src/resources/images/influenceField.png")); } catch (IOException ie) { System.out.println("Error:" + ie.getMessage()); } // Important variable to make sure doStep = false; replaySpeed = 500; } public void setGameReplay(ICycleReplay replay) { if (playTimer != null) { playTimer.cancel(); } this.replay = replay; gameStateIterator = (ListIterator) this.replay.iterator(); } public void stepForward() { if (gameStateIterator != null && gameStateIterator.hasNext()) { doStep = true; gameStateToPaint = gameStateIterator.next(); repaint(); } } public void stepBackward() { if (gameStateIterator != null && gameStateIterator.hasPrevious()) { doStep = true; gameStateToPaint = gameStateIterator.previous(); repaint(); } } public void pause() { if (playTimer != null) { playTimer.cancel(); } } /** * Sets ReplaySpeed to speed and re-initializes the replay * * @param speed */ public void changeReplaySpeed(long speed) { this.replaySpeed = speed; this.pause(); this.play(); } /** * Will replay the game stepForward by stepForward with 500 ms between each stepForward */ public void play() { if (gameStateIterator != null && gameStateIterator.hasNext()) { playTimer = new Timer(); playTimer.schedule(new TimerTask() { @Override public void run() { if (gameStateIterator.hasNext()) { doStep = true; gameStateToPaint = gameStateIterator.next(); repaint(); } else { playTimer.cancel(); } } }, 10, replaySpeed); } } @Override public void paintComponent(Graphics g) { super.paintComponent(g); if (gameStateToPaint != null && doStep) { // set to false to make sure just one single stepForward is being printed doStep = false; TAbstractField[][] fields = gameStateToPaint.getMapFields(); for (int i = 0; i < fields.length; i++) { int j = 0; for (TAbstractField field : fields[i]) { BufferedImage fieldToDraw = normalField; BufferedImage unitToDraw = null; Faction faction = Faction.NEUTRAL; if (field.isOccupied()) { faction = field.getOccupant().getControllingFaction(); if (faction == Faction.BLUE) { unitToDraw = unitBlue; } else if (faction == Faction.RED) { unitToDraw = unitRed; } } if (field instanceof TNormalField) { fieldToDraw = normalField; } else if (field instanceof TFactoryField) { for (TFactory factory : gameStateToPaint.getFactories()) { if (factory.getFactoryID() == ((TFactoryField) field).getFactoryID()) { faction = factory.getOwningFaction(); } } if (faction == Faction.BLUE) { fieldToDraw = factoryFieldBlue; } else if (faction == Faction.RED) { fieldToDraw = factoryFieldRed; } else { fieldToDraw = factoryFieldNeutral; } } else if (field instanceof TInfluenceField) { fieldToDraw = influenceField; } g.drawImage(fieldToDraw, (i % fields[i].length) * fieldToDraw.getWidth(), j * fieldToDraw.getHeight(), null); if (field.isOccupied()) { g.drawImage(unitToDraw, (i % fields[i].length) * unitToDraw.getWidth(), j * unitToDraw.getHeight(), null); } j++; } } } } }