From 2d03e81f4969866fd81688f2ef3429286dc27abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 12:46:34 +0200 Subject: [PATCH 01/54] a glorious day for all mankind: Tester.java deleted for good --- cicaprojekt/Tester.java | 286 ---------------------------------------- 1 file changed, 286 deletions(-) delete mode 100644 cicaprojekt/Tester.java diff --git a/cicaprojekt/Tester.java b/cicaprojekt/Tester.java deleted file mode 100644 index 8da4a56..0000000 --- a/cicaprojekt/Tester.java +++ /dev/null @@ -1,286 +0,0 @@ -package cicaprojekt; - -import java.io.File; -import java.io.IOException; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Map; - -public class Tester { - private Player oneill; - private Player jaffa; - private PlayerBase replicator; - - - Dungeon loadMap(String param) throws IOException{ - Dungeon dungeon = new Dungeon(); - Map playerLocations = dungeon.buildDungeon(new File(param)); - oneill = new Player("ONeill", (Tile) playerLocations.get("oneill"), Direction.NORTH); - jaffa = new Player("Jaffa", (Tile) playerLocations.get("jaffa"), Direction.NORTH); - replicator = new PlayerBase("Replicator", (Tile) playerLocations.get("replicator"), Direction.NORTH); - return dungeon; - } - - String listPlayers() { - return oneill.toString() + " " + jaffa.toString() + " " + replicator.toString(); - } - - void move(String param) { - switch (param) { - case "O" : - oneill.move(oneill.getFacingDirection()); - break; - case "J" : - jaffa.move(jaffa.getFacingDirection()); - break; - default: - //TODO error handling - break; - } - } - - String boxLift(String param) { - switch (param) { - case "O" : - oneill.boxLift(); - break; - case "J" : - jaffa.boxLift(); - break; - } - return "box lifted"; - } - - String boxDrop(String param) { - switch (param) { - case "O" : - oneill.boxDrop(); - break; - case "J" : - jaffa.boxDrop(); - break; - } - return "box dropped"; - } - - void shootONeillsGun(String param) { - switch (param) { - case "B" : - oneill.shootStargate(Stargate.blueStargate); - break; - case "Y" : - oneill.shootStargate(Stargate.yellowStargate); - break; - } - } - - String rotate(String playerParam, String directionParam) { - switch (playerParam) { - case "O" : - switch (directionParam) { - case "L" : - oneill.rotateLeft(); - return oneill.getFacingDirection().toString(); - case "R" : - oneill.rotateRight(); - return oneill.getFacingDirection().toString(); - default: return "Hiba, nem fordult!"; - } - case "J" : - switch (directionParam) { - case "L" : - jaffa.rotateLeft(); - return jaffa.getFacingDirection().toString(); - case "R" : - jaffa.rotateRight(); - return jaffa.getFacingDirection().toString(); - default: return "Hiba, nem fordult!"; - } - default: return "Hiba, nem létező játékos!"; - } - } - - String listStargates() { - String blue = Stargate.blueStargate.toString(); - String yellow = Stargate.yellowStargate.toString(); - String red = Stargate.redStargate.toString(); - String green = Stargate.greenStargate.toString(); - - return blue + " " + yellow + " " + red + " " + green; - } - - String getConnectedGateOpen(Scale s){ - if(s.getGateConnected().isOpen()) - return "gate open"; - else return "gate closed"; - } - - /* custom Test annotation */ - @Target(ElementType.METHOD) // it's for methods - @Retention(RetentionPolicy.RUNTIME) // we want to retain annotations in runtime - private @interface Test {} - - /* run all methods annotated with @Test */ - public boolean runAllTests() throws InvocationTargetException, IllegalAccessException - { - boolean testspassed = true; - - for (Method m : this.getClass().getMethods()) // iterate over all methods of this - { - if (m.isAnnotationPresent(Test.class)) // if its annotated with @Test... - { - Boolean testresult = (Boolean) m.invoke(null); // call it! - if (!testresult) - { - testspassed = false; - } - } - } - return testspassed; - } - - @Test - boolean moveTest() throws IOException{ - boolean success = true; - - loadMap("moveTest.dungeon"); - - String listOfPlayers = listPlayers(); - if(!listOfPlayers.equals("ONeill: 1, 1 Jaffa: -666, -666 Replicator: -666, -666")) - success = false; - - move("O"); - - listOfPlayers = listPlayers(); - if(!listOfPlayers.equals("ONeill: 1, 2 Jaffa: -666, -666 Replicator: -666, -666")) - success = false; - - return success; - } - - @Test - boolean testStargates() throws IOException{ - boolean success = true; - - loadMap("testStargates.dungeon"); - shootONeillsGun("B"); - rotate("O", "L"); - shootONeillsGun("Y"); - - String listOfStargates = listStargates(); - if(!listOfStargates.equals("BlueStargate: 5, 10 YellowStargate: 10, 5 RedStargate: not spawned GreenStargate: not spawned")) - success = false; - - move("O"); - move("O"); - move("O"); - - String listOfPlayers = listPlayers(); - if(!listOfPlayers.equals("ONeill: 5, 9 Jaffa: -666, -666 Replicator: -666, -666")) - success = false; - - return success; - } - - @Test - boolean testScalesAndGates() throws IOException { - boolean success = true; - - loadMap("testScalesAndGates.dungeon"); - boxLift("O"); - rotate("O", "L"); - boxDrop("O"); - - String gateOpen = getConnectedGateOpen((Scale)oneill.getCurrentTile().getAdjacentTile(oneill.facingDirection)); - - if(!gateOpen.equals("gate open")) - success = false; - - return success; - } - - @Test - boolean gapTest() throws IOException{ - - loadMap("gapTest.dungeon"); - move("O"); - - boolean success = oneill.isDestroyed(); - - return success; - } - - @Test - boolean ZPMTest() throws IOException{ - boolean success = true; - - loadMap("ZPMTest.dungeon"); - move("O"); - - if(oneill.getZPMCount() != 1) - success = false; - - return success; - } - - @Test - boolean testReplicatorPosition(){ - String[] commands = {"loadMap testReplicatorPosition\n", - "move O\n"}; - - String[] expectedOutputs = {}; - - boolean results = testOnSequenceOfCommands(commands, expectedOutputs); - - return results; - } - - @Test - boolean timeUpTest(){ - String[] commands = {"loadMap timeUpTest\n"}; - - String[] expectedOutputs = {}; - boolean results = testOnSequenceOfCommands(commands, expectedOutputs); - - return results; - } - - - @Test - boolean rotationTest() throws IOException { - boolean success = true; - - loadMap("rotationTest.dungeon"); - - if(!rotate("O", "L").equals("WEST")) - success = false; - - if(!rotate("O", "R").equals("NORTH")) - success = false; - - return success; - } - - @Test - boolean testBoxes() throws IOException{ - boolean success = true; - - loadMap("testBoxes.dungeon"); - - if(!boxLift("O").equals("box lifted")) - success = false; - - if(!boxDrop("O").equals("box dropped")) - success = false; - - return success; - } - - private boolean testOnSequenceOfCommands(String[] commands, String[] expectedOutputs) { - return true; - } -} \ No newline at end of file From 412c37c1dae4486a65274243a1a41c4575e8c0fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 12:53:01 +0200 Subject: [PATCH 02/54] Cleaned up Menu Code Your Own Game --- cicaprojekt/Menu.java | 59 +------------------------------------------ 1 file changed, 1 insertion(+), 58 deletions(-) diff --git a/cicaprojekt/Menu.java b/cicaprojekt/Menu.java index 76fbcdb..fb25df1 100644 --- a/cicaprojekt/Menu.java +++ b/cicaprojekt/Menu.java @@ -1,65 +1,8 @@ package cicaprojekt; -import java.io.BufferedReader; -import java.io.Console; -import java.io.IOException; -import java.io.InputStreamReader; -import java.lang.reflect.InvocationTargetException; - public class Menu { - public static void main(String[] args) throws IOException, InvocationTargetException, IllegalAccessException { + public static void main(String[] args) { System.out.println("Continuously Integrated Cica Projekt - Proto"); System.out.println("Üdvözöllek a Babylon Simulator 2000 játékban! Kérlek válassz egy menüpontot!"); - - Tester tester = new Tester(); - - BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); - - boolean isExiting = false; - while (!isExiting) { - try { - String[] input = br.readLine().split(" "); - switch (input[0]) { - case "loadMap": - tester.loadMap(input[1]); - break; - case "listPlayers": - System.out.println(tester.listPlayers()); - break; - case "move": - tester.move(input[1]); - break; - case "boxLift": - System.out.println(tester.boxLift(input[1])); - break; - case "boxDrop": - System.out.println(tester.boxDrop(input[1])); - break; - case "shootONeillsGun": - tester.shootONeillsGun(input[1]); - break; - case "rotate": - tester.rotate(input[1], input[2]); - break; - case "listStargates": - System.out.println(tester.listStargates()); - break; - case "runAllTests": - boolean testresult = tester.runAllTests(); - if (testresult) - System.out.println("All tests successful!"); - else - System.out.println("Tests failed!"); - break; - case "exit": - isExiting = true; - break; - } - } catch (Exception e) { - e.printStackTrace(); - //TODO not so granular error handling - } - - } } } From 85ed7281243d25365abfe4979b3c95ef3744510a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 12:55:49 +0200 Subject: [PATCH 03/54] Cleaned up dungeons, which weren't properly verificated and validated --- ZPMTest.dungeon | 5 ----- gapTest.dungeon | 6 ------ moveTest.dungeon | 8 -------- rotate.dungeon | 5 ----- testBoxes.dungeon | 6 ------ testReplicatorInGap.dungeon | 5 ----- testReplicatorPosition.dungeon | 6 ------ testScalesAndGates.dungeon | 8 -------- testStargates.dungeon | 6 ------ timeUpTest.dungeon | 5 ----- 10 files changed, 60 deletions(-) delete mode 100644 ZPMTest.dungeon delete mode 100644 gapTest.dungeon delete mode 100644 moveTest.dungeon delete mode 100644 rotate.dungeon delete mode 100644 testBoxes.dungeon delete mode 100644 testReplicatorInGap.dungeon delete mode 100644 testReplicatorPosition.dungeon delete mode 100644 testScalesAndGates.dungeon delete mode 100644 testStargates.dungeon delete mode 100644 timeUpTest.dungeon diff --git a/ZPMTest.dungeon b/ZPMTest.dungeon deleted file mode 100644 index 1cd1925..0000000 --- a/ZPMTest.dungeon +++ /dev/null @@ -1,5 +0,0 @@ -4x3 - -W W W W -W O Z W -W W W W diff --git a/gapTest.dungeon b/gapTest.dungeon deleted file mode 100644 index a39fe7b..0000000 --- a/gapTest.dungeon +++ /dev/null @@ -1,6 +0,0 @@ -4x3 - -W W W W -W O X W -W W W W - diff --git a/moveTest.dungeon b/moveTest.dungeon deleted file mode 100644 index 381648c..0000000 --- a/moveTest.dungeon +++ /dev/null @@ -1,8 +0,0 @@ -5x5 - -W W W W W -W O F F W -W F F F W -W F F F W -W W W W W - diff --git a/rotate.dungeon b/rotate.dungeon deleted file mode 100644 index 0001956..0000000 --- a/rotate.dungeon +++ /dev/null @@ -1,5 +0,0 @@ -3x3 - -W W W -W O W -W W W diff --git a/testBoxes.dungeon b/testBoxes.dungeon deleted file mode 100644 index be8b280..0000000 --- a/testBoxes.dungeon +++ /dev/null @@ -1,6 +0,0 @@ -4x4 - -W W W W -W O B W -W F F W -W W W W diff --git a/testReplicatorInGap.dungeon b/testReplicatorInGap.dungeon deleted file mode 100644 index cbd7e7c..0000000 --- a/testReplicatorInGap.dungeon +++ /dev/null @@ -1,5 +0,0 @@ -4x3 - -W W W W -W O X W -W W W W diff --git a/testReplicatorPosition.dungeon b/testReplicatorPosition.dungeon deleted file mode 100644 index b7f5e1c..0000000 --- a/testReplicatorPosition.dungeon +++ /dev/null @@ -1,6 +0,0 @@ -4x4 - -W W W W -W R O W -W S B W -W W W W diff --git a/testScalesAndGates.dungeon b/testScalesAndGates.dungeon deleted file mode 100644 index 8f521b2..0000000 --- a/testScalesAndGates.dungeon +++ /dev/null @@ -1,8 +0,0 @@ -5x4 - -W W W W W -W O F F G -W F S B W -W W W W W - -2-2-1-4-1 diff --git a/testStargates.dungeon b/testStargates.dungeon deleted file mode 100644 index b77ee92..0000000 --- a/testStargates.dungeon +++ /dev/null @@ -1,6 +0,0 @@ -5x4 - -W W W W W -W O F F W -W F F F W -W W W W W diff --git a/timeUpTest.dungeon b/timeUpTest.dungeon deleted file mode 100644 index 79bebd7..0000000 --- a/timeUpTest.dungeon +++ /dev/null @@ -1,5 +0,0 @@ -4x3 - -X X X X -X O X Z -X X X X From 96e53324e1dedd73be9b39c422eea1d1c264c5be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 13:15:55 +0200 Subject: [PATCH 04/54] Removed main from Game.java It gon' be called from Application anyway --- cicaprojekt/Game.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 43acf95..99dad3b 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -6,9 +6,6 @@ public class Game { private Dungeon dungeon; private FlowOfTime flowoftime; - public static void main(String[] args) { - } - public void allZPMsCollected() { this.stopGame(); } From d228415e41c48d1dfd00ce833b3ebc688eb11d8a Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 13:28:42 +0200 Subject: [PATCH 05/54] ImagePanel.java added to display images --- cicaprojekt/ImagePanel.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 cicaprojekt/ImagePanel.java diff --git a/cicaprojekt/ImagePanel.java b/cicaprojekt/ImagePanel.java new file mode 100644 index 0000000..2085226 --- /dev/null +++ b/cicaprojekt/ImagePanel.java @@ -0,0 +1,28 @@ +package cicaprojekt; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; + +public class ImagePanel extends JPanel{ + + private BufferedImage image; + + public ImagePanel(String path) { + try { + image = ImageIO.read(new File(path)); + } catch (IOException ex) { + } + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + +} \ No newline at end of file From f728bd4667988b5d88ba2351cc47133c789628e3 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 13:34:26 +0200 Subject: [PATCH 06/54] Drawer interface added --- cicaprojekt/Drawer.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 cicaprojekt/Drawer.java diff --git a/cicaprojekt/Drawer.java b/cicaprojekt/Drawer.java new file mode 100644 index 0000000..561cc7b --- /dev/null +++ b/cicaprojekt/Drawer.java @@ -0,0 +1,7 @@ +package cicaprojekt; + +public interface Drawer { + + public void draw(); + +} From 446b2b57f363765a3bb175814762e42c5c8ec657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 13:35:20 +0200 Subject: [PATCH 07/54] implemented all the good stuff in FlowOfTime.java --- cicaprojekt/FlowOfTime.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/FlowOfTime.java b/cicaprojekt/FlowOfTime.java index 496a372..c6c1d9c 100644 --- a/cicaprojekt/FlowOfTime.java +++ b/cicaprojekt/FlowOfTime.java @@ -6,8 +6,18 @@ import java.util.TimerTask; public class FlowOfTime extends Timer { private TimerTask timeup; private long gametime; + private Game game; - public void start() { + private class GameOver extends TimerTask { + + @Override + public void run() { + game.stopGame(); + } + } + + public void start(long delay) { + schedule(new GameOver(), delay); } } From e4e7367a825e338ece80124c39f87175c3e7df68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 13:36:38 +0200 Subject: [PATCH 08/54] added GameoverCause.java -- enum to indicate cause of Game's ending --- cicaprojekt/GameoverCause.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 cicaprojekt/GameoverCause.java diff --git a/cicaprojekt/GameoverCause.java b/cicaprojekt/GameoverCause.java new file mode 100644 index 0000000..acb49e5 --- /dev/null +++ b/cicaprojekt/GameoverCause.java @@ -0,0 +1,5 @@ +package cicaprojekt; + +public enum GameoverCause { + TIMEOUT, ONEILLWON, JAFFAWON; +} From e3d720f611f8aa4f63db642e2906ac865dae88ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 13:38:34 +0200 Subject: [PATCH 09/54] added Test.java to .gitignore -- use this for quick&dirty local tests --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 396c617..e9a50f8 100644 --- a/.gitignore +++ b/.gitignore @@ -27,4 +27,5 @@ local.properties .cproject .buildpath .idea -out/* \ No newline at end of file +out/* +Test.java \ No newline at end of file From 7c3cbee3cccb71e6c71a4f738b2772960ed46888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 13:43:26 +0200 Subject: [PATCH 10/54] added GameoverCause to function sigtanures in Game --- cicaprojekt/Game.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 43acf95..6243aed 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -9,13 +9,13 @@ public class Game { public static void main(String[] args) { } - public void allZPMsCollected() { - this.stopGame(); + public void allZPMsCollected(GameoverCause cause) { + this.stopGame(cause); } public void startGame() { } - public void stopGame() { + public void stopGame(GameoverCause cause) { } } From 3ef7bdd4115a2eddadb2c42d4a6ba3e7b1ee4aff Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 13:46:03 +0200 Subject: [PATCH 11/54] Display.java added to store visual elements --- cicaprojekt/Display.java | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 cicaprojekt/Display.java diff --git a/cicaprojekt/Display.java b/cicaprojekt/Display.java new file mode 100644 index 0000000..16ed820 --- /dev/null +++ b/cicaprojekt/Display.java @@ -0,0 +1,21 @@ +package cicaprojekt; + +import java.util.ArrayList; +import java.util.List; + +public class Display { + private List visuals; + + public Display() { + visuals = new ArrayList<>(); + } + + public void addVisual(Drawer visual) { + visuals.add(visual); + } + + public void drawVisuals() { + for(Drawer visual : visuals) + visual.draw(); + } +} From 27de97aaad6b41885832bea1f620e0204e686999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 13:51:05 +0200 Subject: [PATCH 12/54] added GameoverCause.TIMEOUT to FlowOfTime's timeout call --- cicaprojekt/FlowOfTime.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cicaprojekt/FlowOfTime.java b/cicaprojekt/FlowOfTime.java index c6c1d9c..aadbcaa 100644 --- a/cicaprojekt/FlowOfTime.java +++ b/cicaprojekt/FlowOfTime.java @@ -13,7 +13,7 @@ public class FlowOfTime extends Timer { @Override public void run() { - game.stopGame(); + game.stopGame(GameoverCause.TIMEOUT); } } From 098f0cba62fcd4710806c83e7a42dd335c19b5ea Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:04:05 +0200 Subject: [PATCH 13/54] Clients now can call getX and getY for objects which implement Drawer. GapDrawer.java added --- cicaprojekt/Drawer.java | 3 ++- cicaprojekt/GapDrawer.java | 28 ++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 cicaprojekt/GapDrawer.java diff --git a/cicaprojekt/Drawer.java b/cicaprojekt/Drawer.java index 561cc7b..c275898 100644 --- a/cicaprojekt/Drawer.java +++ b/cicaprojekt/Drawer.java @@ -3,5 +3,6 @@ package cicaprojekt; public interface Drawer { public void draw(); - + public int getX(); + public int getY(); } diff --git a/cicaprojekt/GapDrawer.java b/cicaprojekt/GapDrawer.java new file mode 100644 index 0000000..9a7e370 --- /dev/null +++ b/cicaprojekt/GapDrawer.java @@ -0,0 +1,28 @@ +package cicaprojekt; + +public class GapDrawer extends ImagePanel implements Drawer{ + + private Gap gap; + + public GapDrawer(Gap g) { + super("Gap.png"); + gap = g; + setVisible(false); + } + + @Override + public void draw() { + setVisible(true); + } + + @Override + public int getX() { + return gap.getX(); + } + + @Override + public int getY() { + return gap.getY(); + } + +} From e1c6612356ec7d878e9815088627ee8ad1080bbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 14:04:42 +0200 Subject: [PATCH 14/54] Added lots'a init stuff in Game --- cicaprojekt/Game.java | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 99dad3b..14943bc 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -1,16 +1,40 @@ package cicaprojekt; +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.Random; + public class Game { private Player oneill; + private Player jaffa; + + private PlayerBase replicator; private Dungeon dungeon; + private Random random; private FlowOfTime flowoftime; + public Game() { + dungeon = new Dungeon(); + random = new Random(); + } + public void allZPMsCollected() { this.stopGame(); } - public void startGame() { + public void startGame(File dungeonFile) throws IOException { + Stargate.init(); + + Map players = dungeon.buildDungeon(dungeonFile); + oneill = new Player("O'Neill", players.get("oneill"), getRandomDirection()); + jaffa = new Player("Jaffa", players.get("jaffa"), getRandomDirection()); + replicator = new PlayerBase("Replicator", players.get("replicator"), getRandomDirection()); + } + + private Direction getRandomDirection() { + return Direction.values()[random.nextInt(Direction.values().length)]; } public void stopGame() { From e98abbecac33d0677a660e5df56611956059c158 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 14:06:09 +0200 Subject: [PATCH 15/54] Added FlowOfTime init in Game --- cicaprojekt/Game.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 14943bc..f4bd744 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -18,6 +18,7 @@ public class Game { public Game() { dungeon = new Dungeon(); random = new Random(); + flowoftime = new FlowOfTime(); } public void allZPMsCollected() { @@ -31,6 +32,8 @@ public class Game { oneill = new Player("O'Neill", players.get("oneill"), getRandomDirection()); jaffa = new Player("Jaffa", players.get("jaffa"), getRandomDirection()); replicator = new PlayerBase("Replicator", players.get("replicator"), getRandomDirection()); + + flowoftime.start(); } private Direction getRandomDirection() { From 9e93cf89289a052d14c9343a31ee4f3bdd240f68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 14:09:39 +0200 Subject: [PATCH 16/54] added ApplicationFrame.java -- to be implemented --- cicaprojekt/ApplicationFrame.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 cicaprojekt/ApplicationFrame.java diff --git a/cicaprojekt/ApplicationFrame.java b/cicaprojekt/ApplicationFrame.java new file mode 100644 index 0000000..27a8017 --- /dev/null +++ b/cicaprojekt/ApplicationFrame.java @@ -0,0 +1,19 @@ +package cicaprojekt; + +import javax.swing.*; + +public class ApplicationFrame implements Runnable +{ + private JFrame jframe; + + + public ApplicationFrame(){ + jframe = new JFrame(); + } + + @Override + public void run() + { + + } +} From a458aba4dde5c2558e26113ebba0ffb4a22afab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 14:19:53 +0200 Subject: [PATCH 17/54] Added delay parameter to start of flowoftime --- cicaprojekt/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index a8c3737..fcd56d3 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -33,7 +33,7 @@ public class Game { jaffa = new Player("Jaffa", players.get("jaffa"), getRandomDirection()); replicator = new PlayerBase("Replicator", players.get("replicator"), getRandomDirection()); - flowoftime.start(); + flowoftime.start(420*420); } private Direction getRandomDirection() { From 0b5ef542dfc635c2e1f53b2bcf5ec0af976417c7 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:19:56 +0200 Subject: [PATCH 18/54] FieldDrawer.java added --- cicaprojekt/FieldDrawer.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 cicaprojekt/FieldDrawer.java diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java new file mode 100644 index 0000000..0d1fc7b --- /dev/null +++ b/cicaprojekt/FieldDrawer.java @@ -0,0 +1,28 @@ +package cicaprojekt; + +public class FieldDrawer extends ImagePanel implements Drawer { + + Field field; + + public FieldDrawer(Field f) { + super("Field.png"); + field = f; + setVisible(false); + } + + @Override + public void draw() { + setVisible(true); + } + + @Override + public int getX() { + return field.getX(); + } + + @Override + public int getY() { + return field.getY(); + } + +} From cc5f21ab78fe3e8ff13d5fd74022e585e3057bf8 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:24:23 +0200 Subject: [PATCH 19/54] Display display added to Game.java --- cicaprojekt/Game.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index fcd56d3..0193d0f 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -15,10 +15,13 @@ public class Game { private Random random; private FlowOfTime flowoftime; + private Display display; + public Game() { dungeon = new Dungeon(); random = new Random(); flowoftime = new FlowOfTime(); + display = new Display(); } public void allZPMsCollected(GameoverCause cause) { From 17d7f46d78e58c4ecfdf6838927bbb2d6c7fdd4c Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:29:36 +0200 Subject: [PATCH 20/54] WallDrawer.java added --- cicaprojekt/WallDrawer.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 cicaprojekt/WallDrawer.java diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java new file mode 100644 index 0000000..ef16c78 --- /dev/null +++ b/cicaprojekt/WallDrawer.java @@ -0,0 +1,29 @@ +package cicaprojekt; + +public class WallDrawer extends ImagePanel implements Drawer { + + Wall wall; + + public WallDrawer(Wall w) { + super("Wall.png"); + wall = w; + setVisible(false); + } + + @Override + public void draw() { + setVisible(true); + + } + + @Override + public int getX() { + return wall.getX(); + } + + @Override + public int getY() { + return wall.getY(); + } + +} From 573518d14b6afedc56b326d041348b3b59c37e0d Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:40:52 +0200 Subject: [PATCH 21/54] Heirs of ImagePanel now throw IOException. --- cicaprojekt/FieldDrawer.java | 4 +++- cicaprojekt/GapDrawer.java | 4 +++- cicaprojekt/ImagePanel.java | 7 ++----- cicaprojekt/WallDrawer.java | 4 +++- 4 files changed, 11 insertions(+), 8 deletions(-) diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java index 0d1fc7b..76301a3 100644 --- a/cicaprojekt/FieldDrawer.java +++ b/cicaprojekt/FieldDrawer.java @@ -1,10 +1,12 @@ package cicaprojekt; +import java.io.IOException; + public class FieldDrawer extends ImagePanel implements Drawer { Field field; - public FieldDrawer(Field f) { + public FieldDrawer(Field f) throws IOException { super("Field.png"); field = f; setVisible(false); diff --git a/cicaprojekt/GapDrawer.java b/cicaprojekt/GapDrawer.java index 9a7e370..b5248a5 100644 --- a/cicaprojekt/GapDrawer.java +++ b/cicaprojekt/GapDrawer.java @@ -1,10 +1,12 @@ package cicaprojekt; +import java.io.IOException; + public class GapDrawer extends ImagePanel implements Drawer{ private Gap gap; - public GapDrawer(Gap g) { + public GapDrawer(Gap g) throws IOException { super("Gap.png"); gap = g; setVisible(false); diff --git a/cicaprojekt/ImagePanel.java b/cicaprojekt/ImagePanel.java index 2085226..d7fd475 100644 --- a/cicaprojekt/ImagePanel.java +++ b/cicaprojekt/ImagePanel.java @@ -12,11 +12,8 @@ public class ImagePanel extends JPanel{ private BufferedImage image; - public ImagePanel(String path) { - try { - image = ImageIO.read(new File(path)); - } catch (IOException ex) { - } + public ImagePanel(String path) throws IOException { + image = ImageIO.read(new File(path)); } @Override diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index ef16c78..f5202a9 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -1,10 +1,12 @@ package cicaprojekt; +import java.io.IOException; + public class WallDrawer extends ImagePanel implements Drawer { Wall wall; - public WallDrawer(Wall w) { + public WallDrawer(Wall w) throws IOException { super("Wall.png"); wall = w; setVisible(false); From 1c847c06ae3475483b249ae4edc441a83a4fa0b6 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:45:58 +0200 Subject: [PATCH 22/54] void changeImage(String path) added to ImagePanel. --- cicaprojekt/ImagePanel.java | 6 +++++- cicaprojekt/WallDrawer.java | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/ImagePanel.java b/cicaprojekt/ImagePanel.java index d7fd475..243a779 100644 --- a/cicaprojekt/ImagePanel.java +++ b/cicaprojekt/ImagePanel.java @@ -21,5 +21,9 @@ public class ImagePanel extends JPanel{ super.paintComponent(g); g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters } - + + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } } \ No newline at end of file diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index f5202a9..7d5aabd 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -14,6 +14,7 @@ public class WallDrawer extends ImagePanel implements Drawer { @Override public void draw() { + setVisible(true); } From cd5b407fb32ebdf6a1c5ad7db1761e2c59ef016d Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 14:51:20 +0200 Subject: [PATCH 23/54] Stargate getStargate() added to Wall.java. --- cicaprojekt/Wall.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cicaprojekt/Wall.java b/cicaprojekt/Wall.java index aa35936..cf296e3 100644 --- a/cicaprojekt/Wall.java +++ b/cicaprojekt/Wall.java @@ -36,4 +36,8 @@ public class Wall extends Tile { public void onExit(PlayerBase playerBase) throws IllegalStateException { throw new IllegalStateException("Hiba! Te hogy kerültél a falba?"); } + + public Stargate getStargate() { + return sg; + } } From 9e37f114d0794079ab66cda1d7a71fbe35f2d23a Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:06:25 +0200 Subject: [PATCH 24/54] String getName() added to Stargate.java --- cicaprojekt/Stargate.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cicaprojekt/Stargate.java b/cicaprojekt/Stargate.java index 7c36008..f8e3952 100644 --- a/cicaprojekt/Stargate.java +++ b/cicaprojekt/Stargate.java @@ -62,4 +62,8 @@ public class Stargate { return String.format("%s: %s", name, currentWall); else return String.format("%s: not spawned", name, currentWall); } + + public String getName() { + return name; + } } From 39a082c2aab6e38f933861ca8855184aadcd5045 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:07:23 +0200 Subject: [PATCH 25/54] Drawer.draw() now throws IOException. --- cicaprojekt/Drawer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/Drawer.java b/cicaprojekt/Drawer.java index c275898..1c6ca3b 100644 --- a/cicaprojekt/Drawer.java +++ b/cicaprojekt/Drawer.java @@ -1,8 +1,10 @@ package cicaprojekt; +import java.io.IOException; + public interface Drawer { - public void draw(); + public void draw() throws IOException; public int getX(); public int getY(); } From f4f118a9ba8ac83e12bc4eb52bb0272cc40bc7c4 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:08:13 +0200 Subject: [PATCH 26/54] draw() modified, Wall now shows stargates. --- cicaprojekt/WallDrawer.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 7d5aabd..066bf81 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -13,8 +13,25 @@ public class WallDrawer extends ImagePanel implements Drawer { } @Override - public void draw() { - + public void draw() throws IOException { + switch(wall.getStargate().getName()){ + case "Blue Stargate": + changeImage("BlueStargate.png"); + break; + case "Yellow Stargate": + changeImage("YellowStargate.png"); + break; + case "Red Stargate": + changeImage("RedStargate.png"); + break; + case "GreenStargate": + changeImage("GreenStargate"); + break; + default: + changeImage("Wall.png"); + break; + } + setVisible(true); } From c15798125382b8ea2f658caf0232e57e70108cad Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:10:42 +0200 Subject: [PATCH 27/54] Display.drawVisuals() now throws IOException. --- cicaprojekt/Display.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/Display.java b/cicaprojekt/Display.java index 16ed820..b07c634 100644 --- a/cicaprojekt/Display.java +++ b/cicaprojekt/Display.java @@ -1,5 +1,6 @@ package cicaprojekt; +import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -14,7 +15,7 @@ public class Display { visuals.add(visual); } - public void drawVisuals() { + public void drawVisuals() throws IOException { for(Drawer visual : visuals) visual.draw(); } From 536081b01567d941fc8b575a5d7ca16168e4ffbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 15:15:44 +0200 Subject: [PATCH 28/54] started implementing ApplicationFrame.init() -- further work needed --- cicaprojekt/ApplicationFrame.java | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/ApplicationFrame.java b/cicaprojekt/ApplicationFrame.java index 27a8017..6b364db 100644 --- a/cicaprojekt/ApplicationFrame.java +++ b/cicaprojekt/ApplicationFrame.java @@ -1,14 +1,36 @@ package cicaprojekt; import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.plaf.basic.BasicInternalFrameTitlePane; +import java.io.File; +import java.util.ArrayList; +import java.util.List; public class ApplicationFrame implements Runnable { private JFrame jframe; + private JPanel mapselectorpanel; + private JPanel gamepanel; - public ApplicationFrame(){ + public ApplicationFrame(){} + + public void init(){ jframe = new JFrame(); + mapselectorpanel = new JPanel(); + + List dungeons = new ArrayList<>(); + File dir = new File(System.getProperty("user.dir")); + FileNameExtensionFilter filter = new FileNameExtensionFilter("dungeon"); + + for (File f : dir.listFiles()) { + if (filter.accept(f)){ + dungeons.add(f); + } + } + + //TODO create a JTable and put it into mapselectorpanel } @Override From 645028bc94b6ca665b0f44f47c44780a903eadcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 15:19:58 +0200 Subject: [PATCH 29/54] Added keyboard input support for moving players and box operations --- cicaprojekt/Control.java | 50 ++++++++++++++++++++++++++++++++++++++++ cicaprojekt/Game.java | 19 +++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 cicaprojekt/Control.java diff --git a/cicaprojekt/Control.java b/cicaprojekt/Control.java new file mode 100644 index 0000000..8a5a34e --- /dev/null +++ b/cicaprojekt/Control.java @@ -0,0 +1,50 @@ +package cicaprojekt; + +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; + +public class Control { + private Game game; + + public class KeyHandler extends KeyAdapter{ + @Override + public void keyTyped(KeyEvent e) { + char c = e.getKeyChar(); + c = Character.toUpperCase(c); + switch(c) { + case 'W' : + game.moveONeill(Direction.NORTH); + break; + case 'A' : + game.moveONeill(Direction.WEST); + break; + case 'S' : + game.moveONeill(Direction.SOUTH); + break; + case 'D' : + game.moveONeill(Direction.EAST); + break; + case 'I' : + game.moveJaffa(Direction.NORTH); + break; + case 'J' : + game.moveJaffa(Direction.WEST); + break; + case 'K' : + game.moveJaffa(Direction.SOUTH); + break; + case 'L' : + game.moveJaffa(Direction.EAST); + break; + case 'Q' : + game.boxONeill(); + break; + case 'U' : + game.boxJaffa(); + break; + } + game.updateDisplay(); + + } + } +} diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 0193d0f..49c66d8 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -45,4 +45,23 @@ public class Game { public void stopGame(GameoverCause cause) { } + + public void moveONeill(Direction direction) { + oneill.move(direction); + } + + public void moveJaffa(Direction direction) { + jaffa.move(direction); + } + + public void boxONeill() { + + } + + public void boxJaffa() { + + } + + public void updateDisplay() { + } } From f11adc2fab45214e8bf4ca45e580ae1c4b669443 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:22:42 +0200 Subject: [PATCH 30/54] boolean hasZPM() and hasBox() added to Tile.java. --- cicaprojekt/Tile.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/cicaprojekt/Tile.java b/cicaprojekt/Tile.java index b21a43e..c784559 100644 --- a/cicaprojekt/Tile.java +++ b/cicaprojekt/Tile.java @@ -71,4 +71,15 @@ public abstract class Tile { public String toString() { return String.format("%d, %d", x, y); } + + public boolean hasZPM() { + if(zpmOnTile == null) + return false; + else + return true; + } + + public boolean hasBox() { + return boxStack.isEmpty(); + } } From c91a1d051cffc2f2a08507e99411e065def03c94 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:23:47 +0200 Subject: [PATCH 31/54] Tile.hasBox() fixed. --- cicaprojekt/Tile.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cicaprojekt/Tile.java b/cicaprojekt/Tile.java index c784559..fcb2f4a 100644 --- a/cicaprojekt/Tile.java +++ b/cicaprojekt/Tile.java @@ -80,6 +80,6 @@ public abstract class Tile { } public boolean hasBox() { - return boxStack.isEmpty(); + return !boxStack.isEmpty(); } } From 46ced04536d0f3f23c773b86d0675d2c5a381924 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 15:47:43 +0200 Subject: [PATCH 32/54] FieldDrawer.draw() modified. --- cicaprojekt/FieldDrawer.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java index 76301a3..7d86b68 100644 --- a/cicaprojekt/FieldDrawer.java +++ b/cicaprojekt/FieldDrawer.java @@ -13,7 +13,14 @@ public class FieldDrawer extends ImagePanel implements Drawer { } @Override - public void draw() { + public void draw() throws IOException { + if(field.hasBox()) + changeImage("Box.png"); + else if(field.hasZPM()) + changeImage("ZPM.png"); + else + changeImage("Field.png"); + setVisible(true); } From 5c32997f8b1898107ab6b5cd5241d4df28b6e370 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 16:10:00 +0200 Subject: [PATCH 33/54] ApplicationFrame now correctly displays menu with maps on run() --- cicaprojekt/ApplicationFrame.java | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/cicaprojekt/ApplicationFrame.java b/cicaprojekt/ApplicationFrame.java index 6b364db..89e0151 100644 --- a/cicaprojekt/ApplicationFrame.java +++ b/cicaprojekt/ApplicationFrame.java @@ -3,6 +3,7 @@ package cicaprojekt; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.plaf.basic.BasicInternalFrameTitlePane; +import java.awt.*; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -10,32 +11,42 @@ import java.util.List; public class ApplicationFrame implements Runnable { private JFrame jframe; + private JPanel mapselectorpanel; private JPanel gamepanel; + private JList filelist; + public ApplicationFrame(){} public void init(){ jframe = new JFrame(); + jframe.setMinimumSize(new Dimension(600, 400)); + mapselectorpanel = new JPanel(); - List dungeons = new ArrayList<>(); + DefaultListModel dungeonslist = new DefaultListModel<>(); File dir = new File(System.getProperty("user.dir")); - FileNameExtensionFilter filter = new FileNameExtensionFilter("dungeon"); + FileNameExtensionFilter filter = new FileNameExtensionFilter("N/A", "dungeon"); for (File f : dir.listFiles()) { - if (filter.accept(f)){ - dungeons.add(f); + if (filter.accept(f) && f.isFile()){ + dungeonslist.addElement(f); } } - //TODO create a JTable and put it into mapselectorpanel + filelist = new JList<>(dungeonslist); + filelist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + filelist.setLayoutOrientation(JList.HORIZONTAL_WRAP); + + mapselectorpanel.add(filelist); + + jframe.add(mapselectorpanel); } @Override - public void run() - { - + public void run() { + jframe.setVisible(true); } } From 96c3adba83cfadd131328150a380000fc6d9e4bc Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 16:08:25 +0200 Subject: [PATCH 34/54] GateDrawer.java added. --- cicaprojekt/GateDrawer.java | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 cicaprojekt/GateDrawer.java diff --git a/cicaprojekt/GateDrawer.java b/cicaprojekt/GateDrawer.java new file mode 100644 index 0000000..1a1d730 --- /dev/null +++ b/cicaprojekt/GateDrawer.java @@ -0,0 +1,35 @@ +package cicaprojekt; + +import java.io.IOException; + +public class GateDrawer extends ImagePanel implements Drawer{ + + Gate gate; + + public GateDrawer(Gate g) throws IOException { + super("ClosedGate.png"); + gate = g; + setVisible(false); + } + + @Override + public void draw() throws IOException { + if(gate.isOpen()) + changeImage("OpenGate.png"); + else + changeImage("ClosedGate.png"); + + setVisible(true); + } + + @Override + public int getX() { + return gate.getX(); + } + + @Override + public int getY() { + return gate.getY(); + } + +} From 6edcffc58648c6f08a51608cb0a05f8aa17afc4f Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 16:47:57 +0200 Subject: [PATCH 35/54] ScaleDrawer.java added. --- cicaprojekt/ScaleDrawer.java | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 cicaprojekt/ScaleDrawer.java diff --git a/cicaprojekt/ScaleDrawer.java b/cicaprojekt/ScaleDrawer.java new file mode 100644 index 0000000..02e3942 --- /dev/null +++ b/cicaprojekt/ScaleDrawer.java @@ -0,0 +1,30 @@ +package cicaprojekt; + +import java.io.IOException; + +public class ScaleDrawer extends ImagePanel implements Drawer { + + Scale scale; + + public ScaleDrawer(Scale s) throws IOException { + super("Scale.png"); + scale = s; + setVisible(false); + } + + @Override + public void draw() throws IOException { + setVisible(true); + } + + @Override + public int getX() { + return scale.getX(); + } + + @Override + public int getY() { + return scale.getY(); + } + +} From f760ded0e4aa450a1b7acb20cdeda172284eec6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 16:19:57 +0200 Subject: [PATCH 36/54] Added hasBox to Player --- cicaprojekt/Player.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cicaprojekt/Player.java b/cicaprojekt/Player.java index 667381c..2dad2d4 100644 --- a/cicaprojekt/Player.java +++ b/cicaprojekt/Player.java @@ -13,6 +13,10 @@ public class Player extends PlayerBase { zpmContainer = new ArrayList<>(); } + public boolean hasBox() { + return (boxLifted != null); + } + public void boxLift() { boxLifted = (Box) currentTile.getAdjacentTile(facingDirection).getABox(); } From d61b6af8ed390cfb5224664a372077bf260abc43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 16:22:59 +0200 Subject: [PATCH 37/54] Implemented box operations --- cicaprojekt/Game.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 49c66d8..0d037ea 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -55,11 +55,17 @@ public class Game { } public void boxONeill() { - + if(oneill.hasBox()) + oneill.boxDrop(); + else + oneill.boxLift(); } public void boxJaffa() { - + if(jaffa.hasBox()) + jaffa.boxDrop(); + else + jaffa.boxLift(); } public void updateDisplay() { From 04afbf83a460ad1c6dcb427299c689c768cecf00 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 17:05:40 +0200 Subject: [PATCH 38/54] GateDrawer.draw() modified --- cicaprojekt/GateDrawer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cicaprojekt/GateDrawer.java b/cicaprojekt/GateDrawer.java index 1a1d730..a841e26 100644 --- a/cicaprojekt/GateDrawer.java +++ b/cicaprojekt/GateDrawer.java @@ -15,7 +15,7 @@ public class GateDrawer extends ImagePanel implements Drawer{ @Override public void draw() throws IOException { if(gate.isOpen()) - changeImage("OpenGate.png"); + changeImage("Field.png"); //TODO picture for open gate. else changeImage("ClosedGate.png"); From 22553d657ffdc9285ed99776b7e7e4b5cf80881c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 17:07:27 +0200 Subject: [PATCH 39/54] added proof of concept mouse listener to JList in ApplicationFrame --- cicaprojekt/ApplicationFrame.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/cicaprojekt/ApplicationFrame.java b/cicaprojekt/ApplicationFrame.java index 89e0151..4d8f84c 100644 --- a/cicaprojekt/ApplicationFrame.java +++ b/cicaprojekt/ApplicationFrame.java @@ -4,6 +4,8 @@ import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; import javax.swing.plaf.basic.BasicInternalFrameTitlePane; import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -20,6 +22,13 @@ public class ApplicationFrame implements Runnable public ApplicationFrame(){} + private class ListMouseHandler extends MouseAdapter{ + @Override + public void mouseClicked(MouseEvent e) { + JOptionPane.showMessageDialog(null, ((JList)e.getComponent()).getSelectedValue().toString()); + } + } + public void init(){ jframe = new JFrame(); jframe.setMinimumSize(new Dimension(600, 400)); @@ -39,10 +48,13 @@ public class ApplicationFrame implements Runnable filelist = new JList<>(dungeonslist); filelist.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); filelist.setLayoutOrientation(JList.HORIZONTAL_WRAP); + filelist.addMouseListener(new ListMouseHandler()); mapselectorpanel.add(filelist); jframe.add(mapselectorpanel); + + //TODO rewrite demo ListMouseHandler and do Game stuff... } @Override From 46d43ae4ed9d77277d8f33c55d567af5bafe03d2 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 17:21:46 +0200 Subject: [PATCH 40/54] WallDrawer.draw() fixed. --- cicaprojekt/WallDrawer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 066bf81..4e8ad7a 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -25,7 +25,7 @@ public class WallDrawer extends ImagePanel implements Drawer { changeImage("RedStargate.png"); break; case "GreenStargate": - changeImage("GreenStargate"); + changeImage("GreenStargate.png"); break; default: changeImage("Wall.png"); From 316e6e60ea3a9afc5c8e1caec5cc56084cfe6d8e Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 17:35:11 +0200 Subject: [PATCH 41/54] ScaleDrawer.draw() modified. --- cicaprojekt/ScaleDrawer.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cicaprojekt/ScaleDrawer.java b/cicaprojekt/ScaleDrawer.java index 02e3942..d0d5244 100644 --- a/cicaprojekt/ScaleDrawer.java +++ b/cicaprojekt/ScaleDrawer.java @@ -14,6 +14,11 @@ public class ScaleDrawer extends ImagePanel implements Drawer { @Override public void draw() throws IOException { + if(scale.hasBox()) + changeImage("Box.png"); //TODO Picture for Scale with box. + else + changeImage("Scale.png"); + setVisible(true); } From ed45c604a421545176e210c80dffe5b9cc8836b7 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 17:43:55 +0200 Subject: [PATCH 42/54] PNG files for GUI added. --- BlueStargate.png | Bin 0 -> 23075 bytes Box.png | Bin 0 -> 20379 bytes Field.png | Bin 0 -> 19588 bytes Gap.png | Bin 0 -> 21132 bytes Gate.png | Bin 0 -> 20078 bytes GreenStargate.png | Bin 0 -> 23034 bytes Jaffa.png | Bin 0 -> 20554 bytes ONeill.png | Bin 0 -> 20354 bytes RedStargate.png | Bin 0 -> 23049 bytes Replicator.png | Bin 0 -> 20371 bytes Scale.png | Bin 0 -> 20348 bytes SpecialWall.png | Bin 0 -> 22590 bytes Wall.png | Bin 0 -> 19665 bytes YellowStargate.png | Bin 0 -> 23059 bytes ZPM.png | Bin 0 -> 20985 bytes 15 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 BlueStargate.png create mode 100644 Box.png create mode 100644 Field.png create mode 100644 Gap.png create mode 100644 Gate.png create mode 100644 GreenStargate.png create mode 100644 Jaffa.png create mode 100644 ONeill.png create mode 100644 RedStargate.png create mode 100644 Replicator.png create mode 100644 Scale.png create mode 100644 SpecialWall.png create mode 100644 Wall.png create mode 100644 YellowStargate.png create mode 100644 ZPM.png diff --git a/BlueStargate.png b/BlueStargate.png new file mode 100644 index 0000000000000000000000000000000000000000..8e7d605386c90a4ea079eaf173f5b5394695d5ef GIT binary patch literal 23075 zcmeI42{@Ep`@kP5MA3#yYS1DXvl}yweb2sy((;(i6hCMU%r`YLu!TN#xW8hvpucM*dLp2Yxn3sDYygm0%>5Mt63#3I0C6jZzP`1!8MY|M!i9B>J{K%s(9RcTdKPw*YsT$3F zuGM>aFzI@YXo=XoQzjT2T;RM*dMg*cJXCS7yrWA^CrEs?7qCF=Iz@p!q9g=-JU}9C zP%II>4G8%@l@J3;ED}qQE5gR4-sr`<2n8M%D&fRvn27~00d)K$^)3QBMnZu}r`Os6 zDYJo{kIAl`fHfT0x$a=kQy?(uV|;)Ru=Rw3v`|V609#BAHvrr=0+(wxA29@+kiZg} z**yZ#2nUd+jx-bCYCcd>y+9%d5Ss@eZNfv=1G58woez|he1XI9z!IYYN7C;bvKREK zK&0YxNCm42hCy4!;Cn!+7imtAmqun)`UeLsKa1PXtsv@p058Nmc=rQ`sn*P~t+a*%= z4j-lENa^GPDSb_jgI-)VhN;m7FJ5$abv16fr?(Y+YL3r6?Ap>3W&AZ?V(hE@Q^k9xt_4miOFC^9?TIuUb0Wt9OZDip;%+@V%;*`7^27rMgW@){$m~f!m zp^h4#vG>{|#wlxnK$_|CJpi!XV6~e4qwCrgVgO)}5~OlfS8k|uscMPHiqbhPr4nCv zsvp){eXmS!fu1-ea0P4U`pdz3%Ar+PUHF?B{puMv0jpDWeztbHNB)hgJQ|0 z%Edu*XX`!?TMQ~Rg$ubJaZ-vDlZ_Ags8DJ$d(qL=u!rGGY!uC6a3(0*Bla){6Zrv6 z)+|Dpi&0_B#s>g8_-kmfG3rE6j*Vvhyj=Z)bo}zeM!!frp>R+MQ8FosPgpmWYaUZi z?R}EzCe;+BrC)(8dA(E=bI%>AR(@CSnuhA!Sn}g*ikIhQmM_1$`Lb|P#0PTCHJ{mw zf(%RMs?YY(gMlk`O`Ob~EE`SIVJlW+7dFks&lNswQ?^bqHr?#T+QNmO?k#miqr#j_ zRF$4Bidu|V5D>0^55Ia*gg$y*LG&!sYv=9j7S$QmdD<%Vsa{INnk-j}eb_|Vog+#( zp$gmZAfzj)>uwjOORh^{V5@kNtInSDAMIW#+dkU0X<7GzZfv&*^)y=7;aq}kYkI2v zLR{1qy{yzc+bcF<>5H*@69`p@WK7L2Wc_mT>2fz&w_(PW*POzIttVGn#yxSYd)#OI zI_|abkk7pNq0)yc!s*J(5|@fDr7!bYdgZkF#br;AE~~Id;!$r;_r^=bGaZ~%@>KRo z$2<~0x#{HElX5Bu`%4)YGukpF90na8+ecm6Znr<%$N^*5d1-F_sZ58AB1I1nW1}waQD_;t9r4| zTczmqh{;UBsFf zpr|gpGfu^wa>_Kxw8=DndrLk0U0Tw`TZTo>UxFlcD>kijS!Ya-s-Bb7YxlygHBCHC z#zK?$AzLkD_XWAsA_Jd0o@xE3lW%ViOg3kxwfWuZ{k&p7V#I#L<8#^v<9SXZ*XOMk zX`WZTlyo1rhe?u0R5br?qrdI0j{XJkBpBCmIHsVMbgseZA4XEg809XVt2;f)J<89m z6svMU0W_X_vaORhHN1?UvP5RvhBK2R#MiQXGK{>X$#W|EMqM*lb_M=Uj04qVcwivxVu$Hrx*t6@CoiXeucOU4#wCS$ZmNT+3KF|x7)wI z8w`7u^h%;LK=w4^!8R|y)atUKkTjV~YKv5fr*zE2Ej3R3rn^8TUFO)DfyF*+BE|j6 zl_y0X?!F#-$_UVqdajX(4L?AW_SWs5qF=UoUjbA-z~_1wC=i;zRw z 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 literal 0 HcmV?d00001 diff --git a/Field.png b/Field.png new file mode 100644 index 0000000000000000000000000000000000000000..3b7fc2f392cfa355c2eedf68ac2b85b2bd37f019 GIT binary patch literal 19588 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 QodCeiX{lq0L&(Pe0?tLj5&!@I literal 0 HcmV?d00001 diff --git a/Gap.png b/Gap.png new file mode 100644 index 0000000000000000000000000000000000000000..6915ffe537196d7593653056ed3763b3fb5194e4 GIT binary patch literal 21132 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 IynfsN0IMz=mjD0& literal 0 HcmV?d00001 diff --git a/Jaffa.png b/Jaffa.png new file mode 100644 index 0000000000000000000000000000000000000000..d83e89e94ad02e0ad2aca0db7b948e1e5268259e GIT binary patch literal 20554 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 literal 0 HcmV?d00001 diff --git a/Replicator.png b/Replicator.png new file mode 100644 index 0000000000000000000000000000000000000000..a2f5340ad29fa1cb2b099209c2c79fb93762b1ef GIT binary patch literal 20371 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 literal 0 HcmV?d00001 diff --git a/Scale.png b/Scale.png new file mode 100644 index 0000000000000000000000000000000000000000..160b26470e46a04b16f4313ebe35c29c8690b7b3 GIT binary patch literal 20348 zcmeI42{@E%`@mmu>|1G<8cQV^vlzonGh-QR$R1kF^3IqrGt6YG94ew5l4Ogt5~W2H zQd((2w2DYbDmtMj zMoE6IJOBVncD9zT(6^c3M^+m8ozDtvfxhIpw%$Adm7LFjtFRk<*hF>1oQT zE|1kb*f_)G%2X>WDfQ}{SjmKh$oLs9`ieW{pU8A*9!l7DICkgl&uyCy`#rii__F3} z@ncfgiT`CH4>5AB`WzzCib$C(*d*a1dC&UnYBb@R@x#r zAV&)DxkID21I}>3XYsEu?*oxpL+P6&fYp07XGr8E0WdW%))Met2Arr{xzh^pLITqn z_SbR16F7jh^JLfpr_TeGwWM4K{je_7cKiFBU_Z~PIs7xtwtX) zXbNt}8tby8Wz_(B>z9~|HmJQ(XI+R76pP8FdB$_MTOU%mN9Ut55@+UQ-U~W6ml%&d z*mbYKSLJCUiCl%Od^KCf@VYrwFv@&$TQ3K%6;EvQVDoe^Q=iHi%Smo`xw=>@InVywqOz$Uug|8UQ9HbB z^|c>OOH@OsZi*#eH`bXJM@BC$-95$b%n|p7X${s5Y*+1W{o|P!+qv4wx1Q4d&dT8S z>cf^+M|Wg(TeOH48j4_4bD4b2?Q!F`d$28rt0BaE9x%yo2sj zjS^Q`oIF_Kddg)-o*HIj2Cin?OgsCdCl96EpX)ozcaU}J6~Aoivy}NOQtx>--08M? zmHJ9@AVg6qX2!OvSf=ir%-J%tnR7yBpGtE$Hs}7XIaTgRW7M0pu5^`jj)#|CiQeWJ zNw?)wmZvOAQP)GbAJ0FQ-;%H3(eH7`J@NQDw=IR%9)@o1$K@XEEAYtAa(?5c?#4X6 zEN@3XGmqnLdL+VoI8NI8n!`0G@)4JuGwa(g-h?U8<`jkMYx*e_#B7W*y1wX4P2=WZ zz4EkSjq+W@{No34WW(i#o<*+xdl{xO?P-BS`}r&6x^#0>`y+O?On806 zxW+GkU+O-u0^0(Y0-HA#*utLNtYZ~c<=&s8l+CM_FJ80QhM8FVOIDX#quaAw`P`X~ zMEr+BgM7cE>Icg$LoTy(d(*Nnt&7Zd;N-T1Rdjutw*@imJ{<5V_k)e1mvoV$j&ze^ z?QFsgqd*Qp15wrV-i5sOni=^hC54jOwmqq|o^be~^>5ZH@vNI`+I89kZU)>uyhwVH z<|2E?*N(jzu8yV0mKyue07d|RKS)MyJw{%7Fih}G%%xkCLm)t5jetypB z&L`4Mg(U$cTPRHGEav$eh1YtME0VXAZTW4OD5JEaQMo{4l|}^bT+np>Xc&sU$n<8+Oay*|2? z{Hyi|eI$IO9>|ScD8ZDBi!zT|J>~OI_-4(^38wfa@Q<^NJ?8N_rRFot6Stn++Ii)q zrf>Dz-6u5%yV7ctYFWzB&JnL3-IJlbr0lvDp}07DN3>^*X#zLaYi>O%)hMLCnapdo z{A9V$vL%y=a>AX0FE`R7&cvDf}V`aHF39b`wFs`*7V#hy4|$fc>lWtBR$iuPHWp!ax})?6RzR)vf{)B+*v|k zSd)DFj9-?lZS+d<3q+n@Uz|LqCwNbxcu&+eV+r? zo?H6^zE(ETGRr2_4|IHWLT+6VI z?m@ZM!TCz~r@`@?PPEC~Ul6Rp)Ie;o$mq+k&UDN8yqdbY%;_$v{?Y4}@Gmw^3sm-F z2;O1K``vG`o_24&pUmv5i_c2Q+7e;#vDv5TP|2n)T5anF70$adReoE8)yS@{Wfzy# zuIanL?>pPnspfgXGvgF~eZXt}Yr@y$`%YEm`^z&5OV{|7_J&s!Z(v!XS_+1j-PO!r?I(JQ4}}_R%8ALlPl~&cM4` zT7Mf3`irRL%ja|P2t-Ioh(U;<0VjxwK;dvW1QLxvqv4PSoEOICQ$pcvp7xlNaX*$I zj~2w@@>v`={Ms%9chPyGy ze{^be8UpkO13)&P2ic*1Xa^y6bQGHYaJYbgA6oMGR>9B}d?WHhOP+fe7eu&%JkG`- z8fX;^%|!c0ljreW!3nq`xPsJw=!iRhl=<I$Y(KrG7&+~PtCwk)=$g?J!590 zF*UZ-1c*AG90XGMoFI1&$DcG7t`i3_=o}^pPnfPJi%sW*@Rkq|-`CIK~?txs7 zB^o-12DukT5gtXMVChs73>?XzQQ#;Ph=t=A6bu{(qG`sUu?f`#Z8$#ABxipa$SH^g zLB)IAI18*o-CyJcTC6btIY~ z%0W5-@u${_X$dXAnX&%5oT4EZ^FPV_=VOHUg6yB}k}*G{DnIwY<1qLklpxTY35AC! zyLZg%pUu8^Pe2H64F0VDg;n5Dg8$hX;EX{mNXHq%sdO9$PBF%Sa47iDa0(RjXc`5F z#u($q*ZA+Q!K5@}C`?xWf6Fit!ZcqBn+eiMi18~MZ}@LoInW42MPiLi;KoK2LpatL zgM*vkObp?MXc`?_RYNM)1Ur6x|6t`NZV=*?`|ikH@8mux!&0C^77XH%7(tu> z7=_FAXVEBvJc+fWkNwcJlV}kvcUGqQA zsiKuBW6LVunPY{**gf*krOJ4P_1DryP#Hrtp5<6{S_}4+;1>HoS29pB0v$2%lc$*4^6yo9W0RX?{v+?4e_B(Hjq(FG6Qhljp9FYP@j?)0Dmz@>1vEdLLUT5@cWzT-f=m0p>3eNwRw(H2WyyjLG(16Jj)jguqc-1n{Ls+*XNHqH zz8Q{f(MiucMnht(6?&QiJ;*@_pX5x67U4nQKQByN(SP2z(4%+|Aqr6hF)mRk33bG{ zgeXK2#JEJEB-9b(5~2`A5aSYsl2AvCONc@gL5xcjNg_2N5j7x|@6hVwj6iPxJF)kqrQ3NqAQ78#@#JGegL=nWe zM4=?q5#th~5JeE<5`~gbM~q8|LKH!aOB6~%9WgE;3Q+_xE>S26b;P)YC`1v&xJ02O z)Dhznq7X$8;}V6EP)CeQh(Z)Wj7txoxF+}+gk=)eGlRuw^TgNR;xCbB6|3q8ivWvSF9L#ZZy+>&mxP&GM$oJ zp|P2@y_XvA@|im6jWR^KT~Yr?%_hTl70=GhJntzx+g}*~($Vvv36_F$7Pq|Ky%Z9M z&*4=4Q-_F^IqrI^)IU=q6l zTVQrT!fSPXLiP1eBNgp`(19n!&1z*Un{}5+>MF!*2l!+T4a&bM@QiynX!>@+mqs!o z^-{$1vXPBZCJoJvYG&N`kBd7?7Y=+X=Nw3*sYSJ2pSmveH`y;vjXY9j|CYl2?&S7P ziMCi-n_m*+p4CBb<1!oWQ!MKuvQ-^`x&gGEYhALWe zEwm*FYttTCY(`?Xs_mLmefdH`N~q!#;uR9$w64~7$^30*PUmWhi&?UoOJcm5eBK9m z+dJhIzoB-Xma$;ICjkdc9~Ezpj63xf^Sf%^Tg>LAM`X-bn(Pg3 z%H6xqUZ}9Be(=1_*OWM<(3^6|&th+v)ULF9Z=J0i-93idL#_>ed=Q}QCxKTw*7Mw6 zLI1o;iG5|ToR`K{Nf=ALCc_JcymEN^PA}Elea+La9XZv_|;QPwhW%fnLI*-2Kx=q(GgX_XqWy`$PIN#WVRIz3_^X|L?c39}YFz#=h zx4+CWZ+-U1*AWieFe8enTO{zV8D&Xs>JI%unUGSGW z8et&>c1n#j(r(e&H}O(ApW2QrZ=X}XTjtel>4X*34L$e=IR*=WEY#DDMyX>;}*7xsg$^t909^$X$|wZ92cxKlb-adg_BjSV~i~ zv+iNd7kTqy^^tnKsmwJDUAt&CKrT|sY>H3wPR&OsHEqC0CO%$5m9UC29r)yYFc5H1 jdnf6$@h-t?Bm{_D5wXrcht>cEG+<}7!m`l9XY0QJMBCy0 literal 0 HcmV?d00001 diff --git a/SpecialWall.png b/SpecialWall.png new file mode 100644 index 0000000000000000000000000000000000000000..855918b728da9587d8e64010872495f10cfb4aec GIT binary patch literal 22590 zcmeI42|Sct+rV#+vP+9rsX<9H`;0LYW8bo54ehhsGbYPmCR-6nmU>AlA<`mSRFsmG zR9Y0#QwougwCE9~4c|Rv8IPXneS6;b`@P>c^ZS{Z>%Pu)o%{UHIoCPoy8R}~#@bX? zYMvAT0J7$0Mt0Dr9`8@$H|Tw_^ouCyL(T(03fxJWoT$)d!?i;TYWwRy`iw?~(HU)<|I zS4(a`*_~2QC0;5abHEI1iw}{>GFUL}S=i0%<;|@Ky-=w|Ucgj|0=g2XPelay6s)bi zOu1D2G9cprKw1JQwMs5U&5sz6du5QgRwQJHNGUf?%R(YV9?%PnF*pI}nTUj>98|Rj z(k1~LD`?afzy=O%T(a%O10W>jQ{om8V9h?InIdU%0Bi;rX#}_~2ToS4iZ%wEQGh(d z;yMv{3sDMoH2`lm#Tt#f0MIo^{^^fV8-oP;0yU z{41yARaR=o6i(Rye|1G{K$%Ky>2Isb@q#+8nHyZ)uYoL>7qVO|#H0V{;?7B~>!s5+ z_wHik%jum1(mLv#y1jU8jF0Rodh(>Lwe|6e>jrBmcbtOynPnSFo%-BA2Wx-p{qXGa z^F^VUb)lw{K0PbD+hdtNziO}K4r;@TSkrIkr3bz#K2W}HPAzg)mv6D1?j2*4w7VOV zt{i2scj=AAH3RhLO&VWC$xV3R^d_>%mN>uk3spa@uh4UKjz+22{Hv22u1bH~ zsJX*n(e*NesRmN?koi6vm!8~iptkegX+`yo$lvu8aizAdJLA2kAj%vsOwsX@`$CaO zy{dL8RC1F3Er}TvrMgHFYP7RTjKu83@J~ut%_dFXwFq`QQr=eCA`Wkcwu^RvIhrZH z*YWv{7_rvmV%+ju0A~BQotI3}`$F?=b$*vQXIPX;n76~^sPuh07o8M4D=qoH&)Io8 zyETur-_LQCtBWNY-b9tYoFk6C?v6r~Uo$wPr6Czlt2m>4QYNQ--sx2*MT?_8(5lY( zO`0BRTq>zK$v8xSoj}+RSvW>``f!mx!ycagh+#)^q=>7-uTxYxXvQE9^UYz!H{{riT`%X0# z9i}f6UW)ek$;j@U8Fn+0sWvxxj`$qrT)#P|4qBd=`(W4Hn+_-f`t`x~M7cz^qqBOU z`qr6occk{O*sr=@K^^Ikm3<<+F7aSrwgFdSbcda?6|d?%q3k?@=N?SqEK!{HQp$IAdByk#)RvPU<7(wbNaNw+pk* z&pqAtSgby;(4#Pj!lce-p1+ZItuwwPKImf5Kl*gUWh0(U$x&Rb7|c2ABTrgIYD}s; z)TtYEqvt>elIdJEwdygprEo^Y((9}g`{W0v%-PH$PFQ#3t|*J`6^H~fB3YsQ>8+C1 z72FTr>zV^=KBOcUB$vI-tUuMM*~#jRXgGWqcX(;43zl>L+AYIpwr$nA(uen>+?q}X zuQXg4$~@Puf}|nioN{YVpHKJ8?xnn&P5wysIov{S(Izxv8eKNrC6u1Ob-rTdHFoNT z@Fv4;Dg*R^z=3KYBV@4%Q#2}6KXlD+Uq1zIRk{+ROR5Jy=0AC>zdNl+f2Mxy_T24l zS96tIZ@t-*tJK?murjWaH6`38_~oPf;*=MZUDtwTmV`%yJMGks@rrbwSB*}<`&Bm> za+-|37#%QbOlG225>LTb;MK|5h)vpcgp0U~y5$Il%iV|0DbD8Z7W0V+^*l{a_sdP+ z-gZYkPkAogvSs!`Jtrr-z@-WePP}wj ztyZfpp3elG7+3B^-60;xNnLjD?cIVq^?L}1-W?uzJH2dr^WMVrofb}TMdueKCpQuE zwY>xCrCMfAUbb_U*h%dR(S_R7%atmF5_0IOI=S19IOFK%ng$KQE zsC~O`r8Cl{=^W+D&J+dm%&6!*`TE%jGq*ifYw&MVh+yBjlGw2CY*x6DubFZZXs^MlK3$~ykzQ2BEe zFQb6gj$X;8-UYIxI^W$}PBx1_Sm>+BR77qvNP3@Sl5C&!bq#gR#g%u-)sJ2^27WWG zUnqA7r|lB3qTAs%tFB}FgLvlqs@*C3Q-XpKpBpyTA1&O{POEI%B*%VtaVodD#&}>? z`|?Z6E7!iizY8d(gu%L+*jKD@efwsEIw46lvlLYt*A4wSkzPHQ6YosDi&UbbYMWjE)3yDUckP{iv zX(KjXn|<5|Z;ehvg6^OP=*i_kcIXN1Af#4SBc>Bp=ixD-C5LP53$@@okqIq14gp>u z(hlUXH~Y{)V_)b_R3^H44%ZGGh5Hk(pyCrc@)|zMOnhG>>K|g{vKT+O5uWCUW}rXo z2WC9YklEmv8tQ6oh&sv82c&S>J`QZQJ9%ihjvmCIa~N-U!ql8to^-Y!XQ?)FyvgXm z8TAGlQMe!(vebm5aBwWj0fQx>F(ka^G86_H-ea5$l^o~83YtW83YRj07YvGoCXV&O zS9ZJ~Hl4)?_$e==CCB)n(?|@qj|YWIW_eJUAkxc|sf`@HIHu&_=p~tZa<~*v8fb1r zhAtpjEINsyNzkHW@n|>>rA3F+XgC6#NMzvPL=+7qU};n$RSP?a!^&!``JY@Hv1yxm z69{rW6l>^g8svUtAd&DGDwTjIFyJT#ng~auK~1<88c%?0VHqHSjv>;BSmJO+W1Rh| zqLn@@C=^oM$CTl-&^O{gteL^K6X)uhoW7zUPs#%K*!F@c*u zRb|HFK;tf8%y@)G4t<-Hi3;?)*6fL;lB@|F{l6SJ3mXCd!bj!BRhV!eKMGeiR>2 zp9zhSpP9o$Uir<&yVpkYmIrs%zo8>I6yIO#1}Y7!MbIQt;6#uJjYKMr4%fnILL;66 zVsTgo1B)d>v+5VS0ZT&Rha=7ZUN?-6Vwx+(lL^wv$l;a^U-%F99F6Vi3;O&slL(rs z6lhZf`f$h$AGQaK;^pPeqEUDg66xzn|GujjiDNJ>8#X4`4sjpj<3HF|I_SgtXU6H6 zyBxs;`!8$rFV9R0fq_F~2p}B8K!b1`4M*cGby{!?7K5f^sVEv+6FoeB|K$KFoSD3( zihptY<(?zb@iYt_1MS!-L@FGQ;jQje3Kotd5}@xW3KfOL|7y=cyEl}UFsAbN+(@t( zru%)nGCtIecKMh{GZnm5lK*zM_BQ%K!Jp)c>9~|MJWv;HeZ08l=I| z1S}CwLE%8S7M_TLYtcYRK;x-eXv}c8{;M%nI5T-6_3w_UbOJ~uQ0Y`S0j&kChIkwU zP6er2a4HQ?!85QZ476SS8+vZ^L@eB=en097_o;*9neXlUvNI;~k1Rd^@Aj!bmzVjq z6C_`*>i@vZ9NHJ~=VpfUJ%7&S@UnqWQp;%Q6lKCY`|%PA(C8D8x`Bo%lvX8;S;>Zz zX+IlI$C>l(Z@znn(r3f@wBhvD&n~k(?_hp-S~_~N zxMXN2HF%@rE|0O|WzvVB+Cxu|Kwi_vUm9Q9hUE{sI~%c}3@(S4iPVHv{Xv`YiU|!} zeq=aC@!fD}ijH~4GdLuMu0l_cpodq;k*8N#Knh0kRZe*h!CG%h>H)0 zAVG*r5FtLj5EmZ~L4pvMAVPe4Auc`~f&?KhL4^49LR@?}1PMZ1f(Y^Hg}C@|2oi+2 z1QFuX3vuz`5F`k32_nR&7vkc>AxIG75=4kkFT}-%Ly#cEC5RB8UWkhihaf?SOAsMG zy$}~44ncwtmmorXdLb@89D;r}>6vDj$Iv@7Q5fex~Z` z39Z{coxZ)kzRY(KS=PPXZ|_z%z9B4cS+^r7GvEK+E4F;>mAurOv$xcrdO^@toNpt` zj;&f-wWq4cek-Tv<45V{zQ(R*o!Rlvmz3tp*n}YN+(nZ)(Nlnej^CFKez7>0WWTjt zx9chWx%}ad>sktl#B!!}pEN+GS$8Eq=nx6fdoO3x%#r8P1||Upt|u10t=%T28)c%R z)L-A7(R)QVal_90`;JIvUVr^4uX4-nu0=Jh59VGyA_cOr`O~G-!#c8_xYDi`sC}O4 zX{&!5c-ko{xfy^Pn@mpOg$G)MBY z7||IgCf$WasKtI9xMp%--9nT#UDDXw%vMA$GuAmjwsv`LaH#c#h9~aJingx`N>fun z_-Te_llN>hs;OSkE7!^v4GMx06nd&msy~FzcfViTh}wNr4Atn3kDn2f)Nia{u<7Ea z7i(f1b(+Q1vAdmA37Pvef@{van1^OJg~8v*?6s9lzI&DY`j5+B zhF%8S?Z2RzaWq@*c$@xI%cEvpW$|erwO2caS#JE2{(G z)j79PiT-I@R|)aLm(q7R%QEDf(#}nGS~#bnVUBqE!9e<1zk7^H3v46`w@4}=5?*gU zFSgr0MIp(^CO))jN`&*)wLu$8s!@-h_AI^J9^k2y)(E~?6SB4G=JOWKd{=GX<6jyk vJ8!i<8Ct^Ggh;TFypa>w8`!4v2OFpib49s{Y8>MI44b*JwNakI#_j(D1QBH7 literal 0 HcmV?d00001 diff --git a/Wall.png b/Wall.png new file mode 100644 index 0000000000000000000000000000000000000000..36caed15da787ea09d111165527fc9f8770e141b GIT binary patch literal 19665 zcmeI32{@GN-^U**dq`R&ov~EHnAI{9V;O6*bC9+%n+Y>xX0mk>g{V%FWQ%AcqD3i@ zY|(}gEs_d3>d?PbwBUV)Je-csJLf(B_y1n+b{)l}GoONXONIewqRz0?V*YVgrx4%5!cHFP6Z0KeE z=%ojQ-ZO(4MUCPW5;BKvFwS}rGN;X#&3m@1uBP^Rx2|cVlm;7+mnfpBa!1rffZ=c> zBW<+`@p3>Uq(xc+sIX73KrY=qCilubb-hSLlt=|H!O%`3LJ=?x+i!jfFtrki$Vge? z3S`X&Hs2xpbOBCqVDriyFI#|!jN#O6B7pZH)deD12>@(9HP!;~T@9RR{CSTh;E4nj zX?8U@;2|79+IrAzfOD6DiUxV<3xI?SfOL+HUIonF25i2mt{wtJr2>jp?>vm&Y8T4) zYJsFuFBp|*;4CA(CE$VL9v-^OG#hLeX)EfJW|7iNb*n;CmC%t`xo3lS0U#@30eH8A zBOwj4g$)h*`-^2a!Cze$8&mV~=^E{6%x8lW_na5rG^&FrS`x8ZEFxg^*z$qdz8j^p zwhry3U63=q1Z4F+_84UI*;r;DD0%d#r@Q;%ni_L&(ru6Jqx7mx6&@r0pTdp44t;o5 z{z4-Xy&=+i_VBZ+yYJVYT-tb0GRo)4%XsUrm!-$Ps{aHa;{pbmY8dIamCenpK2ESpi#R$ zZFJPz6yoP2a}vwOOK`cR$F1NR=QRBX-zFUT%-IqSSTcRqG&8m@lVLR-6&1;>(FmiR969b%mQjdyikN76Ef5Ih|)0Ki3pG{eNN~vY9Qk@&p0QEYhH&rf`-f zRhlxQQo7eT?{qefh*^X2C~_G*L^BcZN(mf3!gG-9)yzpA4Bzuq@y)6itCUY+*Os8D z>;3W$Cm;6Ax5;6+~V8TW8{iYE$A#QW7coc~nA4lhN^3t6#0;_AzSLcWHD5)CSZZUm>o7yFV^t4^(6yLxS1{oVRw^=+wo>BguB=-%|+^atskmp88qS*KH+TYQCT zd!c*XDX)RzGG_EToYzTD_jMbJtO_y;mbaA_l;+IKDRD@2$j@w}SD$-Ze5?5MWu!L$;&XRDlFe6HrxMP+$Wg@qjDMQeaAd$_ z`;GU9`w(=`M)}5vn6BdacUILfGF;PJtm%vBCEQ(uv3uj}cHYrVCg`Rs*LK{z*1d-J zA#lUS_ zF_M0%R~U;C|0|lx>y(tX|4Gh_6r|{p}?unCLlJ-`I%dCvv9qkcgvY#F6xugk|tQXw$gvjl* z_-t|5;%Pb^<%l~AU!$i*$kW|o^w{7k_Nqy(F3sz1t7nF%t-sw;oUT@(KGVOv^K1X$ z?iU#^q`S5)NDpKa!$bcvlh?{!xNrHp`N7NgONCac zRMFKCP5Mo-4~grwmN~q$(XtOa_HmxWoCG+V%Z+i*C0cFgWt&=vco(mBRCb#V2FzJm4yxFRz{1g1cZ8 z7}_q?wP22R%+F$HjIQh{)(U8K%-P23CxPmSxU;^!Vc3&Yv&#fB0zGj!3T8Y%kqaOe{Hm-RMdgHRo1C{c01p6K?O_ zKD+4;GI-M*F9O8sK{rD({cFfOle`0$s2 z4FwJXf&F!&&7vdX>axWTO76F+G#k6Q#J6d`wwA5?seCl!O)z|}{#^H8kJP?UXIq4J z_YFyQ4lSFDe;l-L+nML$Ek6aR&{Ysy%+ubbS*5$Ceew43zUp|F(A4(oY1mim_MhaA zV2!*&*9^MdVm$8K*^)?q*SIeuDPw!M?x!c4+m97*>m@gIZjocXxhl_l-fTIxw|8~f z>W202uJGPnXz!Wtam6F;EPhkKE8Z)k(Zm+Vy3!-1X@w>0{YnPHu3g$j8|qWeG-&8} ze=YRw!m+m2Oq_AYwZSmf(2b!FoeMj{IV(pR?vy?XUO7-u=2*7ry=lMMBVxzyRuk{h zClB8|*|DV}IBT%!iS>|J^sdIygb(p@#5wV)@poe8#=OonB;ar_OgJNbUvr3!l*SdA zi$;%)-YHzP5D`Ay`uagbQ%X~I^1I~3>jA%<9C=moTIp?Mo)W-Kef9bCb zeiE$m=6I)^WA`tx9hzglpU!`9y_fSPQ7JKTY_@31;8!vR-VOjJ2@E$+o~Qj-*H5h|ptmdI-kF;kKslE)GFb>r< z%)yNu=10a+)JzCcMj?1mAb`pv!9oK3nOuB`vD&yU9<=$*2sPNa3(wD3&5S=F%+uZp zMr3iQFg;y8I2nmX!3=P^C_Oy`1GEkdjYMG)NE8BvfunGEEEbPM!oI!K2vVSB#G%me zE*4hbh6DdHR`ccY*mwjYI5=207^BPL&=Dvc4u?RZ5ok0V^ni0inLJVmoXJ(65Si4m zpmNC^2AjuVF=2dNk`HSu&sa^3KM?f#c3%N(Xdou{8#|C9B80?7pmdRlnSv-}D2Bb2 z<3E0B6f%P9PYs|ld0a3KHDerz)ZQKnopHE;fEgpXJj)>P4!#kYF_P;R%BCV*s9e@o z4w-5h1YU{yOc&4PxlpIz3Lpi#&nU#6e3Y5_x}feKV&pMsKe!Nn&kw_>A&eh{@p~r1 z#&c?7s*OPEcp`^N;;}exES5iEB3-8*#K7k;etN<*Js3<1E10{=2=RT$RN_pjQ7uS3 zDglhtha<6Y4AKpa!K2W4J$-E?8cgqLA`_n9Y1o5{h(h9#W>Uf6k$Tfr{^0w)4vWH| zg$krHoaQ;6y?9$Dmq%ifskRmbutAr>px{Xc zG%N~jK!u}eC@LIF#**PUB-s#-#-LFYj1Q8G(npQsu(zKc{wHY*7I`aw0fEvJdkuv} z2IZkd!eeO|8jg(9gCl7uLpTaW)rT9R^bFvJ7#h`pf(E-VxXFR0iT!CHM-Btr3Q7Lc zeE9c50SCjP^$d_m3>HozgX(B~EU1n{k>Ec1WC{rlj*mhcP7X1H%%6s`VQ|5`3!Rpa zU{;QAcCOUGKekSG_%p^gEjEe6rSjLbvD)OKhITn<6XVB>?+thonZMl;$oxd7Qj8FP zXq~z&DDqnv}B8W-(R#iaz7>vh)P1|fIxKGpg58f+<%3=JSJe_ux5GL6FvwQx>D^sxZ zZem)6D|6z+nb>Lnc;-!>qkldl`BfHJELcorrxkxq@i*%K{zwE*HLzU8Poq9rqzJm5 zei#0SwfIdPEK4Tql)qOtOkCWw@R`(E|Fk%n7-a^TsnI6MPXj#d2sDCrDm;?Rn{MUxl#D6vjTo-F|n5`vIAB6+YF0?LK2+rs?O^09n-ZKpu|%gm zJCCQtL@W4Y4t^+rfIbzNmMu_4`R_NT?&#mI4Jir-flvry2yqEQ3Gxx*f=~!z2yqEQ z3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx* zf=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ z3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx*f=~!z2yqEQ3Gxx* zf=~!z{3R}_sqfiSnc$b}gTZgn%X?(Pz;EEg$Tlwa01&nu03vn)z^5_ry$=AkA_3sl zW&psa0Kg*F!A&=;0ASW8TMIL{kjKBLl{!=-6=MSG?3<-UU+ue}9p4fiC;n{C;)IX| zANNR#Et{hnBb%fZdEmgFyk_sTsB8r-Y!JtPEI|Fm={5HeZ+nKn*6kRs>zS|3?YjJ{ za(#bt;!u73>!+=aH+F}2ws!S@nq_RBdB~|8H&Pay5IQpYcHn{H>YlMk@2#ey9n4iJ zh%8>MXPSmnc|@}k*=(`-r+>jVTF*O#*z3x}=zSxOpioq&4Q?mA+$Xk}%&1;P;SRVCJ9N#g(MpnFij`Bdh;*%#!u z;xdXC0+wkeUwpdPB%<5ngX!{|v2EhMqo(ykdU3ZlzA*4EI9t|Ysl5X>)E~$wby}vW zSsA!Is-QCAOEW#A!Pl@RNgmblEbEi#(Js_Q0Ik{SJ6gd*M=mt|T;wd?o?HLG&T`$g zri!4=C4)UN-l^E5^|`;KnXn%-iFQs`OtKo$AGKOtQ(~78`aLasBJuMd?orZAGLctH ic5;_<J^2QB`q(#kto~$86wT=o$vj=zW?{XzW+6IU1R2)``q_=&hOmke$Kfc*F>*g zWidl~o-_aeGpsDl9HGw@ytm{u=bN8 znv}eCl-h}BN)ESXu3RamQjr!V8WR(?U&%pd`d;aJi8i&9F}qGh?Y%$nD&&;U)55;j z4~MVT8FpOgNzJX6D3P3g*b?i251W48WWmgryYAjDf7OOq5iYIC0^}ugscM`d4H2L} zR9}CYdWpnMKqT;qj3iKEmr{b7zh^}5oyieTk+9t&CEPeY8_6(5U`23@$ys29xky-Q z(qbndO$^vrN%3k0R>OgfOLn||0)(aZ9|;iwJPxWUiKN8=uvuV~8Q{GfxKO=j?@GW8 z1t`*NZWDoeIDoQprC9=(t^p-g@-jJqkk1=W7yIhI>fDH%qv>A{J;>SAbVG^jknfjJ{lUK8 zmp5B9!!hf^EyVg?mOl7oduD!hywq;5#@DeHgV$t6234P^-?s9~chgpEbx_zGW0t(X z2XjU}+9ZDIokfpFs4dMp1EPk_c;M0|Ly?d;__=iy(a$zZEqwscUBJBco0g<# znD?$%)d3?PjD{@I76D;2tN6_Tu-;4);e0>W=&mFHn5BhlUouwtbZf3oiTM0mzck*G z8Qe(NZK8R*)I{Dyni@8ry>aPA&toA%g#A~mcMvUZ~BN6>-w=BgJ_G!ZIMJYO{+r;55(T;naVJ?=c z-3IJw#66zoH{zC80GOSFk%boMgW)+22ER?eYMOseciwLElQNH}Ty%2m?6j0e>?`vO z_7hHYJj(Qzdmd|OdKXplX08PGwl4}%US@JxPe&?&Qh8bZ!t~7Yd6(8)5G{!ArBq)I z5K{$@%uZf%aTuN6;bhkt467__0HdhwknEB=QTrUiI zkDH~A##4pZSxEViDAU`znhMdTm?ilKrdeG+?fh8bvH4?vM~$~S=TmT&^E49fJ*WEQ zNDvR|z?M}+w57I{wPD*-+SIx|q*J|CY(CxZ)S~5hf0MOxyL>yYT^vlp7`vQGc5FI# z!g(e>cCAU)i9E-P4tvhc!fi<=KHN3i%H~Yg$wN=(dC&3gV_ba0y)m=t(1KNok6a&D zzO{Ih_(t?o!1NiBO1thx(Y2IQ=1R<^D+kQIm}Gla`N=-zyUr+G^!ucaBXUQWE^gX+ z+S`=k?n@uCKD79diZ;^ue8$;~7a1}xJua2bvFF!2ZO=A$!8)~`m-_8+rb|ZZ>i146 zPW1E3&+W;epJO^3oep&$iWYY-vn{hXJ?)Toc|&VqIZTG4oExa4<})KRa!WY=_TtMA zpKaT!U63@STCmR`G`V?R%IT0N-w+gG4Ed9 z`D@CT+Uvy|vh)1%wv*{zbLiLZWS4a%6eVoGvHjN}1Bn@Xp2=pau2l`?TwyDc){tH# zR~_v#+J5KL;kQV-TeW<3J+?J(R^`&$j8vzTCl>TM^nA{)o~V7%Haja3iH3+2mGY*F zqBd)8@8)%{f*<#$rsSrScAjgv*hT1KbnR(8{s4D;=`nXK=TTXO=}U+98Y7wGhfqGv z7eeh#?ZfF;J2a3KWSnbO-KA@10y6r@ALbZ-He?@fHEh+_eSvx5zTtsx$+e1WmG))K zV;drxO?POFP)CACYJl{xMIv<3=y2n3k7)z_!Q0e|V~j`*;OCrYoyPmq@{N^@V|Qll zY`>MI=3Vjofh@JYj-;x%Du!&t>d-e&A4!m3llPT{PG1tSC&D$-D25f~Hm?Sqh!3b~ zH03m#eKk95_9BIjwkKYMTjRA2GZ35fpX=Vh-7qRg(A*!?x}~~V`P$4UBDAv!{=PSx z2RnQAw4}Dkw1&({LRPF}1)ZoW{S=Wt`#eHHhje&_ZPY5ggMS#yYoD9Fe^K|WfJHIV zL8YptbaiA6p(d){)Kh!Gs%}edyWsfW;|lRXns=~gblUTGFFAjp&~}DxQwr(W?BuO5 zKa2sX2)!#l?!ab~3^luiJo-EOYueVz3t&Xf@E!ks*N_ViN!;_vJ#gU{cer$($=Nr~ zYqjdMC35JXE3Nop^nK#t%wx+Qc0S0x-*79Y40vUeBW98UcZ0G~ma;qvRz@)ix2 zSy0>CKB?xu1v5y`x9$(Q@Jiyz!mX-wRpcg<$N3)P`P-dO66oF4`%@34ZVyF#Y24UwGB2cqQq{akj``t+JonY(l_UE) zmKQFs^6b9O?apavpXGYpHTfcGgWo&uJN@B=C-!#>jus?m=X?6(cLf(+4WaeDRXL_x z)%2+-=;Q2>r?tn322Djh!OXrpeZ9@In?l)3hN>zHo&_xF$||%k-0*2dr|~n>raiSr z9>b0G9~yUTDhWvIscE$66OY(cJsj5?D`)yk?2*{Y$QhCEkLei_i7iI#p|^wSrq$Hy z#mD9hpB%2to--R6+F$#=uBs-f=0sw5VnVUswlhQTO5Q79Y$z`+UvTqYAQrv;)0%2K+!S85Zd0>(3zt8mN!jB|+bL)kt;NXcMlFfx0oTLztW0 zYM3dL4Z`pUJe-2Upkca11R9Um)y3$*Feo$*i9#dMSU8$U!r@3L6ztne-B23(rq8C* zNRDRa-@1cJ2I}5iE{lXj1_T5k0ii9{p{gT!FqPzyLG$e&9Ng!^+e#*B>H zF#|aiHiN}wF#TaXyJRos7OsK1IN}14M zZDIS4UK*8x1bsn2(4WhJ^w3l4K}hZFCRC^F&d+a3O%8YER%is@h)k);aSmdENJo&v z+`^`SE4M;dqA}IQbGVM+cesDU6x4i5L#*+m%+%L4A^uB@Tn6ngE`%rfOEoZ%@fT`5 z$(Y)xPmN8rK17{l$_B|?Cfk|G^ferF*Y5{0=p4p#Pneb~!=K6w;4IZg@~eDzobT2^ zGcp%6gft0o6b_C>Ib*OSG=_vHEJI-+_nu^AtRH5g;m6KYIdN0Y!pTi~lQ$Q;-L#P75 zU{FbTG8u=b;IVKlQ4fS;@HjM_NXFvfWL-U7Je5KuV2PMf9Cmh-)&FGLj7izTTR@QM zu~$R*1_^L4GzN+`SR77Q4~_D|QfcEIO)~bUj_lbC zC=`-?C$-^?g$i|s!{BvMC@c<6ra;y)1e`8hkBBD2y$BR48AHR;&=|e(E~YT^r>-m+ z9LVp2Cix@em7~GV3Ecc+?YO{~F&ea3WHtxnt!V@G@kKom~a6v-+bNzj=Km@Alx!_+OX^4teX(O@kK&tEWpKlHo*<2zjCxjtbYq5eRTSGKj@t zX*4XBh#jBie|Z|PBoux;()`~|!*?&Hc$59t3UPIu3{pN!MIG=q+mP7eUgp;;8>|3oAJ;1>7=Wi zzy$j*8}m=EOtLNwhsNkaw>sW!2uHzD;6xNf501fN&{V7!ih?Gf$Ng8hGQZz(#$xSH z+}wV8=7>~01w+L^J2o=W3y#O|?(SY>EF4GFg}$T6UMMX7XJ-zBBBAtzF_mvy^3ySO zB4F~O=RXLr<5M^(TK!kX)c>9_|Mbe##e0!4XpjO&>tcy;G71O6_3%U#T#o`m1vK7E z4-K6m#%`7WYD^Wb%+Xl<bHRNe{&!C>6Q8S@-jacQ~$rM%(0BXkGYxge9xbA zIlOEjl+-dCJ4KoE&VIa2F61x&Aaw)9U?{Chnsg@{Pp19daLT9t!~W)*btru%IG={Y z5pfubE}554BaY?M^w4-{PmHC3x>O92Lc|hzp_|v&Bx6(c#r)Zn+E_1BnEBq@_&iL) zJt=XcKXJY$nKFHuY&#|uG=wrFQ&ms0`CSbCL(b~4|Hm=pI9iy%tX7&5&_pQXfJQbI(QypLZ<&%J1&57QB&tW|K40pmChP-=^uNXJRU*U ztIx~Clb}Q=lyn=-XBa{#{!}*!!>G)Sm$3BRGMbRo#h{=U63zSjO?9%EU)5c(>SQs$ z>UT{Se+JhO+AfY>3}5vmE#BjTF<)_l9+82(q48Jow_eQ%1byAi7*Lv;!%MdkaNl(J z1yd@z|CQn-!8gURNt^T_Yt&uFYN5wu&=Wf3#3Q;tdD6s@```KH`-uLXR{3lRJK+N& zxG2OWm=B*+h>H)1;Gz(hU_N|OAuc{3f{Q|2g8A@Cg}C^D2rde73FgBm72@IpBDg5T zC72JNREUcYh~T0Smta18QXwurAcBiRT!Q)VNrkxhfCw%MaS7(bCl%u210uL6#3h&y zpHzs84~XER5SL&+d{QAUJ|KdNLR^CR@JWTZ_<#s53ULYM!zUHu;sYYMD8wb051&+s ziw}t4q7av0K73LkEH)1 z;Gz(hU_N|OAuc{3f{Q|2g8A@Cg}C^D2rdf5CH?(JuRwq3m#zY!pR~$3d7~ftIV>2( z($Nk8f)@cm*e(G0G6H?R1%NFm0C=|%07yvyFozkx;f^@~h$&i`89N6)Z(LjK<77O4 z7mhvJhi?jE@R(b1ts~t5FojYE- zE#uBy`^b2;kM#w+l!dac*>xcSeO+~xa>dlZ5AoZ&2HxK^>Oy>^kR{BIC>(M&?(Xe6 z^r8RNo!_yT>zDIhZwe0Crg$w!q0&6O1*rKZ$FJIv61kbxUYT5jJw~+QSViV97fRu7x51Vo1xH z9orL(Wf#2gkN}R8=M_iVl_%8)g-YgT*B^zImsMmA_EUp$(iBd^ZNPkubu6{#r0XYN z4==oSVr}%|_$`%lJD(J4FIZb+tAg0 z_jxt2cf07>gh#cDvPhon-d~ee%xSJ`DM|7k^jd5qYqjr)4$4Vl_P*=P-663RvbRB_ omq!cPtBTs@n~QkX6pH|!8Ir||yY_qXep}CK`83Nr(`cD7GigC8wBVDzv?!%) zr3fKXsE{m`5Ty;3$X9%YvQ+1tvShx@@ju`HoO7LX&0NOCqu8f?DZ|sn;h5Piw^)ZVZx_Wl}cI$0LVMB$z*3| zAC7>-_u+714rDTn%i}QFejoq@KTdaJQQTfmwdikoOIjKezIQ3dRZ|w`O4=E&5pQUu zE2p|7MmMWL)1_?6;>FV1m6Bd984@>%= zR}GzeMC?4?mwu*3rc_oj$sXf^4Ocuynl3$BJEo(6~0ZXR1j~rR5n}#unOHxItp0XN`-ZOgr^Ve+b9LB+N-N6l^GAf)WH}Vz-JL~yk^CY#egRg z&|ogTh6n250MfyOX%Cz_50qA`Dii>+iU86jX8U|VdL!UnsjnXlY}*HD*!Fsu|Fs}r zwbKY9wXeXu$N;}MVwEg>y^M#4@vM2(4q6K|OsNy7saD42A^WDIBTQ7D^xXk~%y>=c zYWoI*tCjPst4((oDzAliU70+rN29e3b=2f>tpMPuAgp$1A>z!8@I{lu{f7?D>5=yN zO(8R|e^`4Y82+qtU+Ka{cfAo zU47^ydaXLp#8xbDY8_E(V>~=(4SnMKrE^t11*OmW0id^-Q}$q< z?8I=Ntxs!$hF@C_+GWlG!kG?#tOtPKYz&Mkx6WAJkOcsn%m|}X*4l5&rY$U;JhN<4 zQ<=hNZ_{lggKOm^Rgyd-d?wF({_#lCyr`;EI!4}z2Ua>Jr7k{E30!64a`y|$7F?B& zRN0KOc_k5Y($QvpwF;cW0p8C6Gwf1cv&@HoL4mp3 z>-1XiCg7u2+g^-cR0*IXKS!0=q4q`;xL7<;JV!3d!Ohradr;vnLx4(+o0^$+mv?rC z#V*sV&bxU&Dv#rc@g*Zh#i6<0~8%@)cf&~KmCJFb{lG2_&V;}eTx-_dJM z2T7|%EH0HZl@21osI#o?J(qbdueZ;E%``BX@>mWhH*uRw`CPq(oTXf%tK`#ZR_hNBxILTadTZU1=^d&aCLNQ(6tuPbp;XuA zoGi)|Y}`uHiL64`lP=LY>L!7y_^Pc_9hM$BaWL`z3?D6@e)h>1f{Rm{6K5??zUy)C z_Dj1L$uB0p4N_E!(%gC@hBa?`+BBJItm#41PNpn7I{p66={G1y9O_j{=RTEv9CuHn zLZeNZ@wem?mn0e{Y8xRa$8wM6w&W_f_qpGu#2x$1ZF9b@JI1Z;nB0S;Jonsm=T~mp zZmeUAa-wrtIUI`R;V`ek*vVd3mtA!tA9l$+y|%5S0;WKpekORKuCG#FRA2=5n&IiH zhD{rcic|R|m&F{`mKYD3#vDc>vW$PPD=B}P=$BL_-l-}vq;MSZi zpFP#lg77ZiIM?@xc2==X(3ODfo|KHszlCQk<7BslTmY74{^dembJdD`gqlcAe!4BbsMh>Yo$c?oD!bSftJ@6P{44w` z4jE21)HPh{*yY%h>grf@bpFvr%N8xWQFW*4VAaEY*fa~&BXnn4XWFB**7M#ggI6vr z%qhG8Iux|8JnGd`SQ4;(CEn|Zr~Aq^XKYWTpP2Ko_(XB`l?EH__&oAeUF@~ly2T}!MpWqo`&9gm!5Vet-L#@@nnx_54$J2>A)S61M@SyF#Nk$E6Gn>I%+Ky4kRLd zTaSl1k)0w~=Q{NfbVR(ziASf-9|_9sr@q!Az9;eyv=Q6PaV_W;ueEn@rROWp-*&pn z$ymF+mAplNm@ynWTnl7}&yiwHjE%64ST*6(KhibSv!@<2R$E9&vRW3i+-&a~YgMD1sk`R%st3*4 zEgw>@Q_j*u)SA}D)RR{m&05}TZ{!&I$Di>f*bsy3m?H~2inh%?wx?v7(z50>LdMk8 z4KRPS1>q8E>mTuZ){}B|9TN&!U99KK4Y!Yj+Y5%S2kbnLn3X7V)A!7tH*jBe17Tp zI(&io`jAHXHqA*3qE<{kZhm1$p^<-`Q(m`6a(>t)!%#=xh~LU?MV6hD@_nV?F5j_z z^Q)#u-D{jY5niq5s2`)!wTYUsJMuLewURZr)X!@Q?$D0r+`6)_Y46!%dDn^$`7Eyf<-BMqjz`QPG1soqHA(*SLoZUfC(%n0Ywek2qx1+skUiush?KSR$X+uL#%z+)e`#I zu5q@?eiL)AkR^STo9xFgBkw1$dTVy2C#G)>Gyc%z-FUEYV<)}3b)5?5^+i>|(|e1D zcXlo+Sya8c_ky6eps_>UecW#BEEFZG3T`mguDYn|F0#+y4>eY?0JXl~Dm5~q^2Z>_qm8_3Pk zb(X7!n(ALSZCO_ul-XC?WY<4=`_`JF_;+zC5lvm8Ud@~q>`t9wC zPu*ofO+h-Z54EZ|wQquLnK$h7;q*JVyV;)-rY9r}OHWMc`%K5c8v%f1#HM%(JRO%2 z=p27zDuY7da#i$0$&R~YvF(} zPe*4MnZpBNSYs@ljzptiIJ_|mi^bv43t?y^$^?N#Ay61N3QsUGAs~^kFAqJUJoL$& z$6yj%ZEU{`2T2xsJ^}%kfItKV1sMlnj5$0O0)@xp5lA!wjfO)#;QWvP0W}yNz}Fvj z^3{(G$fxtzTmhRC02BJ9(l~(v3q3vIK;Ir;uFIeMZJ+@D7j_UuL@A1uB`;TkM7cAZYUBMS3<6815AzTpQ z3i3IDJUX~|12hx;@g~m~xPsr|{(>v0`?!v{Uym~5&+D7|rx*on=1(Rf)cn*83}*kt zOsE+(8;PmWr8bAC6UaP}D&X)a9F8AxG+e(Q#GrGSFg#)NJlFvYP7r^-IYQLrd*FQc z2HH>sAQ7@Og(FSi7$gOaCYYEmK%$}89^+xOn}`EPXa_N<0_qqSSU3_zf%XOxNkC)9 zdikNRs2>i4%?$Y^FW-BP@xh=Im>ixzRX}9>Q&}K_8^AJ0d~Y1nb0l;L4gq`tHGmE} z*bt!xV>X*Xz+f2+oEaK~o0;I~a4gmY1IN?N@X$6#F;R5T42fYdM{qbgjy3Qv9S{TA>LDG;|(98^O3gSSx321_Yo8fRYxG9E-Lz*!eAdT^Dh;iKf zZ76#-9}2pVF~JChh_9?4i-Dvu8eH?)P`*B$*W#eK_QLYtAqK%mlv zxsFH|MmfkZNBq$GeOlivznHPdS2%_>p zYZeq9zp{Hrz5Zw>>fRh7yfOH({~K0;Pu=j()__K1;LWfM6dXgtq2W}ji3yx)2GZa- z8j^vf;+R+_4hqBn+8T_c8DWmW5s;{_Y36@#8NP=w-G>^$0vSZa*DL$l@PBFL&}JyC z850BD5$I-AIEo3a9F57O!qFHS6@@ebK^%?#_4@wR-81eDLb7sSG9M>k1IYVVavzjo zsZb#c^7uq1kK+%ca=CtNI#rlQ5gP&+Un;?Gw;z~*0~>RX9OXX7$NylIGC&^tU&%0I zW=a2w3HE>Nn*VW5{k1aXALLZg((V7j&K$i*{#dGft+4)H+6XISsK&DyjZRzPo)X?- z|MN-)Dn_6q24PG-{90T7YC07$|6wnF@eWm!;>$}jGX@sRpdz925;|Rul$TUf8VZi5 z(U~Yy3?9ie87ZuUV~ue(-dLP}T49a?8OP1{(Y~(37~Eq@8S`&>i$Lc1ad?g#21tZz zhVh!m`24Ph{y614`nM?}-_?!;b689^Md3|N;b>#jST|$(jqB%Yk!=kf8ichlf6OF> z_kLl7kf^L5TfZux>TLX@z^|>{QNdGwE*y|BDUvuH9lmONJP#HRMpCCdg{?;}I z!-&pPSik!Pj@0KkG!l9sP{P+QreoEjre5Mr$Ern5zgxNoum!@UADN6u^B61P(Rnmh z+@P^QF#6xQwZ zB?3geD8VJ3kBC-+O9Y5`QG!c69}%qtmk1E?q6C+CJ|bEPE)gK&MF}qPd_=SoTp~ck zixOPo`G{yGxI}=67bUpF^AXWXaESmBFG_HU=Odz(;1U5MUX63<6OE5RiKM7$`$C7zFnR)R|e zh1Ht(mf6~)|BAK?W?XhX;^E7osTTF{&Svv&fa#t{aecCt0}03X-rkq zc9i{H33d9ZWogv5@@w+yK8h)xR`$oG4_~%*CPhBpv)Y>VBs}N*R0em$`>Hz|F=w(n z9eHwg%-7F9we(-^-wO_bF#XPgHNDS^t+;c4~A_sEQU8e*>dfX z{*zx+F@qvSTpO_C!Yjh+2ddz7orG;`qW+wdMVY!ih6tiAD^%>F3@+1JZ2K;0sO7WX zD!HRZ&z6$f62 znY=cqIa$s|2VD+_=O*5c?ceT-`YWVNu5|SQHL!W6l+_&TjFUSrU)Zo^A!)*_m6qXp$cQnse>{~v>YteS>Qk>`catJj zPvNfkbXV2Q{Ol32$U|x!S%2!0yg^edjW_v&SAyha=e*!~+C^Th4}Bi`W~0<{-v#Pf zZrkChGvDmrarYTr;7P$3EiXz+d)>sdcLfTY7xwp4Gza!9c2Ef*DW?MHU5n;NmYp83V z7fjP(U$W4N?N8r~JN{C4*eP*KkDX#s-%fqB3pOfeMz&Mz2j!3{l&zHeInGAqH_No( z19y+?IRfmEC*@fGK1A(!kUI6~3)WG`}&=?==JN9C~Jq!$}jUf5i0 z#1E`AsNC`5&*H3iO6tMs6ZXq`9!Rrx+R9y`ne@t3&up`NBG3sx-F9fb8F2<{`eCEi ztGC#L7bZLbp>9?zolLcgXr+C7V~g6$e7c-`BlnZm4pcQ%J(|evAIe5*>k%}$U1wu88acB02GWgF zR{pliK{fMoO{7Lwth&0KHb=(WC-}w*&7@C2x=hS)^d{r*RHC8U$}M4A;}ApuD82h; zdCH1um|LMLU0HB1Ya=P8LGGSZTVt7{dasnEduOC)INs4t�@e`gkM>cRv=hVs5<; zy{#KyXQWQ>(R7{-_uYmvDVg}XwYi}BbdvRlta4lJ{(vnePB|+-hTBeleQEZdMZVS9 bFSe)vHg6sR2Wfi3ED1O)UT%|5@{aru1gGS9 literal 0 HcmV?d00001 From 070d3ef3f4142c88af9e27b7e06a24872bea939e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 17:40:30 +0200 Subject: [PATCH 43/54] Added a map to Stargate --- cicaprojekt/Stargate.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/cicaprojekt/Stargate.java b/cicaprojekt/Stargate.java index f8e3952..9895cc0 100644 --- a/cicaprojekt/Stargate.java +++ b/cicaprojekt/Stargate.java @@ -1,5 +1,9 @@ package cicaprojekt; +import java.awt.*; +import java.util.HashMap; +import java.util.Map; + public class Stargate { public static final Stargate yellowStargate = new Stargate("Yellow Stargate"); public static final Stargate blueStargate = new Stargate("Blue Stargate"); @@ -10,6 +14,8 @@ public class Stargate { private Wall currentWall; private String name; + private static Map stargates = new HashMap<>(); + private Stargate(String name) { isSpawned = false; @@ -21,6 +27,15 @@ public class Stargate { blueStargate.other = yellowStargate; redStargate.other = greenStargate; greenStargate.other = redStargate; + + stargates.put(Color.YELLOW, yellowStargate); + stargates.put(Color.BLUE, blueStargate); + stargates.put(Color.RED, redStargate); + stargates.put(Color.GREEN, greenStargate); + } + + public static Stargate get(Color color) { + return stargates.get(color); } public Wall getCurrentWall() { From a7d6c604d8494215e621fdfa5c5d2332e395aeee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 17:41:25 +0200 Subject: [PATCH 44/54] Implemented Stargate shooting in Game --- cicaprojekt/Game.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 0d037ea..566230b 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -1,5 +1,6 @@ package cicaprojekt; +import java.awt.*; import java.io.File; import java.io.IOException; import java.util.Map; @@ -68,6 +69,13 @@ public class Game { jaffa.boxLift(); } + public void shootStargate(Color color) { + if(color == Color.YELLOW || color == Color.BLUE) + oneill.shootStargate(Stargate.get(color)); + else + jaffa.shootStargate(Stargate.get(color)); + } + public void updateDisplay() { } } From 1c4488d710544aa9556d2988f573aedf9584b07e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bokros=20B=C3=A1lint?= Date: Sat, 7 May 2016 17:44:20 +0200 Subject: [PATCH 45/54] Added keyboard input support for shooting stargates --- cicaprojekt/Control.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/cicaprojekt/Control.java b/cicaprojekt/Control.java index 8a5a34e..f97e35c 100644 --- a/cicaprojekt/Control.java +++ b/cicaprojekt/Control.java @@ -1,5 +1,6 @@ package cicaprojekt; +import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; @@ -42,6 +43,18 @@ public class Control { case 'U' : game.boxJaffa(); break; + case 'E' : + game.shootStargate(Color.YELLOW); + break; + case 'R' : + game.shootStargate(Color.BLUE); + break; + case 'O' : + game.shootStargate(Color.RED); + break; + case 'P' : + game.shootStargate(Color.GREEN); + break; } game.updateDisplay(); From 1f02ffc892352618908e6fbebddf77da9c92492f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 17:46:43 +0200 Subject: [PATCH 46/54] added Game reference to ApplicationFrame --- cicaprojekt/ApplicationFrame.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cicaprojekt/ApplicationFrame.java b/cicaprojekt/ApplicationFrame.java index 4d8f84c..62168ca 100644 --- a/cicaprojekt/ApplicationFrame.java +++ b/cicaprojekt/ApplicationFrame.java @@ -2,16 +2,15 @@ package cicaprojekt; import javax.swing.*; import javax.swing.filechooser.FileNameExtensionFilter; -import javax.swing.plaf.basic.BasicInternalFrameTitlePane; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.File; -import java.util.ArrayList; -import java.util.List; public class ApplicationFrame implements Runnable { + private Game game; + private JFrame jframe; private JPanel mapselectorpanel; @@ -20,7 +19,9 @@ public class ApplicationFrame implements Runnable private JList filelist; - public ApplicationFrame(){} + public ApplicationFrame(Game game){ + this.game = game; + } private class ListMouseHandler extends MouseAdapter{ @Override From 3d81dc6c65f4c8def67675c872a136249755cb02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 19:15:19 +0200 Subject: [PATCH 47/54] Dungeon.buildDungeon() now correctly sets Display up --- cicaprojekt/Dungeon.java | 12 +++++++++++- cicaprojekt/Game.java | 2 +- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/cicaprojekt/Dungeon.java b/cicaprojekt/Dungeon.java index fe9b061..2aacede 100644 --- a/cicaprojekt/Dungeon.java +++ b/cicaprojekt/Dungeon.java @@ -31,7 +31,7 @@ public class Dungeon { * S: Scale * X: Gap * R: Replicator */ - Map buildDungeon(File input) throws IOException + Map buildDungeon(File input, Display display) throws IOException { Tile defaultTile = new Field(); defaultTile.setX(-666); @@ -63,29 +63,35 @@ public class Dungeon { { case 'W': tile = new Wall(); + display.addVisual(new WallDrawer((Wall) tile)); break; case 'F': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); break; case 'Z': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); tile.setZPMOnTile(new ZPM()); break; case 'B': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); tile.putABox(new Box()); break; case 'O': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); oneilllocation = tile; break; case 'J': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); jaffalocation = tile; break; @@ -100,10 +106,12 @@ public class Dungeon { case 'X': tile = new Gap(); + display.addVisual(new GapDrawer((Gap) tile)); break; case 'R': tile = new Field(); + display.addVisual(new FieldDrawer((Field) tile)); replicatorlocation = tile; break; } @@ -125,10 +133,12 @@ public class Dungeon { int triggerweight = Integer.parseInt(scaledata[4]); Gate gate = new Gate(); + display.addVisual(new GateDrawer(gate)); gate.setY(gy); gate.setX(gx); Scale scale = new Scale(gate, triggerweight); + display.addVisual(new ScaleDrawer(scale)); scale.setY(sy); scale.setX(sx); diff --git a/cicaprojekt/Game.java b/cicaprojekt/Game.java index 566230b..2f82798 100644 --- a/cicaprojekt/Game.java +++ b/cicaprojekt/Game.java @@ -32,7 +32,7 @@ public class Game { public void startGame(File dungeonFile) throws IOException { Stargate.init(); - Map players = dungeon.buildDungeon(dungeonFile); + Map players = dungeon.buildDungeon(dungeonFile, display); oneill = new Player("O'Neill", players.get("oneill"), getRandomDirection()); jaffa = new Player("Jaffa", players.get("jaffa"), getRandomDirection()); replicator = new PlayerBase("Replicator", players.get("replicator"), getRandomDirection()); From 3a9c615b488cbbc0cbc1aefdb99bb8c6430cfd9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kjist=C3=B3f?= Date: Sat, 7 May 2016 19:17:14 +0200 Subject: [PATCH 48/54] fixed a bug, where Gates would not initialize (Dungeon.buildDungeon()) --- cicaprojekt/Dungeon.java | 1 + 1 file changed, 1 insertion(+) diff --git a/cicaprojekt/Dungeon.java b/cicaprojekt/Dungeon.java index 2aacede..69d1bae 100644 --- a/cicaprojekt/Dungeon.java +++ b/cicaprojekt/Dungeon.java @@ -142,6 +142,7 @@ public class Dungeon { scale.setY(sy); scale.setX(sx); + dungeon[gy][gx] = gate; dungeon[sy][sx] = scale; } From 3268268dc2d24e0d07473c53a75a7a71b27ce653 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 19:41:57 +0200 Subject: [PATCH 49/54] Drawers refactored. Imageloading is now in the Drawers instead of inheriting from ImagePanel. ImagePanel.java deleted. --- cicaprojekt/FieldDrawer.java | 21 +++++++++++++++++++-- cicaprojekt/GapDrawer.java | 16 ++++++++++++++-- cicaprojekt/GateDrawer.java | 21 +++++++++++++++++++-- cicaprojekt/ImagePanel.java | 29 ----------------------------- cicaprojekt/ScaleDrawer.java | 21 +++++++++++++++++++-- cicaprojekt/WallDrawer.java | 21 +++++++++++++++++++-- 6 files changed, 90 insertions(+), 39 deletions(-) delete mode 100644 cicaprojekt/ImagePanel.java diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java index 7d86b68..c7d54b4 100644 --- a/cicaprojekt/FieldDrawer.java +++ b/cicaprojekt/FieldDrawer.java @@ -1,13 +1,19 @@ package cicaprojekt; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; -public class FieldDrawer extends ImagePanel implements Drawer { +import javax.imageio.ImageIO; +import javax.swing.JPanel; +public class FieldDrawer extends JPanel implements Drawer { + private BufferedImage image; Field field; public FieldDrawer(Field f) throws IOException { - super("Field.png"); + image = ImageIO.read(new File("Field.png")); field = f; setVisible(false); } @@ -33,5 +39,16 @@ public class FieldDrawer extends ImagePanel implements Drawer { public int getY() { return field.getY(); } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } } diff --git a/cicaprojekt/GapDrawer.java b/cicaprojekt/GapDrawer.java index b5248a5..486a628 100644 --- a/cicaprojekt/GapDrawer.java +++ b/cicaprojekt/GapDrawer.java @@ -1,13 +1,19 @@ package cicaprojekt; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; -public class GapDrawer extends ImagePanel implements Drawer{ +import javax.imageio.ImageIO; +import javax.swing.JPanel; +public class GapDrawer extends JPanel implements Drawer{ + private BufferedImage image; private Gap gap; public GapDrawer(Gap g) throws IOException { - super("Gap.png"); + image = ImageIO.read(new File("Gap.png")); gap = g; setVisible(false); } @@ -27,4 +33,10 @@ public class GapDrawer extends ImagePanel implements Drawer{ return gap.getY(); } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } } diff --git a/cicaprojekt/GateDrawer.java b/cicaprojekt/GateDrawer.java index a841e26..f01a171 100644 --- a/cicaprojekt/GateDrawer.java +++ b/cicaprojekt/GateDrawer.java @@ -1,13 +1,19 @@ package cicaprojekt; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; -public class GateDrawer extends ImagePanel implements Drawer{ +import javax.imageio.ImageIO; +import javax.swing.JPanel; +public class GateDrawer extends JPanel implements Drawer{ + private BufferedImage image; Gate gate; public GateDrawer(Gate g) throws IOException { - super("ClosedGate.png"); + image = ImageIO.read(new File("ClosedGate.png")); gate = g; setVisible(false); } @@ -32,4 +38,15 @@ public class GateDrawer extends ImagePanel implements Drawer{ return gate.getY(); } + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } + } diff --git a/cicaprojekt/ImagePanel.java b/cicaprojekt/ImagePanel.java deleted file mode 100644 index 243a779..0000000 --- a/cicaprojekt/ImagePanel.java +++ /dev/null @@ -1,29 +0,0 @@ -package cicaprojekt; - -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -import javax.imageio.ImageIO; -import javax.swing.JPanel; - -public class ImagePanel extends JPanel{ - - private BufferedImage image; - - public ImagePanel(String path) throws IOException { - image = ImageIO.read(new File(path)); - } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } - - public void changeImage(String path) throws IOException { - image = ImageIO.read(new File(path)); - repaint(); - } -} \ No newline at end of file diff --git a/cicaprojekt/ScaleDrawer.java b/cicaprojekt/ScaleDrawer.java index d0d5244..ac18510 100644 --- a/cicaprojekt/ScaleDrawer.java +++ b/cicaprojekt/ScaleDrawer.java @@ -1,13 +1,19 @@ package cicaprojekt; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; -public class ScaleDrawer extends ImagePanel implements Drawer { +import javax.imageio.ImageIO; +import javax.swing.JPanel; +public class ScaleDrawer extends JPanel implements Drawer { + private BufferedImage image; Scale scale; public ScaleDrawer(Scale s) throws IOException { - super("Scale.png"); + image = ImageIO.read(new File("Scale.png")); scale = s; setVisible(false); } @@ -32,4 +38,15 @@ public class ScaleDrawer extends ImagePanel implements Drawer { return scale.getY(); } + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } + } diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 4e8ad7a..9864ed7 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -1,13 +1,19 @@ package cicaprojekt; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; import java.io.IOException; -public class WallDrawer extends ImagePanel implements Drawer { +import javax.imageio.ImageIO; +import javax.swing.JPanel; +public class WallDrawer extends JPanel implements Drawer { + private BufferedImage image; Wall wall; public WallDrawer(Wall w) throws IOException { - super("Wall.png"); + image = ImageIO.read(new File("Wall.png")); wall = w; setVisible(false); } @@ -45,5 +51,16 @@ public class WallDrawer extends ImagePanel implements Drawer { public int getY() { return wall.getY(); } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } + } From 0d31d8c79ba7cbb86e66198fe9394935e535cf7c Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 20:12:49 +0200 Subject: [PATCH 50/54] Revert "Drawers refactored. Imageloading is now in the Drawers instead of" This reverts commit 3268268dc2d24e0d07473c53a75a7a71b27ce653. --- cicaprojekt/FieldDrawer.java | 21 ++------------------- cicaprojekt/GapDrawer.java | 16 ++-------------- cicaprojekt/GateDrawer.java | 21 ++------------------- cicaprojekt/ImagePanel.java | 29 +++++++++++++++++++++++++++++ cicaprojekt/ScaleDrawer.java | 21 ++------------------- cicaprojekt/WallDrawer.java | 21 ++------------------- 6 files changed, 39 insertions(+), 90 deletions(-) create mode 100644 cicaprojekt/ImagePanel.java diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java index c7d54b4..7d86b68 100644 --- a/cicaprojekt/FieldDrawer.java +++ b/cicaprojekt/FieldDrawer.java @@ -1,19 +1,13 @@ package cicaprojekt; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; +public class FieldDrawer extends ImagePanel implements Drawer { -public class FieldDrawer extends JPanel implements Drawer { - private BufferedImage image; Field field; public FieldDrawer(Field f) throws IOException { - image = ImageIO.read(new File("Field.png")); + super("Field.png"); field = f; setVisible(false); } @@ -39,16 +33,5 @@ public class FieldDrawer extends JPanel implements Drawer { public int getY() { return field.getY(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } - - public void changeImage(String path) throws IOException { - image = ImageIO.read(new File(path)); - repaint(); - } } diff --git a/cicaprojekt/GapDrawer.java b/cicaprojekt/GapDrawer.java index 486a628..b5248a5 100644 --- a/cicaprojekt/GapDrawer.java +++ b/cicaprojekt/GapDrawer.java @@ -1,19 +1,13 @@ package cicaprojekt; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; +public class GapDrawer extends ImagePanel implements Drawer{ -public class GapDrawer extends JPanel implements Drawer{ - private BufferedImage image; private Gap gap; public GapDrawer(Gap g) throws IOException { - image = ImageIO.read(new File("Gap.png")); + super("Gap.png"); gap = g; setVisible(false); } @@ -33,10 +27,4 @@ public class GapDrawer extends JPanel implements Drawer{ return gap.getY(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } } diff --git a/cicaprojekt/GateDrawer.java b/cicaprojekt/GateDrawer.java index f01a171..a841e26 100644 --- a/cicaprojekt/GateDrawer.java +++ b/cicaprojekt/GateDrawer.java @@ -1,19 +1,13 @@ package cicaprojekt; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; +public class GateDrawer extends ImagePanel implements Drawer{ -public class GateDrawer extends JPanel implements Drawer{ - private BufferedImage image; Gate gate; public GateDrawer(Gate g) throws IOException { - image = ImageIO.read(new File("ClosedGate.png")); + super("ClosedGate.png"); gate = g; setVisible(false); } @@ -38,15 +32,4 @@ public class GateDrawer extends JPanel implements Drawer{ return gate.getY(); } - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } - - public void changeImage(String path) throws IOException { - image = ImageIO.read(new File(path)); - repaint(); - } - } diff --git a/cicaprojekt/ImagePanel.java b/cicaprojekt/ImagePanel.java new file mode 100644 index 0000000..243a779 --- /dev/null +++ b/cicaprojekt/ImagePanel.java @@ -0,0 +1,29 @@ +package cicaprojekt; + +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + +import javax.imageio.ImageIO; +import javax.swing.JPanel; + +public class ImagePanel extends JPanel{ + + private BufferedImage image; + + public ImagePanel(String path) throws IOException { + image = ImageIO.read(new File(path)); + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters + } + + public void changeImage(String path) throws IOException { + image = ImageIO.read(new File(path)); + repaint(); + } +} \ No newline at end of file diff --git a/cicaprojekt/ScaleDrawer.java b/cicaprojekt/ScaleDrawer.java index ac18510..d0d5244 100644 --- a/cicaprojekt/ScaleDrawer.java +++ b/cicaprojekt/ScaleDrawer.java @@ -1,19 +1,13 @@ package cicaprojekt; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; +public class ScaleDrawer extends ImagePanel implements Drawer { -public class ScaleDrawer extends JPanel implements Drawer { - private BufferedImage image; Scale scale; public ScaleDrawer(Scale s) throws IOException { - image = ImageIO.read(new File("Scale.png")); + super("Scale.png"); scale = s; setVisible(false); } @@ -38,15 +32,4 @@ public class ScaleDrawer extends JPanel implements Drawer { return scale.getY(); } - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } - - public void changeImage(String path) throws IOException { - image = ImageIO.read(new File(path)); - repaint(); - } - } diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 9864ed7..4e8ad7a 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -1,19 +1,13 @@ package cicaprojekt; -import java.awt.Graphics; -import java.awt.image.BufferedImage; -import java.io.File; import java.io.IOException; -import javax.imageio.ImageIO; -import javax.swing.JPanel; +public class WallDrawer extends ImagePanel implements Drawer { -public class WallDrawer extends JPanel implements Drawer { - private BufferedImage image; Wall wall; public WallDrawer(Wall w) throws IOException { - image = ImageIO.read(new File("Wall.png")); + super("Wall.png"); wall = w; setVisible(false); } @@ -51,16 +45,5 @@ public class WallDrawer extends JPanel implements Drawer { public int getY() { return wall.getY(); } - - @Override - protected void paintComponent(Graphics g) { - super.paintComponent(g); - g.drawImage(image, 0, 0, null); // see javadoc for more info on the parameters - } - public void changeImage(String path) throws IOException { - image = ImageIO.read(new File(path)); - repaint(); - } - } From c854a1ed3753005ab4210f3fbbc73e722379e8a7 Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 20:15:08 +0200 Subject: [PATCH 51/54] Drawers fixed from Babylonian errors (JComponent also has getX, getY). --- cicaprojekt/Drawer.java | 4 ++-- cicaprojekt/FieldDrawer.java | 4 ++-- cicaprojekt/GapDrawer.java | 4 ++-- cicaprojekt/GateDrawer.java | 4 ++-- cicaprojekt/ScaleDrawer.java | 4 ++-- cicaprojekt/WallDrawer.java | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/cicaprojekt/Drawer.java b/cicaprojekt/Drawer.java index 1c6ca3b..950e989 100644 --- a/cicaprojekt/Drawer.java +++ b/cicaprojekt/Drawer.java @@ -5,6 +5,6 @@ import java.io.IOException; public interface Drawer { public void draw() throws IOException; - public int getX(); - public int getY(); + public int getTileX(); + public int getTileY(); } diff --git a/cicaprojekt/FieldDrawer.java b/cicaprojekt/FieldDrawer.java index 7d86b68..c00b26e 100644 --- a/cicaprojekt/FieldDrawer.java +++ b/cicaprojekt/FieldDrawer.java @@ -25,12 +25,12 @@ public class FieldDrawer extends ImagePanel implements Drawer { } @Override - public int getX() { + public int getTileX() { return field.getX(); } @Override - public int getY() { + public int getTileY() { return field.getY(); } diff --git a/cicaprojekt/GapDrawer.java b/cicaprojekt/GapDrawer.java index b5248a5..9676fd0 100644 --- a/cicaprojekt/GapDrawer.java +++ b/cicaprojekt/GapDrawer.java @@ -18,12 +18,12 @@ public class GapDrawer extends ImagePanel implements Drawer{ } @Override - public int getX() { + public int getTileX() { return gap.getX(); } @Override - public int getY() { + public int getTileY() { return gap.getY(); } diff --git a/cicaprojekt/GateDrawer.java b/cicaprojekt/GateDrawer.java index a841e26..cb45d0e 100644 --- a/cicaprojekt/GateDrawer.java +++ b/cicaprojekt/GateDrawer.java @@ -23,12 +23,12 @@ public class GateDrawer extends ImagePanel implements Drawer{ } @Override - public int getX() { + public int getTileX() { return gate.getX(); } @Override - public int getY() { + public int getTileY() { return gate.getY(); } diff --git a/cicaprojekt/ScaleDrawer.java b/cicaprojekt/ScaleDrawer.java index d0d5244..a11edf1 100644 --- a/cicaprojekt/ScaleDrawer.java +++ b/cicaprojekt/ScaleDrawer.java @@ -23,12 +23,12 @@ public class ScaleDrawer extends ImagePanel implements Drawer { } @Override - public int getX() { + public int getTileX() { return scale.getX(); } @Override - public int getY() { + public int getTileY() { return scale.getY(); } diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 4e8ad7a..4eeeeb0 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -37,12 +37,12 @@ public class WallDrawer extends ImagePanel implements Drawer { } @Override - public int getX() { + public int getTileX() { return wall.getX(); } @Override - public int getY() { + public int getTileY() { return wall.getY(); } From 25fd8189d2b6097951ca8868de40a4c2835ba80d Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 22:19:55 +0200 Subject: [PATCH 52/54] PlayerDrawer.java added. --- cicaprojekt/PlayerDrawer.java | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 cicaprojekt/PlayerDrawer.java diff --git a/cicaprojekt/PlayerDrawer.java b/cicaprojekt/PlayerDrawer.java new file mode 100644 index 0000000..e88da0a --- /dev/null +++ b/cicaprojekt/PlayerDrawer.java @@ -0,0 +1,67 @@ +package cicaprojekt; + +import java.io.IOException; + +public class PlayerDrawer extends ImagePanel implements Drawer { + Player player; + + public PlayerDrawer(Player p) throws IOException { + super("ONeill.png"); + player = p; + setVisible(false); + } + + @Override + public void draw() throws IOException { + + //TODO Pictures for different facing directions. + switch(player.name){ + case "O'Neill": + switch(player.facingDirection){ + case NORTH: + changeImage("ONeill.png"); + break; + case EAST: + changeImage("ONeill.png"); + break; + case SOUTH: + changeImage("ONeill.png"); + break; + default: + changeImage("ONeill.png"); + break; + } + break; + + default: + switch(player.facingDirection){ + case NORTH: + changeImage("Jaffa.png"); + break; + case EAST: + changeImage("Jaffa.png"); + break; + case SOUTH: + changeImage("Jaffa.png"); + break; + default: + changeImage("Jaffa.png"); + break; + } + break; + } + + setVisible(true); + } + + @Override + public int getTileX() { + return player.getCurrentTile().getX(); + } + + @Override + public int getTileY() { + return player.getCurrentTile().getY(); + } + +} From e63a62893e329eb9b4be89931acf2581bebde78d Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 22:27:16 +0200 Subject: [PATCH 53/54] PlayerBaseDrawer.java added. --- cicaprojekt/PlayerBaseDrawer.java | 49 +++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 cicaprojekt/PlayerBaseDrawer.java diff --git a/cicaprojekt/PlayerBaseDrawer.java b/cicaprojekt/PlayerBaseDrawer.java new file mode 100644 index 0000000..6a616b0 --- /dev/null +++ b/cicaprojekt/PlayerBaseDrawer.java @@ -0,0 +1,49 @@ +package cicaprojekt; + +import java.io.IOException; + +public class PlayerBaseDrawer extends ImagePanel implements Drawer { + PlayerBase playerbase; + + public PlayerBaseDrawer(PlayerBase pb) throws IOException { + super("Replicator.png"); + playerbase = pb; + setVisible(false); + } + + @Override + public void draw() throws IOException { + + //TODO Pictures for different facing directions. + switch(playerbase.name){ + case "Replicator": + switch(playerbase.facingDirection){ + case NORTH: + changeImage("ONeill.png"); + break; + case EAST: + changeImage("ONeill.png"); + break; + case SOUTH: + changeImage("ONeill.png"); + break; + default: + changeImage("ONeill.png"); + break; + } + } + + setVisible(true); + } + + @Override + public int getTileX() { + return playerbase.currentTile.getX(); + } + + @Override + public int getTileY() { + return playerbase.currentTile.getY(); + } + +} From f241695413b3fa69b1bd36a395414c5fe889a9bc Mon Sep 17 00:00:00 2001 From: ericnerdo Date: Sat, 7 May 2016 23:24:51 +0200 Subject: [PATCH 54/54] WallDrawer.java fixed. Looks like asking a null reference's name is not a good idea. --- cicaprojekt/WallDrawer.java | 43 ++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/cicaprojekt/WallDrawer.java b/cicaprojekt/WallDrawer.java index 4eeeeb0..cf4a8bd 100644 --- a/cicaprojekt/WallDrawer.java +++ b/cicaprojekt/WallDrawer.java @@ -14,26 +14,29 @@ public class WallDrawer extends ImagePanel implements Drawer { @Override public void draw() throws IOException { - switch(wall.getStargate().getName()){ - case "Blue Stargate": - changeImage("BlueStargate.png"); - break; - case "Yellow Stargate": - changeImage("YellowStargate.png"); - break; - case "Red Stargate": - changeImage("RedStargate.png"); - break; - case "GreenStargate": - changeImage("GreenStargate.png"); - break; - default: - changeImage("Wall.png"); - break; - } - - setVisible(true); - + if(wall.getStargate() == null) + changeImage("Wall.png"); + else{ + switch(wall.getStargate().getName()){ + case "Blue Stargate": + changeImage("BlueStargate.png"); + break; + case "Yellow Stargate": + changeImage("YellowStargate.png"); + break; + case "Red Stargate": + changeImage("RedStargate.png"); + break; + case "Green Stargate": + changeImage("GreenStargate.png"); + break; + default: + changeImage("Wall.png"); + break; + } + } + + setVisible(true); } @Override