From 3bc978ed3a30bf3bbac87969158ba183df0da3a7 Mon Sep 17 00:00:00 2001 From: Rob Date: Sun, 11 Sep 2016 11:25:08 -0500 Subject: [PATCH] Committing historical code from 2001 with minor tweaks to make function in maven. --- .gitignore | 4 + doc/current/GamePlay.png | Bin 0 -> 67933 bytes doc/original/Bomb.gif | Bin 0 -> 941 bytes doc/original/Exit.gif | Bin 0 -> 895 bytes doc/original/GameScreen.gif | Bin 0 -> 10272 bytes doc/original/HelpScreen.gif | Bin 0 -> 5377 bytes doc/original/Mine.gif | Bin 0 -> 889 bytes doc/original/Mouse.gif | Bin 0 -> 914 bytes doc/original/MouseMaze.dsk | Bin 0 -> 143360 bytes doc/original/Robot.gif | Bin 0 -> 924 bytes doc/original/Skull.gif | Bin 0 -> 941 bytes doc/original/WinningScreen.gif | Bin 0 -> 5795 bytes pom.xml | 46 ++ .../mousemaze2001/GameSettingsPanel.java | 308 ++++++++ .../games/mousemaze2001/IntroPanel.java | 325 ++++++++ .../games/mousemaze2001/MazeGridPanel.java | 138 ++++ .../games/mousemaze2001/MouseLivesPanel.java | 42 + .../games/mousemaze2001/MouseMaze2001.java | 535 +++++++++++++ .../mousemaze2001/WindowCloseAdapter.java | 38 + .../mousemaze2001/domain/DomainEvent.java | 41 + .../mousemaze2001/domain/DomainListener.java | 18 + .../mousemaze2001/domain/GameSettings.java | 439 +++++++++++ .../mousemaze2001/domain/MazeDomain.java | 735 ++++++++++++++++++ .../mousemaze2001/images/ImageCanvas.java | 40 + .../mousemaze2001/images/ImageManager.java | 137 ++++ .../mazeobjects/AnimatedBomb.java | 41 + .../mazeobjects/AnimatedMazeImageObject.java | 70 ++ .../mazeobjects/AnimatedMouse.java | 41 + .../AnimatedMouseMazeImageObject.java | 31 + .../mazeobjects/AnimatedRobot.java | 192 +++++ .../mazeobjects/ColoredMazeObject.java | 42 + .../games/mousemaze2001/mazeobjects/Exit.java | 52 ++ .../mousemaze2001/mazeobjects/GreenTile.java | 27 + .../mazeobjects/InvertedMouse.java | 39 + .../mazeobjects/MazeImageObject.java | 72 ++ .../mousemaze2001/mazeobjects/MazeObject.java | 89 +++ .../games/mousemaze2001/mazeobjects/Mine.java | 36 + .../mousemaze2001/mazeobjects/PurpleTile.java | 29 + .../threads/AnimationThread.java | 39 + .../threads/BombExplosionThread.java | 58 ++ .../threads/ControlledThread.java | 169 ++++ .../threads/ExplosionThread.java | 55 ++ .../threads/GameDelayThread.java | 53 ++ .../mousemaze2001/threads/GameThread.java | 32 + .../mousemaze2001/threads/IntroThread.java | 32 + .../threads/LevelTranslationThread.java | 68 ++ .../mousemaze2001/threads/RepaintThread.java | 98 +++ src/main/resources/images/CancelButton.gif | Bin 0 -> 1397 bytes src/main/resources/images/DefaultButton.gif | Bin 0 -> 1320 bytes src/main/resources/images/EasyButton.gif | Bin 0 -> 1170 bytes src/main/resources/images/HardButton.gif | Bin 0 -> 1151 bytes .../resources/images/ImageManager.properties | 52 ++ src/main/resources/images/InvertedMouse.gif | Bin 0 -> 914 bytes src/main/resources/images/MouseMazeLogo.gif | Bin 0 -> 4898 bytes src/main/resources/images/OkButton.gif | Bin 0 -> 1124 bytes src/main/resources/images/OriginalBomb.gif | Bin 0 -> 941 bytes src/main/resources/images/OriginalBomb0.gif | Bin 0 -> 941 bytes src/main/resources/images/OriginalBomb1.gif | Bin 0 -> 947 bytes src/main/resources/images/OriginalBomb2.gif | Bin 0 -> 956 bytes src/main/resources/images/OriginalBomb3.gif | Bin 0 -> 950 bytes src/main/resources/images/OriginalExit.gif | Bin 0 -> 895 bytes src/main/resources/images/OriginalMine.gif | Bin 0 -> 889 bytes src/main/resources/images/OriginalMouse.gif | Bin 0 -> 914 bytes src/main/resources/images/OriginalMouse0.gif | Bin 0 -> 914 bytes src/main/resources/images/OriginalMouse1.gif | Bin 0 -> 910 bytes src/main/resources/images/OriginalMouse2.gif | Bin 0 -> 911 bytes src/main/resources/images/OriginalMouse3.gif | Bin 0 -> 909 bytes src/main/resources/images/OriginalMouse4.gif | Bin 0 -> 913 bytes .../images/OriginalMouseMazeGameShot.gif | Bin 0 -> 10272 bytes .../images/OriginalMouseMazeHelp.gif | Bin 0 -> 5377 bytes .../images/OriginalMouseMazeLogo.gif | Bin 0 -> 1843 bytes .../resources/images/OriginalMouseMazeWin.gif | Bin 0 -> 5795 bytes src/main/resources/images/OriginalPlayer.gif | Bin 0 -> 903 bytes src/main/resources/images/OriginalRobot.gif | Bin 0 -> 924 bytes src/main/resources/images/OriginalRobot0.gif | Bin 0 -> 926 bytes .../images/OriginalRobot0shield1.gif | Bin 0 -> 979 bytes .../images/OriginalRobot0shield2.gif | Bin 0 -> 979 bytes src/main/resources/images/OriginalRobot1.gif | Bin 0 -> 931 bytes .../images/OriginalRobot1shield1.gif | Bin 0 -> 979 bytes .../images/OriginalRobot1shield2.gif | Bin 0 -> 979 bytes src/main/resources/images/OriginalRobot2.gif | Bin 0 -> 933 bytes .../images/OriginalRobot2shield1.gif | Bin 0 -> 979 bytes .../images/OriginalRobot2shield2.gif | Bin 0 -> 979 bytes src/main/resources/images/OriginalRobot3.gif | Bin 0 -> 927 bytes .../images/OriginalRobot3shield1.gif | Bin 0 -> 976 bytes .../images/OriginalRobot3shield2.gif | Bin 0 -> 976 bytes src/main/resources/images/OriginalSkull.gif | Bin 0 -> 941 bytes .../resources/images/PreferencesButton.gif | Bin 0 -> 1719 bytes src/main/resources/images/QuitButton.gif | Bin 0 -> 1215 bytes src/main/resources/images/StartButton.gif | Bin 0 -> 1321 bytes src/main/resources/images/robot.gif | Bin 0 -> 6383 bytes .../resources/settings/default.properties | 14 + src/main/resources/settings/easy.properties | 14 + src/main/resources/settings/hard.properties | 14 + src/main/resources/sounds/boing.wav | Bin 0 -> 2806 bytes src/main/resources/sounds/clickfast.wav | Bin 0 -> 124 bytes src/main/resources/sounds/explode.wav | Bin 0 -> 23114 bytes src/main/resources/sounds/explosion.wav | Bin 0 -> 14132 bytes src/main/resources/sounds/explosion2.wav | Bin 0 -> 22128 bytes 99 files changed, 4305 insertions(+) create mode 100644 .gitignore create mode 100644 doc/current/GamePlay.png create mode 100644 doc/original/Bomb.gif create mode 100644 doc/original/Exit.gif create mode 100644 doc/original/GameScreen.gif create mode 100644 doc/original/HelpScreen.gif create mode 100644 doc/original/Mine.gif create mode 100644 doc/original/Mouse.gif create mode 100644 doc/original/MouseMaze.dsk create mode 100644 doc/original/Robot.gif create mode 100644 doc/original/Skull.gif create mode 100644 doc/original/WinningScreen.gif create mode 100644 pom.xml create mode 100644 src/main/java/a2geek/games/mousemaze2001/GameSettingsPanel.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/IntroPanel.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/MazeGridPanel.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/MouseLivesPanel.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/MouseMaze2001.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/WindowCloseAdapter.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/domain/DomainEvent.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/domain/DomainListener.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/domain/GameSettings.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/domain/MazeDomain.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/images/ImageCanvas.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/images/ImageManager.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedBomb.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMazeImageObject.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMouse.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMouseMazeImageObject.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedRobot.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/ColoredMazeObject.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/Exit.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/GreenTile.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/InvertedMouse.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeImageObject.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeObject.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/Mine.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/mazeobjects/PurpleTile.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/AnimationThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/BombExplosionThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/ControlledThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/ExplosionThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/GameDelayThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/GameThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/IntroThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/LevelTranslationThread.java create mode 100644 src/main/java/a2geek/games/mousemaze2001/threads/RepaintThread.java create mode 100644 src/main/resources/images/CancelButton.gif create mode 100644 src/main/resources/images/DefaultButton.gif create mode 100644 src/main/resources/images/EasyButton.gif create mode 100644 src/main/resources/images/HardButton.gif create mode 100644 src/main/resources/images/ImageManager.properties create mode 100644 src/main/resources/images/InvertedMouse.gif create mode 100644 src/main/resources/images/MouseMazeLogo.gif create mode 100644 src/main/resources/images/OkButton.gif create mode 100644 src/main/resources/images/OriginalBomb.gif create mode 100644 src/main/resources/images/OriginalBomb0.gif create mode 100644 src/main/resources/images/OriginalBomb1.gif create mode 100644 src/main/resources/images/OriginalBomb2.gif create mode 100644 src/main/resources/images/OriginalBomb3.gif create mode 100644 src/main/resources/images/OriginalExit.gif create mode 100644 src/main/resources/images/OriginalMine.gif create mode 100644 src/main/resources/images/OriginalMouse.gif create mode 100644 src/main/resources/images/OriginalMouse0.gif create mode 100644 src/main/resources/images/OriginalMouse1.gif create mode 100644 src/main/resources/images/OriginalMouse2.gif create mode 100644 src/main/resources/images/OriginalMouse3.gif create mode 100644 src/main/resources/images/OriginalMouse4.gif create mode 100644 src/main/resources/images/OriginalMouseMazeGameShot.gif create mode 100644 src/main/resources/images/OriginalMouseMazeHelp.gif create mode 100644 src/main/resources/images/OriginalMouseMazeLogo.gif create mode 100644 src/main/resources/images/OriginalMouseMazeWin.gif create mode 100644 src/main/resources/images/OriginalPlayer.gif create mode 100644 src/main/resources/images/OriginalRobot.gif create mode 100644 src/main/resources/images/OriginalRobot0.gif create mode 100644 src/main/resources/images/OriginalRobot0shield1.gif create mode 100644 src/main/resources/images/OriginalRobot0shield2.gif create mode 100644 src/main/resources/images/OriginalRobot1.gif create mode 100644 src/main/resources/images/OriginalRobot1shield1.gif create mode 100644 src/main/resources/images/OriginalRobot1shield2.gif create mode 100644 src/main/resources/images/OriginalRobot2.gif create mode 100644 src/main/resources/images/OriginalRobot2shield1.gif create mode 100644 src/main/resources/images/OriginalRobot2shield2.gif create mode 100644 src/main/resources/images/OriginalRobot3.gif create mode 100644 src/main/resources/images/OriginalRobot3shield1.gif create mode 100644 src/main/resources/images/OriginalRobot3shield2.gif create mode 100644 src/main/resources/images/OriginalSkull.gif create mode 100644 src/main/resources/images/PreferencesButton.gif create mode 100644 src/main/resources/images/QuitButton.gif create mode 100644 src/main/resources/images/StartButton.gif create mode 100644 src/main/resources/images/robot.gif create mode 100644 src/main/resources/settings/default.properties create mode 100644 src/main/resources/settings/easy.properties create mode 100644 src/main/resources/settings/hard.properties create mode 100644 src/main/resources/sounds/boing.wav create mode 100644 src/main/resources/sounds/clickfast.wav create mode 100644 src/main/resources/sounds/explode.wav create mode 100644 src/main/resources/sounds/explosion.wav create mode 100644 src/main/resources/sounds/explosion2.wav diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d98981c --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target/ +/.classpath +/.project +/.settings/ diff --git a/doc/current/GamePlay.png b/doc/current/GamePlay.png new file mode 100644 index 0000000000000000000000000000000000000000..0fee0e047e84e89bf68dfe9357cd62ddf9867afa GIT binary patch literal 67933 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 aIlGH5QRAgopPvGL9?PjbDtc)0`u_nFb}Rk> literal 0 HcmV?d00001 diff --git a/doc/original/Bomb.gif b/doc/original/Bomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5abb4c3b9ee402f5b6cd028954a22dd2f7cccbe GIT binary patch literal 941 zcmX9-PYB<07=EzwJB(V&Y11pphL8!d^t8qp2|2CdwH>g7+QDhcBNtY4Va3TyN(yO< z%Pz09$ZZEFe{w+0NvTPx*YnBe@a@~@`@YY=_xJ}@fPg^&L4*(k z-;toeK>|snkh2O!NYJ2wB1))115LEhgE1H}!b}(v3@9)Wh+u>wCd@+y6`V*!GE$Kf zGCxBKO%$RSrKpKUG@}(gVWqQjS=1KZ@%I>B8LeknPLuQPrep4EU?HD zYuI3uE%wmv4KU(N+Pb@;#AG0Y8OoS+9)_fnlZi}bDsxiK$y7>B7P6S7tjR_;vz0yR zL@jERFDv%zl>4CDe5=jS=18I$vp>Q9(tORHKHPYNva?&egYl9j5Q5=xH5s8fY1R;g;LQO#;qPkHhV&-^p(u{$}FV>-~m z4s}d>7aXS*aXQh-PIXQTEiRdwE_AU=UDJ(jcB^~Z+vI`R)67~Wa2di{Chv_`#2c{o zi(D?bhU9rTdMCS@}D}Fxo&Y52xJ$3t2AN+e^_fEaJ@BWMXjz0O(`S{`kwDP7Dk2gBF(DB|Se4#uVwKkkMg-|JN+>xJqfQm7Sf#3|Mm4KdJ>|(eJoC@A$L{1zj_E)LJJd1l zU2vRM#OXvQJJmTYw76tyy3oZgbxk+A*{$wrZ<7aNPcv(kz-0()nY=e%5pTfSFLJr$ z8j|PX=$-6ZI&oRoGH;)@WW^S0O{O=xLEZ0Cziocpjdi|RkM⪻}YhxueWyU>5Yy3 z$1nY}bNBhJy@${Jwe|Sk%U{3z{>qzU`}Ftk2fn+$`{%0K0p5czkly--ad5t$shMG+}yPbr#=B!EQ5Cd literal 0 HcmV?d00001 diff --git a/doc/original/GameScreen.gif b/doc/original/GameScreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe1585fdae526ab80cbe12dde212e43596527ac8 GIT binary patch literal 10272 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 literal 0 HcmV?d00001 diff --git a/doc/original/Mouse.gif b/doc/original/Mouse.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fbaa655b130a656f3327bd7642638de4e27d7a0 GIT binary patch literal 914 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 literal 0 HcmV?d00001 diff --git a/doc/original/Skull.gif b/doc/original/Skull.gif new file mode 100644 index 0000000000000000000000000000000000000000..52d2b4cc9855f6b080bd7e90de38349c2a4db0cf GIT binary patch literal 941 zcmX9-J;;z{6g_x^L<>C_gApUlgdxFz0uzArPO30i&@H=Y-BTA z*^^GxqDDE+2usll)PCSN?A*reXUSYbT?f+`(G9NimDU**R8&bdYN)A}dgLkDsB34+ zBeF{uVk%I<3RO&bZno}jP9-W?smdv#s-_y%tXB1uC-3mgKhqw&lQTJ{ z10C#8$Fz6Baas|l6P@f-=d{q`lBwxJ7rWFo-RNewx~IKO9*8~7tW^S+A*^Nc-grg4 z0c*d=<&tYio`<7%vTNzYWnIg>ecF;0Tc|ae-slE(zf1l0$Uob#&hGVC{{%Kq;;zky z_g|@-?`_`u=*!<<`SRNn_iX?7%>Jue-+h4HN6&Bmwe`%$JD%Qo-^Dl1KKs!_FMf9H zt6$Fj@b29Q9ytBsCwF*e?@QmjaQ)i3A5ZPu_4SUEZ~k%ci#>Zb_TBjT^+RWOefs;W zm#&`w_0+b@*G^x$|Kh>VkKBCc{U?vV_S=cWKONqF`S_h%7q;GhZ100_{dxO3Ha76o Ee|)x^V*mgE literal 0 HcmV?d00001 diff --git a/doc/original/WinningScreen.gif b/doc/original/WinningScreen.gif new file mode 100644 index 0000000000000000000000000000000000000000..db3a427be97a1c0fed8b7d59d380dc18be4ff635 GIT binary patch literal 5795 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 RYz)e844Z9SIeP|>{U7q#iNXK? literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..57b2ba7 --- /dev/null +++ b/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + a2geek.games + mouse-maze-2001 + 1.9.0-FINAL + Mouse Maze 2001 + A recreation of a game developed in 1983. + + + 1.8 + 1.8 + 2.4.3 + + + + + + org.apache.maven.plugins + maven-shade-plugin + ${maven.shade.version} + + + package + + shade + + + + + + a2geek.games.mousemaze2001.MouseMaze2001 + Mouse Maze 2001 + ${project.version} + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/GameSettingsPanel.java b/src/main/java/a2geek/games/mousemaze2001/GameSettingsPanel.java new file mode 100644 index 0000000..776e86e --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/GameSettingsPanel.java @@ -0,0 +1,308 @@ +package a2geek.games.mousemaze2001; +import java.util.*; +import javax.swing.border.*; + +import a2geek.games.mousemaze2001.domain.*; +import a2geek.games.mousemaze2001.images.ImageManager; + +import java.awt.*; +import javax.swing.*; + +import java.awt.event.*; + +/** + * Provides the panel used for game settings. + * + * Creation date: (10/27/01 7:32:59 PM) + * @author: Rob Greene + * @version: RJG 10/29/2001 22:40:54 + */ +public class GameSettingsPanel extends JPanel implements ActionListener { + private static final String HARD = "hard"; + private static final String EASY = "easy"; + private static final String DEFAULT = "default"; + + private JSlider bombsPerLevel; + private JSlider robotRange; + private JSlider robotShotFrequency; + private JSlider robotMineFrequency; + private JCheckBox mouseShoots; + private JCheckBox robotShotDistanceFixed; + private JCheckBox animatedImages; + private JCheckBox unlimitedLevels; + private JCheckBox unlimitedLives; + private JCheckBox shieldedRobots; + + private GameSettings easySettings; + private GameSettings hardSettings; + private GameSettings defaultSettings; + private GameSettings currentSettings; + +/** + * GameSettingsPanel constructor comment. + */ +public GameSettingsPanel() { + super(); + initializeSettings(); + initializeComponents(); + copyFromCurrentSettings(); +} + + +/** + * Handle action events from buttons. + * + * Creation date: (10/27/01 7:45:27 PM) + */ +public void actionPerformed(ActionEvent actionEvent) { + String command = actionEvent.getActionCommand(); + if (command != null) { + if (DEFAULT.equals(command)) { + currentSettings = new GameSettings(defaultSettings); + } else if (EASY.equals(command)) { + currentSettings = new GameSettings(easySettings); + } else if (HARD.equals(command)) { + currentSettings = new GameSettings(hardSettings); + } + copyFromCurrentSettings(); + } +} + + +/** + * Copy the current settings values to the screen components. + * + * Creation date: (10/27/01 11:38:39 PM) + */ +public void copyFromCurrentSettings() { + bombsPerLevel.setMaximum(currentSettings.getMaxBombsPerLevel()); + bombsPerLevel.setValue(currentSettings.getBombsPerLevel()); + robotRange.setMaximum(currentSettings.getMaxRobotShotRange()); + robotRange.setValue(currentSettings.getRobotShotRange()); + robotShotDistanceFixed.setSelected(currentSettings.isFixedRobotShotRange()); + robotShotFrequency.setValue(currentSettings.getRobotShootFrequency()); + robotMineFrequency.setValue(currentSettings.getRobotMineFrequency()); + mouseShoots.setSelected(currentSettings.isShootingMouse()); + animatedImages.setSelected(currentSettings.isAnimatedImages()); + unlimitedLevels.setSelected(currentSettings.isUnlimitedGameLevels()); + unlimitedLives.setSelected(currentSettings.isUnlimitedLives()); + shieldedRobots.setSelected(currentSettings.isShieldedRobots()); + repaint(); +} + + +/** + * Copy the current settings values from the screen components. + * + * Creation date: (10/27/01 11:38:39 PM) + */ +public void copyToCurrentSettings() { + currentSettings.setBombsPerLevel(bombsPerLevel.getValue()); + currentSettings.setRobotShotRange(robotRange.getValue()); + currentSettings.setFixedRobotShotRange(robotShotDistanceFixed.isSelected()); + currentSettings.setRobotShootFrequency(robotShotFrequency.getValue()); + currentSettings.setRobotMineFrequency(robotMineFrequency.getValue()); + currentSettings.setShootingMouse(mouseShoots.isSelected()); + currentSettings.setAnimatedImages(animatedImages.isSelected()); + currentSettings.setUnlimitedGameLevels(unlimitedLevels.isSelected()); + currentSettings.setUnlimitedLives(unlimitedLives.isSelected()); + currentSettings.setShieldedRobots(shieldedRobots.isSelected()); +} + + +/** + * Create a bordered panel. + * + * Creation date: (10/27/01 8:35:30 PM) + */ +protected JPanel createBorderedPanel(String title) { + return createBorderedPanel(title, BoxLayout.Y_AXIS); +} + + +/** + * Create a bordered panel. + * + * Creation date: (10/27/01 8:35:30 PM) + */ +protected JPanel createBorderedPanel(String title, int axis) { + JPanel thePanel = new JPanel(); + thePanel.setLayout(new BoxLayout(thePanel, axis)); + TitledBorder titledBorder = new TitledBorder(title); + titledBorder.setTitleColor(Color.black); + thePanel.setBorder(titledBorder); + return thePanel; +} + + +/** + * Create a standard image button. + * + * Creation date: (10/27/01 3:05:07 PM) + */ +protected JButton createImageButton(String resourceName, String commandString) { + return createImageButton(resourceName, commandString, this); +} + + +/** + * Create a standard image button. + * + * Creation date: (10/27/01 3:05:07 PM) + */ +protected JButton createImageButton(String resourceName, String commandString, ActionListener actionListener) { + JButton button = new JButton(new ImageIcon(ImageManager.getInstance().getImage(resourceName))); + button.setActionCommand(commandString); + button.addActionListener(actionListener); + return button; +} + + +/** + * Create a slider panel. + * + * Creation date: (10/27/01 8:38:48 PM) + */ +protected JSlider createSlider(int minimumValue, int maximumValue, int currentValue) { + JSlider theSlider = new JSlider(minimumValue, maximumValue, currentValue); + if (maximumValue >= 100) { + theSlider.setMinorTickSpacing(1); + theSlider.setMajorTickSpacing(10); + } else { + theSlider.setMajorTickSpacing(1); + } + theSlider.setPaintTicks(true); + theSlider.setPaintLabels(true); + theSlider.setSnapToTicks(true); + theSlider.setForeground(Color.black); + // change the foreground color of all labels (numbers) + Dictionary table = theSlider.getLabelTable(); + Enumeration e = table.elements(); + while (e.hasMoreElements()) { + JLabel label = (JLabel) e.nextElement(); + label.setForeground(Color.black); + } + + return theSlider; +} + + +/** + * Retrieve the current game settings. + * + * Creation date: (10/28/01 1:23:58 PM) + */ +public GameSettings getCurrentSettings() { + copyToCurrentSettings(); + return currentSettings; +} + + +/** + * Initialize the graphical components. + * + * Creation date: (10/27/01 11:18:17 PM) + */ +protected void initializeComponents() { + GameSettings curs = currentSettings; + JPanel everything = new JPanel(); + BoxLayout boxLayout = new BoxLayout(everything, BoxLayout.Y_AXIS); + everything.setLayout(boxLayout); + + JPanel bombsPanel = createBorderedPanel("Bombs per level"); + bombsPerLevel = createSlider(0,curs.getMaxBombsPerLevel(),curs.getBombsPerLevel()); + bombsPanel.add(bombsPerLevel); + + JPanel rangePanel = createBorderedPanel("Range of robot shooting"); + robotRange = createSlider(1,curs.getMaxRobotShotRange(),curs.getRobotShotRange()); + robotShotDistanceFixed = new JCheckBox("Robots can only shoot the maximum distance (specified above)"); + robotShotDistanceFixed.setSelected(curs.isFixedRobotShotRange()); + robotShotDistanceFixed.setHorizontalAlignment(JCheckBox.LEFT); + rangePanel.add(robotRange); + rangePanel.add(robotShotDistanceFixed); + + JPanel freqPanel = createBorderedPanel("Robot shooting frequency (%)"); + robotShotFrequency = createSlider(0,100,curs.getRobotShootFrequency()); + freqPanel.add(robotShotFrequency); + + JPanel minePanel = createBorderedPanel("Robot mine dropping frequency (%)"); + robotMineFrequency = createSlider(0,100,curs.getRobotMineFrequency()); + minePanel.add(robotMineFrequency); + + JPanel settingsPanel = createBorderedPanel("Other settings"); + mouseShoots = new JCheckBox("Honestly, mice can shoot. Really!"); + mouseShoots.setSelected(curs.isShootingMouse()); + animatedImages = new JCheckBox("Animated images"); + animatedImages.setSelected(curs.isAnimatedImages()); + unlimitedLevels = new JCheckBox("Unlimited levels"); + unlimitedLevels.setSelected(curs.isUnlimitedGameLevels()); + unlimitedLives = new JCheckBox("Unlimited lives"); + unlimitedLives.setSelected(curs.isUnlimitedLives()); + shieldedRobots = new JCheckBox("Are robots shielded?"); + shieldedRobots.setSelected(curs.isShieldedRobots()); + settingsPanel.add(mouseShoots); + settingsPanel.add(shieldedRobots); + settingsPanel.add(animatedImages); + settingsPanel.add(unlimitedLevels); + settingsPanel.add(unlimitedLives); + + JPanel predefinedPanel = createBorderedPanel("Predefined game settings"); + predefinedPanel.setLayout(new GridLayout(3,1)); + JButton easyButton = createImageButton("EasyButton.gif", EASY); + JButton defaultButton = createImageButton("DefaultButton.gif", DEFAULT); + JButton hardButton = createImageButton("HardButton.gif", HARD); + predefinedPanel.add(easyButton); + predefinedPanel.add(defaultButton); + predefinedPanel.add(hardButton); + + JPanel comboPanel = new JPanel(new GridLayout(1,2)); + comboPanel.add(predefinedPanel); + comboPanel.add(settingsPanel); + + everything.add(bombsPanel); + everything.add(rangePanel); + everything.add(freqPanel); + everything.add(minePanel); + everything.add(comboPanel); + + // apparantly these need to be separate panels... + JPanel dividerPanel = new JPanel(); + JPanel dividerPanel2 = new JPanel(); + JPanel dividerPanel3 = new JPanel(); + JPanel dividerPanel4 = new JPanel(); + + this.setLayout(new BorderLayout()); + this.add(dividerPanel, BorderLayout.WEST); + this.add(dividerPanel2, BorderLayout.EAST); + this.add(dividerPanel3, BorderLayout.SOUTH); + this.add(dividerPanel4, BorderLayout.NORTH); + this.add(everything, BorderLayout.CENTER); +} + + +/** + * Initialize the predefined Settings. + * + * Creation date: (10/27/01 11:20:00 PM) + */ +protected void initializeSettings() { + currentSettings = new GameSettings(MazeDomain.getInstance().getGameSettings()); + easySettings = new GameSettings(); + easySettings.load("easy.properties"); + hardSettings = new GameSettings(); + hardSettings.load("hard.properties"); + defaultSettings = new GameSettings(); + defaultSettings.load("default.properties"); +} + + +/** + * Set the current game settings. + * + * Creation date: (10/28/01 1:23:14 PM) + */ +public void setCurrentSettings(GameSettings gameSettings) { + currentSettings = new GameSettings(gameSettings); + copyFromCurrentSettings(); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/IntroPanel.java b/src/main/java/a2geek/games/mousemaze2001/IntroPanel.java new file mode 100644 index 0000000..cc9fa17 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/IntroPanel.java @@ -0,0 +1,325 @@ +package a2geek.games.mousemaze2001; +import java.io.*; +import java.awt.image.*; +import java.net.*; +import java.awt.*; +import javax.swing.*; + +import a2geek.games.mousemaze2001.images.*; + +/** + * Insert the type's description here. + * + * Creation date: (10/16/01 10:28:58 PM) + * @author: Rob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class IntroPanel extends JPanel { + private static IntroPanel instance = new IntroPanel(); + private String[] imageNames = { + "OriginalMouseMazeLogo.gif", + "OriginalMouseMazeHelp.gif", + "OriginalMouseMazeGameShot.gif", + "OriginalMouseMazeWin.gif" + }; + private Image[] scaledImages; + private int ticker; + private int stage; + private String[] story = { + "A long time ago,", + "when life was much different,", + "I wrote my first game called...", + "", + "&1", + "", + "", + "This a rewrite.", + "", + "", + "The Apple ][,", + "simple graphics,", + "small computers,", + "All Gone!", + "", + "", + "The original help screen:", + "&2", + "", + "A game in progress:", + "&3", + "", + "The winners' screen:", + "&4" + }; + private Image marquee; + private Thread creationThread; + +/** + * IntroPanel constructor comment. + */ +protected IntroPanel() { + super(); + initialize(); +} + + +public static IntroPanel getInstance() { + return instance; +} + + +protected int getMaxStage() { + return 2; +} + + +public void incrementTicker() { + ticker++; +} + + +private void initialize() { + setMinimumSize(new Dimension(560,384)); + setMaximumSize(new Dimension(560*2,384*2)); + setPreferredSize(new Dimension(560,384)); + + // load original images + Image originalImages[] = new Image[imageNames.length]; + ImageManager imageManager = ImageManager.getInstance(); + for (int i=0; i 0) { + scaled = scaled.getScaledInstance(width, -1, Image.SCALE_FAST); + } + tracker.addImage(scaled, i); + scaledImages[i] = scaled; + } + try { + tracker.waitForAll(); + } catch (InterruptedException ex) { + } +} + + +/** + * This method will layout the marquee on the given grapics context - which can be + * the screen as well as an off-screen image. + * + * Creation date: (10/19/01 11:16:17 PM) + */ +protected int layoutMarquee(Image layoutImage) { + Graphics g = layoutImage.getGraphics(); + Font font = new Font(g.getFont().getFontName(), Font.BOLD, 20); + g.setFont(font); + FontMetrics metrics = g.getFontMetrics(); + int fontHeight = metrics.getHeight(); + int lines = story.length; + + int screenHeight = layoutImage.getHeight(null); + int screenWidth = layoutImage.getWidth(null); + g.setColor(Color.black); + g.fillRect(0,0,screenWidth,screenHeight); + + int y = fontHeight + 10; // just a buffer + for (int i=0; i= 0 && shape < scaledImages.length) { + Image image = scaledImages[shape]; + int shapeWidth = image.getWidth(null); + int shapeHeight = image.getHeight(null); + int x = (screenWidth - shapeWidth) / 2; + int yPos = y - fontHeight+10; + g.setColor(Color.blue); + g.fillRoundRect(x-5,yPos-5,shapeWidth+10,shapeHeight+10,5,5); + g.drawImage(image,x,yPos,null); + y+= shapeHeight+10; + } + } else { + int stringWidth = metrics.stringWidth(line); + int x = (screenWidth - stringWidth) / 2; + g.setColor(Color.lightGray); + g.drawString(line, x, y); + y+= fontHeight; + } + } + return y + 10; +} + + +private void nextStage() { + stage++; + if (stage >= getMaxStage()) { + stage = 0; + } + resetTicker(); +} + + +public void paint(Graphics g) { + Font oldFont = g.getFont(); + + int screenHeight = getHeight(); + int screenWidth = getWidth(); + g.setColor(Color.black); + g.fillRect(0,0,screenWidth,screenHeight); + + switch (stage) { + case 0: paintMarquee(g); + break; + case 1: paintSectionTwo(g); + break; + } + + g.setFont(oldFont); // not sure if this needs to be done.. +} + + +/** + * Paint the scrolling marquee. + * The marquee image creation is placed here since the initialize method apparantly + * cannot create a Graphics object from an Image; thus the marquee cannot be rendered + * from the constructor. The marquee image itself is laid out twice - once to get the + * height (allows it to remain somewhat dynamic) and then to generate the real image. + * The rest of the logic here is just to draw the image on the physical screen. + * + * Creation date: (10/19/01 11:13:58 PM) + */ +public void paintMarquee(Graphics g) { + if (marquee == null) { + if (creationThread == null) { + creationThread = new Thread() { + public void run() { + int width = 500; + int height = 800; + Image layoutImage = createImage(width,height); + height = layoutMarquee(layoutImage); + Image marqueeTemp = createImage(width, height); + layoutMarquee(marqueeTemp); + marquee = marqueeTemp; + resetTicker(); + }; + }; + creationThread.setDaemon(true); + creationThread.start(); + } + } + + int screenHeight = getHeight(); + int screenWidth = getWidth(); + if (marquee == null) { + String message = "Please wait..."; + Font font = new Font(g.getFont().getFontName(), Font.BOLD, 20); + g.setFont(font); + FontMetrics metrics = g.getFontMetrics(); + int fontHeight = metrics.getHeight(); + int stringWidth = metrics.stringWidth(message); + int x = (screenWidth - stringWidth) / 2; + int y = (screenHeight - fontHeight) / 2; + g.setColor(Color.green); + g.drawString(message, x, y); + } else { + int y = screenHeight - ticker;; + int shapeWidth = marquee.getWidth(null); + int shapeHeight = marquee.getHeight(null); + int x = (screenWidth - shapeWidth) / 2; + g.drawImage(marquee,x,y,null); + y+= shapeHeight; + if (y < 0) { + nextStage(); + } + } +} + + +public void paintSectionTwo(Graphics g) { + Font font = new Font(g.getFont().getFontName(), Font.BOLD, 20); + g.setFont(font); + g.setColor(Color.blue); + FontMetrics metrics = g.getFontMetrics(); + int fontHeight = metrics.getHeight(); + int fontAscent = metrics.getAscent(); + int screenHeight = getHeight(); + int screenWidth = getWidth(); + int y = (screenHeight - fontHeight*8) / 2; + + String title = "Controlling Mouse Maze"; + int stringWidth = metrics.stringWidth(title); + g.drawString(title, (screenWidth - stringWidth) / 2, y); + + int saveY = y; + int x; + String[] keys; + for (int z=0; z<2; z++) { + if (z == 0) { + y = saveY; + x = (screenWidth / 4); + title = "To Shoot:"; + keys = new String[] { "Q", "W", "E", "A", null, "D", "Z", "X", "C" }; + } else { + y = saveY; + x= (screenWidth / 2); + title = "To Move:"; + keys = new String[] { "Home", "Up", "PgUp", "Left", null, "Right", "End", "Down", "PgDn" }; + } + g.setColor(Color.blue); + y+= fontHeight * 2; + g.drawString(title, x, y); + y+= fontHeight; + int maxWidth = 0; + for (int i=0; i maxWidth) maxWidth = width; + } + } + int padding = 6; + for (int i=0; i 1000) { + nextStage(); + } +} + + +public void resetTicker() { + ticker= 0; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/MazeGridPanel.java b/src/main/java/a2geek/games/mousemaze2001/MazeGridPanel.java new file mode 100644 index 0000000..7c36171 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/MazeGridPanel.java @@ -0,0 +1,138 @@ +package a2geek.games.mousemaze2001; +import java.awt.*; +import javax.swing.*; + +import a2geek.games.mousemaze2001.domain.*; +import a2geek.games.mousemaze2001.mazeobjects.*; + +/** + * Insert the type's description here. + * + * Creation date: (10/11/01 10:13:35 PM) + * @author: Rob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class MazeGridPanel extends JPanel { + private int gridWidth = 14; + private int gridHeight = 9; + // the following keep an aspect ratio of 1.33333:1 for w:h + private int minCellHeight = 16; + private int minCellWidth = 15; + private int prefCellWidth = 32; + private int prefCellHeight = 30; + private int maxCellWidth = 64; + private int maxCellHeight = 60; + +/** + * MazeGridPanel constructor comment. + */ +public MazeGridPanel() { + super(); + initialize(); +} + + +/** + * MazeGridPanel constructor comment. + * @param layout java.awt.LayoutManager + */ +public MazeGridPanel(java.awt.LayoutManager layout) { + super(layout); + initialize(); +} + + +/** + * MazeGridPanel constructor comment. + * @param layout java.awt.LayoutManager + * @param isDoubleBuffered boolean + */ +public MazeGridPanel(java.awt.LayoutManager layout, boolean isDoubleBuffered) { + super(layout, isDoubleBuffered); + initialize(); +} + + +/** + * MazeGridPanel constructor comment. + * @param isDoubleBuffered boolean + */ +public MazeGridPanel(boolean isDoubleBuffered) { + super(isDoubleBuffered); + initialize(); +} + + +protected void initialize() { + setMinimumSize(new Dimension(gridWidth * minCellWidth, gridHeight * minCellHeight)); + setMaximumSize(new Dimension(gridWidth * maxCellWidth, gridHeight * maxCellHeight)); + setPreferredSize(new Dimension(gridWidth * prefCellWidth, gridHeight * prefCellHeight)); +} + + +public void paint(Graphics g) { + //System.out.println(new java.util.Date() + " - painting screen"); + int screenWidth = getWidth(); + int screenHeight = getHeight(); + g.setColor(Color.black); + g.fillRect(0, 0, screenWidth, screenHeight); + g.setColor(Color.white); + screenWidth -= 2; + screenHeight -= 2; + for (int x=0; x <= gridWidth; x++) { + int xPos = (screenWidth * x) / gridWidth; + g.drawLine(xPos, 0, xPos, screenHeight); + xPos++; + g.drawLine(xPos, 0, xPos, screenHeight); + } + for (int y=0; y <= gridHeight; y++) { + int yPos = (screenHeight * y) / gridHeight; + g.drawLine(0, yPos, screenWidth, yPos); + yPos++; + g.drawLine(0, yPos, screenWidth, yPos); + } + + MazeDomain maze = MazeDomain.getInstance(); + if (maze.getMap() == null) return; + + int cellWidth = screenWidth / gridWidth - 2; + int cellHeight = screenHeight / gridHeight - 2; + for (int x=0; x + * Creation date: (10/6/01 11:29:16 PM) + * @author: Rob Greene + * @version: RJG 10/08/2001 00:10:56 + */ +public class WindowCloseAdapter extends WindowAdapter implements ActionListener { + /** + * WindowCloseAdapter constructor comment. + */ + public WindowCloseAdapter() { + super(); + } + + /** + * Perform the close action. + * + * Creation date: (10/6/01 11:32:38 PM) + */ + public void actionPerformed(ActionEvent e) { + System.exit(0); + } + + /** + * Close the system down. + * + * Creation date: (10/6/01 11:29:36 PM) + */ + public void windowClosed(WindowEvent e) { + System.exit(0); + } +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/domain/DomainEvent.java b/src/main/java/a2geek/games/mousemaze2001/domain/DomainEvent.java new file mode 100644 index 0000000..5fe83ef --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/domain/DomainEvent.java @@ -0,0 +1,41 @@ +package a2geek.games.mousemaze2001.domain; +/** + * A DomainEvent is passed to DomainListeners. + * + * Creation date: (10/22/01 9:58:14 PM) + * @author: Rob Greene + * @version: RJG 10/22/2001 23:31:31 + */ +public class DomainEvent { + private Object source; + private String event; + +/** + * DomainEvent constructor comment. + */ +public DomainEvent(Object theSource, String theEvent) { + super(); + source = theSource; + event = theEvent; +} + + +/** + * Retrieve the event that occurred. + * + * Creation date: (10/22/01 10:00:08 PM) + */ +public String getEvent() { + return event; +} + + +/** + * Retrieve the source of this DomainEvent. + * + * Creation date: (10/22/01 9:59:45 PM) + */ +public Object getSource() { + return source; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/domain/DomainListener.java b/src/main/java/a2geek/games/mousemaze2001/domain/DomainListener.java new file mode 100644 index 0000000..d799010 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/domain/DomainListener.java @@ -0,0 +1,18 @@ +package a2geek.games.mousemaze2001.domain; +/** + * A DomainListener identifies an object that wants to know that + * something has happened in the domain. + * + * Creation date: (10/22/01 9:55:37 PM) + * @author: Rob Greene + * @version: RJG 10/22/2001 23:31:31 + */ +public interface DomainListener { +/** + * A DomainListener will receive a domainChanged event + * when the domain state has been modified. + * + * Creation date: (10/22/01 9:56:33 PM) + */ +public void domainChanged(DomainEvent domainEvent); +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/domain/GameSettings.java b/src/main/java/a2geek/games/mousemaze2001/domain/GameSettings.java new file mode 100644 index 0000000..1283d0d --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/domain/GameSettings.java @@ -0,0 +1,439 @@ +package a2geek.games.mousemaze2001.domain; +import java.io.*; +import java.util.*; +/** + * Represents all the configurable information of the game. + * + * Creation date: (10/27/01 2:39:27 PM) + * @author: Rob Greene + * @version: RJG 10/29/2001 22:40:54 + */ +public class GameSettings { + private static final String BASE_PATH = "/settings/%s"; + /* + * Indicates if the mouse is able to shoot. + */ + private boolean shootingMouse; + /* + * Number of bombs added per level. Set to 0 for none. + */ + private int bombsPerLevel; + /* + * Maximum number of bombs to have per level. + * Note: Not used by game itself, used by preferences screen. + */ + private int maxBombsPerLevel; + /* + * Range that robots can "see" or target the mouse. When the mouse + * is within this range, the robot may shoot. + */ + private int robotVisibilityRange; + /* + * Maximum robot visibility range. + * Note: Not used by game itself, used by preferences screen. + */ + private int maxRobotVisibilityRange; + /* + * Longest shot that a robot can take. + */ + private int robotShotRange; + /* + * Maximum shot range that can be chosen. + * Note: Not used by game itself, used by preferences screen. + */ + private int maxRobotShotRange; + /* + * Can robots only shoot at their maximum range? + * (For example, maybe the mouse gets "too close" and under the gun.) + */ + private boolean fixedRobotShotRange; + /* + * When the mouse is within shooting range, this is the percent chance that + * the robot will actually shoot. + */ + private int robotShootFrequency; + /* + * Should the game use animated images, or does that annoy the player? + */ + private boolean animatedImages; + /* + * How frequently should the robot drop mines? + */ + private int robotMineFrequency; + /* + * Cheat: Game is too short, lets make it go on forever! + */ + private boolean unlimitedGameLevels; + /* + * Cheat: Game is too hard, mouse is always reincarnated. + */ + private boolean unlimitedLives; + /* + * Allow robots have shielding. + */ + private boolean shieldedRobots; + +/** + * GameSettings constructor comment. + */ +public GameSettings() { + super(); +} + + +/** + * GameSettings constructor comment. + */ +public GameSettings(GameSettings other) { + super(); + this.setAnimatedImages(other.isAnimatedImages()); + this.setBombsPerLevel(other.getBombsPerLevel()); + this.setFixedRobotShotRange(other.isFixedRobotShotRange()); + this.setMaxBombsPerLevel(other.getMaxBombsPerLevel()); + this.setMaxRobotShotRange(other.getMaxRobotShotRange()); + this.setMaxRobotVisibilityRange(other.getMaxRobotVisibilityRange()); + this.setRobotMineFrequency(other.getRobotMineFrequency()); + this.setRobotShootFrequency(other.getRobotShootFrequency()); + this.setRobotShotRange(other.getRobotShotRange()); + this.setRobotVisibilityRange(other.getRobotVisibilityRange()); + this.setShootingMouse(other.isShootingMouse()); + this.setUnlimitedGameLevels(other.isUnlimitedGameLevels()); + this.setUnlimitedLives(other.isUnlimitedLives()); + this.setShieldedRobots(other.isShieldedRobots()); +} + + +/** + * Retrieve the number of bombs per level. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getBombsPerLevel() { + return bombsPerLevel; +} + + +/** + * Get the maximum bombs per level. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getMaxBombsPerLevel() { + return maxBombsPerLevel; +} + + +/** + * Get the maximum robot shot range. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getMaxRobotShotRange() { + return maxRobotShotRange; +} + + +/** + * Get the maximum robot visibility range. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getMaxRobotVisibilityRange() { + return maxRobotVisibilityRange; +} + + +/** + * Get the robot mining frequency. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getRobotMineFrequency() { + return robotMineFrequency; +} + + +/** + * Get the robot shooting frequency. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getRobotShootFrequency() { + return robotShootFrequency; +} + + +/** + * Get the range of a robot shot. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getRobotShotRange() { + return robotShotRange; +} + + +/** + * Get the range a robot can see. + * + * Creation date: (10/27/01 2:51:10 PM) + * @return int + */ +public int getRobotVisibilityRange() { + return robotVisibilityRange; +} + + +/** + * Are there animated images? + * + * Creation date: (10/27/01 2:51:10 PM) + * @return boolean + */ +public boolean isAnimatedImages() { + return animatedImages; +} + + +/** + * Do the robots have a fixed shot range? + * + * Creation date: (10/27/01 2:51:10 PM) + * @return boolean + */ +public boolean isFixedRobotShotRange() { + return fixedRobotShotRange; +} + + +/** + * Answer if the robots have shielding. + * + * Creation date: (10/29/01 10:05:30 PM) + */ +public boolean isShieldedRobots() { + return shieldedRobots; +} + + +/** + * Can this mouse shoot? + * + * Creation date: (10/27/01 2:51:10 PM) + * @return boolean + */ +public boolean isShootingMouse() { + return shootingMouse; +} + + +/** + * Are we too good for the game? + * + * Creation date: (10/27/01 2:51:10 PM) + * @return boolean + */ +public boolean isUnlimitedGameLevels() { + return unlimitedGameLevels; +} + + +/** + * Are we cheating? + * + * Creation date: (10/27/01 2:51:10 PM) + * @return boolean + */ +public boolean isUnlimitedLives() { + return unlimitedLives; +} + + +/** + * Load the game settings from a Properties file. + * + * Creation date: (10/27/01 11:21:59 PM) + */ +public void load(String filename) { + Properties props = new Properties(); + try { + props.load(getClass().getResourceAsStream(String.format(BASE_PATH,filename))); + } catch (IOException ex) { + // ignore - default settings are set + } + setAnimatedImages(new Boolean(props.getProperty("animatedImages","true")).booleanValue()); + setBombsPerLevel(Integer.parseInt(props.getProperty("bombsPerLevel","2"))); + setFixedRobotShotRange(new Boolean(props.getProperty("fixedRobotShotRange","true")).booleanValue()); + setMaxBombsPerLevel(Integer.parseInt(props.getProperty("maxBombsPerLevel","5"))); + setMaxRobotShotRange(Integer.parseInt(props.getProperty("maxRobotShotRange","4"))); + setMaxRobotVisibilityRange(Integer.parseInt(props.getProperty("maxRobotVisibilityRange","5"))); + setRobotMineFrequency(Integer.parseInt(props.getProperty("robotMineFrequency","20"))); + setRobotShootFrequency(Integer.parseInt(props.getProperty("robotShootFrequency","80"))); + setRobotShotRange(Integer.parseInt(props.getProperty("robotShotRange","2"))); + setRobotVisibilityRange(Integer.parseInt(props.getProperty("robotVisibilityRange","4"))); + setShootingMouse(new Boolean(props.getProperty("shootingMouse","true")).booleanValue()); + setUnlimitedGameLevels(new Boolean(props.getProperty("unlimitedGameLevels","false")).booleanValue()); + setUnlimitedLives(new Boolean(props.getProperty("unlimitedLives","false")).booleanValue()); + setShieldedRobots(new Boolean(props.getProperty("shieldedRobots","false")).booleanValue()); +} + + +/** + * Set the animated images flag. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newAnimatedImages boolean + */ +public void setAnimatedImages(boolean newAnimatedImages) { + animatedImages = newAnimatedImages; +} + + +/** + * Set the number of bombs per level. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newBombsPerLevel int + */ +public void setBombsPerLevel(int newBombsPerLevel) { + bombsPerLevel = newBombsPerLevel; +} + + +/** + * Set the fixed range of the robots. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newFixedRobotShotRange boolean + */ +public void setFixedRobotShotRange(boolean newFixedRobotShotRange) { + fixedRobotShotRange = newFixedRobotShotRange; +} + + +/** + * Set the maximum bombs allowed per level. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newMaxBombsPerLevel int + */ +public void setMaxBombsPerLevel(int newMaxBombsPerLevel) { + maxBombsPerLevel = newMaxBombsPerLevel; +} + + +/** + * Set the maximum robot shot range. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newMaxRobotShotRange int + */ +public void setMaxRobotShotRange(int newMaxRobotShotRange) { + maxRobotShotRange = newMaxRobotShotRange; +} + + +/** + * Set the maximum robot visibility range. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newMaxRobotVisibilityRange int + */ +public void setMaxRobotVisibilityRange(int newMaxRobotVisibilityRange) { + maxRobotVisibilityRange = newMaxRobotVisibilityRange; +} + + +/** + * Set the robot mining frequency. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newRobotMineFrequency int + */ +public void setRobotMineFrequency(int newRobotMineFrequency) { + robotMineFrequency = newRobotMineFrequency; +} + + +/** + * Set the robot shooting frequency. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newRobotShootFrequency int + */ +public void setRobotShootFrequency(int newRobotShootFrequency) { + robotShootFrequency = newRobotShootFrequency; +} + + +/** + * Set the robot shooting distance. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newRobotShotRange int + */ +public void setRobotShotRange(int newRobotShotRange) { + robotShotRange = newRobotShotRange; +} + + +/** + * Set the robot visibility range. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newRobotVisibilityRange int + */ +public void setRobotVisibilityRange(int newRobotVisibilityRange) { + robotVisibilityRange = newRobotVisibilityRange; +} + + +/** + * Set if the robots have shielding. + * + * Creation date: (10/29/01 10:05:57 PM) + */ +public void setShieldedRobots(boolean newShieldedRobots) { + shieldedRobots = newShieldedRobots; +} + + +/** + * Tell me if this mouse is Rambo. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newShootingMouse boolean + */ +public void setShootingMouse(boolean newShootingMouse) { + shootingMouse = newShootingMouse; +} + + +/** + * Way cool game, but way too easy. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newUnlimitedGameLevels boolean + */ +public void setUnlimitedGameLevels(boolean newUnlimitedGameLevels) { + unlimitedGameLevels = newUnlimitedGameLevels; +} + + +/** + * Way cool game, but way too hard. + * + * Creation date: (10/27/01 2:51:10 PM) + * @param newUnlimitedLives boolean + */ +public void setUnlimitedLives(boolean newUnlimitedLives) { + unlimitedLives = newUnlimitedLives; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/domain/MazeDomain.java b/src/main/java/a2geek/games/mousemaze2001/domain/MazeDomain.java new file mode 100644 index 0000000..545a967 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/domain/MazeDomain.java @@ -0,0 +1,735 @@ +package a2geek.games.mousemaze2001.domain; +import java.applet.Applet; +import java.applet.AudioClip; +import java.awt.*; +import java.util.*; +import javax.swing.event.ChangeListener; + +import a2geek.games.mousemaze2001.mazeobjects.*; +import a2geek.games.mousemaze2001.threads.*; + +/** + * Contain the MouseMaze domain in a singleton instance. + * Basically, all map related items are here. + * + * Creation date: (10/14/01 9:35:03 PM) + * @author: Rob Greene + * @version: RJG 11/29/2001 22:42:21 + */ +public class MazeDomain { + private static final String BASE_PATH = "/sounds/%s"; + private static MazeDomain instance = null; + private MazeObject[][] map = null; + private int mapWidth = 14; + private int mapHeight = 9; + private int mapLevel = 1; + private int totalMice = 3; + private int lives; + private int kills; + private Point mousePoint = new Point(); + private Point exitPoint = new Point(); + private Vector robots = new Vector(); + private MazeObject mouse = new AnimatedMouse(); + private MazeObject bomb = new AnimatedBomb(); + private MazeObject exit = new Exit(); + private MazeObject mine = new Mine(); + private Vector domainListeners = new Vector(); + private String pauseMessage = null; + private boolean paused = false; + private int animationSequence = 0; + private GameSettings gameSettings; + + private AudioClip moveSound; + private AudioClip hitSound; + +/** + * MazeDomain constructor comment. + */ +protected MazeDomain() { + super(); + + moveSound = Applet.newAudioClip(getClass().getResource(String.format(BASE_PATH,"clickfast.wav"))); + hitSound = Applet.newAudioClip(getClass().getResource(String.format(BASE_PATH,"boing.wav"))); +} + + +/** + * Add a DomainListener. + * + * Creation date: (10/22/01 9:49:44 PM) + */ +public void addDomainListener(DomainListener domainListener) { + domainListeners.add(domainListener); +} + + +/** + * Determine if there are any explosions on the screen. + * After explosions have disappered, checks to see if the terminate + * message should be sent. This allows the message to be displayed + * stating that the game is over. + * + * Creation date: (10/26/01 12:12:54 PM) + */ +public boolean areExplosionsPresent() { + for (int x=0; x 5) { + notifyDomainListeners("terminate"); + } + return false; +} + + +/** + * Answer if a mouse is able to shoot in this game. + * + * Creation date: (10/28/01 1:32:27 PM) + */ +public boolean canMouseShoot() { + return gameSettings.isShootingMouse(); +} + + +/** + * Erase current domain as it relates to a specific game. + * + * Creation date: (11/5/01 10:29:06 PM) + */ +public void clear() { + map = null; + mapLevel = 1; + lives = 0; + kills = 0; + mousePoint = new Point(); + exitPoint = new Point(); + robots = new Vector(); + pauseMessage = null; + paused = false; + animationSequence = 0; +} + + +/** + * Initiate the game over sequence. + * + * Creation date: (10/26/01 12:54:32 PM) + */ +public void endGame() { + lives = 0; + notifyDomainListeners("gameOver"); +} + + +/** + * Provide random bomb explosions. + * + * Creation date: (10/26/01 12:38:22 PM) + */ +public void explodeBombsRandomly() { + if (isPaused()) return; + Random random = new Random(); + int x = random.nextInt(getMapWidth()-1); + int y = random.nextInt(getMapHeight()-1); + if (isBomb(x,y)) { + setMazeObject(x,y,null); + BombExplosionThread bombExplosion = new BombExplosionThread(new Point(x,y)); + bombExplosion.start(); + } +} + + +/** + * Generate a map. + * + * Creation date: (10/14/01 10:01:32 PM) + */ +public void generateMap() { + if (mapWidth > 0 && mapHeight > 0 && mapLevel > 0) { + setPause(true); + // setup information + MazeObject[][] oldMap = map; + map = new MazeObject[mapWidth][mapHeight]; + int midPoint = (mapHeight + 1) / 2 - 1; + // place mouse + setMazeObject(0, midPoint, mouse); + // place exit + exitPoint = new Point(mapWidth-1, midPoint); + setMazeObject(exitPoint, exit); + // place robots + if (getLevel() >= 5) { + placeRobot(0, 0); + placeRobot(0, mapHeight-1); + } + for (int i=1; i<=Math.min(getLevel(),4); i++) { + placeRobot(mapWidth-1, midPoint-i); + placeRobot(mapWidth-1, midPoint+i); + } + // place bombs + int bombs = mapLevel * gameSettings.getBombsPerLevel(); + Random random = new Random(); + while (bombs > 0) { + int x = random.nextInt(mapWidth); + int y = random.nextInt(mapHeight); + if (getMazeObject(x,y) == null) { + setMazeObject(x,y,bomb); + bombs--; + } + } + if (oldMap != null) { + LevelTranslationThread thread = new LevelTranslationThread("Welcome to level " + getLevel() + "!", map); + map = oldMap; + thread.start(); + } + } +} + + +/** + * Retrieve the current animation sequence. + * + * Creation date: (10/26/01 10:59:35 PM) + */ +public int getAnimationSequence() { + return animationSequence; +} + + +/** + * Get game settings. + * + * Creation date: (10/28/01 12:43:41 PM) + */ +public GameSettings getGameSettings() { + if (gameSettings == null) { + gameSettings = new GameSettings(); + gameSettings.load("default.properties"); + } + return gameSettings; +} + + +/** + * Retrieve the singleton instance. + * + * Creation date: (10/14/01 9:36:19 PM) + */ +public static MazeDomain getInstance() { + if (instance == null) { + instance = new MazeDomain(); + } + return instance; +} + + +/** + * Retrieve the number of robots killed. + * + * Creation date: (10/25/01 10:47:06 PM) + */ +public int getKills() { + return kills; +} + + +public int getLevel() { + return mapLevel; +} + + +/** + * Return the number of mouse lives left. + * + * Creation date: (10/25/01 11:24:01 PM) + */ +public int getLives() { + return lives; +} + + +/** + * Retrieve the current map. + * + * Creation date: (10/14/01 9:35:25 PM) + */ +public MazeObject[][] getMap() { + return map; +} + + +/** + * Retrieve map height. + * + * Creation date: (10/14/01 10:11:27 PM) + */ +public int getMapHeight() { + return mapHeight; +} + + +/** + * Retrieve map width. + * + * Creation date: (10/14/01 10:11:53 PM) + */ +public int getMapWidth() { + return mapWidth; +} + + +/** + * Get MazeObject. + * + * Creation date: (10/14/01 10:10:05 PM) + */ +public MazeObject getMazeObject(int x, int y) { + MazeObject mazeObject = null; + if (map != null) { + mazeObject = map[x][y]; + } + return mazeObject; +} + + +/** + * Get a MazeObject. + * + * Creation date: (10/21/01 3:49:44 PM) + */ +public MazeObject getMazeObject(Point pt) { + return getMazeObject(pt.x,pt.y); +} + + +public Point getMouseLocation() { + return mousePoint; +} + + +public String getPauseMessage() { + return pauseMessage; +} + + +/** + * Return the number of living robots. + * + * Creation date: (10/22/01 10:45:58 PM) + */ +public int getRobotCount() { + if (robots == null) return 0; + return robots.size(); +} + + +/** + * Retrieve the number of mouse lives. + * + * Creation date: (10/24/01 10:27:45 PM) + * @return int + */ +public int getTotalMice() { + return totalMice; +} + + +/** + * Increment the animation sequence. + * + * Creation date: (10/26/01 10:59:55 PM) + */ +public void incrementAnimationSequence() { + animationSequence++; +} + + +/** + * Test if a cell has a bomb. + * + * Creation date: (10/23/01 10:24:36 PM) + */ +public boolean isBomb(int x, int y) { + return getMazeObject(x,y) == bomb; +} + + +/** + * Answers true if the game has ended. + * This is used by other threads to force termination. + * + * Creation date: (10/26/01 11:05:40 PM) + */ +public boolean isGameOver() { + return (lives < 1); +} + + +public boolean isPaused() { + return paused; +} + + +/** + * Test if a point is a valid cell location. + * + * Creation date: (10/23/01 10:26:22 PM) + */ +public boolean isValidPoint(int x, int y) { + return (x >= 0 && x < mapWidth && y >= 0 && y < mapHeight); +} + + +/** + * Test if a point is a valid cell location. + * + * Creation date: (10/23/01 10:26:22 PM) + */ +public boolean isValidPoint(Point pt) { + return isValidPoint(pt.x, pt.y); +} + + +public void moveMouse(int dx, int dy) { + if (isPaused()) return; + if (mousePoint == null) return; + Point pt = new Point(mousePoint); + pt.translate(dx,dy); + + if (isValidPoint(pt) == false) return; + + if (getMazeObject(pt) == exit) { // end of level + moveSound.play(); + setMazeObject(mousePoint, null); + mousePoint = null; + if (gameSettings.isUnlimitedGameLevels() || getLevel() <= 5) { + setLevel(getLevel()+1); + generateMap(); + } else { + notifyDomainListeners("gameWon"); + } + } else if (getMazeObject(pt) == null) { // a valid move + moveSound.play(); + setMazeObject(mousePoint, null); + setMazeObject(pt, mouse); + } else if (getMazeObject(pt) == mine) { // ouch, that hurts! + setMazeObject(mousePoint, null); + setMazeObject(pt, mouse); + Thread explosion = new ExplosionThread(pt); + explosion.start(); + } else { + hitSound.play(); + } +} + + +/** + * Provide robot AI. + * An external thread will trigger this logic. + * + * Creation date: (10/22/01 10:47:15 PM) + * @return moved status (true == moved) + */ +public boolean moveRobot(AnimatedRobot robot) { + if (isPaused()) return true; + if (mousePoint == null) return false; + Point robotPoint = robot.getLocation(); + int dx = (mousePoint.x < robotPoint.x ? -1 : 0) + (mousePoint.x > robotPoint.x ? 1 : 0); + int dy = (mousePoint.y < robotPoint.y ? -1 : 0) + (mousePoint.y > robotPoint.y ? 1 : 0); + Random random = new Random(); + // determine if the robot will drop a mine + boolean willDropMine = (random.nextInt(100) < gameSettings.getRobotMineFrequency()); + MazeObject replacementObject = (willDropMine ? mine : null); + // try real move + Point pt = new Point(robotPoint); + pt.translate(dx,dy); + if (isValidPoint(pt) && getMazeObject(pt) == null) { + setMazeObject(robotPoint, replacementObject); + robotPoint.translate(dx,dy); // need to keep object intact! + setMazeObject(robotPoint, robot); + notifyDomainListeners("robot"); + // attempt to shoot... + robotShoot(robotPoint); + return true; + } else if (isValidPoint(pt) && getMazeObject(pt) == mouse) { + return false; + } + // try random move + dx = random.nextInt(3) - 1; + dy = random.nextInt(3) - 1; + pt = new Point(robotPoint); + pt.translate(dx,dy); + if (isValidPoint(pt) && getMazeObject(pt) == null) { + setMazeObject(robotPoint, replacementObject); + robotPoint.translate(dx,dy); // need to keep object intact! + setMazeObject(robotPoint, robot); + notifyDomainListeners("robot"); + // attempt to shoot... + robotShoot(robotPoint); + return true; + } + // shucks... + return false; +} + + +/** + * Invoke this method to start a new game. + * + * Creation date: (10/22/01 10:12:50 PM) + */ +public void newGame() { + setLevel(1); + lives = getTotalMice(); + kills = 0; + notifyDomainListeners("newGame"); + generateMap(); +} + + +/** + * Notify all change listeners. + * + * Creation date: (10/22/01 9:51:10 PM) + */ +protected void notifyDomainListeners(String event) { + Enumeration listeners = domainListeners.elements(); + DomainEvent domainEvent = new DomainEvent(this, event); + while (listeners.hasMoreElements()) { + DomainListener listener = (DomainListener) listeners.nextElement(); + listener.domainChanged(domainEvent); + } +} + + +/** + * Place a robot onto the maze. Used as a helper by generateMap. + * + * Creation date: (10/30/01 9:46:21 PM) + */ +protected void placeRobot(int x, int y) { + //System.out.println("Creating new robot at " + x + "," + y + "."); + int shieldLevels = (getGameSettings().isShieldedRobots() ? 2 : 0); + Point point = new Point(x, y); + AnimatedRobot robot = new AnimatedRobot(point, shieldLevels); + setMazeObject(point, robot); + robots.add(robot); +} + + +/** + * Remove a DomainListener. + * + * Creation date: (10/22/01 9:50:42 PM) + */ +public void removeDomainListener(DomainListener domainListener) { + domainListeners.remove(domainListener); +} + + +/** + * Control robot shooting. + * + * Creation date: (10/28/01 1:43:21 PM) + */ +protected void robotShoot(Point robotPoint) { + Random random = new Random(); + int distance = (int)robotPoint.distance(mousePoint); + boolean closeEnough = distance < gameSettings.getRobotVisibilityRange(); + boolean randomChance = random.nextInt(100) < gameSettings.getRobotShootFrequency(); + if (closeEnough && randomChance) { + int range; + if (gameSettings.isFixedRobotShotRange()) { + range = gameSettings.getRobotShotRange(); + } else { + range = random.nextInt(gameSettings.getRobotShotRange()); + } + int dx = (mousePoint.x < robotPoint.x ? -range : 0) + (mousePoint.x > robotPoint.x ? range : 0); + int dy = (mousePoint.y < robotPoint.y ? -range : 0) + (mousePoint.y > robotPoint.y ? range : 0); + Point pt = new Point(robotPoint); + pt.translate(dx,dy); + if (isValidPoint(pt)) { + MazeObject mazeObject = getMazeObject(pt); + if (mazeObject != null && mazeObject.isRobot() == false) { + Thread explosion = new ExplosionThread(pt); + explosion.start(); + } + } + } +} + + +/** + * Set the game settings. + * + * Creation date: (10/28/01 12:44:51 PM) + */ +public void setGameSettings(GameSettings newSettings) { + gameSettings = newSettings; +} + + +/** + * Choose a level. + * + * Creation date: (10/14/01 10:00:05 PM) + */ +public void setLevel(int level) { + // set new level + mapLevel = level; + notifyDomainListeners("level"); + // kill off any robots + if (robots != null) { + for (int i=0; i 0) { + setMazeObject(pt, null); + mousePoint = new Point(0,mapHeight/2); + setMazeObject(mousePoint, mouse); + notifyDomainListeners("mouseKilled"); + } else { + endGame(); + } + } + } + return pt; +} + + +/** + * Ensure that map is in sync. + * + * Creation date: (10/29/01 10:28:31 PM) + */ +public void synchronizeMap() { + if (getLives() > 0) setMazeObject(mousePoint, mouse); + setMazeObject(exitPoint, exit); + for (int i=0; iRob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class ImageManager { + private static final String BASE_PATH = "/images/%s"; + private static ImageManager instance = null; + private Hashtable images = new Hashtable(); + +/** + * ImageManager constructor comment. + */ +protected ImageManager() { + super(); +} + + +/** + * Retrieve an image from the images table. + * If the image has not been loaded, it is loaded. + * + * Creation date: (10/31/01 8:51:13 PM) + */ +public Image getImage(String imageName) { + Image image = (Image) images.get(imageName); + if (image == null) { + image = loadImage(imageName); + } + return image; +} + + +/** + * Retrieve the singleton instance of this class and + * initialize the class. + * + * Creation date: (10/31/01 7:34:49 PM) + */ +public static synchronized ImageManager getInstance() { + if (instance == null) { + instance = new ImageManager(); + instance.initialize(); + } + return instance; +} + + +/** + * Initialize the class by preloading images. + * + * Creation date: (10/31/01 7:36:07 PM) + */ +protected void initialize() { + Properties properties = new Properties(); + String resourceName = String.format(BASE_PATH, "ImageManager.properties"); + InputStream inputStream = getClass().getResourceAsStream(resourceName); + if (inputStream != null) { + try { + properties.load(inputStream); + Enumeration elements = properties.keys(); + while (elements.hasMoreElements()) { + String imageName = (String) elements.nextElement(); + //if (imageName.startsWith("#") == false && imageName.length() > 0) { + loadImage(imageName); + //} + } + } catch (IOException ex) { + log("initialize", "Unable to load " + resourceName, ex); + } + } +} + + +/** + * Test if the requested images have completed loading. + * + * Creation date: (10/31/01 8:52:50 PM) + */ +public boolean isDoneLoading() { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + Enumeration elements = images.elements(); + while (elements.hasMoreElements()) { + Image image = (Image) elements.nextElement(); + if (image.getHeight(null) == -1 || image.getWidth(null) == -1) { + return false; + } + } + return true; +} + + +/** + * Load an image into the images table. + * + * Creation date: (10/31/01 7:36:40 PM) + */ +protected Image loadImage(String imageName) { + Toolkit toolkit = Toolkit.getDefaultToolkit(); + URL url = getClass().getResource(String.format(BASE_PATH,imageName)); + Image image = null; + try { + image = toolkit.createImage((ImageProducer) url.getContent()); + images.put(imageName, image); + } catch (IOException ex) { + log("loadImage", "Unable to load " + imageName, ex); + } + return image; +} + + +/** + * Log errors. + * + * Creation date: (10/31/01 9:07:18 PM) + */ +protected void log(String methodName, String description, Exception exception) { + System.out.println(new Date() + " ImageManager." + methodName + ":"); + System.out.println(" " + description); + exception.printStackTrace(System.out); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedBomb.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedBomb.java new file mode 100644 index 0000000..b751c3b --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedBomb.java @@ -0,0 +1,41 @@ +package a2geek.games.mousemaze2001.mazeobjects; +/** + * Provide an animated bomb. + * + * Creation date: (10/26/01 11:01:35 PM) + * @author: Rob Greene + * @version: RJG 10/27/2001 01:02:48 + */ +public class AnimatedBomb extends AnimatedMouseMazeImageObject { +/** + * AnimatedMine constructor comment. + */ +public AnimatedBomb() { + super(); +} + + +/** + * Answers with the image names for this object. + * + * Creation date: (10/26/01 11:01:35 PM) + */ +protected String[] getImageNames() { + return new String[] { + "OriginalBomb0.gif", + "OriginalBomb1.gif", + "OriginalBomb2.gif", + "OriginalBomb3.gif" + }; +} + + +/** + * Returns true if this is a bomb. + * + * Creation date: (10/14/01 9:43:56 PM) + */ +public boolean isBomb() { + return true; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMazeImageObject.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMazeImageObject.java new file mode 100644 index 0000000..39886f8 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMazeImageObject.java @@ -0,0 +1,70 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.net.*; + +import a2geek.games.mousemaze2001.images.ImageManager; + +import java.io.*; +import java.awt.image.*; +import java.awt.*; + +/** + * Represents a MazeObject which is Image based and is animated. (Basically, a 'tile'.) + * + * Creation date: (10/23/01 9:31:27 PM) + * @author: Rob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public abstract class AnimatedMazeImageObject extends MazeObject { + private Image[] images = null; + +/** + * MazeImageObject constructor comment. + */ +public AnimatedMazeImageObject() { + super(); + ImageManager imageManager = ImageManager.getInstance(); + String[] names = getImageNames(); + images = new Image[names.length]; + for (int i=0; iRob Greene + * @version: RJG 10/27/2001 01:02:48 + */ +public class AnimatedMouse extends AnimatedMouseMazeImageObject { +/** + * AnimatedMouse constructor comment. + */ +public AnimatedMouse() { + super(); +} + + +/** + * Answers with the image names for this object. + * + * Creation date: (10/27/01 12:22:59 AM) + */ +protected String[] getImageNames() { + return new String[] { + "OriginalMouse0.gif", + "OriginalMouse1.gif", + "OriginalMouse2.gif", + "OriginalMouse3.gif" + }; +} + + +/** + * Returns true if this is the mouse. + * + * Creation date: (10/14/01 9:43:11 PM) + */ +public boolean isMouse() { + return true; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMouseMazeImageObject.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMouseMazeImageObject.java new file mode 100644 index 0000000..b1cf478 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedMouseMazeImageObject.java @@ -0,0 +1,31 @@ +package a2geek.games.mousemaze2001.mazeobjects; + +import a2geek.games.mousemaze2001.domain.MazeDomain; + +/** + * Provides the generic base-class for the MouseMaze 2001 games. + * + * Creation date: (10/26/01 10:58:46 PM) + * @author: Rob Greene + * @version: RJG 10/27/2001 01:02:48 + */ +public abstract class AnimatedMouseMazeImageObject extends AnimatedMazeImageObject { +/** + * AnimatedMouseMazeImageObject constructor comment. + */ +public AnimatedMouseMazeImageObject() { + super(); +} + + +/** + * Provides the animation sequence. + * This just needs to be an integer - not necessarily in the valid range, as + * modulo arithmetic will be used. + * + * Creation date: (10/26/01 10:55:18 PM) + */ +protected int getAnimationSequence() { + return MazeDomain.getInstance().getAnimationSequence(); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedRobot.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedRobot.java new file mode 100644 index 0000000..8f9b52a --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/AnimatedRobot.java @@ -0,0 +1,192 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.Point; + +import a2geek.games.mousemaze2001.domain.MazeDomain; + +/** + * Represents the animated robot. + * + * Creation date: (10/27/01 12:08:56 AM) + * @author: Rob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class AnimatedRobot extends AnimatedMouseMazeImageObject { + private static int idCounter = 0; + private int id; + private Point location; + private int shieldLevel; + private Thread controlThread; + +/** + * AnimatedRobot constructor comment. + */ +public AnimatedRobot(Point location, int shieldLevel) { + super(); + id = idCounter++; + setLocation(location); + setShieldLevel(shieldLevel); + createControlThread(); + controlThread.start(); +} + + +/** + * Create the control thread. + * + * Creation date: (10/29/01 10:55:38 PM) + */ +protected void createControlThread() { + controlThread = new Thread() { + private void log(String message) { + //System.out.println(new java.util.Date() + " (" + id + ") - " + message); + } + public void run() { + MazeDomain domain = MazeDomain.getInstance(); + log("Robot thread started."); + while (getInstance().isAlive()) { + if (domain.isGameOver()) break; + log("Robot alive at " + location.x + "," + location.y); + try { + if (getInstance() != null) { + domain.moveRobot(getInstance()); + sleep(1250); + } + } catch (InterruptedException ex) { + ex.printStackTrace(System.out); + } + } + log("Robot died."); + } + }; + controlThread.setDaemon(true); +} + + +/** + * Decrease the robots shield level. + * + * Creation date: (10/29/01 7:48:53 PM) + */ +public void decreaseShieldLevel() { + shieldLevel--; +} + + +/** + * Provides the animation sequence. + * This just needs to be an integer - not necessarily in the valid range, as + * modulo arithmetic will be used. + * + * Creation date: (10/26/01 10:55:18 PM) + */ +protected int getAnimationSequence() { + return (super.getAnimationSequence() % 4) + (shieldLevel * 4); +} + + +/** + * Answers with the image names for this object. + * + * Creation date: (10/27/01 12:08:56 AM) + */ +protected java.lang.String[] getImageNames() { + return new String[] { + "OriginalRobot0.gif", + "OriginalRobot1.gif", + "OriginalRobot2.gif", + "OriginalRobot3.gif", + "OriginalRobot0shield1.gif", + "OriginalRobot1shield1.gif", + "OriginalRobot2shield1.gif", + "OriginalRobot3shield1.gif", + "OriginalRobot0shield2.gif", + "OriginalRobot1shield2.gif", + "OriginalRobot2shield2.gif", + "OriginalRobot3shield2.gif" + }; +} + + +/** + * Internal hook for control thread. + * + * Creation date: (10/29/01 11:00:57 PM) + */ +protected AnimatedRobot getInstance() { + return this; +} + + +/** + * Retrieve the Robots current position. + * + * Creation date: (10/29/01 7:47:51 PM) + * @return java.awt.Point + */ +public Point getLocation() { + return location; +} + + +/** + * Retrieve the robots current shield level. + * + * Creation date: (10/29/01 7:47:51 PM) + * @return int + */ +public int getShieldLevel() { + return shieldLevel; +} + + +/** + * Answers true if this robot is still alive. + * + * Creation date: (10/29/01 9:38:38 PM) + */ +public boolean isAlive() { + return (shieldLevel >= 0); +} + + +/** + * Returns true if this is a robot. + * + * Creation date: (10/14/01 9:42:51 PM) + */ +public boolean isRobot() { + return true; +} + + +/** + * Kill this robot. + * + * Creation date: (10/29/01 11:04:18 PM) + */ +public void kill() { + shieldLevel = -1; +} + + +/** + * Set the robots current location. + * + * Creation date: (10/29/01 7:47:51 PM) + * @param newLocation java.awt.Point + */ +public void setLocation(Point newLocation) { + location = newLocation; +} + + +/** + * Set the robots current shield level. + * + * Creation date: (10/29/01 7:47:51 PM) + * @param newShieldLevel int + */ +public void setShieldLevel(int newShieldLevel) { + shieldLevel = newShieldLevel; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/ColoredMazeObject.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/ColoredMazeObject.java new file mode 100644 index 0000000..6b7ced2 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/ColoredMazeObject.java @@ -0,0 +1,42 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.*; + +/** + * Will draw the MazeObject in a solid color. + * + * Creation date: (10/23/01 9:37:10 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public abstract class ColoredMazeObject extends MazeObject { +/** + * ColoredMazeObject constructor comment. + */ +public ColoredMazeObject() { + super(); +} + + +/** + * Returns true if this is an explosion. + * + * Creation date: (10/14/01 9:42:51 PM) + */ +public boolean isExplosion() { + return true; +} + + +/** + * Draw image on screen. + * It is expected that the region to be drawn has been clipped. + * See Graphics.create for more details. + * + * Creation date: (10/14/01 9:45:16 PM) + */ +public void paint(Graphics g) { + Rectangle rect = g.getClipBounds(); + g.setColor(getBackground()); + g.fillRect(0, 0, rect.width, rect.height); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Exit.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Exit.java new file mode 100644 index 0000000..483c2b9 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Exit.java @@ -0,0 +1,52 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.*; +/** + * Represents the exit. + * + * Creation date: (10/14/01 10:32:40 PM) + * @author: Rob Greene + * @version: RJG 10/24/2001 22:58:13 + */ +public class Exit extends MazeImageObject { +/** + * Exit constructor comment. + */ +public Exit() { + super(); +} + + +/** + * Answers with the image name of this object. + * + * Creation date: (10/14/01 10:32:40 PM) + */ +protected String getImageName() { + return "OriginalExit.gif"; +} + + +/** + * Returns true if this is an exit. + * + * Creation date: (10/14/01 9:43:27 PM) + */ +public boolean isExit() { + return true; +} + + +/** + * Draw image on screen. + * It is expected that the region to be drawn has been clipped. + * See Graphics.create for more details. + * + * Creation date: (10/14/01 9:45:16 PM) + */ +public void paint(Graphics g) { + Rectangle rect = g.getClipBounds(); + g.setColor(Color.white); + g.fillRect(0,0,rect.width,rect.height); + super.paint(g); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/GreenTile.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/GreenTile.java new file mode 100644 index 0000000..3ae4011 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/GreenTile.java @@ -0,0 +1,27 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.*; +/** + * Insert the type's description here. + * + * Creation date: (10/23/01 9:38:56 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public class GreenTile extends ColoredMazeObject { +/** + * GreenTile constructor comment. + */ +public GreenTile() { + super(); +} + + +/** + * Retrieve the background color of this tile. + * + * Creation date: (10/23/01 9:50:07 PM) + */ +public Color getBackground() { + return Color.green; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/InvertedMouse.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/InvertedMouse.java new file mode 100644 index 0000000..8a7a9a0 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/InvertedMouse.java @@ -0,0 +1,39 @@ +package a2geek.games.mousemaze2001.mazeobjects; + +import a2geek.games.mousemaze2001.mazeobjects.*; + +/** + * Represents the inverted mouse image used for the life indicator. + * + * Creation date: (10/27/01 12:56:35 AM) + * @author: Rob Greene + * @version: RJG 10/29/2001 23:31:16 + */ +public class InvertedMouse extends MazeImageObject { +/** + * InvertedMouse constructor comment. + */ +public InvertedMouse() { + super(); +} + + +/** + * Answers with the image name of this object. + * + * Creation date: (10/14/01 10:31:56 PM) + */ +protected String getImageName() { + return "InvertedMouse.gif"; +} + + +/** + * Returns true if this is the mouse. + * + * Creation date: (10/14/01 9:43:11 PM) + */ +public boolean isMouse() { + return true; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeImageObject.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeImageObject.java new file mode 100644 index 0000000..423a656 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeImageObject.java @@ -0,0 +1,72 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.net.*; + +import a2geek.games.mousemaze2001.images.ImageManager; + +import java.io.*; +import java.awt.image.*; +import java.awt.*; + +/** + * Represents a MazeObject which is Image based. (Basically, a 'tile'.) + * + * Creation date: (10/23/01 9:31:27 PM) + * @author: Rob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public abstract class MazeImageObject extends MazeObject { + private Image image = null; + +/** + * MazeImageObject constructor comment. + */ +public MazeImageObject() { + super(); + image = ImageManager.getInstance().getImage(getImageName()); +} + + +/** + * Return the height of the image. + * + * Creation date: (10/27/01 12:47:15 AM) + */ +public int getHeight() { + return image.getHeight(null); +} + + +/** + * Answers with the image name of this object. + * + * Creation date: (10/14/01 9:41:15 PM) + */ +protected abstract String getImageName(); + + +/** + * Return the width of the image. + * + * Creation date: (10/27/01 12:47:15 AM) + */ +public int getWidth() { + return image.getWidth(null); +} + + +/** + * Draw image on screen. + * It is expected that the region to be drawn has been clipped. + * See Graphics.create for more details. + * + * Creation date: (10/14/01 9:45:16 PM) + */ +public void paint(Graphics g) { + if (image != null) { + Rectangle rect = g.getClipBounds(); + int x = (rect.width - image.getWidth(null)) / 2; + int y = (rect.height - image.getHeight(null)) / 2; + g.drawImage(image, x, x, null); + } +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeObject.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeObject.java new file mode 100644 index 0000000..529a73b --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/MazeObject.java @@ -0,0 +1,89 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.*; + +/** + * Represents a maze object. + * + * Creation date: (10/14/01 9:38:50 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public abstract class MazeObject extends Canvas { +/** + * MazeObject constructor comment. + */ +public MazeObject() { + super(); +} + + +/** + * Returns true if this is a bomb. + * + * Creation date: (10/14/01 9:43:27 PM) + */ +public boolean isBomb() { + return false; +} + + +/** + * Returns true if this is an exit. + * + * Creation date: (10/14/01 9:43:27 PM) + */ +public boolean isExit() { + return false; +} + + +/** + * Returns true if this is an explosion. + * + * Creation date: (10/14/01 9:42:51 PM) + */ +public boolean isExplosion() { + return false; +} + + +/** + * Returns true if this is a mine. + * + * Creation date: (10/14/01 9:43:56 PM) + */ +public boolean isMine() { + return false; +} + + +/** + * Returns true if this is the mouse. + * + * Creation date: (10/14/01 9:43:11 PM) + */ +public boolean isMouse() { + return false; +} + + +/** + * Returns true if this is a robot. + * + * Creation date: (10/14/01 9:42:51 PM) + */ +public boolean isRobot() { + return false; +} + + +/** + * Draw image on screen. + * It is expected that the region to be drawn has been clipped. + * See Graphics.create for more details. + * + * Creation date: (10/14/01 9:45:16 PM) + */ +public void paint(Graphics g) { +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Mine.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Mine.java new file mode 100644 index 0000000..85e1baf --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/Mine.java @@ -0,0 +1,36 @@ +package a2geek.games.mousemaze2001.mazeobjects; +/** + * Represents a mine. + * + * Creation date: (10/22/01 11:23:56 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public class Mine extends MazeImageObject { +/** + * Mine constructor comment. + */ +public Mine() { + super(); +} + + +/** + * Answers with the image name of this object. + * + * Creation date: (10/22/01 11:23:56 PM) + */ +protected String getImageName() { + return "OriginalMine.gif"; +} + + +/** + * Returns true if this is a mine. + * + * Creation date: (10/14/01 9:43:56 PM) + */ +public boolean isMine() { + return true; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/mazeobjects/PurpleTile.java b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/PurpleTile.java new file mode 100644 index 0000000..4179111 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/mazeobjects/PurpleTile.java @@ -0,0 +1,29 @@ +package a2geek.games.mousemaze2001.mazeobjects; +import java.awt.*; + +/** + * Purple (cyan) explosion tile. + * + * Creation date: (10/23/01 9:39:30 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public class PurpleTile extends ColoredMazeObject { +/** + * PurpleTile constructor comment. + */ +public PurpleTile() { + super(); + setBackground(Color.cyan); +} + + +/** + * Retrieve the background color of this tile. + * + * Creation date: (10/23/01 9:50:07 PM) + */ +public Color getBackground() { + return Color.magenta; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/AnimationThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/AnimationThread.java new file mode 100644 index 0000000..797663b --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/AnimationThread.java @@ -0,0 +1,39 @@ +package a2geek.games.mousemaze2001.threads; + +import a2geek.games.mousemaze2001.MouseMaze2001; +import a2geek.games.mousemaze2001.domain.MazeDomain; + +/** + * Insert the type's description here. + * + * Creation date: (10/27/01 12:38:44 AM) + * @author: Rob Greene + * @version: RJG 10/27/2001 01:02:48 + */ +public class AnimationThread extends Thread { +/** + * AnimationThread constructor comment. + */ +public AnimationThread() { + super("AnimationThread"); +} + + +/** + * Provide animation. + * + * Creation date: (10/27/01 12:38:59 AM) + */ +public void run() { + MazeDomain domain = MazeDomain.getInstance(); + MouseMaze2001 game = MouseMaze2001.getInstance(); + while (domain.isGameOver() == false) { + try { + sleep(250); + } catch (InterruptedException ex) { + } + domain.incrementAnimationSequence(); + game.repaintNeeded(); + } +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/BombExplosionThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/BombExplosionThread.java new file mode 100644 index 0000000..ecfdc00 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/BombExplosionThread.java @@ -0,0 +1,58 @@ +package a2geek.games.mousemaze2001.threads; +import java.util.*; + +import a2geek.games.mousemaze2001.domain.MazeDomain; + +import java.awt.*; + +/** + * This thread sets up the bomb explosion and creates multiple explosion threads. + * + * Creation date: (10/23/01 10:08:07 PM) + * @author: Rob Greene + * @version: RJG 10/24/2001 22:58:13 + */ +public class BombExplosionThread extends Thread { + private int delay = 400; + private Point pt = null; + private int maxSize = 4; + +/** + * ExplosionThread constructor comment. + */ +public BombExplosionThread(Point pt) { + super("BombExplosionThread"); + this.pt = pt; +} + + +/** + * Perform the threadded process to generate bomb explosions. + * Generates the initial bomb explosion and then delayed rings around that point. + *

+ * Creation date: (10/23/01 10:08:07 PM) + */ +public void run() { + try { + MazeDomain domain = MazeDomain.getInstance(); + Random random = new Random(); + int size = random.nextInt(maxSize-2)+2; + for (int i=0; i + * To implement a pausable thread, extend the ControlledThread and implement process. + * Don't forget to set a default delay in your constructor, if appropriate! + *

+ * Creation date: (10/20/01 9:08:13 PM) + * @author: Rob Greene + * @version: RJG 10/29/2001 22:40:54 + */ +public abstract class ControlledThread implements Runnable { + private boolean running = false; + private boolean paused = false; + private Thread thread; + private long delay; + +/** + * ControlledThread constructor. + */ +public ControlledThread() { + super(); + thread = new Thread(this, getThreadName()); + thread.setDaemon(true); +} + + +/** + * Retrieve the delay that the thread will use. + *

+ * Creation date: (10/20/01 9:42:01 PM) + * @return long + */ +public final long getDelay() { + return delay; +} + + +/** + * Returns the name of this thread. By default, it will be the class name. + * + * Creation date: (10/21/01 2:24:36 PM) + */ +protected String getThreadName() { + String className = getClass().getName(); + int pos = className.lastIndexOf(".") + 1; + if (pos > -1) return className.substring(pos); + else return className; +} + + +/** + * Returns true if the thread is paused. + * Note that this does not indicate if the thread is actually running. + *

+ * Creation date: (10/20/01 10:20:37 PM) + */ +public final boolean isPaused() { + return paused; +} + + +/** + * Returns true if this thread is actively running. + * Note that this does not indicate if the thread has been paused. + *

+ * Creation date: (10/20/01 10:21:07 PM) + */ +public final boolean isRunning() { + return running; +} + + +/** + * Perform the threadded process. + *

+ * Creation date: (10/20/01 10:21:40 PM) + */ +protected abstract void process(); + + +/** + * Resume a paused thread. + * Note that the thread must be in a running state. + *

+ * Creation date: (10/20/01 10:22:13 PM) + */ +public synchronized final void resume() { + paused = false; + notifyAll(); +} + + +/** + * This is the thread control loop. + * To customize, implement the process method. + *

+ * Creation date: (10/20/01 10:22:32 PM) + */ +public final void run() { + while (isRunning()) { + try { + process(); // <-- customize here!! + synchronized(this) { + while (isRunning() && isPaused()) { + wait(); + } + } + thread.sleep(getDelay()); + } catch (Exception ex) { + System.out.println("Exception in " + getThreadName()); + ex.printStackTrace(System.out); + } + } + paused = false; + running = false; +} + + +/** + * Set the delay used in the control thread. + *

+ * Creation date: (10/20/01 9:42:01 PM) + * @param newDelay long + */ +public final void setDelay(long newDelay) { + delay = newDelay; +} + + +/** + * Start the thread. + *

+ * Creation date: (10/20/01 10:24:37 PM) + */ +public final void start() { + if (isRunning()) { + resume(); + } else { + running = true; + paused = false; + thread.start(); + } +} + + +/** + * Stop the thread. + *

+ * Creation date: (10/20/01 10:24:46 PM) + */ +public synchronized final void stop() { + running = false; + notifyAll(); +} + + +/** + * Suspend the thread. + *

+ * Creation date: (10/20/01 10:24:58 PM) + */ +public final void suspend() { + paused = true; +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/ExplosionThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/ExplosionThread.java new file mode 100644 index 0000000..c4d5083 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/ExplosionThread.java @@ -0,0 +1,55 @@ +package a2geek.games.mousemaze2001.threads; +import java.awt.*; + +import a2geek.games.mousemaze2001.MouseMaze2001; +import a2geek.games.mousemaze2001.domain.MazeDomain; +import a2geek.games.mousemaze2001.mazeobjects.*; + +/** + * This thread runs until the explosion effect is done. + * + * Creation date: (10/23/01 10:08:07 PM) + * @author: Rob Greene + * @version: RJG 10/29/2001 22:40:54 + */ +public class ExplosionThread extends Thread { + private int delay = 100; + private int loops = 3; + private Point pt = null; + +/** + * ExplosionThread constructor comment. + */ +public ExplosionThread(Point pt) { + super("ExplosionThread"); + this.pt = pt; + this.setPriority(2); +} + + +/** + * Perform the threadded process. + *

+ * Creation date: (10/23/01 10:08:07 PM) + */ +public void run() { + try { + MazeDomain domain = MazeDomain.getInstance(); + domain.shoot(pt); + for (int i=0; iRob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class GameDelayThread extends Thread { + private int delay; + +/** + * GameDelayThread constructor comment. + */ +public GameDelayThread(String message) { + this(message, 250); +} + + +/** + * GameDelayThread constructor comment. + */ +public GameDelayThread(String message, int delay) { + super(); + MazeDomain.getInstance().setPause(message); + MouseMaze2001.getInstance().repaintNeeded(); + this.delay = delay; +} + + +/** + * Pause for a short period of time and then disable the game pause. + * + * Creation date: (10/25/01 11:49:16 PM) + */ +public void run() { + try { + sleep(delay); + while (MazeDomain.getInstance().areExplosionsPresent()) { + sleep(50); + } + } catch (InterruptedException ex) { + int i = 0; + // ignore + } + MazeDomain.getInstance().setPause(null); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/GameThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/GameThread.java new file mode 100644 index 0000000..7ea2289 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/GameThread.java @@ -0,0 +1,32 @@ +package a2geek.games.mousemaze2001.threads; +import java.awt.Point; +import java.util.*; + +import a2geek.games.mousemaze2001.domain.MazeDomain; + +/** + * Provide AI for MouseMaze game. + * + * Creation date: (10/21/01 2:00:35 PM) + * @author: Rob Greene + * @version: RJG 10/29/2001 23:31:16 + */ +public class GameThread extends ControlledThread { +/** + * GameThread constructor comment. + */ +public GameThread() { + super(); + setDelay(300); +} + + +/** + * Perform the threadded process. + *

+ * Creation date: (10/21/01 2:00:35 PM) + */ +protected void process() { + MazeDomain.getInstance().explodeBombsRandomly(); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/IntroThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/IntroThread.java new file mode 100644 index 0000000..c431f8c --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/IntroThread.java @@ -0,0 +1,32 @@ +package a2geek.games.mousemaze2001.threads; + +import a2geek.games.mousemaze2001.IntroPanel; + +/** + * Manage the Intro (demo) control thread. + *

+ * Creation date: (10/20/01 9:08:13 PM) + * @author: Rob Greene + * @version: RJG 10/23/2001 23:16:23 + */ +public class IntroThread extends ControlledThread { +/** + * IntroThread constructor comment. + */ +public IntroThread() { + super(); + setDelay(15); +} + + +/** + * Instruct the IntroPanel to perform another "tick". + *

+ * Creation date: (10/20/01 10:25:15 PM) + */ +protected void process() { + IntroPanel introPanel = IntroPanel.getInstance(); + introPanel.incrementTicker(); + introPanel.repaint(); +} +} \ No newline at end of file diff --git a/src/main/java/a2geek/games/mousemaze2001/threads/LevelTranslationThread.java b/src/main/java/a2geek/games/mousemaze2001/threads/LevelTranslationThread.java new file mode 100644 index 0000000..f25d149 --- /dev/null +++ b/src/main/java/a2geek/games/mousemaze2001/threads/LevelTranslationThread.java @@ -0,0 +1,68 @@ +package a2geek.games.mousemaze2001.threads; + +import a2geek.games.mousemaze2001.MouseMaze2001; +import a2geek.games.mousemaze2001.domain.MazeDomain; +import a2geek.games.mousemaze2001.mazeobjects.*; + +/** + * This thread will pause the game while the map is redrawn; semi artistically. + * + * Creation date: (10/25/01 11:45:57 PM) + * @author: Rob Greene + * @version: RJG 11/05/2001 22:35:58 + */ +public class LevelTranslationThread extends Thread { + private int delay; + private MazeObject[][] newMap; + +/** + * LevelTranslationThread constructor comment. + */ +public LevelTranslationThread(String message, MazeObject[][] map) { + this(message, 5, map); +} + + +/** + * LevelTranslationThread constructor comment. + */ +public LevelTranslationThread(String message, int delay, MazeObject[][] map) { + super(); + MazeDomain.getInstance().setPause(message); + MouseMaze2001.getInstance().repaintNeeded(); + this.newMap = map; + this.delay = delay; +} + + +/** + * Pause for a short period of time and then disable the game pause. + * + * Creation date: (10/25/01 11:49:16 PM) + */ +public void run() { + MazeDomain domain = MazeDomain.getInstance(); + MouseMaze2001 controller = MouseMaze2001.getInstance(); + GreenTile greenTile = new GreenTile(); + PurpleTile purpleTile = new PurpleTile(); + try { + for (int x=0; xRob Greene + * @version: RJG 10/31/2001 22:12:32 + */ +public class RepaintThread implements Runnable { + private Component component; + private Thread thread; + private int delay; + private boolean repaintNeeded; + +/** + * RepaintThread constructor. + */ +public RepaintThread(Component theComponent) { + super(); + thread = new Thread(this, "RepaintThread"); + thread.setDaemon(true); + component = theComponent; + delay = 50; + thread.setPriority(thread.getPriority()-1); +} + + +/** + * Retrieve the current delay used by the RepaintThread. + * + * Creation date: (10/24/01 9:12:16 PM) + * @return int + */ +public int getDelay() { + return delay; +} + + +/** + * Tell the RepaintThread that a repaint needs to occur. + * + * Creation date: (10/24/01 9:19:23 PM) + */ +public synchronized void repaintNeeded() { + //System.out.println(new java.util.Date() + " + repaint received"); + repaintNeeded = true; + notifyAll(); +} + + +/** + * Control the RepaintThread. + * + * Creation date: (10/24/01 9:15:14 PM) + */ +public void run() { + while (true) { + try { + if (repaintNeeded) { + repaintNeeded = false; + component.repaint(); + } + thread.sleep(getDelay()); + synchronized(this) { + wait(); + } + } catch (Exception ex) { + break; + } + } +} + + +/** + * Set the delay to be used by the RepaintThread. + * + * Creation date: (10/24/01 9:12:16 PM) + * @param newDelay int + */ +public void setDelay(int newDelay) { + delay = newDelay; +} + + +/** + * Start the thread. + *

+ * Creation date: (10/20/01 10:24:37 PM) + */ +public void start() { + thread.start(); +} +} \ No newline at end of file diff --git a/src/main/resources/images/CancelButton.gif b/src/main/resources/images/CancelButton.gif new file mode 100644 index 0000000000000000000000000000000000000000..1ed4c91e0a3b83de195281f914731a2336d49c86 GIT binary patch literal 1397 zcmZ?wbhEHbOk~hw_|Cxa|NsB>>(9r>&$qYl$RZa;SmCgKUo+V7z7z~7=QqjCm1;XGbnS&cx+g3 zu$eW3pauR`J8D zYb2*CC0G??gtx{Yj1%z=TM)?-SDF->JyAD&N5<1jYj^>c+8P6X%_L*vLKy&A6PtY_Ej8lhQT|Wk2Ja63Ss#wPkbrEh4`u_7pz6qUa>4v^-_1 z&odM8ngFfu^CuWSnh`L~CwHcJPgA30%9P|R&PR^joNfUO?h9w$sf&4*v23<`7ia3M zVzDW+D=c^;g_(3;{k#^)eUojG-~Fd-OXfAd`x)yv;blt7vc9e#qJcat(+`x-*ypLi z#JQzJW>Mg}Ad$oc(VkjbetdG~Q7i&aw!EC^bMw|rhl9OhA?q!+mT7kio-m7QKOV>- y$F#w9f>Pl8)JT!mi$>4hZhz3G{cgvTY1!{~zF4;U-L5y=UccM@VUmadgEau`VEd#1 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/DefaultButton.gif b/src/main/resources/images/DefaultButton.gif new file mode 100644 index 0000000000000000000000000000000000000000..adf1c985d3675873dc72cc56cc3f5f2d4dfaa030 GIT binary patch literal 1320 zcmZ?wbhEHb3};Yf_|Cxa|NsB}`)~5|=QA**$;(&f=daY)Z+id!Ykd6t^XDJkzyGGb zev`ldRD1iL`SXviUw^*8e-BX0C>RZa;SmCgKUo+V7z7z~7=QqjCm1;XGbnS&cx+g3 zu$eJ zaO!QJZ?em-2C0}j%x+*lqduXLfp5WrlFO>k78LW=xhAGvN?f7Pem(blVqM4I@B~l& zCUeDJO}!mSWvaa27y0m>i%4{2TCp{uM19|Nr9SCTH{zPUw020=|Kj~JqeX3=%G`-R zf2ybC*zOWn&3tbA;$hWZ-4{_|Cxa|NsB{_ut6NS28f9>FYPu*KgwI&(F_axqkim_wT>XpMUiH z`A7Tr-;9r+Z*Sk@??1J_e-BX0C>RZa;SmCgKUo+V7z7z~7=QqjCm1;XGbnS&cx+g3 zu$evvlqVSp3Qa3zGmB!PKD=t+ z&}0`VaM+e}VN(ikiHt;<&dokPB?i+hBb~4oejhHM%n8YNcC!Aw_4LIx$AIR_{qL@N z7bG+9Waitv)?4V%LG}!Dqi5L{j8aZ^@8`3tU|5~BL56jKseB+2<|!}+9IkZ%Gj#6a{DxYzMpJL&PshN0y@={T9UeI6OS+I(%X0AQM*x^ RdvY(U?1KZ$-mEMP)&P?|hbaI6 literal 0 HcmV?d00001 diff --git a/src/main/resources/images/HardButton.gif b/src/main/resources/images/HardButton.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0188754f5807fa9a52767363eef9d16280cbb6d GIT binary patch literal 1151 zcmZ?wbhEHbv|vzW_|Cxa|NsB>>(A%suiU@?=KJ?w@85sJz>p>{U&+s(Z*Skz-@oVl z`A7Bjo953y8XrGjU%$!Ue=1PRC>RZa;SmCgKUo+V7z7z~7=QqjCm1;XGbnS&cx+g3 zu$e|yo=nED7a5n z!#u0ySmVxBvK8V_Q<|8%jBf0y)J~o>UD+Z*pfWR+Iga;HPQv%ijZ@fIXS?xkRljz8 zEvs3b>}+lSTZzH{+jh<_i@lz~eQIA-)Q^CfM?HVLqU(9CbJ6;=HaiIHf~?eb4REAi@u=24R7i1-anRJy&@OA{HN)h`ZCiEa-Liw yA=6`JH66qfIV=krO8y-D+Tc(cxMEJMoR#XM4wY#ck2*D$t$5U>vq(aK!5RQe+J(me literal 0 HcmV?d00001 diff --git a/src/main/resources/images/ImageManager.properties b/src/main/resources/images/ImageManager.properties new file mode 100644 index 0000000..45dfa3b --- /dev/null +++ b/src/main/resources/images/ImageManager.properties @@ -0,0 +1,52 @@ +# Logo +MouseMazeLogo.gif + +# Buttons +CancelButton.gif +DefaultButton.gif +EasyButton.gif +HardButton.gif +OkButton.gif +PreferencesButton.gif +QuitButton.gif +StartButton.gif + +# Intro sequence images +OriginalMouseMazeGameShot.gif +OriginalMouseMazeHelp.gif +OriginalMouseMazeLogo.gif +OriginalMouseMazeWin.gif + +# Mouse used for lives left +InvertedMouse.gif + +# Static game images +OriginalBomb.gif +OriginalExit.gif +OriginalMine.gif +OriginalMouse.gif +OriginalRobot.gif +OriginalSkull.gif + +# Animated game image sequences +OriginalBomb0.gif +OriginalBomb1.gif +OriginalBomb2.gif +OriginalBomb3.gif +OriginalMouse0.gif +OriginalMouse1.gif +OriginalMouse2.gif +OriginalMouse3.gif +OriginalMouse4.gif +OriginalRobot0.gif +OriginalRobot0shield1.gif +OriginalRobot0shield2.gif +OriginalRobot1.gif +OriginalRobot1shield1.gif +OriginalRobot1shield2.gif +OriginalRobot2.gif +OriginalRobot2shield1.gif +OriginalRobot2shield2.gif +OriginalRobot3.gif +OriginalRobot3shield1.gif +OriginalRobot3shield2.gif diff --git a/src/main/resources/images/InvertedMouse.gif b/src/main/resources/images/InvertedMouse.gif new file mode 100644 index 0000000000000000000000000000000000000000..91c109b3d7badb6b803e9893e20c41e5ddb647ac GIT binary patch literal 914 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 ZvM=FxU*gvOB-{R!)BP-@DhLGF{14^N7o7kA literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OkButton.gif b/src/main/resources/images/OkButton.gif new file mode 100644 index 0000000000000000000000000000000000000000..3809cb49be14208dbb41191e7403989d03a68a49 GIT binary patch literal 1124 zcmZ?wbhEHbG-A+W_|Cxa|NsB<=O5MAZ@Pc~&HMLX=g&XNz>vnzpKov9RZa;SmCgKUo+V7z7z~7=QqjCm1;XGbnS&cx+g3 zu$e(BZ}4wU3J z&7HknFML`Ar&Yqw2Wua;H`Z=z37E0*$eCG@w~qXd%zrVRLumqA&MnoJ6D;NHeD?k- zc)eUJef7RK0$Y-IZK*W>;yYvgyIV8zznfOaSU5l0$;?Gc?xupA!^$5asm!@3xDL9BL~b ZH1U|dc+f21rtz>vBrHSGk&%(X8UQB>hhqQ$ literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalBomb.gif b/src/main/resources/images/OriginalBomb.gif new file mode 100644 index 0000000000000000000000000000000000000000..d5abb4c3b9ee402f5b6cd028954a22dd2f7cccbe GIT binary patch literal 941 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 YFE{SH?)INPc=`9$s}6s3@3yf2Kf%hQGXMYp literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalBomb3.gif b/src/main/resources/images/OriginalBomb3.gif new file mode 100644 index 0000000000000000000000000000000000000000..b83d9f2585123f35b922cf22b25b0142ba04712d GIT binary patch literal 950 zcmX9-O~{~Q6g?S>Sx$YZG3ZX;Br(l~$;9TAk1?}hVZmbR&X>)|Mxx2;pQUCJYG%6qpD^FhUU%<{^U$P9!23 zsmKYLpCN@N3Q>$w)I=ki(Tbk1(qW8ZOarU5AoH2Vh;H^bUvV9g!vvE|F^94zUyB+R zSY(McY_Q1|duaCt7;z?T-Q7@PGLXRxWlTB`LsH4fL?$zpIVtC4Dy1e1SN=Rlh;DG5ue8pnprT5uQA16&)FV&HMqN8o z9+6$T5L1B)R;XgibF+1Kb1G5EN>xq?B}Zb^sX`U2R5jJ8X0@uPJb8y_{+agJot()r z9q3?(I;On~j?;=bo#4J-u!dx>|YnZd*{%rhhDz+ z@VVpXx8At%>N`F@`Tbk>oqy`9ohRP=>3x25_U>;!Ir!tJr=I!a^3E%pC(iAA_vc5C PJ^8^epKt8C0(brgcle?o literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalExit.gif b/src/main/resources/images/OriginalExit.gif new file mode 100644 index 0000000000000000000000000000000000000000..bb646072b365fb648f264385d6764b5d60577bc7 GIT binary patch literal 895 zcmX9-yQ)xE5M6@B4W>{`kwDP7Dk2gBF(DB|Se4#uVwKkkMg-|JN+>xJqfQm7Sf#3|Mm4KdJ>|(eJoC@A$L{1zj_E)LJJd1l zU2vRM#OXvQJJmTYw76tyy3oZgbxk+A*{$wrZ<7aNPcv(kz-0()nY=e%5pTfSFLJr$ z8j|PX=$-6ZI&oRoGH;)@WW^S0O{O=xLEZ0Cziocpjdi|RkM⪻}YhxueWyU>5Yy3 z$1nY}bNBhJy@${Jwe|Sk%U{3z{>qzU`}Ftk2fn+$`{%0K0p5czkly--ad5t$shMG+}yPbr#=B!EQ5Cd literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalMine.gif b/src/main/resources/images/OriginalMine.gif new file mode 100644 index 0000000000000000000000000000000000000000..8b68f5d311cbe7be07f06a75584f432aedd73056 GIT binary patch literal 889 zcmX9-y^2_65Ius$7Fz^Ok%UD?ge5E~LM*Z%gd>Q%o5n&2L@Xw4z-P!oix3oq#U`@F zxXAg93^up#}{!(LxW#V8jSBVMs8bz(gQ|5sH{F4;fT&A`!_*MNY{4 z3@J2Gh+>qYCK}OB1^1c zgH5*BL%TP?h%;&H?uHVRfedCSW72sTl1fe{GMTB&NjWD|DK%NhVwSQd8`;cO_M{WF zs8NnH!cw#XwI4VRJGU|WSu&SU*TFPKbc5@BrFBLH6;)D=8fvPg9(hVO>e`v|i0smZ zmQ;AAes&YywITE8z6{=XJs;Ndbt5rSa$vZsr&$P$x=i%s`>{>c;S=TaepSEPh7HUnVH@ZRH?^3^g`rn6G=h}L#e*znK@WIB`{z;wv zwDIxI_va^nJb!rMv)f1er^hdTzV!M1f6h;zy!`dbJlZ-qeER3%)xGb&y8P_lzka)Z ocl(!vZ{ME%zWc*Re?NW`-yGd~@OpFS;`XcK8(;poxq&a<19TUG&;S4c literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalMouse.gif b/src/main/resources/images/OriginalMouse.gif new file mode 100644 index 0000000000000000000000000000000000000000..9fbaa655b130a656f3327bd7642638de4e27d7a0 GIT binary patch literal 914 zcmX9-J*bdn6n?rk+)cUBpeP)>>PXZO8i~kP+0fPX72q6Z( zBSC?K1d>Q0XBCQ&pg{pelu&~PnrNX1V=!WbnJ^?6P+%eu!3af6n1>81IFX2Cq#`F| zeufm9C`2(zQ4@`5Mk{*4N{2CuF%7KJg3Md@X8NV38%( zu)!u;U zLQDlJSfPq3&&}4|&8b8sD^)oqlpKjsrwUc9Qq@$Wn$@bF^5h+!`DfZ=cXB4jbfAMB z>X`N}I8H0#bfS};>YNr@TrxFX=wg?;rW@VtR`;~G$pf*cnYBvbGK95E-W#uoH(>1- zxm%6ue>z}~pXLw=r@R@t{ z^H-ZMz53DKz1zQDIIw;8)|nsg{C;U;&i!}c%9EYT`%irN$4|R=_O4>*>$e_$u>ITh z*AM=3>*ChYcW=J2`}p%4_n-3G@soF7dHCp)_ph8fdFbuG&wqOQ+aq6W{PS$>>PXZO8i~kP+0fPX72q6Z( zBSC?K1d>Q0XBCQ&pg{pelu&~PnrNX1V=!WbnJ^?6P+%eu!3af6n1>81IFX2Cq#`F| zeufm9C`2(zQ4@`5Mk{*4N{2CuF%7KJg3Md@X8NV38%( zu)!u;U zLQDlJSfPq3&&}4|&8b8sD^)oqlpKjsrwUc9Qq@$Wn$@bF^5h+!`DfZ=cXB4jbfAMB z>X`N}I8H0#bfS};>YNr@TrxFX=wg?;rW@VtR`;~G$pf*cnYBvbGK95E-W#uoH(>1- zxm%6ue>z}~pXLw=r@R@t{ z^H-ZMz53DKz1zQDIIw;8)|nsg{C;U;&i!}c%9EYT`%irN$4|R=_O4>*>$e_$u>ITh z*AM=3>*ChYcW=J2`}p%4_n-3G@soF7dHCp)_ph8fdFbuG&wqOQ+aq6W{PS$V_|(Z!(xjUFYg76jfqio=P!^kdW^5aNL#i6BrYC>%}_ z1VLa+UMU+s32AXK02V*c|gqbiT7*Jp$5WxsVOqhoZDmamdWTYY| zWPXMenkYmuN>LMyXhth~!b*oRiZKnW(t^xq8Y8;d-+aY&L=F>7GQ}Lqo_sB8SYVMQ z*08}QTkN6T8(_qlv~_nwiOE0)Gn6suJPb)CCli^>ROY0dlc|)NEMzfDS(A-yW-EKr ziCWYs#~EQMT7lXR9EY9TnEfo7OQ`E$8Y8;Fb-vO%qk@VmsYVSo)l!c{j=*x5)#srh&N#E z7r9(=4axIx^iFmyow%%PnYT|{vSJIhCes_;pze36-;Vyf59^#*kM&Pr<5TR}IDFww z-Tz|a!12qE@BH}i`u=0@-@5SI?MGklosa*!e&hM(H?O?&`O|w_w;$ic=9g!lY#;mm zyOW0=-1_R(qaXb6#@63gzrXtrzde2Sm)D>CxpVQxyJuf}d-uvm=YKwO?cA@Qo!Z_0 P>EO<#XMg38| z1Sb`T#?yyz1-G2Vsp0+u5d^2_N5A3a<@cWRe4X>2Ik)w}`=134;cxtZ2nZMi5JU(u z@Er*X93+rL3OTD#gai!=D58WKG|)r~Js5)#Bg}*$!GHo2fe1z@V!}LRP{D~rBqJ3$ zA@eh&&_p4MQHq*qL^E2^6IMEmQH*I|l@??^(-_gs{^l#LBXXEvk}2j;_T+0(!vc#e zv4#yc*Ii>?0 z>`=$FcfoO55vLQK>{REp(BhJ*=|UH~)HU7cX1BVhy-gm7JBMDS%e;Nsk`-I1HJRS%26ewn{kHkfeynqBJ=Q;gjjPzV@z&V~ z_3Jkq2abNa`{2&+H(on@{?^%tcb{y(GN1o@W9Q}8cdvf<^|N0t-QE2jTh~uM{rK=7 zKOR5$+pTY3-@NeidzW5Z`{~hN{Ncpu`$wMsdHLebN2lLBwfDu9GxrXC`Nmg!?;L%; Q{mI+6AK!d;?}>2YKR@z~j{pDw literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalMouse3.gif b/src/main/resources/images/OriginalMouse3.gif new file mode 100644 index 0000000000000000000000000000000000000000..26301b9f05b8c9afa6ab506e4a7ca15197392968 GIT binary patch literal 909 zcmX9-&#O>n5Iu&(%T1!Ipk&0AqDwXCL1*>S$WQ}8a4|0PkB9?;5-+4&D2UJ~?%F7B z!qu1x3ax~eg&^+Six5obqi=D!e0S#jnz>({-1_|Z#lUBHhyM=&0fPX72q6Z(BSC?K z1d>Q0XBCQ&pg{pelu&~PnrNX1V=!WbnJ^?6P+%eu!3af6n1>81IFX2Cq#`F|eufm9 zC`2(zQ4@`5Mk{*4N{2CuF%7KJg3Md@X8NV38%(u)!u< z?4jKoV8ofUb$3IF$v_4(lriZ%3`r#?6Pe6Z=A@jHsg#;5WHC!wlZ|X;ULQDlJ zSfPq3&&}4|&8b8sD^)oqlpKjsrwUc9Qq@$Wn$@bF^5h+!`DfZ=cXB4jbfAMB>X`N} zI8H0#bfS};>YNr@TrxFX=wg?;rW@VtR`;~G$pf*cnYBvbGK95E-W#uoH(>1-xmejI{|NM0R^qX&Q9y_J^m=KYac2+Bd(R+x+P0!N0aQf4lVe JuA_l3{sS#$i^c!| literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalMouse4.gif b/src/main/resources/images/OriginalMouse4.gif new file mode 100644 index 0000000000000000000000000000000000000000..a120c7311ecbf3a3d3b5f9b6793a9ccbee54469f GIT binary patch literal 913 zcmX9-zpIdC6n<_r+^taC435~+MTe$Bjh-N`+Ez;t4#z27+--=b0v)8FAJ@eTp6(LS za@!hDny8>HL4%WvOMifo1gGc4clh{tzjK~n=X|HnZol>B`M|6A2hR@y0fPX72q6Z( zBSC?K1d>Q0XBCQ&pg{pelu&~PnrNX1V=!WbnJ^?6P+%eu!3af6n1>81IFX2Cq#`F| zeufm9C`2(zQ4@`5Mk{*4N{2CuF%7KJg3Md@X8NV38%( zu)!u;U zLQDlJSfPq3&&}4|&8b8sD^)oqlpKjsrwUc9Qq@$Wn$@bF^5h+!`DfZ=cXB4jbfAMB z>X`N}I8H0#bfS};>YNr@TrxFX=wg?;rW@VtR`;~G$pf*cnYBvbGK95E-W#uoH(>1- zxmz}~pC2VXSKC@rH zeYtsX>)gHlA8ucL`RMz*XMWkcbM1w>_}|rU9&dmB(mS6$`1OOmd*5RF%BlMw9{v6L z@mFr`zJB1y!yEDT-fNe?`{a-BPk#RN(6c|Eyt{ks?4$QSK6v5o7uz?tc24a4egDUg Semd~gr*HiH*R_oeoctegV~(K! literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalMouseMazeGameShot.gif b/src/main/resources/images/OriginalMouseMazeGameShot.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe1585fdae526ab80cbe12dde212e43596527ac8 GIT binary patch literal 10272 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 RYz)e844Z9SIeP|>{U7q#iNXK? literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalPlayer.gif b/src/main/resources/images/OriginalPlayer.gif new file mode 100644 index 0000000000000000000000000000000000000000..237af014ed8dc6d7fb8b27e01565bf2ad7b82994 GIT binary patch literal 903 zcmZ?wbhEHblw*)(_|5gDdqS?4P7grnL&!Dr>mJBs?iKqZJ251 zJnc+pvHI~zriE==JOf^M%$MYT zIU(~iq|ihmicyN1Xhbtw(GylWj8TkfV3ihRKGPV{&Hm;qt|M}oV3H~3Q1;|&QNsd@ zEU|_SHrZki?cM+*&ZMoo8%j(DGMJ%^N#|imDmj_RWTrAF<(y2V)MO!xS<0GhWHVdY zlTOs4Mmf$1OVJ9{e&9Il+{Wx@$y`ER2h$kQ4X*Q*))^I4R7o{zsHv8ErW)0(R`rx8@9@k&(;mB%GdZRM z9qdrYw0FUAS`nuco$OTSw9w*`sp&!&yVNz^=w`RNr@c)ch&|1$RRWhGtYz}vctyMc zYrn|ll50qwhog70Yw5&gUCX?E+L9Gps5P11=mvGaOa1ojzX!3-bL+AG32c0X0~=3m zeO0$U-Z-@R)`!2}`0nDPPaeIn^~a6dmmhn0`}0qK+`V<>@rOS6>xn;qzO!@e&70r+ z^I3j>EzaJ&d+gBmYk1*}d$-SBedmXrljlEqWbgf7wsuav{`|{(`$xY0^7P@K_Fp;^ hcXrRbxBc#={on3?advm}`sVRp_r5;&z=H>I@;}{Dl!E{O literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot0.gif b/src/main/resources/images/OriginalRobot0.gif new file mode 100644 index 0000000000000000000000000000000000000000..5e5d7121785db6943ece7e7b137b540a9892b97b GIT binary patch literal 926 zcmX9-Kd6v(6g@%EBONT4QmI=*NHqnKB*_^fUo}L822pf_k`^Z+goX|z6@nnIH;Ll4 zA?O7Wv^HGng%&L}H77Jz2-S2uKl%+HAHVP3^Y7m8`18*ldFrhP@c{nD|A&BpK>$I7 z5Ch+lpuj-_Nu-do3PniJpnxJus6hiww9tbw7%{?37!nL9FcFAggd!%)Lk1O`NJKJH zkrOgMLkdk4q8O#9iAFS|6+L04!x+Vw23Bc7<}-~E-Ry6^;yNOS2_~6h4rNci7Bwue z$P#PVV3RHO(C!T|;!N7QyP?EnAcGmom~__~OlB%`QqIX#N=+8Bn5C@AMmDpR zJ?TU(YLw%QuoSI8?FWv-&TY(omdqv8buf()-QYT3X`N9)MU_;ehMH=rN1l?6x^|{K zBD-`UrUDhLP{owzX6x?eRHBlVs+M=_g(_C5YN}DqYE@5p@($1ZGwrcEIg?{L z(7_IMOnVm`rxkHJ(aBDAP75tAnVK$iu}fXkjc#_Ud)nLNf!Nc`S|xB9!dfQpjaS4Q zu=a~wF1d!}c{q9}yOvH|*0s#rr!85rg<6y8jc!o)yVP$F{d*_Yd3-(AKY@++amU7? z&9CeFha3AJef{hoSHJss-~ErA+x+wD?)iK6oVxtU&)2SBxc9F2Zr}IUt(#kiU)lNg zpNskZcD%Xs)8YN6Uc{3x|FZk;r*GfbI{Lv!dw)Fh`{vd&FFmpS!}i0+KRb5i(zAEp m{(SSx6JPwc`}Fo>H@|xAjTcTIIC<;WZ{B%z=fuH%IQk#|)s;E` literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot0shield1.gif b/src/main/resources/images/OriginalRobot0shield1.gif new file mode 100644 index 0000000000000000000000000000000000000000..29e89a21eca9e5003517ef3ce64431bf9079c93d GIT binary patch literal 979 zcmX9-O^A?X5PlMqJ#0VT1Y;fd(j_Akwm_62Olt|^lUG9xfi|K4@v8+qGpg5(-y8;zn!HO=T=tCyE5|v)b%C16{SFx%~+oXZW zQ}FC2chk5ywB`KCrX%fBA1*(3P>TUJC zr5NXl@fiOECKmC)#A7eKRXDtC`P9 z*l}rg=dCp#zVzhF7vH>c=KCKnUbuSXwHrULx%}%td%r#Q_`iRzJo)J#@9tl_{-Fu1 F{~t5ruAl$_ literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot0shield2.gif b/src/main/resources/images/OriginalRobot0shield2.gif new file mode 100644 index 0000000000000000000000000000000000000000..dbe31bba372e0f71893575e01f92f6c8fd43e83d GIT binary patch literal 979 zcmX9-O^A?X5Pl4`J(%fDDAsW=T{6;O3nY1{{8>DxnHP`qBV&IY<*8IUx zaX@klBKJ_~L2^Kf2=!1<2dRT#hYIo_g%C{7OYh<1j=Xfv46EX>-( zLmI=_<}jyun74)aX%QA}2}@drWn00DR$%Ts18j@MpfIL8j)P85S@lJrbSw(<|gavW~U>a>5<+U$WSCg?M!4cGcr31S~fT|Jj%NQ6&y07D^bbHsO&0Ku_~&%v`rd_ zJavy%0*4`tWzybgMYI89zsTW|V@R5ZqF1tG>4L+04D<3SOHwSM(js zsu#~ce{6EwYwyi|I5l%(YUOh;pPIAlr&u{-|ozrAVE~%ybpmH1UY)OOh#e(da}z5z*3gw`VphW7M~Hli2B| zi&3V_baAGoNu;jown)0F8P(P4`PuK{_4>W%JpaylpMK`4g9l!D0Qch`+&lyX3<3xu zgc$ga1O*NfNFs%tRVYG&1_cyRLJb;dqJ_6W9mXieG_XnwGM{OT=w^TO71t3tOfbn5b0~ZAwWwi% zMV45@2AgcLhjwp(5oglY-3=us0~yRv#-#HwB$b>@WHM8klX6a`Qfji0#Vln_HnN$m z>`5nTQKKAZgr#T&YCmusc5Y+#vt%xzu7hce=myvMO6!aYDypO!HPlo~J@S-n)U`9^ z5!s~+F%_s_g({{zH(Pf%rxKN{ROOUVawJBbDpavbRa1>>R;zl-lXrOLpJ|WX$(bC} zfev=4W7@mmIIW1&iB5K^b6RL|$<%bAi(TrPZgjI--P7JC55%5k)+&L^5Y{qzZ@ePj zfVE%ba>+F$&%@C>*|l`yvaV&`K5fa0E!3J!Z*+sY-=%(g@V{MH=i&8O{{%LLjm`VE zF4vV)n|t;jedn)>U%$Ki-o2-{{=Rti?CrO1fBfE$pIkY2$1TTi+;jc6Ydia1xb)S( z@8>rk#>n1>fA!m)LnqGM_T5{*Z|yw({38$jdH&ZYKE3k1l-q#b+;_+StIM{{hcImW2QS literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot1shield1.gif b/src/main/resources/images/OriginalRobot1shield1.gif new file mode 100644 index 0000000000000000000000000000000000000000..74a287cd0ea871cb881782a5bd4c7c0f509c8294 GIT binary patch literal 979 zcmX9-Pl%Ug5PkxQALK!6(+*-IvI~h4vmKC(SdFgBxndjo574`Vb&%d z(ip}zhdIr|ye-5}i?C=*Skf{q+X_~+3ad6LZCZ!5XdsmmBtFpyQO)|MD~=On(?KUa z=*^HPT?eC?V3HZkW`RXku$po&fDU%Mtg9R0Xg9dgE!^6bhaefwc85FN!@WI}lc>U@ zJ>f~u@N6%5(JQ>#m8e8@cq=0eMI%u8f#Q&J8IzwOa|l%(L?c8ss7_ZgPDdh=krCNZ zh+;#)%TUI$DC^QLC{8J2m!q8JQQj4(;E)+ziAq*RWmln!RZ-QYZPGyG zse7yvI1FJdllDd{q74}PMGlu7L()7Hy^}Fty)eJL^6jR>*U$FcE8k3> zy}xkgxwkH?tX=v1#_Fz@w;aEBd-lL5I}c4~zWe*~t z>7|2nuTN%X-(H(Pzqsd*JHIbqeC@02OOMuf{PgME)(dAoT0XpR<=DaZ?oLj>z^uW>|SLn2?$0jd%Nu>7JVHT305;X`y zq6VT^h+stz=AkA9NedM65Wj;LFX>4tiA(JHLkq_k-r)}nz_N|5+OBSbapo31!ckWB}j z^q@CGo^&0IW`ap(Fq;JyS;1<`y#PAc?Xs?JgrnWyMz?TlR~~|7INKfWbPxCTP)?!> zkM@KoJ;SrT;6<_NJd6v zMY>=!v)atulHQ1nW6EM0I|k6~UuWl4%9RGLIDbb+d0rFz@- z&t{DC?0AfS0+S7Fn(Wwr@A8(lN4D+UeCkwQet+xkrR7(*)ej#&wXm{!Ve8>5Cwu<+ z^ONnj7f(EX@XYG^*)M-u+wEYxrTUxVs{@Af+ zVf~lSpE)%D(qv}twe^M5OMCD9`uoafFMfMv`N77nA3vR+J#*rNmBWi?j~zOCbGmwW z`Q+Q*T)RJ=IdbFlyT>2Ab#-~;*7t87pUy3PeEZVHk7lpm|M%S2)1RN%`{-j6yzn0> CW3Ms* literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot2.gif b/src/main/resources/images/OriginalRobot2.gif new file mode 100644 index 0000000000000000000000000000000000000000..09c1394b4e65d5783c8e8264891a80a24ab1efa3 GIT binary patch literal 933 zcmX9-&#O>n5Iup|gAytUQo^QjzB`(lU~yU5AQ_K#*6v5=Us$ zYm*Cc(_$p0$D>XD3qgxk6+*R|&PU(ka{2De`89K&KmFX($KQMmhwwN4KLi8}0th06 z82F9^1r8EOB88k)C_;h;1r$+24H{^og&vH-h!JMOkYGT8i9iG+6ft2QGN|B0B9f7c zoRIk$QfQ(O#VAEhG@==;=m{$w#wf-#uu2OupJ|NfW`FY)*AY2PFv%2iD0}j?s9}Lc zmRQ3En{2U%c5i?YXVTW)4J9T68O%_|r1LN&m7GjuGEx>F2s-zk<)Kp77@|0}UwKL@r z*`*6H6{ui^DyBR)TX#375|yk}<&;ozBu1SoRIy4`Q;lj?t9r_lcX;NXX^-8>nHDuK%o)-ri-ydvI! zwO{0N$u%U;!_hn0wRGaLu4UdnZOMu))S66hbc4FzrG9(--#u98iS=0j1U5dzJsXd1 zeqT2~+Sq^ewfFzH^5dru960>(=ATz?eg5Em=f3{zm#a4~K6LMeyN~?!>(17Zm$!fT z=ThGOGTzw!`N;lrFXE}QcW%A?#almZo&4aF`*+X(wz+lcr6=#6K3iwLIehup?Png| t-uddpwHL1M-Z{E+^_6emef{8t@1DJO{QR*qufF&D?u~c$?cIZu{{bbem+=4q literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot2shield1.gif b/src/main/resources/images/OriginalRobot2shield1.gif new file mode 100644 index 0000000000000000000000000000000000000000..04d006566974daf83c53d2e56bcf2beb2e875268 GIT binary patch literal 979 zcmX9-ONfwV6g|p-1CCMQLh#WQ2^G{Q@@NF`ga= z2s8{ZhY{A$ojaWHMgZXmB6<|kL4u70(vd_q3MfYr)o6h^n&>t`!VNUE8O+>_W^Lke zH>Y`9z``wP(MIvRk;b-!rCZXntzhL=v}%*mc57OT22v?O;uDP!)vRy2@^R?i9`JAv zdbCrXbWLY_!qYwJ*ItXDko7f z*pZ0zNJe%PqCARG9ZFQ9n$gM#L(vFSexNwyT*l;Q$Q(jd2hj*o4XV=>$7v>*&Lp#0 zU^$DdrlusLs_jmVNG?@~PD7ffF|AW`lXZ1_XCT8fn9)fj6^T$g6PcdL%+5lVXECc& zlUI1+?=Fp9$%!0YhB7Z>S(kP}aY~VQ1uDFP6RQ)Q|+r}po z7-#EvjDG@?H?VAS-R9%Pk5?>PbKu~OrSCp@cGEL&UfsTtr`PN}_QmGsF5NxX`!-B` z_2q-vvlDX{Za@0_y?cuawp zn|c4@?Ahh>|DK;dbZO?Z>%UDeT>gG(@7G6vdHvRv`NgTV7x%9{aqY)*@80_LjYqq- z{dD>L`Pn;v?$~zt+Z7AHzqoJVueWmU;gQ#-K6>!Zol~Fwx9ao7>kn_P-nnvW60iIZ DcMYmI literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot2shield2.gif b/src/main/resources/images/OriginalRobot2shield2.gif new file mode 100644 index 0000000000000000000000000000000000000000..d994f393e218ebacb9cb3523fdbf75b98f2a1eca GIT binary patch literal 979 zcmX9-O^A?X5Pp;e7h0vFgJ9Z-1a66Fg873mi?*xM9@m2eO+Scr3qg<$J$MoHpm^AW z5X>rQQiy>bLeK%Ty4W>{3WPL?4jzKgL(}upd-(WxznSN6=9@b(yW`FGUcoy2ga3~M z1R4gI!w75W&K*v8BY~V(k*G(R80avBc^Jbwl!qXl;T?epk6=Uxm6NC# z>_|jLAW@jPGvzXPX z$tyhZcbCSlsU7V^2R53Pn}$`Z1ukV*O%^|dVa&IcfQ!No}aDW_VHI6U%2?)+1|Bo z;+wA@%$}K;JOAzDCm(*l`1;<{`*vajn5JimPAwZBhn-7vGXXYJul z(>L;m3$tgI&p$giecLAwDZ=HUk~2AGQT*r=E9yepIrUv><2f0d;9VB z%|Bm0IzM~w&o?$7y0c>8(W|=_{(3j(9v*&c>iC2A?|u6Dzbn67y!Pn5Iu&A=PI&|3$ZB_A_N1mg16`>G(=2=4ZCq&QzQ6Y3wE#ol~ z7`YN^)oLOaE@~;bl4#u~B&yYPKKd4y%XeqaubI1b?(8cs?>>Vg_#6Kp0s;mB1Q9|E zd`E%;2MHvRLe44_Awh!ziYTE54K&e055{1`2s2?wFrdIhAc7H!m@p3+RB$2@$w);` z$ovc`G*O6Rl%ggY(TrB~gq03s6k{4#r3IPKG)8o@zxj&mh#V%EWQsYIJ^5PHu)rcq ztYL#qw%9|vH^7K9Y3uHW5|e=pW+-FQc^HyPP9`#$smw_^CsQdkS;%6RvL+kZ%vScK z6Sb&Ojx)kiv;wssI1W3vG5c9Emr&QiG)8oT>wKkkMg-|JN+>xJqfQm7Sf#3|Mm4KdJ>|(eJoC@A$L{1zj_E)L zJJd1lU2vRM#OXvQJJmTYw76tyy3oZgbxk+A*{$wrZ<7aNPcv(kz-0()nY=e%5pTfS zFLJr$8j|PX=$-6ZI&oRoGH;)@WW^S0O{O=xLEZ0Czdif!eynqRJ=Q;gjZd*}GbD^=F~6m{`vd8tA}6xnBd${^R-YkDkAA^0jLpeD~%1_x3h-pZM#e$46h^JNwzA3wL&QfBp8kt(UI;bC3^i j?p%EH?H?a}{LZbd17~i&_xQJm-&}s{&c)3a1DpQ=J5-ca literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalRobot3shield1.gif b/src/main/resources/images/OriginalRobot3shield1.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ede296684b0eb0b8ed8b0dc31571c1555601ff2 GIT binary patch literal 976 zcmX9-&5MwA5PnuXY*Z3$hX~PG@}SkBP4ELn9!OmEAW9NZA|nKz#18Hy5XORFSr$zy zl`dnF2O-dd8-~INTA)zS9}sv*>En>65|r`z(eLo`@_T2VubFpt*N#ma53R;3{EPn& zfdCo?7-0cx=#B&fY&hVA2fRmN5D|z*0!d^b8wC_mfoinChz@j{AVEVI+6-ni3$r%y zkj5~!Im~Gu=4~Nnvv4-|)-%b5HOnM0`RAQ~a6L3O%{aXJ!_jEu;R zLKLGSszXzfQPp;*MkJRiM5iH*X_3~cxyib^+384UdZc#-G8BnWI}@4AjLgnL7PBI& zQs8kD!U3*tct2GZIcEf zPu*jcz+nhunY1@r5pBTOFLJo#7?S3p=#}hPy5O)L!@PXTk`zm*G>Km50#(0C^)~%z zImUToJjOqP$?q^RxpL>_y!q+m)N2Rc`>1eY#q_r2FMNLf_QH$nm;LwCl?$_r&rf~4 z^3lAM@Q{yF!cF2DNA((%`i z{l53izWG&GKlt+g!5iD2{5JRX_eXYJi$7jjTzL8D`W6RHFq(bfDV=2^zxCW-y~!n6-(A zG={OwVNUZfZwv9$A}rbxmb47Zwt^L{!m3S5o7Q118c3xCiBB{_RI|S6isJ;?bkIo; zdNbrn*THBem}CaCSzwVBtft%xpo85m>*_{0+6``W3%7RVAxMU^-QiC6aBmOgB&zUe zPk7QZJlhLi^a`(bB`Q%J-pU9=(Fjz2pg81Q#^h(n970tG(Fjous?$}B(~*c|WJGop zq8JrX9h#Dis1eHGL*3_%DS`*ic^Z%K>~E4nr8rq`lFKXamN6k;5g&kTefPuVly41&8$*=H*kCq*y|wN%TS&sQOi^x9P{r zG0rRFG5!fmeus(4wL357jn5{hUOx2B!ylgdszS zTKo9OuWz1QzvBGr`IBdF9GjY1I{NhAe(RfMhrhb{?ZXddKYek-oqxA%dg=C=w-ygP znE&GZzJ-~$m$qG<*|7Wc%5y*6ytDtW{hx1}yLV{!@xyyAP2YX(^8L9#>f#GOFMYi6 z=x=+!-Z#JQ^1&~EfA9MC|9+V}_5FvtuEd{f78jmB^6rIWclTV|a^=;Xn3%xUCy*Ab AB>(^b literal 0 HcmV?d00001 diff --git a/src/main/resources/images/OriginalSkull.gif b/src/main/resources/images/OriginalSkull.gif new file mode 100644 index 0000000000000000000000000000000000000000..52d2b4cc9855f6b080bd7e90de38349c2a4db0cf GIT binary patch literal 941 zcmX9-J;;z{6g_x^L<>C_gApUlgdxFz0uzArPO30i&@H=Y-BTA z*^^GxqDDE+2usll)PCSN?A*reXUSYbT?f+`(G9NimDU**R8&bdYN)A}dgLkDsB34+ zBeF{uVk%I<3RO&bZno}jP9-W?smdv#s-_y%tXB1uC-3mgKhqw&lQTJ{ z10C#8$Fz6Baas|l6P@f-=d{q`lBwxJ7rWFo-RNewx~IKO9*8~7tW^S+A*^Nc-grg4 z0c*d=<&tYio`<7%vTNzYWnIg>ecF;0Tc|ae-slE(zf1l0$Uob#&hGVC{{%Kq;;zky z_g|@-?`_`u=*!<<`SRNn_iX?7%>Jue-+h4HN6&Bmwe`%$JD%Qo-^Dl1KKs!_FMf9H zt6$Fj@b29Q9ytBsCwF*e?@QmjaQ)i3A5ZPu_4SUEZ~k%ci#>Zb_TBjT^+RWOefs;W zm#&`w_0+b@*G^x$|Kh>VkKBCc{U?vV_S=cWKONqF`S_h%7q;GhZ100_{dxO3Ha76o Ee|)x^V*mgE literal 0 HcmV?d00001 diff --git a/src/main/resources/images/PreferencesButton.gif b/src/main/resources/images/PreferencesButton.gif new file mode 100644 index 0000000000000000000000000000000000000000..aee160199c77fd236ce92481a28a01432ece990f GIT binary patch literal 1719 zcmZ?wbhEHb+`yp6@STC-|NsB@@4xBq-&0?|>HPUe`}g1E=g((gNXyS(86Q9Y{rj)> z_C50QmGkEx)z@$G_n*3c{du64Q7{?;!y^O~f3h$#FbFc}FaQB4PcU%&XHe#l@z}87 zU^9oXR?LYF3lFyoD0|KE*tqCuw}f%lof8`uAMaOi?vnA`wB+Pujo?)=CpRrUJ>4K# zO~hcqva_?910IPeY*u$+W^dw>)e>Pm$>P%bD`u5I=B4HA9!{nQwyZkH>MW^qW7pJ! z0V^HF?`-iZQ@FN(WA7r_m0Q+CZ_ZtRjMwtJ?#<1C{Et{?U(dU_x9WAB$eVJ_gq_*0 zLV9;T7dRf5m*#kSa)(yRj%@Z7s#yvL53o2aWGlVk@PPRuyBtSLfmG?MMh-Lnw|^|R zykHk#F`F8np-O0GKI4xE?%&}J;aaMHuORb!!^@*KmVy_0oj$DQ==V)r+Fym zbE!>zSed&s<3jn5rN@JNSQjprYGJ!NHN?^LuDiel;Yscjf;HqipG0+Qnl79qT6g1d zcjrn~)9Ul?#$_RIX~>=rklE@9V@il}SVV_CR7fiLuB@+2Xa z<&DP*rLL@8_3VH6-GEu2PHL`P(R3?eSH1DOd;U$KGXmXSy{q!~vk2b2u;2Ni)`SDB(mCsnwZ_df zIL^@+@oFDm`}L&uc}03E;nTWYL*ZdDX(54yV1%wj{mo zEZLLuSS94DQ)}+!8@yei!Q1orrikh~dK+g69OmJ3NpQUDFIwpxepe7 zbg5{0VfS?QA(oBd@3MYs?wbGNXW+58+02R-cZ=%$SEfB;3)Y)8X}Wr98nfxbJ^>cy znm7Spi-#&}PP}HT58k=wx1Yd=W7oH=`;`0Xp3SQ>=J9(zo(f;~_uHNF_kX`XXxIPu d#;5zyGGa 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 S%D@SV;-wW5O1x;62LA(1^>8Hs literal 0 HcmV?d00001 diff --git a/src/main/resources/sounds/clickfast.wav b/src/main/resources/sounds/clickfast.wav new file mode 100644 index 0000000000000000000000000000000000000000..8657d4edeac37d34650feb99184bfa68ca4ffb10 GIT binary patch literal 124 zcmWIYbaN|VU|23ZAr7N3T7bY$* X_nuljdq!DH>dM5HxhWe<=Pv~S6JIX; literal 0 HcmV?d00001 diff --git a/src/main/resources/sounds/explode.wav b/src/main/resources/sounds/explode.wav new file mode 100644 index 0000000000000000000000000000000000000000..63f0389afe78a8a8e42dae767f391b8a48cfeda4 GIT binary patch literal 23114 zcmZv^Ic#EU)Gc_Q)VgZjpwwMK1r@kk4jede;J^U^YPaQwEXzVP;vpI#WE_~XCe&;Rv*{IUP{U;g-C|9HH;H~ug9 z{{N2OliV6_$>%>$R(_#^uCSggLTJQ4}}^7QoJ&%em^ z_2}&4f_ZhtJZEvmV)5;x^j7Bxgo3eTK2vSraf8uhG@4A8tJSi+8Nd%?BaZZ_-XVm_aa`n`6om`g^yK9}8K(5j@;JJAjE>`T5tAmoZ4l~2+~$t{n=UCSSWROlJ=u9?~ zqT@lA!(`BCW&ERqvn!D{IN0t6R%bYppo_6+I6ZtG=G+nv)@*m#d;wo7;WFy!R<)YN zU?Pz~hzilIHl?(6R&TrAa+Ju`nzYCF{JMRf4sv0y`0PSp%Ji4L=fSW)sr#Q)Hj_*w z5{mf(<(*Qba+pj8L#)u7tuR7j9oy|{xtPs6g_PX^2N%kK5<4c7azS9Zje0a;HDt{ocOM_w8~t z8gy!zWY}ZYi-lsgL@vH{YRskex)F;Auedjlw)%WMAC~k6okGB5Fs~VxOvVY5#koHH z>wqE9P_^!8v086&ZPr*E_|34_?bOqefZt=)s`Lg+c$oBOgXco?lh~={e?Pu>cuW>n z+tu@A+-_Bi*-{~wiS5mz*X?#&@OXkUt?pnnnoXyZ>GOQnZKPt-bM}KNlxuWGlll8@ z)(JmcogMsZt;A^m{0k;~a>lq4sjb0eu|8Z(*1H|N8XtDs?e6t;w_S|ayIHz67(Xvp z>kY=d+iX_L`Ji1+hoiwjyzZBCFU}6XeE~F)`yHL0F}b4Kdxg&A@*pJpksoUrcw{P2JFQQm6r|Xa1YWLhNP--#f^77)G$-3t9xIE#LTI=@4^0`W_)0@u5ON_r)+`i)h zYam6xlaFULSL_>6XuKIm_$(t=qrIGk_)5Zn?$>*un1Y2T)?W+pQP#ey5U6$HU=($K{X4Bb3t- z2qtOxP|9gGn#?+*-4Tj}d`^}8N%A0-ip2_*?CDO#=LvXh;hmT(Fmbr&Ono6y>`xI~ zUWn(DX*`d*t!h5s%Y~#`^ED7wqY$#0@c5&{?*~UGho>y9I8YeDE;hT@A0MATf5O2( z|NimuvYK>KwnxtS*~#(IF##I}oRM|IW3!k{I~{I~m)qC3&%HUq0N!8L^Z9zboHc1b zUvPbPK$he1^ogzD$xVSmx!vmY2jki5{k2(LZd#>+RPMHUyn%2mkr@rv+es^Fvj{n? z^NUM1SNvdbC32aN!>-orv_fDWhbK10%I!+2lBrZ%%~ma&rs+tg)+#3>{(zSX2mLOu zT`4hUsd%o@rkle~D@*Ae^Yx^+d0j8w{{Fe_PsY>Pe9|ASrgeG}zk3v%oqi|7{PVA` z2Pemj%kxv)_kbgUif4`irG>Xm|{HcD@}I+WGc)Gstw8yJdSc->eq( zOe|oxx?{D~%c7MKUERq9EYbDh8S`4|WIw322B*iSaV5H|mybP^z74$mt7{fqlqm>? zop!ffesMyEK*Mmyy-qckX-@_XI!RZ0BYO~(`{d3b9&K9+7Z?J<8Z&uS%wM_f% z+FL&7=7Px+-<%zuoE{P&`17wn|NQIQ!NJifi^q0&gW-tOOs_Vt#Mu6m2mJcLO`eC{ za;cb$x-8l!F;{3ei?7caSocF1?IAv#Fo27f9I--Yw)geE*gx0gOqwnPN@!o3p zR`%ClM|^=eUiPsc)2-orwcWiDBgMXcuB=>1IO&qH4jDix#dz5%xWqD#1zyHnoF6E2%AU@;C)1oxMx$A2B2U2+~+mscleHzJAF>h);2(!}VMOzY>%dOYvN z6kO)v6@$YO3A9qN)D&+;Yn?%{JAHn6dH?luQE9h!ZySm)cGbZ=oArqFNpSw{@H)3! z){;({)vtEf`sD=)qF`}Yz;U}m5(Ka~O7|c&nw8G#Wbr&7jh0(j3wiLb*VWK^eF zdHRXZ=J_*pjEcrxPeSIwAy2R8o__m!dUk$s%~2(^PnFSVwRxTlTC#vfPc7ajU0VDF zNOg8^@cRM=8UN&n_arzxIlo|CUocrJx}FO<%$7&H%kJPm>K@s!`zw~%6v`CZ-PvY8 z2r`iW+4VYW10`{FXl4(3|*3QIfH;BSQ?w!Kp4N-2D$`Mvy+=?Eq`1cnVtSbTE z;E-@Q;r?!!ce^9;WYB8RJV^LA;Gb8QNP(s1cr;ZgmO8V=^OQv0_3q{UpU3@x&#pkq zw(IrlZZ#}d*Ds6V^R$-sDEK!VzJPyDVDjM0kxeXs$7zkNOk9*~`x#$bx>eln>-o>mAZ! zT)#ekysl=?>p{}OzW{?q`f_jxXx&4?7qSRn56?hB89ZA6Rlkx_##Y!Ixv71O#Tm4?Qzd-su>a|+Us$VP+-HG{PTV{f= zLZ=6dmzOnQa@uLMauElWwBIuif4l4Vlas@*U%tYwu~}-D#}|#)+vDv|=oTB;)_;W0 zUnEfd{bM^Gc2iVP&0#UY{*R81kG}5-%ooI7Hji_`yOT)70=-eFbGv={O80rSg135&RI@_~G|sj6$Neg;LpStAlJ1+rC{tcc+`p zV%P%l0g>NsXV1$u+zt$7{rdN>&8QxCQE}tlHCL?F%2iK7fq-*$!4mSWFOcXQ9bTDg zt!kswE14b)HWv)LKU{1OVScU0!};cI``pb(D4K2!hVwzI+m4##4@yfglTC+YLS@iq zRd7Bz++*%xs+v#Y`q!oy)LjJ8KKACM^HnR@oseH53>Qwz|Q+X7!nGGW5 z`8D(Cgn4|-VVyBA06B`oH*HJ&nVL@IlLqSCqA zY`G@;_V*iMRfzVx4Sbs9nn;rH?a!AvNI<_-E@gsz23xE$*v!^od%f&O9pdvt?97*c zQT>3!y;keQtbGp?Q_oU;qQlxTl{{_4NDjWSL}?JKmLJ$O)i+9 zzi(HoVI^V_GEcuBpE0l4;#<6mClWqn3(5BO$IoBHNq_$Q`T4$EKaZM?D8kb@LuHjB;e>firwCdefdogc^^icn< z&alb{=jW#$3`unEc!Obh*2FM+kd;0aC4zudaHD%wW4&j0Ph-YqNPC z%%_MylVQK3zPVPYB#z0fTX4iInp^hO#p&rOCdRoD3Kb&Z)|( zy2JTmy`1=Xck0M^vnVB_PMy)8gP>{T->|Q5c=vjpzP@{Z-_FOANjD^9OU#jEq_J8J z(%E9WQ_5#@sh~s07aQWKR4f{FYaj1~SjO8sG3;2x6N(hJNIaAGIIHt5!~?+Kuea@X zu^cuB)v&ABnl1)C+JAe&;6Z2<3h#tgi(VzwYab!$936in_V@k!5rc7h@a5~7BflU# z?&ps!P~?BmU!!3nZ0sc5#L6$IhHyTf&(}zu&Kv)4AjbtBLDlyBZ7% zPL)rjb%$=D@3610?yj!RuZ5CF9*c2)g>1m-w;5Hp*94T9f+v4#-t7Ph`{RB(lgqaH zLqIRm&)0oWdGCfj9*653d8t50G@*hbp)F^|{Jkoia}T!H<9PQ7pt?$7iR<$0D=O>j)GE zD@f^(ZpY(cChBwYFGWvUcMdWWcsNA9m(30U*Xz$#>*pD)I-l@qEkUu!>gH+XcaK_~ z2@9i@C`DHnJn`-QgH5#$q4)@%2>!)f&%f+$lccV)p&)i#%1?=#$G;KBV*>tPh@6R_ts=t4}O{e`~XE+^?uvcr)v4lq|WL}DdQnkY$ z$#fgph*TiHx_MA56b~W*FcSEqbD@z6di<49r{A4V=DkcH6|(EBftXJzV4gumI6fDf z+OyTmK4Sm<`3}+TmHR(d!d4iQL}qw#9>h7J1s*liZofL_UGU!23+LBPHq95C+1H@Du- zuvU(xk;!gGeT4AE3qt=35z^PN=N++bP=R@?J87FA#X^~0X;j@Cbx+sF#NKdyJvcsr zRDE>D6kE!4CRIRDr#kHPC++9u?)CHYW4qbzRvXYU=q%4OXs^R&n(|YTSRoas{Z^g! zmcwM69wQ=uJ3eAuT@sC-dCieJJuY7)lM98@&E8{j!|45V|^?{>;= zlhzDVs(}{F+uiwOd;z;FhQu+yY};IWt&SKNE4!QY+{C3_7$6%Gw>MnIqUz;FqFoisBj zzC7}Q5huv}zy5i^Rw6$Y2qnDpD>mnvNtWV9@WAIoREQNZl9zpm{q_0&kt%F%Pky%8zV1LC#y#jy zz1eIw8niMYDjJTYAp11>^A)NwgU)2S0xI@<;X4-a8mP$S-LS51P@O=Q@u1QAX<+@J zUFprR%I{d9-D=WnW#bSHqb4zr#o`M@kD4b5DmOPwCgbAb`bs30yL9R&5h^OKxXLdB z2We)r-2VLBbo}o2X!QI78Khf+P?0Mk&4su)nGkV*F{p&YA&T;QT&`pR8FJj?b^E1;wfSsiz|A(zZHl*xqQ3X&W9;~DAR&uF&jX#jMyy}w~y{ZJ4OL=2Iw7+ zI?Y1Ney0t$S}})U?5l`5~1G&2`RwA;o-r-IajK% z2XpN?keFPs41E0g39){=eIBLkCXBK&7(yJ+)N1WQ*x_^qQ^jH_5salN!1?(lOKigk zE6wqCJ8HN5K!K*$W)0^vp-|YT6hZ7g`Ubq%v(;~4V{BxA279s#{cHR76UIm~O_VF< zlcwKl(ipXRS3HxJil1Z;YHKtUQ^*u5TYdNWV>il218UwC6ZiY}on$Z)qr>g>$Feyn zC4Nt|*{Nrev%;z;i>PDgK1X`4kf5|*W zYI6WLLXL9;R6SwBeV8nsKp^JBitcoQY;`d0)zYO>tKEcjIfisUn=d!}b^G;W3-Pqq z>UNuhZlN-op)eYWQW?~s%OS1&LCj|KrJ{~=s-&VByULm zynb7vem<_m92Wi4lLmXHxEDzcM!iuhfiTYJvN`N~gUbVN52VV2!EiK2F?sv;>EPF8LGwjc+L~tDorM>-{(n}tG#w>L=tWU z$}uXZs9vY+E~h_LtwTudRAUkCy_j{yLN)PPESG7e7Ed^tO=W31m8`XUqbb2|)ZfM< zWG{<3mhJ#ikNJiUrqKmyGMvGd7Ql?IzxT zbxsOCs9XaOPR=fcI!|W?-n8CA8CosDS8;v5Z#L86=y}-AWqmgNtx&|eIDx#&eabd- z-TnY2@RzrjSD5yo*Xi}qr84c~yVEi1e*H$hmG|1+7QMr5lq+skA}*VC%DfQWF#a`= zKmP(Efz5~|hBhjK|D!~U!YZiN>&tT1&ZaX3DyCH_?rs=|#86S1f!ekAH5LcC7AWei z*6NIBE8Q8=0g^la0@3|=-OSN8GoAG-gXey?1=+HaOcir(IiHR4?!NGf64jp&M*)g( zIzC6A8ZG*$B!C_w;oZ_cy5F9!moGc$U9j3oKIF_kUL2r>=8DVZaJXE);7+M`hCFU6 zQ}51(>jtzZ}UXm znkTtg#T8g05h@r-q?=7TXnnkUkZQChsYuAXWC)Dza5Nk&mZwYL8YcJLuUG5oL@JZ; zdDKW+_$h610T2a^6uojfqB2Q^ zU@|CspRnJajr;D#VlNV#aRHdFX1VwV2L&&&bjs#cx5PM%`MP^0;FV zwkve3k_sm)nRGN1wAp<3_t4MyY)At4_riOrEugf;vcom%&CjDw*l^2#@c3f^F;A$s zQz)T{l@2=Wr$baMmTKkOlgVVUL~~ESlJLhuZnaRvfr)VM%rgSe~c-&!-i042lXNj zbO4eu?XN?qgSTp`HGc;2-M;_)1f_p@LE{aW>=L=)qtZ@ZNHA`!1nEP8Y&+B0C*?#KHM5n#O<<^3L~*6Ogh?K+M0 zUcg5$fmDTduO|b5(~^i4n}gw)l#i$5K{*_*bn{e^P7e_QTQR?%E+=(*lg$?n#PXF+ zm-13Utsz{jbUWSdYB^}5SEpNzKk+U>5&sn)|N3%p2Ia?TvAcX(DA^ysevvZc2gxtc zF|!;GMyQUE{sLMmue-t+iq8M{>*wOW%i zUM`k1VUN!fr8DKuppVGVDwZPE{v6%}UNwJSz=H?9f{VxI2*rkED&$W$@?nQghSoDS z{OA}w6Rq|_O-Dj}E4O+{#wZ%1f0TED`=(Ue7Mvsk+4d9PK9hdpkm z-(?cqT%utE${vr)zT!!=CI^*Imm4|CWdo@Wc+(A(O?&lx6IHe~xKcA64A5mdT>~(+ zTlHoYjYoY1HH2bB`SGafFc@uU_96`-2&4Q5h1Kgt$D7aTKs_?#i>9-ge7V&wqpiqg zvg*W~b0+fkgOh8G*{0KJY)&6tYeO+@w;JeYLv8>WgOm|wkgRvF@8C3_B%49Cq*E?L zDd(+7fVDV1Ir_TaUc@PIVbcNF6tY$3CHwACDHDo>x3^C!rz_qBH(#L9ZHio)#0t_L zwnUQ}#F;rjtlx+g=}IBn?4!amm=Ib?;Am87B%*P2s`Y2Xf>i=N6<-vRopd%D( zPz<^wR3#ar{7%IGt8?bn&BZC|BFN~mjHl;Zi77ppPkQZKJQ<^?6iuVX9dmoqg?hC+ zm_ytDH&mg&3J5l;(?N~koS^LC0a=$nzn?HUVx=!m#i(#P8!vW&dq02|Kwap@{o0_H z4+i}{r&+I%DnxA7`4tp0F`vV^fxxUWc|v}>KZOlX_^{VVKjv6GqG+J$>g^5H-sNny z+m1@K9U|YOOy>-^(rLfb^l-yKit+`eVg~E-=K7KaE`U5re5X{YsBF2|9*!o^7x!w^ z9`v!Vz^(P9n+14Ul6cR)RH z8SPr3D-v-=Tm9Mk4U}u$tN7(2^k}lsqlQ0B^zuS8XNv?vfwMfE&rz+JEhkXeU*6Ge z0`w<%hlNHl8hy9>E6~tcz>@omhZ2UvnstZ?)1vpO41&4LX%#rrB-` zmW#o3IYAiQY?i%PD4eIAYNbi9vv~axlSwI;%DG_djB6+nrbMM!$fxrtJ-16aG|Lt< zbfG)w4MD%qpoMJu6;($>nq0P21)g;}eaHi0jaVd++zNTn@6N78G7IJR=If&gntpnj zFkMNy9cX>K=6VHpl1CIh#1HpRW`nDkFQS7g?lVm5#WEncMCQm79kiq$T(5|X8E z5S5Wu_FA<QAH;H61t8bRq22sh+SrGBNw|0yV*J zq=ksdx*;vZcapouI|2LZ=8DCBG(hMLB9yR!j?n=(8zz-v zvGC^linP2UlVDw3kz^I)}T=+4O)rR?)1hJ;cS+U zM!g24QXr|a`@6eGTpBwSv8m*e2jMOHfA6(+Z;Z~wQ?>qNI_bA6rBcG{v{~(Lm&0sy zhP*~#w$l@DjGx!`s)+g&ZCAIvlZ7G#rm5lOeA=6c5@> zT6C{!WfCEfN~zbHtrn-l<3*Qg6>SNvS{r47ZnNI(c6;q&4`oeomBnlXA+ueh(Oey% zoEo)3?+iw1I$MAs7ol8MJL)t#r7;*x!GFi&`SKYDGnxr1Y8bV1xW2 zM*umT4En?A0A1VlVva7<%J~NFmdPdj4!u!v$KeSD+-u+qIRpS}*P5eH^X8<<09b%z zW{g(7e1Qs(axCTddu>{DU^AIFB8|zPX`xAUJm?QlAa0d&$xJRuQ$Ckb@hFkXWRFrQ zlv{~hDG|wZRuD0SihLbxsoSd1bgfmW7Q%^u73_*MEyju{D~)F3;dHu!_CFhq(JGn? z+KmRB7!g6U(mT8nsKriSkP1a{bR(K97IKyLV9>5siiv<1KIF3Kb!IC{QD%)wek&FW zxO@?qXdsy_WpO;FRIgQvsb~Zh(ebF2^!gGs9YfbJa?v;HXeb`k7uZ)w8j(g zusKfd;5bHi00(Kek+8<|nM6DhA)LUdRH*PwnOJlWwC0QTHiyCD4fwqVgTX{JeW8HI z7mCD)wPLx!LUigXQEPi7)}tvMjW*;$NntjCau5yroi4jhd~bKUgPBIJ+aP9)QZZKY zUT}Gg<`mwo)aVTOJpMQ-dUenUjxr3v1?)vDAg$W%JbW~ zgSqzly+$*a4m;spve!R+t_VH|E39+!@W18$GUYu7y9Jpl$4YPHF1 zwd&QNtl?NJn<>Hjr z0jxBl@y+9O`h0fv9nzM&TdX@AMy55o0@1L~19`w5j;D|a1iW^e#cDP?$fRxNSUesL zCz9y<#BQRRgihkwe2QZOBSiAv0KH)OY&PP-y#ey>ST2`{AlrpV4X}j3=dzn!AxL%Q zW~~b19tZufL&dV#0+<7xg%t%nkw_$(OwomMod7@uB|mhz$rU z*sNBU8=_<&1c}G4*QyO#gNKS2N^~5--Gu?f(&aiVw+lPL=@rm21n^2G1uzYgl*R%J zMvymJEIQefTJH&l5{R{QI+@HBX}?9SG*~>5VyWEfkA}nH7+p-m;h@)Qyz6ClZNNp$3;vC89B(-D0h|lTthjZCn zrC2P0QWdf^KpmfRsaP^wE~L>82Ej$rxxp+pLl3gpycHkn~cdcD!=iDycr&9U39 zBfy9ERl5|{p3cyKs8)ZE@?h5lT00HI+;X{Gsn+VHVhTrLJWeZ)L*UFN7!XKeBpM4M z#KIt;3j%rW?;aE?h1y^ZV*L}rkj&vB;6W@=sf{=@8t{h;g;E;@ z_-FLx5wBW26U`LBm?`8drF=RW4S{Gx$%?ofMx*lS31>E7dWl>y7Z3Zr5Gd6u**&_M zZ>1`;Ga5}~ise>4S1J_{)gtJhji!N7RV)MwFLgo+a5Avd%tl-ehr^~-Nq|nkfO~Bq z9;b6ax@rl!w#)81qV2X*xDgtz-Wde&p2K*1OsnY6JEF3Y%*A#7PG-*w^|*6Xe=3z z_)V&(N9hC3FiY+qqzHIcY&3FuB;{k&6|laQYNKAORhnIrG6Rze`4SxqguFhV&+m;S zli^S-nxLVupd|@MC+!Yj5-MjG=af+r&eOo;LLpBhy+oE0jbpiN7MnqFd-niSdVF{? znJq5ZOe`CVC1MWfBRH#u94{1u?WAxR740*9YZks=ASjbe#3D$~A-W_;#^nen@ak5*mQRHIRva!f>CAeALTmS7 zz~Nvh6iJ5T!0mw7X)+pgDBXEHow zNHmelmZ4t3L#E^)=@_TT$vFk^ek6l1N9;#7nMF^JUit_*2DRO5loG%rc_=CHkn+eh z7KrK5I3OPYA3#K)i{)yi-l*bSI%Zb|wBS}_tRS2cmDYgMVK-aQRN=5=b<8I8s2L2H zk-=<4h;W7IVilD)$a<*d%%|#7Qn>=a5NHw)0H+~e+ATJn;z_P}kZTNJ;nK%P zxdK>hMP?fZZo+Yq#&+9PT*Yj;Nn$o)7hn$3hR=nh!ECVFjYv~NencMNJ)8=?FK`%y zZ4^A#}C2rw2wEfm1kYNT=;dsk?bfN_T>KtmsJBc2+~R=d~d zusUrxK_5+{!={)8cmZxO{5{icl!}>RCY6k%{+5V@BGE`Zovk&%s3SNPYBOt%2Bl1@ zHCvFlBf25Ai>0!qe6d_>Ko_Xxf{6tDwFo&5DRKiDI;f0CEk@47yVbiBm{!2;up88m zPp~q#2Z|A)z71Fu$!$P9;XUOV(t%8l%mw5Q^YOb33WZvyHJdCJi`53+69WEu9Jqlm zoQlPwAs;k`V90HEfUr1GLk)(!LARACsyK`dgLFgLz!i<G!LanzrJwCF00IyUS2dt28W$=Cl(AOhS$b%l(C7P&2YMVQdfE)p!$`*<# z%r~A!e*s8*4`+Lk%BHhvcr}Fi2vKLeW}^oBk5r*E;NU9EB@xFmfkdJ>kHx0rG>w=6 z1s|w~oQ}?Ali62Vf-rfPDff`6bfCx}= zoDz?OY4{ep9s1zy_ybEpr$;iCfNX)`!FNy@0s+=)jClVI7zZe;2gKEfqd37}2%t*g zJ5lTd;z$Ii-h;?gL&;(dA)wVL#`jX29lNL1=rjfh9-a{L=29t_PI!_*3?Y$umH9+u(6sbpXQzlnKO@xI7 zK`s5hP!eX8$mVjXG${!rAohaI$HAU39|!VCUnmfaM?)Y}?qHlQ0+b4sY8&2C!5LDh z1L&+zQo%qd9B_C80WS~-29Ylm=ma(wnM`f>0iH5+ z#N+k4F)O^^hc61eLERFT62)PeHnc;MBH_Iska!@+=`;#Z`2j_7B1)Iw^|fj_OQ&!E zBcDql>9Oie2v}BFdkU}+3*j3Y+2h@vLS?qN12Gsv(CfAstro3XtyDfjSd%Ew(cn&` zBT1}V4n5!=ZzN8qbHyq+WGI9HQ=wVX>wqsU@FnSsp->|Z96Kq40i!nnKv zDv0FAs(gT2Cf8c5c9+*>Ga9f7a^yQUSFF&$SOI&LJWvi9X08Z+RIQdt7)r+zc;}K> zI3C3fL$MgzPh-=_o#9~;_y?jWGqDtDQF3ygLE)X$r-Xn z1@sL{C$eF=4xR)hFM&Ls@ zSxLMB3PibB2BJPn8*~I!ODt-OsIjR?I0(VoX4b(P~L?)Ljff4|I zIksNwh=m#@fcA-iNOGwW3hOY z@>w(*l@f&kP*;mPNWl!O zUB%vW!0%=Pe53$)rG)~5RYEVXc})}kRoCLjU|A` z1+nu0J_uc1h*~gFARwJgrDE|^G6Ew+@x*4eK(hCE02wHtx?vt^IBtL#4$RT(gzW64 zQg|B)02CY~17w53@y`_q5Hgo9BVWoOa)TO2V568T8a;4VKU^^!Kn83v!oa|{{Gb5H z`^l@(F94T~VkA(C8lVhq!hRcYoP0hGIZ>xn$Yn~@xAaCe7_!q7g*02oR%Fl&0LmUM zl6(SNfmf8kF>3Wzv(bPbQK*c=PrR^Qd_?R3SHSxQ>9htT$i5ABho6RU5BLsZ955mt z3xGO0Jyenw%#k-4FNEC^~s>bu1%s4rp` z))WUsNgj`Pr@?RGcacOQ5wU`IS&e#=)!`!B03F0(HJL160YGTNw8`2*BkuS^t0jV)GF^u`TdrED?wT znK@P!qlzWMSSB}?&ldpwL);@&8+ucmOgrKnl?q(GlmYywG+)nn@=(2znSs=S6Z7 z!~^`WYd{FPPqJy;37vc{QaQ!@+L)mjKrF%vA?1MMCE^*}A(hEPCny(6d3=dOAlO&z zEChG5C(s2wR^n#xH7qNr0)7Nt65?Gpg|-1OCX6(KeCmR2Ad6;v8nt;=O4 z$*0lghV4gFbOy@;7kAk#I9lMuo`H_SBQY8}26_b>!R`@$=!CsP@w1xDU_1t>#9F-( z=8t`JV-quwN{}G|UYm6|U#*nSBMF2_&{&ZoDJKtl~kxbXA(8+ZF^GOg7S3YUp;Jkt zLh5F>TglwW4*Cc>xgF2~u+u1k!A6q^9e{%lj(;*R|3{Exg&LM?1at>LK#^3I%9RGR{~;<6q*ZG9jB)|q9t5?3d2jMxOojQXaMBI%~g;3oD z`k_|_Y_AEK16`$M1a5dmqYMX4Mgl>C8XzBVC$i68FW$w>pd)r}x7$Iya5<260=6Mm zKt7}p)LeE8{0I9aHsL24=z&0AKE)PIA0Ds5NVSzZ)Uj(F= z3h;(BG7bO?`SCu72Dx!K2!`W=rNPwz^fn9@j$E+YNF5ojMPwx;_Bg``MGM@f2;71} zfkJ@uA_yXmz?l%!FhFEhSRbGr6nLaPI7?(Q>JgdX6X?DJKPHxw0{W9u8`v*G0oWxf z`Oz@Y9>9mUP&DXtdZUSi918{m=!FMB62{8GeGxj4CLvs=vxNHL{r2*ZQfV|@W(_|oM=p$i7y|?~7m5)3z_R~+M7sS` z@v9+R5D0+?7z0oNj}GtEX7F=OzVM0ivNb-!51fl%+XCTZU2usk`2TOxD;Frh}lZ6i;7+?xy zbo(KZVd3BYFGaLJBE%9cgM1qZh?f%|_`N-Zm62~^opC$j>igX!j<{cYfIoZ!sleW1 zfWlZDy92ZZ-yno#Pg*d2H~=A82%=f64DnX7k;IVTt-s9(yc^#I#_oqf>;o2PvtgPR zm^&C1)*kXY$)%ys6N*Kw6;_3r5-|fe1p!LH=#w=0NJ0Vr3+wuQB@);S@&vLo*ncb~ zz9g%J_>FrZM3VVos$_P*U4#Sz1a$HNe_cp5VJG{qP`5xxg5U>_hHOekiUHwP#L#hJ zWidNAH2$PukVLXX!hpGAP>|&jG%#=yqv3?W0~_$gW&>Y@4PeCy;9&xBvPc*!**TaF z)`a{%Oc0a?7x7v$BG^_a5+~Ub zfuH+1!I}5_LeU=gTKV4Y$>uRZ%E1Q=y>l7qn-@f(=fZ%Zcg#wOtP z7?1;2fy56$h*8qnG*ZNJ>ai|@8e-);r5Y-Jds@RoxO?Uv(Fc#5x+=2ipfD{z;D9($WoKV zAPYc-y9dnu3&~oLnPG$XPa^h2s^}yV5Mv^DAR-)IN5)7dv41FeCRU2f76!22JF*I7 z^?zT4K;y@N7xH;OKJqPi57rWo+dJ`Z3*Y<8-Z6+}V0wswzX23>51$6_qDXKeA!N_r z2(2d`Lh>vUvoKjOy!{Z#AaLO(zww1U6Z_%WPh`Ied#b&k5DDDmNBFoOGX{sDl3D+| zn`GPfhydRr{sxC2aSp$TgaXtSSHi literal 0 HcmV?d00001 diff --git a/src/main/resources/sounds/explosion.wav b/src/main/resources/sounds/explosion.wav new file mode 100644 index 0000000000000000000000000000000000000000..1084c230d6f1904919665b7f7b6a9553b0bc06be GIT binary patch literal 14132 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 literal 0 HcmV?d00001