From 063d57961b7f170f1c9bf46e9ab8d8e9efbb65b3 Mon Sep 17 00:00:00 2001 From: Quentin Legot Date: Thu, 9 Dec 2021 21:36:20 +0100 Subject: [PATCH] first delivery --- livraison/README.txt | 44 + livraison/build.gradle | 8 + livraison/buildSrc/build.gradle | 13 + ...l.game.java-application-conventions.gradle | 11 + ...fr.lnl.game.java-common-conventions.gradle | 31 + ...r.lnl.game.java-library-conventions.gradle | 11 + livraison/client/build.gradle | 33 + .../src/main/java/fr/lnl/game/client/App.java | 203 +++ .../java/fr/lnl/game/client/ClientPlayer.java | 18 + .../java/fr/lnl/game/client/ViewLambda.java | 19 + .../client/listener/ClientEventHandler.java | 20 + .../client/listener/DisplayWinnerEvent.java | 21 + .../listener/NextPlayerButtonListener.java | 40 + .../client/listener/SelectActionButton.java | 38 + .../listener/SelectDirectionListener.java | 34 + .../game/client/listener/package-info.java | 4 + .../java/fr/lnl/game/client/package-info.java | 4 + .../fr/lnl/game/client/view/AbstractView.java | 18 + .../java/fr/lnl/game/client/view/Cell.java | 89 ++ .../fr/lnl/game/client/view/Terminal.java | 113 ++ .../java/fr/lnl/game/client/view/View.java | 20 + .../fr/lnl/game/client/view/ViewManager.java | 81 ++ .../java/fr/lnl/game/client/view/Window.java | 302 +++++ .../fr/lnl/game/client/view/package-info.java | 4 + .../client/src/main/java/module-info.java | 11 + .../client/src/main/resources/background.png | Bin 0 -> 334 bytes livraison/client/src/main/resources/bomb.png | Bin 0 -> 1959 bytes .../client/src/main/resources/energyBall.png | Bin 0 -> 285 bytes livraison/client/src/main/resources/mine.png | Bin 0 -> 525 bytes .../client/src/main/resources/player.png | Bin 0 -> 7266 bytes .../src/main/resources/player_shield.png | Bin 0 -> 7346 bytes .../client/src/main/resources/player_shot.png | Bin 0 -> 7509 bytes livraison/client/src/main/resources/wall.png | Bin 0 -> 360 bytes livraison/dist/client.jar | Bin 0 -> 50412 bytes livraison/dist/server.jar | Bin 0 -> 49307 bytes livraison/doc/client/allclasses-index.html | 127 ++ livraison/doc/client/allpackages-index.html | 73 ++ .../client/client/fr/lnl/game/client/App.html | 369 ++++++ .../fr/lnl/game/client/ClientPlayer.html | 312 +++++ .../client/fr/lnl/game/client/ViewLambda.html | 139 +++ .../client/listener/ClientEventHandler.html | 286 +++++ .../client/listener/DisplayWinnerEvent.html | 184 +++ .../listener/NextPlayerButtonListener.html | 215 ++++ .../client/listener/SelectActionButton.html | 229 ++++ .../listener/SelectDirectionListener.html | 229 ++++ .../game/client/listener/package-summary.html | 127 ++ .../game/client/listener/package-tree.html | 82 ++ .../fr/lnl/game/client/package-summary.html | 118 ++ .../fr/lnl/game/client/package-tree.html | 85 ++ .../fr/lnl/game/client/view/AbstractView.html | 180 +++ .../client/fr/lnl/game/client/view/Cell.html | 320 +++++ .../fr/lnl/game/client/view/Terminal.html | 271 ++++ .../client/fr/lnl/game/client/view/View.html | 148 +++ .../fr/lnl/game/client/view/ViewManager.html | 253 ++++ .../fr/lnl/game/client/view/Window.html | 518 ++++++++ .../lnl/game/client/view/package-summary.html | 131 ++ .../fr/lnl/game/client/view/package-tree.html | 95 ++ .../doc/client/client/module-summary.html | 148 +++ livraison/doc/client/constant-values.html | 84 ++ livraison/doc/client/element-list | 4 + livraison/doc/client/help-doc.html | 185 +++ livraison/doc/client/index-all.html | 482 ++++++++ livraison/doc/client/index.html | 25 + livraison/doc/client/jquery-ui.overrides.css | 34 + livraison/doc/client/legal/COPYRIGHT | 1 + livraison/doc/client/legal/LICENSE | 1 + livraison/doc/client/legal/jquery.md | 72 ++ livraison/doc/client/legal/jqueryUI.md | 49 + livraison/doc/client/member-search-index.js | 1 + livraison/doc/client/module-search-index.js | 1 + livraison/doc/client/overview-tree.html | 117 ++ livraison/doc/client/package-search-index.js | 1 + livraison/doc/client/resources/glass.png | Bin 0 -> 499 bytes livraison/doc/client/resources/x.png | Bin 0 -> 394 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../doc/client/script-dir/jquery-3.5.1.min.js | 2 + .../doc/client/script-dir/jquery-ui.min.css | 7 + .../doc/client/script-dir/jquery-ui.min.js | 6 + .../script-dir/jquery-ui.structure.min.css | 5 + livraison/doc/client/script.js | 132 ++ livraison/doc/client/search.js | 354 ++++++ livraison/doc/client/stylesheet.css | 865 +++++++++++++ livraison/doc/client/tag-search-index.js | 1 + livraison/doc/client/type-search-index.js | 1 + livraison/doc/index.html | 15 + livraison/doc/server/allclasses-index.html | 224 ++++ livraison/doc/server/allpackages-index.html | 102 ++ livraison/doc/server/constant-values.html | 91 ++ livraison/doc/server/element-list | 11 + livraison/doc/server/help-doc.html | 190 +++ livraison/doc/server/index-all.html | 1090 +++++++++++++++++ livraison/doc/server/index.html | 25 + livraison/doc/server/jquery-ui.overrides.css | 34 + livraison/doc/server/legal/COPYRIGHT | 1 + livraison/doc/server/legal/LICENSE | 1 + livraison/doc/server/legal/jquery.md | 72 ++ livraison/doc/server/legal/jqueryUI.md | 49 + livraison/doc/server/member-search-index.js | 1 + livraison/doc/server/module-search-index.js | 1 + livraison/doc/server/overview-tree.html | 178 +++ livraison/doc/server/package-search-index.js | 1 + livraison/doc/server/resources/glass.png | Bin 0 -> 499 bytes livraison/doc/server/resources/x.png | Bin 0 -> 394 bytes .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 335 bytes .../images/ui-bg_glass_65_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 262 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 332 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 280 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 6922 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4549 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 6992 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 6999 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4549 bytes .../doc/server/script-dir/jquery-3.5.1.min.js | 2 + .../doc/server/script-dir/jquery-ui.min.css | 7 + .../doc/server/script-dir/jquery-ui.min.js | 6 + .../script-dir/jquery-ui.structure.min.css | 5 + livraison/doc/server/script.js | 132 ++ livraison/doc/server/search.js | 354 ++++++ livraison/doc/server/serialized-form.html | 90 ++ .../server/fr/lnl/game/server/ServerMain.html | 158 +++ .../server/fr/lnl/game/server/games/Game.html | 471 +++++++ .../server/games/action/AbstractAction.html | 179 +++ .../lnl/game/server/games/action/Action.html | 169 +++ .../server/games/action/DeployShield.html | 219 ++++ .../game/server/games/action/Direction.html | 137 +++ .../server/games/action/Direction4Axis.html | 359 ++++++ .../server/games/action/Direction8Axis.html | 361 ++++++ .../game/server/games/action/DropBomb.html | 194 +++ .../game/server/games/action/DropMine.html | 194 +++ .../game/server/games/action/DropObject.html | 275 +++++ .../fr/lnl/game/server/games/action/Move.html | 277 +++++ .../action/NoMoreBulletInWeaponException.html | 147 +++ .../action/NotValidDirectionException.html | 147 +++ .../lnl/game/server/games/action/Nothing.html | 219 ++++ .../games/action/ReunionSameAction.html | 235 ++++ .../fr/lnl/game/server/games/action/Shot.html | 306 +++++ .../server/games/action/package-summary.html | 165 +++ .../server/games/action/package-tree.html | 116 ++ .../fr/lnl/game/server/games/grid/Grid.html | 396 ++++++ .../build/AbstractGridFactoryBuilder.html | 430 +++++++ .../games/grid/build/GridFactoryBuilder.html | 235 ++++ .../grid/build/LockGridFactoryBuilder.html | 289 +++++ .../games/grid/build/package-summary.html | 114 ++ .../server/games/grid/build/package-tree.html | 80 ++ .../games/grid/elements/AbstractBox.html | 223 ++++ .../game/server/games/grid/elements/Bomb.html | 293 +++++ .../game/server/games/grid/elements/Box.html | 147 +++ .../games/grid/elements/CountdownBox.html | 132 ++ .../games/grid/elements/EnergyBall.html | 219 ++++ .../server/games/grid/elements/Explosive.html | 269 ++++ .../games/grid/elements/InteractiveBox.html | 142 +++ .../game/server/games/grid/elements/Mine.html | 197 +++ .../game/server/games/grid/elements/Wall.html | 188 +++ .../games/grid/elements/package-summary.html | 141 +++ .../games/grid/elements/package-tree.html | 89 ++ .../server/games/grid/package-summary.html | 120 ++ .../game/server/games/grid/package-tree.html | 70 ++ .../game/server/games/package-summary.html | 123 ++ .../lnl/game/server/games/package-tree.html | 70 ++ .../server/games/player/AbstractPlayer.html | 474 +++++++ .../game/server/games/player/ClassPlayer.html | 501 ++++++++ .../server/games/player/ComputerPlayer.html | 199 +++ .../game/server/games/player/HumanPlayer.html | 178 +++ .../lnl/game/server/games/player/Player.html | 281 +++++ .../games/player/RandomComputerPlayer.html | 198 +++ .../games/player/StrategyComputerPlayer.html | 260 ++++ .../server/games/player/package-summary.html | 136 ++ .../server/games/player/package-tree.html | 100 ++ .../lnl/game/server/games/weapon/Firearm.html | 244 ++++ .../lnl/game/server/games/weapon/Weapon.html | 154 +++ .../server/games/weapon/package-summary.html | 118 ++ .../server/games/weapon/package-tree.html | 76 ++ .../listener/AbstractModelListening.html | 213 ++++ .../game/server/listener/ModelListener.html | 136 ++ .../game/server/listener/package-summary.html | 117 ++ .../game/server/listener/package-tree.html | 76 ++ .../fr/lnl/game/server/package-summary.html | 107 ++ .../fr/lnl/game/server/package-tree.html | 70 ++ .../lnl/game/server/utils/CrashException.html | 151 +++ .../lnl/game/server/utils/ErrorMessage.html | 170 +++ .../fr/lnl/game/server/utils/Maths.html | 233 ++++ .../server/fr/lnl/game/server/utils/Pair.html | 280 +++++ .../fr/lnl/game/server/utils/Point.html | 135 ++ .../game/server/utils/package-summary.html | 132 ++ .../lnl/game/server/utils/package-tree.html | 89 ++ .../doc/server/server/module-summary.html | 151 +++ livraison/doc/server/stylesheet.css | 865 +++++++++++++ livraison/doc/server/tag-search-index.js | 1 + livraison/doc/server/type-search-index.js | 1 + livraison/gradlew | 185 +++ livraison/gradlew.bat | 89 ++ livraison/server/build.gradle | 26 + .../java/fr/lnl/game/server/ServerMain.java | 9 + .../java/fr/lnl/game/server/games/Game.java | 212 ++++ .../server/games/action/AbstractAction.java | 16 + .../lnl/game/server/games/action/Action.java | 28 + .../server/games/action/DeployShield.java | 47 + .../game/server/games/action/Direction.java | 8 + .../server/games/action/Direction4Axis.java | 41 + .../server/games/action/Direction8Axis.java | 33 + .../game/server/games/action/DropBomb.java | 26 + .../game/server/games/action/DropMine.java | 26 + .../game/server/games/action/DropObject.java | 78 ++ .../fr/lnl/game/server/games/action/Move.java | 95 ++ .../action/NoMoreBulletInWeaponException.java | 12 + .../action/NotValidDirectionException.java | 12 + .../lnl/game/server/games/action/Nothing.java | 41 + .../games/action/ReunionSameAction.java | 41 + .../fr/lnl/game/server/games/action/Shot.java | 115 ++ .../server/games/action/package-info.java | 4 + .../fr/lnl/game/server/games/grid/Grid.java | 181 +++ .../build/AbstractGridFactoryBuilder.java | 107 ++ .../games/grid/build/GridFactoryBuilder.java | 61 + .../grid/build/LockGridFactoryBuilder.java | 152 +++ .../server/games/grid/build/package-info.java | 4 + .../games/grid/elements/AbstractBox.java | 25 + .../game/server/games/grid/elements/Bomb.java | 65 + .../game/server/games/grid/elements/Box.java | 12 + .../games/grid/elements/CountdownBox.java | 13 + .../games/grid/elements/EnergyBall.java | 34 + .../server/games/grid/elements/Explosive.java | 50 + .../games/grid/elements/InteractiveBox.java | 20 + .../game/server/games/grid/elements/Mine.java | 23 + .../game/server/games/grid/elements/Wall.java | 17 + .../games/grid/elements/package-info.java | 4 + .../game/server/games/grid/package-info.java | 4 + .../lnl/game/server/games/package-info.java | 4 + .../server/games/player/AbstractPlayer.java | 134 ++ .../game/server/games/player/ClassPlayer.java | 86 ++ .../server/games/player/ComputerPlayer.java | 39 + .../game/server/games/player/HumanPlayer.java | 21 + .../lnl/game/server/games/player/Player.java | 62 + .../games/player/RandomComputerPlayer.java | 33 + .../games/player/StrategyComputerPlayer.java | 138 +++ .../server/games/player/package-info.java | 4 + .../lnl/game/server/games/weapon/Firearm.java | 30 + .../lnl/game/server/games/weapon/Weapon.java | 17 + .../server/games/weapon/package-info.java | 4 + .../listener/AbstractModelListening.java | 22 + .../game/server/listener/ModelListener.java | 13 + .../game/server/listener/package-info.java | 5 + .../java/fr/lnl/game/server/package-info.java | 4 + .../lnl/game/server/utils/CrashException.java | 14 + .../lnl/game/server/utils/ErrorMessage.java | 14 + .../java/fr/lnl/game/server/utils/Maths.java | 63 + .../java/fr/lnl/game/server/utils/Pair.java | 59 + .../java/fr/lnl/game/server/utils/Point.java | 11 + .../lnl/game/server/utils/package-info.java | 4 + .../server/src/main/java/module-info.java | 15 + .../fr/lnl/game/server/ActionPlayerTest.java | 101 ++ .../java/fr/lnl/game/server/GridTest.java | 83 ++ .../java/fr/lnl/game/server/mock/Mock.java | 22 + .../game/server/mock/MockDisplayWinner.java | 10 + .../server/mock/MockGridFactoryBuilder.java | 41 + livraison/settings.gradle | 11 + livraison/startTerminal.bat | 3 + livraison/startTerminal.sh | 3 + livraison/startWindow.bat | 2 + livraison/startWindow.sh | 3 + 271 files changed, 28073 insertions(+) create mode 100644 livraison/README.txt create mode 100644 livraison/build.gradle create mode 100644 livraison/buildSrc/build.gradle create mode 100644 livraison/buildSrc/src/main/groovy/fr.lnl.game.java-application-conventions.gradle create mode 100644 livraison/buildSrc/src/main/groovy/fr.lnl.game.java-common-conventions.gradle create mode 100644 livraison/buildSrc/src/main/groovy/fr.lnl.game.java-library-conventions.gradle create mode 100644 livraison/client/build.gradle create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/App.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/ClientPlayer.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/ViewLambda.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/ClientEventHandler.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/DisplayWinnerEvent.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/NextPlayerButtonListener.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/SelectActionButton.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/SelectDirectionListener.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/listener/package-info.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/package-info.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/AbstractView.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/Cell.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/Terminal.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/View.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/ViewManager.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/Window.java create mode 100644 livraison/client/src/main/java/fr/lnl/game/client/view/package-info.java create mode 100644 livraison/client/src/main/java/module-info.java create mode 100644 livraison/client/src/main/resources/background.png create mode 100644 livraison/client/src/main/resources/bomb.png create mode 100644 livraison/client/src/main/resources/energyBall.png create mode 100644 livraison/client/src/main/resources/mine.png create mode 100644 livraison/client/src/main/resources/player.png create mode 100644 livraison/client/src/main/resources/player_shield.png create mode 100644 livraison/client/src/main/resources/player_shot.png create mode 100644 livraison/client/src/main/resources/wall.png create mode 100644 livraison/dist/client.jar create mode 100644 livraison/dist/server.jar create mode 100644 livraison/doc/client/allclasses-index.html create mode 100644 livraison/doc/client/allpackages-index.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/App.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/ClientPlayer.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/ViewLambda.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/ClientEventHandler.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/DisplayWinnerEvent.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/NextPlayerButtonListener.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/SelectActionButton.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/SelectDirectionListener.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/package-summary.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/listener/package-tree.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/package-summary.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/package-tree.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/AbstractView.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/Cell.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/Terminal.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/View.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/ViewManager.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/Window.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/package-summary.html create mode 100644 livraison/doc/client/client/fr/lnl/game/client/view/package-tree.html create mode 100644 livraison/doc/client/client/module-summary.html create mode 100644 livraison/doc/client/constant-values.html create mode 100644 livraison/doc/client/element-list create mode 100644 livraison/doc/client/help-doc.html create mode 100644 livraison/doc/client/index-all.html create mode 100644 livraison/doc/client/index.html create mode 100644 livraison/doc/client/jquery-ui.overrides.css create mode 100644 livraison/doc/client/legal/COPYRIGHT create mode 100644 livraison/doc/client/legal/LICENSE create mode 100644 livraison/doc/client/legal/jquery.md create mode 100644 livraison/doc/client/legal/jqueryUI.md create mode 100644 livraison/doc/client/member-search-index.js create mode 100644 livraison/doc/client/module-search-index.js create mode 100644 livraison/doc/client/overview-tree.html create mode 100644 livraison/doc/client/package-search-index.js create mode 100644 livraison/doc/client/resources/glass.png create mode 100644 livraison/doc/client/resources/x.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_glass_65_dadada_1x400.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 livraison/doc/client/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 livraison/doc/client/script-dir/images/ui-icons_222222_256x240.png create mode 100644 livraison/doc/client/script-dir/images/ui-icons_2e83ff_256x240.png create mode 100644 livraison/doc/client/script-dir/images/ui-icons_454545_256x240.png create mode 100644 livraison/doc/client/script-dir/images/ui-icons_888888_256x240.png create mode 100644 livraison/doc/client/script-dir/images/ui-icons_cd0a0a_256x240.png create mode 100644 livraison/doc/client/script-dir/jquery-3.5.1.min.js create mode 100644 livraison/doc/client/script-dir/jquery-ui.min.css create mode 100644 livraison/doc/client/script-dir/jquery-ui.min.js create mode 100644 livraison/doc/client/script-dir/jquery-ui.structure.min.css create mode 100644 livraison/doc/client/script.js create mode 100644 livraison/doc/client/search.js create mode 100644 livraison/doc/client/stylesheet.css create mode 100644 livraison/doc/client/tag-search-index.js create mode 100644 livraison/doc/client/type-search-index.js create mode 100644 livraison/doc/index.html create mode 100644 livraison/doc/server/allclasses-index.html create mode 100644 livraison/doc/server/allpackages-index.html create mode 100644 livraison/doc/server/constant-values.html create mode 100644 livraison/doc/server/element-list create mode 100644 livraison/doc/server/help-doc.html create mode 100644 livraison/doc/server/index-all.html create mode 100644 livraison/doc/server/index.html create mode 100644 livraison/doc/server/jquery-ui.overrides.css create mode 100644 livraison/doc/server/legal/COPYRIGHT create mode 100644 livraison/doc/server/legal/LICENSE create mode 100644 livraison/doc/server/legal/jquery.md create mode 100644 livraison/doc/server/legal/jqueryUI.md create mode 100644 livraison/doc/server/member-search-index.js create mode 100644 livraison/doc/server/module-search-index.js create mode 100644 livraison/doc/server/overview-tree.html create mode 100644 livraison/doc/server/package-search-index.js create mode 100644 livraison/doc/server/resources/glass.png create mode 100644 livraison/doc/server/resources/x.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_glass_65_dadada_1x400.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 livraison/doc/server/script-dir/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 livraison/doc/server/script-dir/images/ui-icons_222222_256x240.png create mode 100644 livraison/doc/server/script-dir/images/ui-icons_2e83ff_256x240.png create mode 100644 livraison/doc/server/script-dir/images/ui-icons_454545_256x240.png create mode 100644 livraison/doc/server/script-dir/images/ui-icons_888888_256x240.png create mode 100644 livraison/doc/server/script-dir/images/ui-icons_cd0a0a_256x240.png create mode 100644 livraison/doc/server/script-dir/jquery-3.5.1.min.js create mode 100644 livraison/doc/server/script-dir/jquery-ui.min.css create mode 100644 livraison/doc/server/script-dir/jquery-ui.min.js create mode 100644 livraison/doc/server/script-dir/jquery-ui.structure.min.css create mode 100644 livraison/doc/server/script.js create mode 100644 livraison/doc/server/search.js create mode 100644 livraison/doc/server/serialized-form.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/ServerMain.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/Game.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/AbstractAction.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Action.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/DeployShield.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Direction.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Direction4Axis.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Direction8Axis.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/DropBomb.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/DropMine.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/DropObject.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Move.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/NotValidDirectionException.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Nothing.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/ReunionSameAction.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/Shot.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/action/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/Grid.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/AbstractBox.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Bomb.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Box.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/CountdownBox.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/EnergyBall.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Explosive.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/InteractiveBox.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Mine.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Wall.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/grid/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/AbstractPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/ClassPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/ComputerPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/HumanPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/Player.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/RandomComputerPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/StrategyComputerPlayer.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/player/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/weapon/Firearm.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/weapon/Weapon.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/listener/AbstractModelListening.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/listener/ModelListener.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/listener/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/listener/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/package-tree.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/CrashException.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/ErrorMessage.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/Maths.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/Pair.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/Point.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/package-summary.html create mode 100644 livraison/doc/server/server/fr/lnl/game/server/utils/package-tree.html create mode 100644 livraison/doc/server/server/module-summary.html create mode 100644 livraison/doc/server/stylesheet.css create mode 100644 livraison/doc/server/tag-search-index.js create mode 100644 livraison/doc/server/type-search-index.js create mode 100644 livraison/gradlew create mode 100644 livraison/gradlew.bat create mode 100644 livraison/server/build.gradle create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/ServerMain.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/Game.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/AbstractAction.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Action.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/DeployShield.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction4Axis.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction8Axis.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/DropBomb.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/DropMine.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/DropObject.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Move.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/NotValidDirectionException.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Nothing.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/ReunionSameAction.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/Shot.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/action/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/Grid.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/AbstractBox.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Bomb.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Box.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/CountdownBox.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/EnergyBall.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Explosive.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/InteractiveBox.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Mine.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Wall.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/grid/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/AbstractPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/ClassPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/ComputerPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/HumanPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/Player.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/RandomComputerPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/StrategyComputerPlayer.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/player/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Firearm.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Weapon.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/games/weapon/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/listener/AbstractModelListening.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/listener/ModelListener.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/listener/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/package-info.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/CrashException.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/ErrorMessage.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/Maths.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/Pair.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/Point.java create mode 100644 livraison/server/src/main/java/fr/lnl/game/server/utils/package-info.java create mode 100644 livraison/server/src/main/java/module-info.java create mode 100644 livraison/server/src/test/java/fr/lnl/game/server/ActionPlayerTest.java create mode 100644 livraison/server/src/test/java/fr/lnl/game/server/GridTest.java create mode 100644 livraison/server/src/test/java/fr/lnl/game/server/mock/Mock.java create mode 100644 livraison/server/src/test/java/fr/lnl/game/server/mock/MockDisplayWinner.java create mode 100644 livraison/server/src/test/java/fr/lnl/game/server/mock/MockGridFactoryBuilder.java create mode 100644 livraison/settings.gradle create mode 100644 livraison/startTerminal.bat create mode 100644 livraison/startTerminal.sh create mode 100644 livraison/startWindow.bat create mode 100644 livraison/startWindow.sh diff --git a/livraison/README.txt b/livraison/README.txt new file mode 100644 index 0000000..f5b3098 --- /dev/null +++ b/livraison/README.txt @@ -0,0 +1,44 @@ +" Projet de Conception Logiciel conçu par : + +LUCAS Valentin +LEGOT Quentin +NEVEU Thomas + +# Attention + +Ce projet utilise la possibilité de séparé son projet en plusieurs modules en avec Gradle ainsi la disposition des dossiers demandé pour le rendu n'a pas pu être respecté +afin que le programme fonctionne. + +# Dépendances + +Le projet nécessite le ressources suivante pour fonctionner: + +- Java 17 (téléchargeable depuis apt sur Debian 11 ou en téléchargeant sur Oracle ou openJDK) +- Gradle 7.3 ou supérieur (téléchargeable depuis https://gradle.org/releases/ puis en suivez les indications données sur cette page: https://docs.gradle.org/7.3.1/userguide/installation.html#installing_manually ) + +Accédez ensuite à la racine du projet (dossier livraison/ normalement ou du moins le dossier contenant le fichier settings.gradle) pour pouvoir execute le programme + +# Les commandes + +- `gradle :client:run --args="[ARGUMENTS]"` permet de lancer le jeu avec les arguments suivant la logique suivant + - le premier argument concerne le type de vue, indiquer `terminal` pour jouer en mode terminal ou `window` pour jouer en mode fenêtre avec JavaFX + - les arguments suivants concernent les joueurs, ils suivent une forme " [classe du joueur]" + - `type du joueur` pour indiquer si le joueur est: + - `human` pour indiquer un joueur humain utilisant le clavier ou la souris + - `computer` indiquant un joueur ordinateur jouant des coups aléatoire + - `computerS` indiquant un joueur ordinateur semi-aléatoire + - `classe du joueur` est un paramètre facultatif correspond à: + - `tank` indiquant que le joueur est de type tank et qu'il subit moins de dégâts des explosions que les autres ses coups en energies pour faire des actions sont plus élevés + - `dps` ou `default` et un joueur standard, infligeant le plus de dégâts d'attaque et ayant un coup de déplacement équilibré, c'est la valeur par défaut si la classe de ce joueur n'est pas donné + - `support` est un joueur basé sur la pose d'explosif, n'allant que peu au combat direct, ses coups de déplacement sont standard mais ses coups en energies de pose de mine ou de bombes sont les plus faibles. + - Un exemple de ce que cela peux donner est: `window computer default human support computerS dps human tank` + - ici On joue en vue fenêtre avec 4 joueurs: + - computer de classe default (ou dps) + - human de classe support + - computerS de classe dps (ou default) + - human de classe tank +- `gradle build` permet de compiler, exécuter les tests et archiver les classes dans un fichier `.jar` pour chaque module (client et server) +- `gradle javadoc` pour générer la javadoc, une javadoc est générer par projet (soit 2 javadocs), nous vous mettons à disposition dans le dossier livraison un dossier javadoc pour faciliter la navigation + - Si vous voulez naviguer dans la nouvelle javadoc que vous aurez générer, vous pouvez y accéder en allant dans livraison/MODULE/build/doc/javadoc + - les modules étant `client` et `server` +- `gradle test` pour exécuter les tests unitaires \ No newline at end of file diff --git a/livraison/build.gradle b/livraison/build.gradle new file mode 100644 index 0000000..ebdf119 --- /dev/null +++ b/livraison/build.gradle @@ -0,0 +1,8 @@ +subprojects { + apply plugin: 'java' + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + javadoc { + options.memberLevel = JavadocMemberLevel.PRIVATE + } +} diff --git a/livraison/buildSrc/build.gradle b/livraison/buildSrc/build.gradle new file mode 100644 index 0000000..04d80d2 --- /dev/null +++ b/livraison/buildSrc/build.gradle @@ -0,0 +1,13 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + // Support convention plugins written in Groovy. Convention plugins are build scripts in 'src/main' that automatically become available as plugins in the main build. + id 'groovy-gradle-plugin' +} + +repositories { + // Use the plugin portal to apply community plugins in convention plugins. + gradlePluginPortal() +} diff --git a/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-application-conventions.gradle b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-application-conventions.gradle new file mode 100644 index 0000000..553e245 --- /dev/null +++ b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-application-conventions.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + // Apply the common convention plugin for shared build configuration between library and application projects. + id 'fr.lnl.game.java-common-conventions' + + // Apply the application plugin to add support for building a CLI application in Java. + id 'application' +} diff --git a/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-common-conventions.gradle b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-common-conventions.gradle new file mode 100644 index 0000000..1f9f376 --- /dev/null +++ b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-common-conventions.gradle @@ -0,0 +1,31 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + // Apply the java Plugin to add support for Java. + id 'java' +} + +repositories { + // Use Maven Central for resolving dependencies. + mavenCentral() +} + +dependencies { + constraints { + // Define dependency versions as constraints + implementation 'org.apache.commons:commons-text:1.9' + } + + // Use JUnit Jupiter API for testing. + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.1' + + // Use JUnit Jupiter Engine for testing. + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine' +} + +tasks.named('test') { + // Use junit platform for unit tests. + useJUnitPlatform() +} diff --git a/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-library-conventions.gradle b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-library-conventions.gradle new file mode 100644 index 0000000..af0a9af --- /dev/null +++ b/livraison/buildSrc/src/main/groovy/fr.lnl.game.java-library-conventions.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + // Apply the common convention plugin for shared build configuration between library and application projects. + id 'fr.lnl.game.java-common-conventions' + + // Apply the java-library plugin for API and implementation separation. + id 'java-library' +} diff --git a/livraison/client/build.gradle b/livraison/client/build.gradle new file mode 100644 index 0000000..901cb24 --- /dev/null +++ b/livraison/client/build.gradle @@ -0,0 +1,33 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + id 'application' + id 'fr.lnl.game.java-application-conventions' + id 'org.openjfx.javafxplugin' version '0.0.10' + id 'org.javamodularity.moduleplugin' version '1.8.10' apply false +} + +repositories { + mavenCentral() +} + +dependencies { + implementation project(':server') +} + +javafx { + version = JavaVersion.VERSION_17 + modules = [ 'javafx.controls', 'javafx.graphics' ] +} + +application { + // Define the main class for the application. + mainClassName = 'fr.lnl.game.client.App' + mainModule = "client" +} + +run { + standardInput = System.in +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/App.java b/livraison/client/src/main/java/fr/lnl/game/client/App.java new file mode 100644 index 0000000..f0475c1 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/App.java @@ -0,0 +1,203 @@ +package fr.lnl.game.client; + +import fr.lnl.game.client.view.AbstractView; +import fr.lnl.game.client.view.Terminal; +import fr.lnl.game.client.view.ViewManager; +import fr.lnl.game.client.view.Window; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.build.GridFactoryBuilder; +import fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder; +import fr.lnl.game.server.games.player.*; +import fr.lnl.game.server.utils.CrashException; +import fr.lnl.game.server.utils.Point; +import javafx.application.Application; +import javafx.stage.Stage; + +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; + +/** + * Application starting point + */ +public class App extends Application { + + private static LinkedList argsList; + private static Game game; + private static ViewManager viewManager; + + public static void main(String[] args) { + try { + argsList = new LinkedList<>(Arrays.asList(args)); + argsList.removeIf(s -> s.startsWith("-D") || s.equals("fr.lnl.game.client.App")); // remove given parameters from gradle + Class clazz; + try { + clazz = parseView(); + } catch (IllegalArgumentException e) { + throw new CrashException(e.getMessage(), e); + } + if(clazz.equals(Terminal.class)) { + launchTerminal(); + } else { + launch(); + } + } catch(CrashException e) { + System.err.println("Une erreur est survenue et l'application a été obligé de fermer"); + System.err.println(e.getCause().toString()); + for (StackTraceElement element : e.getStackTrace()) { + System.err.println(" at " + element.toString()); + } + System.exit(1); + } + } + + /** + * Parse players arguments and create a new instance of Game + * @throws IllegalArgumentException when given argument is unknown + * @throws InvocationTargetException when the creation of the player throw an exception + * @throws NoSuchMethodException when constructor with given parameter in {@link Class#getConstructor(Class[])} + * doesn't exist + * @throws InstantiationException when the instanciation of the player is impossible (like when class is abstract), + * is probably never called + * @throws IllegalAccessException when the instanciation of thr player is impossible (like a private constructor), + * is probably never called + */ + public static void startGame() throws IllegalArgumentException, InvocationTargetException, NoSuchMethodException, + InstantiationException, IllegalAccessException { + List players = parsePlayers(); + GridFactoryBuilder builder = LockGridFactoryBuilder.create().energyProbability(0.95F).wallProbability(0.80F).gridDimensions(12, 12); + game = new Game(builder, players); + } + + @Override + public void start(Stage stage) { + try { + startGame(); + } catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | InstantiationException + | IllegalAccessException e) { + throw new CrashException(e.getMessage(), e); + } + viewManager = new ViewManager(game, Window.class, player -> new Window(stage, game, player)); + viewManager.run(); + } + + public static void launchTerminal() { + try { + startGame(); + } catch (IllegalArgumentException | InvocationTargetException | NoSuchMethodException | InstantiationException + | IllegalAccessException e) { + throw new CrashException(e.getMessage(), e); + } + viewManager = new ViewManager(game, Terminal.class, player -> new Terminal(game, player)); + viewManager.run(); + } + + /** + * Parse players arguments and create instances for each player + * @throws IllegalArgumentException when given argument is unknown + * @throws InvocationTargetException when the creation of the player throw an exception + * @throws NoSuchMethodException when constructor with given parameter in {@link Class#getConstructor(Class[])} + * doesn't exist + * @throws InstantiationException when the instanciation of the player is impossible (like when class is abstract), + * is probably never called + * @throws IllegalAccessException when the instanciation of thr player is impossible (like a private constructor), + * is probably never called + */ + public static List parsePlayers() throws IllegalArgumentException, NoSuchMethodException, + InvocationTargetException, InstantiationException, IllegalAccessException { + List playerList = new ArrayList<>(); + Class playerClass = null; + ClassPlayer classPlayer = null; + for(String str : argsList) { + switch (str) { + case "human" -> { + if(playerClass != null) { + playerList.add(createNewPlayer(playerClass, + classPlayer != null ? classPlayer : ClassPlayer.DEFAULT, playerList.size()) + ); + classPlayer = null; + } + playerClass = HumanPlayer.class; + } + case "computer" -> { + if(playerClass != null) { + playerList.add(createNewPlayer(playerClass, + classPlayer != null ? classPlayer : ClassPlayer.DEFAULT, playerList.size()) + ); + classPlayer = null; + } + playerClass = RandomComputerPlayer.class; + } + case "computerS" -> { + if(playerClass != null) { + playerList.add(createNewPlayer(playerClass, + classPlayer != null ? classPlayer : ClassPlayer.DEFAULT, playerList.size()) + ); + classPlayer = null; + } + playerClass = StrategyComputerPlayer.class; + } + case "default" -> classPlayer = ClassPlayer.DEFAULT; + case "tank" -> classPlayer = ClassPlayer.TANK; + case "dps" -> classPlayer = ClassPlayer.DPS; + case "support" -> classPlayer = ClassPlayer.SUPPORT; + default -> throw new IllegalArgumentException("Unknown argument: " + str); + } + } + if(playerClass != null) + playerList.add(createNewPlayer(playerClass, + classPlayer != null ? classPlayer : ClassPlayer.DEFAULT, playerList.size()) + ); + return playerList; + } + + /** + * create a new instance of the player + * @throws IllegalArgumentException when given argument is unknown (probably never called in production) + * @throws InvocationTargetException when the creation of the player throw an exception + * @throws NoSuchMethodException when constructor with given parameter in {@link Class#getConstructor(Class[])} + * doesn't exist + * @throws InstantiationException when the instanciation of the player is impossible (like when class is abstract), + * is probably never called + * @throws IllegalAccessException when the instanciation of thr player is impossible (like a private constructor), + * is probably never called + */ + private static Player createNewPlayer(Class playerClass, ClassPlayer playerType, + int playerListSize) throws NoSuchMethodException, InvocationTargetException, + InstantiationException, IllegalAccessException { + return playerClass.getConstructor(Integer.class, Point.class, ClassPlayer.class) + .newInstance(playerListSize, null, playerType); + } + + /** + * Parse the first argument given by user to know the view to use (Terminal or Window) + * @return The class of the View to use + * @throws IllegalArgumentException when given argument is unknown or no argument is given by user + */ + public static Class parseView() throws IllegalArgumentException { + Class clazz; + if(!argsList.isEmpty()) { + if(argsList.get(0).equals("terminal")) { + clazz = Terminal.class; + } else if(argsList.get(0).equals("window")){ + clazz = Window.class; + } else { + throw new IllegalArgumentException("Unknown argument: " + argsList.get(0)); + } + argsList.removeFirst(); + } else { + throw new IllegalArgumentException("No argument given"); + } + return clazz; + } + + public static ViewManager getViewManager() { + return viewManager; + } + + public static Game getGame() { + return game; + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/ClientPlayer.java b/livraison/client/src/main/java/fr/lnl/game/client/ClientPlayer.java new file mode 100644 index 0000000..6195714 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/ClientPlayer.java @@ -0,0 +1,18 @@ +package fr.lnl.game.client; + +import fr.lnl.game.client.view.View; +import fr.lnl.game.server.games.player.Player; + +/** + * Store a view per player + */ +public record ClientPlayer(Player serverPlayer, View view) { + + public Player getServerPlayer() { + return serverPlayer; + } + + public View getView() { + return view; + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/ViewLambda.java b/livraison/client/src/main/java/fr/lnl/game/client/ViewLambda.java new file mode 100644 index 0000000..284bde6 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/ViewLambda.java @@ -0,0 +1,19 @@ +package fr.lnl.game.client; + +import fr.lnl.game.client.view.View; +import fr.lnl.game.server.games.player.Player; + +/** + * Used as Lambda expression to instantiate a {@link View} per {@link Player} stored in {@link ClientPlayer} + */ +@FunctionalInterface +public interface ViewLambda { + + /** + * A lambda create an anonymous class which implements this interface + * @param player an instance of {@link Player} to store in {@link View} + * @return an instance of view (depending on the first argument when launching the program) + */ + View createViewLambda(Player player); + +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/ClientEventHandler.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/ClientEventHandler.java new file mode 100644 index 0000000..a0f39d2 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/ClientEventHandler.java @@ -0,0 +1,20 @@ +package fr.lnl.game.client.listener; + +import fr.lnl.game.server.listener.ModelListener; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; + +/** + * implementation of a listener from JavaFX {@link EventHandler} + */ +public record ClientEventHandler(ModelListener listener) implements EventHandler { + + /** + * This method is call by JavaFX when we click to the button + * @param event event class created when clicking on the element + */ + @Override + public void handle(ActionEvent event) { + listener.updateModel(event); + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/DisplayWinnerEvent.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/DisplayWinnerEvent.java new file mode 100644 index 0000000..d7a698b --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/DisplayWinnerEvent.java @@ -0,0 +1,21 @@ +package fr.lnl.game.client.listener; + +import fr.lnl.game.client.App; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.listener.AbstractModelListening; + +/** + * Used to display the winner of the game + */ +public class DisplayWinnerEvent extends AbstractModelListening { + + /** + * This method is call when the game is over + * @param obj contains the winner of the game, can be null + */ + @Override + public void updateModel(Object obj) { + Player winner = (Player) obj; + App.getViewManager().displayWinner(winner); + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/NextPlayerButtonListener.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/NextPlayerButtonListener.java new file mode 100644 index 0000000..3d67ca5 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/NextPlayerButtonListener.java @@ -0,0 +1,40 @@ +package fr.lnl.game.client.listener; + +import fr.lnl.game.client.App; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.listener.AbstractModelListening; + +/** + * This method is call when the current player have selected an action to play (or if it's a computer player, will + * select it), then we call {@link Game#play()} and we update the view + */ +public class NextPlayerButtonListener extends AbstractModelListening { + + private final Game game; + private final DisplayWinnerEvent displayWinnerEvent; + + public NextPlayerButtonListener(Game game) { + this.game = game; + this.displayWinnerEvent = new DisplayWinnerEvent(); + } + + /** + * Call when clicking on "SUIVANT" button if current player is a computer player or after the human player selected + * action it want to play + */ + @Override + public void updateModel(Object event) { + // Player player = game.getCurrentPlayer(); + boolean isOver = game.play(); + /* Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Un joueur ordinateur a joué"); + alert.setHeaderText("Le joueur ordinateur numéro" + player.getId() + " a joué"); + alert.setContentText("Il a joué l'action: " + game.getSelectedAction()); */ + App.getViewManager().updateView(); + if(isOver) { + displayWinnerEvent.updateModel(game.getWinner()); + System.exit(0); + } + //alert.showAndWait(); + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectActionButton.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectActionButton.java new file mode 100644 index 0000000..7e3711d --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectActionButton.java @@ -0,0 +1,38 @@ +package fr.lnl.game.client.listener; + +import fr.lnl.game.client.App; +import fr.lnl.game.client.view.Window; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.ReunionSameAction; +import fr.lnl.game.server.listener.AbstractModelListening; + +/** + * Used when the human player select type of action it want to play + */ +public class SelectActionButton extends AbstractModelListening { + + private final Window window; + private final ReunionSameAction reunionSameAction; + private final Game game; + + public SelectActionButton(Game game, Window window, ReunionSameAction reunionSameAction) { + this.game = game; + this.window = window; + this.reunionSameAction = reunionSameAction; + } + + /** + * This method is call when the player select the type of action it want to play + * @param obj contain information about the event like the button where the player clicked + */ + @Override + public void updateModel(Object obj) { + if(reunionSameAction.getActions().size() == 1){ + game.setSelectedAction(reunionSameAction.getActions().get(0)); + window.getNextPlayerButtonListener().updateModel(obj); + } else { + window.setSelectedReunionAction(reunionSameAction); + App.getViewManager().updateView(); // update screen + } + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectDirectionListener.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectDirectionListener.java new file mode 100644 index 0000000..4d95554 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/SelectDirectionListener.java @@ -0,0 +1,34 @@ +package fr.lnl.game.client.listener; + +import fr.lnl.game.client.view.Window; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.Action; +import fr.lnl.game.server.listener.AbstractModelListening; + +/** + * Call when the player selected the direction where it wants to play it + */ +public class SelectDirectionListener extends AbstractModelListening { + + private final Game game; + private final Action action; + private final Window window; + + public SelectDirectionListener(Game game, Window window, Action action) { + this.game = game; + this.window = window; + this.action = action; + } + + /** + * This method is call when the player click on the button to select the direction of the previously selected action + * @param obj contain information about the event like the button where the player clicked + */ + @Override + public void updateModel(Object obj) { + game.setSelectedAction(action); + window.setSelectedReunionAction(null); + window.getNextPlayerButtonListener().updateModel(obj); + + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/listener/package-info.java b/livraison/client/src/main/java/fr/lnl/game/client/listener/package-info.java new file mode 100644 index 0000000..0e9f04f --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/listener/package-info.java @@ -0,0 +1,4 @@ +/** + * Package that contains every view listeners + */ +package fr.lnl.game.client.listener; \ No newline at end of file diff --git a/livraison/client/src/main/java/fr/lnl/game/client/package-info.java b/livraison/client/src/main/java/fr/lnl/game/client/package-info.java new file mode 100644 index 0000000..3ade71c --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/package-info.java @@ -0,0 +1,4 @@ +/** + * Client package + */ +package fr.lnl.game.client; \ No newline at end of file diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/AbstractView.java b/livraison/client/src/main/java/fr/lnl/game/client/view/AbstractView.java new file mode 100644 index 0000000..ec020d6 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/AbstractView.java @@ -0,0 +1,18 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.player.Player; + +/** + * Abstract class implemented by every view classes + */ +public abstract class AbstractView implements View { + + protected final Player player; + protected Game game; + + public AbstractView(Game game, Player player) { + this.game = game; + this.player = player; + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/Cell.java b/livraison/client/src/main/java/fr/lnl/game/client/view/Cell.java new file mode 100644 index 0000000..caa47ad --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/Cell.java @@ -0,0 +1,89 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.Shot; +import fr.lnl.game.server.games.grid.elements.Bomb; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Mine; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.Player; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; + +/** + * classe qui a pour but de générer chaque case de la grid et de vérifier les entités présentes dessus + * (Mur, Joueur, Energie, Bombe, etc.) + */ +public class Cell extends Rectangle { + + //Images libres de droit : + //https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/resource-packs/1242533-pixel-perfection-now-with-polar-bears-1-11 + //https://www.stocklib.fr/media-134367689/pixel-game-icons-vector-isolated-bombs-with-fire-graphics-of-retro-gaming-flat-style-of-weapon-with-flames-destruction-and-danger-explosive-substance.html?keyword=bomb%20pixel + + private static final Image PLAYER_IMAGE = new Image("player.png"); + private static final Image PLAYER_SHIELD_IMAGE = new Image("player_shield.png"); + private static final Image PLAYER_SHOT_IMAGE = new Image("player_shot.png"); + private static final Image ENERGY_BALL_IMAGE = new Image("energyBall.png"); + private static final Image BOMB_IMAGE = new Image("bomb.png"); + private static final Image MINE_IMAGE = new Image("mine.png"); + private static final Image WALL_IMAGE = new Image("wall.png"); + private static final Image BACKGROUND_IMAGE = new Image("background.png"); + private static final BackgroundImage BG = new BackgroundImage(BACKGROUND_IMAGE,BackgroundRepeat.NO_REPEAT,BackgroundRepeat.NO_REPEAT,BackgroundPosition.DEFAULT, + BackgroundSize.DEFAULT); + + public Cell(int x, int y){ + setWidth(Window.cellSize); + setHeight(Window.cellSize); + relocate(x * Window.cellSize,y * Window.cellSize); + setFill(Color.WHITE); + setStroke(Color.DARKGRAY); + } + + /** + * @param object the object we'll define the type + * @return a pane which contains an image depending on the type of the object + */ + public static StackPane setImageObject(Object object, Game game){ + StackPane sp = new StackPane(); + Image in; + BackgroundImage bg = BG; + if(object instanceof Player){ + if(object.equals(game.getCurrentPlayer()) && game.getSelectedAction() instanceof Shot){ + in = PLAYER_SHOT_IMAGE; + } + else if(((Player) object).isShieldDeploy()){ + in = PLAYER_SHIELD_IMAGE; + } + else{ + in = PLAYER_IMAGE; + } + } else if(object instanceof EnergyBall){ + in = ENERGY_BALL_IMAGE; + } else if(object instanceof Bomb){ + in = BOMB_IMAGE; + } else if(object instanceof Mine){ + in = MINE_IMAGE; + } + else if(object instanceof Wall){ + in = WALL_IMAGE; + bg = null; + } + else{ + in = null; + } + + ImageView iv = new ImageView(in); + iv.setFitHeight(Window.cellSize); + iv.setFitWidth(Window.cellSize); + sp.getChildren().add(iv); + sp.setBackground(new Background(bg)); + return sp; + } + + public static Image getPlayerImage() { + return PLAYER_IMAGE; + } +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/Terminal.java b/livraison/client/src/main/java/fr/lnl/game/client/view/Terminal.java new file mode 100644 index 0000000..86dbbac --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/Terminal.java @@ -0,0 +1,113 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.*; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Maths; + +import java.util.List; +import java.util.Scanner; + +/** + * View terminal, use standard input and output + */ +public class Terminal extends AbstractView { + + /** + * Standard input + */ + public static Scanner scanner; + + public Terminal(Game game, Player player) { + super(game, player); + } + + /** + * Used to update view + */ + public void show() { + System.out.println(game.getGrid().privateView(player)); + } + + /** + * Used to display the winner of the game + * @param winner the player who win the game, can be Null + */ + @Override + public void displayWinner(Player winner) { + System.out.println("\n\033[0;31m====== FIN DU JEU ======\033[0m"); + System.out.println(game.getGrid().toString()); + if(winner == null) { + System.out.println("\n\033[0;Partie nulle, personne n'a gagné la partie\033[0m"); + } else { + System.out.println("\n\033[0;33mVictoire de " + winner + " " + winner.getId() + "\033[0m"); + } + + } + + /** + * Used when current player is an instance of {@link fr.lnl.game.server.games.player.HumanPlayer} and demand to it + * an action to do + * @return chosen action + * @see Terminal#choseReunionSameAction(List) + */ + public Action choseAction() { + List actions = player.generateAvailableActions(); + List listActions = choseReunionSameAction(actions).getActions(); + Action action = null; + String error = "Veuillez renseigner une valeur numérique comprise entre 1 et " + listActions.size(); + do { + if(listActions.size() == 1){ + return listActions.get(0); + } + System.out.println("Choisissez la cible :"); + for (int i = 0; i < listActions.size(); i++) { + Action a = listActions.get(i); + if(a instanceof Move m){ + System.out.println(i + 1 + " : " + m.getDirection()); + } + else if(a instanceof DropObject o){ + System.out.println(i + 1 + " : " + o.getDirection()); + } + else if(a instanceof Shot s){ + System.out.println(i + 1 + " : " + s.getPoint()); + } + else{ + System.out.println(i + 1 + " : " + a.getClass().getSimpleName()); + } + } + String entry = scanner.next(); + int value = Maths.testInteger(entry, scanner, error); + if (value >= 1 && value <= listActions.size()) { + action = listActions.get(value - 1); + } + } while (action == null); + return action; + } + + /** + * Used when current player is an instance of {@link fr.lnl.game.server.games.player.HumanPlayer} and demand to it + * a type of action to do + * @param actions the list of actions possible + * @return the type of action to execute + * @see Terminal#choseAction() + */ + private ReunionSameAction choseReunionSameAction(List actions) { + ReunionSameAction reunion = null; + String error = "Veuillez renseigner une valeur numérique comprise entre 1 et " + actions.size(); + Scanner scanner = new Scanner(System.in); + do { + System.out.println("Choisissez une action :"); + for (int i = 0; i < actions.size(); i++) { + System.out.println(i + 1 + " : " + actions.get(i).getActionName()); + } + String entry = scanner.next(); + int value = Maths.testInteger(entry, scanner, error); + if (value >= 1 && value <= actions.size()) { + reunion = actions.get(value - 1); + } + }while (reunion == null) ; + return reunion; + } + +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/View.java b/livraison/client/src/main/java/fr/lnl/game/client/view/View.java new file mode 100644 index 0000000..3b22907 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/View.java @@ -0,0 +1,20 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.server.games.player.Player; + +/** + * View interface, implemented by Terminal and Window. + */ +public interface View { + + /** + * used to update screen + */ + void show(); + + /** + * Used to display the name of the winner + * @param winner the player who win the game, can be Null + */ + void displayWinner(/* Nullable */ Player winner); +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/ViewManager.java b/livraison/client/src/main/java/fr/lnl/game/client/view/ViewManager.java new file mode 100644 index 0000000..326d185 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/ViewManager.java @@ -0,0 +1,81 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.client.ClientPlayer; +import fr.lnl.game.client.ViewLambda; +import fr.lnl.game.client.listener.DisplayWinnerEvent; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.player.HumanPlayer; +import fr.lnl.game.server.games.player.Player; + +import java.util.HashMap; +import java.util.Scanner; + +/** + * View manager, main access to every views + */ +public final class ViewManager { + + private final Game game; + private final Class viewType; + public HashMap players = new HashMap<>(); + + public ViewManager(Game game, Class viewType, ViewLambda lambda) { + this.game = game; + this.viewType = viewType; + for (Player player : game.getPlayers()) { + players.put(player, new ClientPlayer(player, lambda.createViewLambda(player))); + } + } + + /** + * Call when we need to change or update view + */ + public void updateView() { + players.get(game.getCurrentPlayer()).getView().show(); + } + + /** + * This method is call when the view is a terminal + */ + public void terminalView() { + Terminal.scanner = new Scanner(System.in); + DisplayWinnerEvent displayWinnerEvent = new DisplayWinnerEvent(); + while (true) { + Player player = game.getCurrentPlayer(); + System.out.println("\n\033[0;34m====== Tour n°" + game.getNbrTurn() + " =======\033[0m"); + System.out.println("\nA \033[0;31m" + player + " " + player.getId() + "\033[0m de jouer"); + players.get(game.getCurrentPlayer()).getView().show(); + if (game.getCurrentPlayer() instanceof HumanPlayer human) { + game.setSelectedAction(((Terminal) players.get(human).getView()).choseAction()); + } + boolean isOver = game.play(); + System.out.println("\n\033[0;31m" + player + " " + player.getId() + "\033[0m utilise l'action \033[0;36m" + + game.getSelectedAction().getClass().getSimpleName() + "\033[0m"); + if (isOver) { + displayWinnerEvent.updateModel(game.getWinner()); + Terminal.scanner.close(); + System.exit(0); + } + } + } + + /** + * This method is call when the game is finish + * @param winner The winner of the game, can be null + */ + public void displayWinner(Player winner) { + players.get(game.getCurrentPlayer()).getView().displayWinner(winner); + } + + /** + * This method is call after initialized view manager to display a first screen + */ + public void run() { + if (viewType == Terminal.class) { + terminalView(); + } else { + updateView(); + } + } + +} diff --git a/livraison/client/src/main/java/fr/lnl/game/client/view/Window.java b/livraison/client/src/main/java/fr/lnl/game/client/view/Window.java new file mode 100644 index 0000000..5bd2b02 --- /dev/null +++ b/livraison/client/src/main/java/fr/lnl/game/client/view/Window.java @@ -0,0 +1,302 @@ +package fr.lnl.game.client.view; + +import fr.lnl.game.client.App; +import fr.lnl.game.client.listener.ClientEventHandler; +import fr.lnl.game.client.listener.NextPlayerButtonListener; +import fr.lnl.game.client.listener.SelectActionButton; +import fr.lnl.game.client.listener.SelectDirectionListener; +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.*; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Explosive; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.HumanPlayer; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Alert; +import javafx.scene.control.Button; +import javafx.scene.layout.*; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; +import javafx.scene.text.Text; +import javafx.stage.Stage; + +import java.util.List; + +/** + * Window view, use mouse and keyboard to control interface + */ +public class Window extends AbstractView { + + + // il faut pouvoir trouver une formule responsive avec width et height + public static final int cellSize = 40; + public static final int width = 500; + public static final int height = 160; + private static final Color dark = Color.valueOf("1F1F1F"); + private static final Background bg = new Background(new BackgroundFill(dark, CornerRadii.EMPTY, Insets.EMPTY)); + + + private final Stage stage; + private Pane buttonPane; + private ReunionSameAction selectedReunionAction = null; + private final NextPlayerButtonListener nextPlayerButtonListener = new NextPlayerButtonListener(game); + + + public Window(Stage stage, Game game, Player player) { + super(game, player); + this.stage = stage; + } + + /** + * used to update screen + */ + public void show() { + Scene scene = new Scene(createContent()); + stage.setScene(scene); + stage.setTitle("Game"); + stage.getIcons().add(Cell.getPlayerImage()); + stage.setResizable(false); + stage.sizeToScene(); + stage.show(); + } + + /** + * Used to display the name of the winner + * @param winner the player who win the game, can be Null + */ + @Override + public void displayWinner(Player winner) { + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle("Fin du jeu"); + alert.setHeaderText("La partie est termin\u00E9"); + if(winner == null) { + alert.setContentText("La partie est nulle, personne n'a gagn\u00E9"); + } else { + alert.setContentText("Le joueur " + winner + " " + winner.getId() + " a gagn\u00E9"); + } + App.getViewManager().updateView(); + alert.showAndWait(); + } + + /** + * Choose a direction between all possible from the previously selected action type + * @param selectedReunionAction previously selected type of action + * @see Window#choseReunionSameAction(List) + */ + public void choseDirectionAction(ReunionSameAction selectedReunionAction) { + for(int i = 0; i < selectedReunionAction.getActions().size(); ++i) { + Action action = selectedReunionAction.getActions().get(i); + if(action instanceof Move m){ + addButtonToPane(m.getDirection().toString(), + new ClientEventHandler(new SelectDirectionListener(game, this, action)), buttonPane, + i * 100 + 50, 0); + } + else if(action instanceof DropObject o){ + addButtonToPane(o.getDirection().toString(), new ClientEventHandler(new SelectDirectionListener(game, this, action)), buttonPane, i * 100 + 50, 0); + } + else if(action instanceof Shot s){ + addButtonToPane(s.getPoint().toString(), new ClientEventHandler(new SelectDirectionListener(game, this, action)), buttonPane, i * 100 + 50, 0); + } + else{ + addButtonToPane(action.getClass().getSimpleName(), new ClientEventHandler(new SelectDirectionListener(game, this, action)), buttonPane, i * 100 + 50, 0); + } + } + } + + /** + * Used when {@link Game#getCurrentPlayer()} is an instance of {@link HumanPlayer}. + * Display button to demand to player to choose the type of action to execute + * @param actions the list of possible actions + * @see Window#choseDirectionAction(ReunionSameAction) + */ + private void choseReunionSameAction(List actions) { + for (int i = 0; i < actions.size(); i++) { + ReunionSameAction action = actions.get(i); + addButtonToPane(action.getActionName(), new ClientEventHandler(new SelectActionButton(game, this, action)), + buttonPane, i * 100 + 50, 0); + } + } + + /** + * called when we add a button in the interface + * @param content content of the button + * @param listener listener of the button + * @param pane pane where we add the button + * @param offsetX move the button from the base position of the pane to the left (when offsetX is negative) or on + * the right (when offsetY is positive) + * @param offsetY move the button from the base position of the pane to the up (when offsetX is negative) or on + * the down (when offsetY is positive) + */ + private void addButtonToPane(String content, EventHandler listener, Pane pane, int offsetX, int offsetY) { + Button button = new Button(content); + button.setOnAction(listener); + button.setPrefSize(85, 35); + button.setStyle("-fx-background-color: #a96806;"); + button.setTextFill(javafx.scene.paint.Color.WHITE); + button.setLayoutX(offsetX - button.getPrefWidth() / 2); + button.setLayoutY(offsetY); + pane.getChildren().add(button); + } + + + /** + * Create content of the stage + * @return the parent element to set to the stage + */ + private Parent createContent() { + Pane principalPane = new Pane(); + principalPane.setPrefSize(game.getGrid().getRow() * cellSize + width, game.getGrid().getColumn() * cellSize + height); // TODO: 04/12/2021 A corriger -> doit plutôt s'adapter à la taille de la grid (grid.getRow() et grid.getColumn()) + for (int i = 0; i < game.getGrid().getRow(); i++) { + for (int j = 0; j < game.getGrid().getColumn(); j++) { + Cell cell = new Cell(i, j); + principalPane.getChildren().add(cell); + } + } + Grid grid = game.getGrid(); + for (int i = 0; i < grid.getRow(); i++) { + for (int j = 0; j < grid.getColumn(); j++) { + Pair value = grid.getBoard().get(new Point(i, j)); + if (value.getB() instanceof Wall || value.getB() instanceof EnergyBall) { + addToPrincipalPanel(value.getB(), principalPane, i, j); + } + else if(value.getB() instanceof Explosive){ + if(((Explosive) value.getB()).getPlayer().equals(player)){ + addToPrincipalPanel(value.getB(), principalPane, i, j); + } + else{ + addToPrincipalPanel(null,principalPane, i, j); + } + } + else if (value.getA() != null) { + addToPrincipalPanel(value.getA(), principalPane, i, j); + } + else{ + addToPrincipalPanel(null,principalPane, i, j); + } + } + } + putStatePlayerPane(principalPane); + putMoveTextPane(principalPane); + this.buttonPane = new Pane(); + buttonPane.setLayoutX(0); + buttonPane.setLayoutY(600); + if(game.getCurrentPlayer() instanceof HumanPlayer) { + if(this.selectedReunionAction == null) { + choseReunionSameAction(player.generateAvailableActions()); + } else { + choseDirectionAction(selectedReunionAction); + } + } else { + addButtonToPane("SUIVANT", new ClientEventHandler(nextPlayerButtonListener), buttonPane, (int) (principalPane.getPrefWidth() / 2), 0); + } + + principalPane.getChildren().add(buttonPane); + principalPane.setBackground(bg); + return principalPane; + } + + /** + * Add grid element to the principal pane + * @param object object to add to the pane + * @param principalPane pane where we'll add the object + * @param i + * @param j + */ + public void addToPrincipalPanel(Object object, Pane principalPane, int i, int j) { + StackPane sp = Cell.setImageObject(object, game); + sp.setLayoutY(i * cellSize); + sp.setLayoutX(j * cellSize); + principalPane.getChildren().add(sp); + } + + /** + * Create the right pane + * @param principalPane principal pane where we'll add the left down pane + */ + public void putStatePlayerPane(Pane principalPane){ + int Y = 0; + for(int i=0;i!lvI6-+0X`wFE0!$Wv|(LWOT)A&lM8dR_wU<#?9CN1pe$#BM`SSr12;DaGv>0i zYzGP+^>lFz@i@MB>OnzPMGoi8gJL<2VmSx@MgKfDBeneB%>tosvPLX79JYwox~mz7 z6uZ9XYgo#$VQnaz#6yM;GTJMqAJU57z_>uAWAd6w)w?QW7nn#*v0QF<(t_O~Q$@2s z%=WDjgUHGdrpH&0{dVYG9v8Jx`7YB1HI7M+#YHvWKS(s>XJ>V7@sN99E0ro*rE=Ox@gCy}frXow{#hBrUbWu!;)g4l_Px7!YU)*^?iv1w>fOcL b^O5bP0l+XkK%}#(A literal 0 HcmV?d00001 diff --git a/livraison/client/src/main/resources/bomb.png b/livraison/client/src/main/resources/bomb.png new file mode 100644 index 0000000000000000000000000000000000000000..cc72c9c62fceec34973091789e99822db31e5ab6 GIT binary patch literal 1959 zcmV;Y2Uz%tP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2RuncK~#8N?OIE7 z8$}TAeaNyc%d#=yQ3=EWisDg49QXtIAy7q8l{;sOBFPCjafS<5s`4ZF0fbZFKv79} zMzLc{mezXhYv`|cMqVpQvevF7Ao{l2v$HchJN->}Pw&dKzyb>_u)qSdN9_M{`FxGk zb0t#SOQc>|A*K9ZFYD%+!Pe#M5xqv1dyZDC=crdXOU=?5itJZ)wNFxrT%V%oOe!uEg$mOGN^{9ThJN5a^&jm(c#o`gXB78z& za&ZRu*APIK#W8?Yw;~EyA~5oQM(77SwWamu3oFm7wWX@stZXV3sHZ3ou&j-8sk~8L zt5S8PLaQq)6i2gP^|=vXvB|^i2ZI4m!Xm%Nr8E1OJl7bIsH;+wc*+O>tT`y1#@q<7 zIqg*{riiyaWx4DPoC)$VYs}9Abl$IIyVHu#UjO+K&}=lxwmJN9AVldn4z(IB-8wr= z)dAmm^P(!3_+_8BH#{ijKUjEVd=6j1%TE+UBkqwnq8w}mVK_3iC#DRD2Z-~H__8xmU)#|IE`>*t?x&%aO?KrSEq zkWjzcTI6VpNXqetVv?i}+yn+9_hNEr?vZ5=~Y_^>5SfD0A!+ljjAl^+;$V%+%d#>eHQ@&>Xvtk!3re0ml89HzzvtyQby0>;F* zwzkBV4Lr{qwgCqR2T}sKBK@U;?a`q>fB%E)Y%zQ(WHb2U%g?XJDk7WR!|QnT!H4gk zIws^I;Ek7GR~xk&1-#Xz6#mItsi~>yyilFmXv>_&jDsaE5cCfrAywh!ue~3`Mu2Kl<3L7?d$$Am_(b zjpKguTs)J@D8`mL*|&sT1mK}iB&{4sfJB%WE6=kXDlE$DzS2*VHV&ewR(J@IrUCNN zW-KgieWyV#0su_U#wOoOfZ5K!pg{Mvb0)EfR=W?tzY0y2)42N5B8|Ow@bVG z52TdHpA~UPjmAE;nhk0;52(rKiue4Yk(&V4RRYa3$ozF z$k9O+qe3(v4e@@SB0hll6VZ3ClFsGylej;oU*&~0<)&hkC9topG!|ZO7-QzUK zO#r4R@9oS%TAqZHxx3AT;jNKfMn*eMbEl0$o&XX?S z$y5wX{b7-V6@?opeEr3jVLm^Nzbo!*4hcjV+-@9l5r9RAMDQOS9I;JG$_+N#z^LHg zUr@5Pyn;y`G6}FbMph^i+Z-?_Ooww3;PW;YMj>?v9XjfHvZ5lqrD0WdIFlbpj7WX} z|L6N5cumd>S!M3es~^Py_6nksMP9#6%AL#vFo(i$>8(q$5J*g*XuV#S?GWc_AWT4Q zkcGC)YbW=y4cRdb!anVK4|2~xmj#R>2$RIe;+!239mx$cI%5fPNP8mYH-Ib{U0?h@ zPy`Akz!8O#A!9bl?~L z<8?hcf^?3gelp>i0IVnSgyrRB>J9qx`P=KXsKw7H0)@taQJmj;NpX}Emw+8$y)!>h zM|ETR*m3@9{9X8b3$=hzB;SE21d=OBu+maIrZeh)2vc=|vzsrfw%0zkV?oxhI>(>C t5CdX%3D56Lb-oKMu)qQfEbvr;=pQLOT1GyfUHAY1002ovPDHLkV1i^@m%RW0 literal 0 HcmV?d00001 diff --git a/livraison/client/src/main/resources/energyBall.png b/livraison/client/src/main/resources/energyBall.png new file mode 100644 index 0000000000000000000000000000000000000000..819b9d310e03ce1822d7652d93b67ef138e7b0a3 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9 z?C1WI$O`031o(uw#;?2K)48_%-0$1({sd1yxZ=@&*V=hN$&8bq9s((jk|4j}{}8}% zuX%4IP>i#{BeIx*f$snaGiF`u znrOVrbZ_&eH2Kg4Oe-8%0~p^raL?^t>%FScjwi3A<2zsj>!S?p6)w>%Z-f=L@Tqn&vI)-b7h%o^n)ajiKn~-k!W2Va S6$6le89ZJ6T-G@yGywqnCT$Y{ literal 0 HcmV?d00001 diff --git a/livraison/client/src/main/resources/mine.png b/livraison/client/src/main/resources/mine.png new file mode 100644 index 0000000000000000000000000000000000000000..13f60a147bae9525815142450938af4b70a5f2c9 GIT binary patch literal 525 zcmV+o0`mQdP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!T(AX+IFf?Y~G!7iP?fLPo3D&h-hmrk&=Oecs4VxcG+7HfZsuzIie z6z;INnQT_YIUfu&h!7dLhr4ScA|fIpA~IHrcXIrIDUcbkusn?^xVe176zr!dGeCn2KsT#&1{6ID z$h*DFfPFaXmA1OW~npax8DiM&y$(J3{c_%(9J5H0aDff8Kg^7&qy34AB0#08+6RXPKtpUwn+KcFNo0G+HFb+zQmzm<4# z^=*LtM}7gjt|ndGyYfpg#b>~^EB_wq&HuonDOVG&hJGg?A|j$cEQ&q=wwZvVQ!aE{ P00000NkvXXu0mjf6UyB{ literal 0 HcmV?d00001 diff --git a/livraison/client/src/main/resources/player.png b/livraison/client/src/main/resources/player.png new file mode 100644 index 0000000000000000000000000000000000000000..0e45c0c1fb438b6337a39a57b259c3e4ad0849f4 GIT binary patch literal 7266 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 B;jsV! literal 0 HcmV?d00001 diff --git a/livraison/client/src/main/resources/player_shot.png b/livraison/client/src/main/resources/player_shot.png new file mode 100644 index 0000000000000000000000000000000000000000..cb03b32128b496299eac8d30b2cfeed69915e587 GIT binary patch literal 7509 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 A9smFU literal 0 HcmV?d00001 diff --git a/livraison/dist/client.jar b/livraison/dist/client.jar new file mode 100644 index 0000000000000000000000000000000000000000..c08f29737d71a515fb7cb30c7748f48b5034f5e5 GIT binary patch literal 50412 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%0Am~4&YfohymZ*x^W(CIesZK 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 literal 0 HcmV?d00001 diff --git a/livraison/dist/server.jar b/livraison/dist/server.jar new file mode 100644 index 0000000000000000000000000000000000000000..2eeeffe471c20bda6e130b7cd0c5600bda169ed1 GIT binary patch literal 49307 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 ddA~49gCwDW57KMbc!7UTfZ+k*+$Z$f{{W2iBn + + + +All Classes and Interfaces (client API) + + + + + + + + + + + + + +

+ +
+ +
+
+
+

All Classes and Interfaces

+
+
+
+
+
+
Class
+
Description
+ +
+
Abstract class implemented by every view classes
+
+ +
+
Application starting point
+
+ +
+
classe qui a pour but de générer chaque case de la grid et de vérifier les entités présentes dessus + (Mur, Joueur, Energie, Bombe, etc.)
+
+ +
+
implementation of a listener from JavaFX EventHandler
+
+ +
+
Store a view per player
+
+ +
+
Used to display the winner of the game
+
+ +
+
This method is call when the current player have selected an action to play (or if it's a computer player, will + select it), then we call Game.play() and we update the view
+
+ +
+
Used when the human player select type of action it want to play
+
+ +
+
Call when the player selected the direction where it wants to play it
+
+ +
+
View terminal, use standard input and output
+
+ +
+
View interface, implemented by Terminal and Window.
+
+ +
+
Used as Lambda expression to instantiate a View per Player stored in ClientPlayer
+
+ +
+
View manager, main access to every views
+
+ +
+
Window view, use mouse and keyboard to control interface
+
+
+
+
+
+
+
+ + diff --git a/livraison/doc/client/allpackages-index.html b/livraison/doc/client/allpackages-index.html new file mode 100644 index 0000000..d3f9478 --- /dev/null +++ b/livraison/doc/client/allpackages-index.html @@ -0,0 +1,73 @@ + + + + +All Packages (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

All Packages

+
+
Package Summary
+
+
Package
+
Description
+ +
+
Client package
+
+ +
+
Package that contains every view listeners
+
+ +
+
View package, contains all classes about user view
+
+
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/App.html b/livraison/doc/client/client/fr/lnl/game/client/App.html new file mode 100644 index 0000000..b2b544a --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/App.html @@ -0,0 +1,369 @@ + + + + +App (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class App

+
+
java.lang.Object +
javafx.application.Application +
fr.lnl.game.client.App
+
+
+
+
+
public class App +extends javafx.application.Application
+
Application starting point
+
+
+
    + +
  • +
    +

    Nested Class Summary

    +
    +

    Nested classes/interfaces inherited from class javafx.application.Application

    +javafx.application.Application.Parameters
    +
    +
  • + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private static LinkedList<String>
    + +
     
    +
    private static fr.lnl.game.server.games.Game
    + +
     
    +
    private static ViewManager
    + +
     
    +
    +
    +

    Fields inherited from class javafx.application.Application

    +STYLESHEET_CASPIAN, STYLESHEET_MODENA
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    App()
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    private static fr.lnl.game.server.games.player.Player
    +
    createNewPlayer(Class<? extends fr.lnl.game.server.games.player.AbstractPlayer> playerClass, + fr.lnl.game.server.games.player.ClassPlayer playerType, + int playerListSize)
    +
    +
    create a new instance of the player
    +
    +
    static fr.lnl.game.server.games.Game
    + +
     
    + + +
     
    +
    static void
    + +
     
    +
    static void
    +
    main(String[] args)
    +
     
    +
    static List<fr.lnl.game.server.games.player.Player>
    + +
    +
    Parse players arguments and create instances for each player
    +
    +
    static Class<? extends AbstractView>
    + +
    +
    Parse the first argument given by user to know the view to use (Terminal or Window)
    +
    +
    void
    +
    start(javafx.stage.Stage stage)
    +
     
    +
    static void
    + +
    +
    Parse players arguments and create a new instance of Game
    +
    +
    +
    +
    +
    +

    Methods inherited from class javafx.application.Application

    +getHostServices, getParameters, getUserAgentStylesheet, init, launch, launch, notifyPreloader, setUserAgentStylesheet, stop
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+ +
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/ClientPlayer.html b/livraison/doc/client/client/fr/lnl/game/client/ClientPlayer.html new file mode 100644 index 0000000..59c22ab --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/ClientPlayer.html @@ -0,0 +1,312 @@ + + + + +ClientPlayer (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Record Class ClientPlayer

+
+
java.lang.Object +
java.lang.Record +
fr.lnl.game.client.ClientPlayer
+
+
+
+
+
public record ClientPlayer(fr.lnl.game.server.games.player.Player serverPlayer, View view) +extends Record
+
Store a view per player
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final fr.lnl.game.server.games.player.Player
    + +
    +
    The field for the serverPlayer record component.
    +
    +
    private final View
    + +
    +
    The field for the view record component.
    +
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    ClientPlayer(fr.lnl.game.server.games.player.Player serverPlayer, + View view)
    +
    +
    Creates an instance of a ClientPlayer record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    fr.lnl.game.server.games.player.Player
    + +
     
    + + +
     
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    fr.lnl.game.server.games.player.Player
    + +
    +
    Returns the value of the serverPlayer record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    + + +
    +
    Returns the value of the view record component.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      serverPlayer

      +
      private final fr.lnl.game.server.games.player.Player serverPlayer
      +
      The field for the serverPlayer record component.
      +
      +
    • +
    • +
      +

      view

      +
      private final View view
      +
      The field for the view record component.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ClientPlayer

      +
      public ClientPlayer(fr.lnl.game.server.games.player.Player serverPlayer, + View view)
      +
      Creates an instance of a ClientPlayer record class.
      +
      +
      Parameters:
      +
      serverPlayer - the value for the serverPlayer record component
      +
      view - the value for the view record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      getServerPlayer

      +
      public fr.lnl.game.server.games.player.Player getServerPlayer()
      +
      +
    • +
    • +
      +

      getView

      +
      public View getView()
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      serverPlayer

      +
      public fr.lnl.game.server.games.player.Player serverPlayer()
      +
      Returns the value of the serverPlayer record component.
      +
      +
      Returns:
      +
      the value of the serverPlayer record component
      +
      +
      +
    • +
    • +
      +

      view

      +
      public View view()
      +
      Returns the value of the view record component.
      +
      +
      Returns:
      +
      the value of the view record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/ViewLambda.html b/livraison/doc/client/client/fr/lnl/game/client/ViewLambda.html new file mode 100644 index 0000000..b635442 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/ViewLambda.html @@ -0,0 +1,139 @@ + + + + +ViewLambda (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Interface ViewLambda

+
+
+
+
Functional Interface:
+
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.
+
+
+
@FunctionalInterface +public interface ViewLambda
+
Used as Lambda expression to instantiate a View per Player stored in ClientPlayer
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    + +
    createViewLambda(fr.lnl.game.server.games.player.Player player)
    +
    +
    A lambda create an anonymous class which implements this interface
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      createViewLambda

      +
      View createViewLambda(fr.lnl.game.server.games.player.Player player)
      +
      A lambda create an anonymous class which implements this interface
      +
      +
      Parameters:
      +
      player - an instance of Player to store in View
      +
      Returns:
      +
      an instance of view (depending on the first argument when launching the program)
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/ClientEventHandler.html b/livraison/doc/client/client/fr/lnl/game/client/listener/ClientEventHandler.html new file mode 100644 index 0000000..d4d0dca --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/ClientEventHandler.html @@ -0,0 +1,286 @@ + + + + +ClientEventHandler (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Record Class ClientEventHandler

+
+
java.lang.Object +
java.lang.Record +
fr.lnl.game.client.listener.ClientEventHandler
+
+
+
+
+
All Implemented Interfaces:
+
EventListener, javafx.event.EventHandler<javafx.event.ActionEvent>
+
+
+
public record ClientEventHandler(fr.lnl.game.server.listener.ModelListener listener) +extends Record +implements javafx.event.EventHandler<javafx.event.ActionEvent>
+
implementation of a listener from JavaFX EventHandler
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final fr.lnl.game.server.listener.ModelListener
    + +
    +
    The field for the listener record component.
    +
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    ClientEventHandler(fr.lnl.game.server.listener.ModelListener listener)
    +
    +
    Creates an instance of a ClientEventHandler record class.
    +
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    final boolean
    + +
    +
    Indicates whether some other object is "equal to" this one.
    +
    +
    void
    +
    handle(javafx.event.ActionEvent event)
    +
    +
    This method is call by JavaFX when we click to the button
    +
    +
    final int
    + +
    +
    Returns a hash code value for this object.
    +
    +
    fr.lnl.game.server.listener.ModelListener
    + +
    +
    Returns the value of the listener record component.
    +
    +
    final String
    + +
    +
    Returns a string representation of this record class.
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      listener

      +
      private final fr.lnl.game.server.listener.ModelListener listener
      +
      The field for the listener record component.
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ClientEventHandler

      +
      public ClientEventHandler(fr.lnl.game.server.listener.ModelListener listener)
      +
      Creates an instance of a ClientEventHandler record class.
      +
      +
      Parameters:
      +
      listener - the value for the listener record component
      +
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      handle

      +
      public void handle(javafx.event.ActionEvent event)
      +
      This method is call by JavaFX when we click to the button
      +
      +
      Specified by:
      +
      handle in interface javafx.event.EventHandler<javafx.event.ActionEvent>
      +
      Parameters:
      +
      event - event class created when clicking on the element
      +
      +
      +
    • +
    • +
      +

      toString

      +
      public final String toString()
      +
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      +
      +
      Specified by:
      +
      toString in class Record
      +
      Returns:
      +
      a string representation of this object
      +
      +
      +
    • +
    • +
      +

      hashCode

      +
      public final int hashCode()
      +
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      +
      +
      Specified by:
      +
      hashCode in class Record
      +
      Returns:
      +
      a hash code value for this object
      +
      +
      +
    • +
    • +
      +

      equals

      +
      public final boolean equals(Object o)
      +
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. All components in this record class are compared with Objects::equals(Object,Object).
      +
      +
      Specified by:
      +
      equals in class Record
      +
      Parameters:
      +
      o - the object with which to compare
      +
      Returns:
      +
      true if this object is the same as the o argument; false otherwise.
      +
      +
      +
    • +
    • +
      +

      listener

      +
      public fr.lnl.game.server.listener.ModelListener listener()
      +
      Returns the value of the listener record component.
      +
      +
      Returns:
      +
      the value of the listener record component
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/DisplayWinnerEvent.html b/livraison/doc/client/client/fr/lnl/game/client/listener/DisplayWinnerEvent.html new file mode 100644 index 0000000..f4946c3 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/DisplayWinnerEvent.html @@ -0,0 +1,184 @@ + + + + +DisplayWinnerEvent (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class DisplayWinnerEvent

+
+
java.lang.Object +
fr.lnl.game.server.listener.AbstractModelListening +
fr.lnl.game.client.listener.DisplayWinnerEvent
+
+
+
+
+
All Implemented Interfaces:
+
fr.lnl.game.server.listener.ModelListener
+
+
+
public class DisplayWinnerEvent +extends fr.lnl.game.server.listener.AbstractModelListening
+
Used to display the winner of the game
+
+
+
    + +
  • +
    +

    Field Summary

    +
    +

    Fields inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +listeners
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
    +
    This method is call when the game is over
    +
    +
    +
    +
    +
    +

    Methods inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +addListener, fireChange, removalListener
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      DisplayWinnerEvent

      +
      public DisplayWinnerEvent()
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      updateModel

      +
      public void updateModel(Object obj)
      +
      This method is call when the game is over
      +
      +
      Parameters:
      +
      obj - contains the winner of the game, can be null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/NextPlayerButtonListener.html b/livraison/doc/client/client/fr/lnl/game/client/listener/NextPlayerButtonListener.html new file mode 100644 index 0000000..f9e6e82 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/NextPlayerButtonListener.html @@ -0,0 +1,215 @@ + + + + +NextPlayerButtonListener (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class NextPlayerButtonListener

+
+
java.lang.Object +
fr.lnl.game.server.listener.AbstractModelListening +
fr.lnl.game.client.listener.NextPlayerButtonListener
+
+
+
+
+
All Implemented Interfaces:
+
fr.lnl.game.server.listener.ModelListener
+
+
+
public class NextPlayerButtonListener +extends fr.lnl.game.server.listener.AbstractModelListening
+
This method is call when the current player have selected an action to play (or if it's a computer player, will + select it), then we call Game.play() and we update the view
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final DisplayWinnerEvent
    + +
     
    +
    private final fr.lnl.game.server.games.Game
    + +
     
    +
    +
    +

    Fields inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +listeners
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    NextPlayerButtonListener(fr.lnl.game.server.games.Game game)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
    +
    Call when clicking on "SUIVANT" button if current player is a computer player or after the human player selected + action it want to play
    +
    +
    +
    +
    +
    +

    Methods inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +addListener, fireChange, removalListener
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      game

      +
      private final fr.lnl.game.server.games.Game game
      +
      +
    • +
    • +
      +

      displayWinnerEvent

      +
      private final DisplayWinnerEvent displayWinnerEvent
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      NextPlayerButtonListener

      +
      public NextPlayerButtonListener(fr.lnl.game.server.games.Game game)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      updateModel

      +
      public void updateModel(Object event)
      +
      Call when clicking on "SUIVANT" button if current player is a computer player or after the human player selected + action it want to play
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/SelectActionButton.html b/livraison/doc/client/client/fr/lnl/game/client/listener/SelectActionButton.html new file mode 100644 index 0000000..59814a4 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/SelectActionButton.html @@ -0,0 +1,229 @@ + + + + +SelectActionButton (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class SelectActionButton

+
+
java.lang.Object +
fr.lnl.game.server.listener.AbstractModelListening +
fr.lnl.game.client.listener.SelectActionButton
+
+
+
+
+
All Implemented Interfaces:
+
fr.lnl.game.server.listener.ModelListener
+
+
+
public class SelectActionButton +extends fr.lnl.game.server.listener.AbstractModelListening
+
Used when the human player select type of action it want to play
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final fr.lnl.game.server.games.Game
    + +
     
    +
    private final fr.lnl.game.server.games.action.ReunionSameAction
    + +
     
    +
    private final Window
    + +
     
    +
    +
    +

    Fields inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +listeners
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    SelectActionButton(fr.lnl.game.server.games.Game game, + Window window, + fr.lnl.game.server.games.action.ReunionSameAction reunionSameAction)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
    +
    This method is call when the player select the type of action it want to play
    +
    +
    +
    +
    +
    +

    Methods inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +addListener, fireChange, removalListener
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      window

      +
      private final Window window
      +
      +
    • +
    • +
      +

      reunionSameAction

      +
      private final fr.lnl.game.server.games.action.ReunionSameAction reunionSameAction
      +
      +
    • +
    • +
      +

      game

      +
      private final fr.lnl.game.server.games.Game game
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      SelectActionButton

      +
      public SelectActionButton(fr.lnl.game.server.games.Game game, + Window window, + fr.lnl.game.server.games.action.ReunionSameAction reunionSameAction)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      updateModel

      +
      public void updateModel(Object obj)
      +
      This method is call when the player select the type of action it want to play
      +
      +
      Parameters:
      +
      obj - contain information about the event like the button where the player clicked
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/SelectDirectionListener.html b/livraison/doc/client/client/fr/lnl/game/client/listener/SelectDirectionListener.html new file mode 100644 index 0000000..8a28142 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/SelectDirectionListener.html @@ -0,0 +1,229 @@ + + + + +SelectDirectionListener (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class SelectDirectionListener

+
+
java.lang.Object +
fr.lnl.game.server.listener.AbstractModelListening +
fr.lnl.game.client.listener.SelectDirectionListener
+
+
+
+
+
All Implemented Interfaces:
+
fr.lnl.game.server.listener.ModelListener
+
+
+
public class SelectDirectionListener +extends fr.lnl.game.server.listener.AbstractModelListening
+
Call when the player selected the direction where it wants to play it
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final fr.lnl.game.server.games.action.Action
    + +
     
    +
    private final fr.lnl.game.server.games.Game
    + +
     
    +
    private final Window
    + +
     
    +
    +
    +

    Fields inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +listeners
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    SelectDirectionListener(fr.lnl.game.server.games.Game game, + Window window, + fr.lnl.game.server.games.action.Action action)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    + +
    +
    This method is call when the player click on the button to select the direction of the previously selected action
    +
    +
    +
    +
    +
    +

    Methods inherited from class fr.lnl.game.server.listener.AbstractModelListening

    +addListener, fireChange, removalListener
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      game

      +
      private final fr.lnl.game.server.games.Game game
      +
      +
    • +
    • +
      +

      action

      +
      private final fr.lnl.game.server.games.action.Action action
      +
      +
    • +
    • +
      +

      window

      +
      private final Window window
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      SelectDirectionListener

      +
      public SelectDirectionListener(fr.lnl.game.server.games.Game game, + Window window, + fr.lnl.game.server.games.action.Action action)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      updateModel

      +
      public void updateModel(Object obj)
      +
      This method is call when the player click on the button to select the direction of the previously selected action
      +
      +
      Parameters:
      +
      obj - contain information about the event like the button where the player clicked
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/package-summary.html b/livraison/doc/client/client/fr/lnl/game/client/listener/package-summary.html new file mode 100644 index 0000000..b835b7e --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/package-summary.html @@ -0,0 +1,127 @@ + + + + +fr.lnl.game.client.listener (client API) + + + + + + + + + + + + + + +
+ +
+
+
+
Module client
+

Package fr.lnl.game.client.listener

+
+
+
package fr.lnl.game.client.listener
+
+
Package that contains every view listeners
+
+
+
    +
  • + +
  • +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    implementation of a listener from JavaFX EventHandler
    +
    + +
    +
    Used to display the winner of the game
    +
    + +
    +
    This method is call when the current player have selected an action to play (or if it's a computer player, will + select it), then we call Game.play() and we update the view
    +
    + +
    +
    Used when the human player select type of action it want to play
    +
    + +
    +
    Call when the player selected the direction where it wants to play it
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/listener/package-tree.html b/livraison/doc/client/client/fr/lnl/game/client/listener/package-tree.html new file mode 100644 index 0000000..65ce871 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/listener/package-tree.html @@ -0,0 +1,82 @@ + + + + +fr.lnl.game.client.listener Class Hierarchy (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package fr.lnl.game.client.listener

+Package Hierarchies: + +
+
+

Class Hierarchy

+ +
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/package-summary.html b/livraison/doc/client/client/fr/lnl/game/client/package-summary.html new file mode 100644 index 0000000..38d83df --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/package-summary.html @@ -0,0 +1,118 @@ + + + + +fr.lnl.game.client (client API) + + + + + + + + + + + + + + +
+ +
+
+
+
Module client
+

Package fr.lnl.game.client

+
+
+
package fr.lnl.game.client
+
+
Client package
+
+
+
    +
  • + +
  • +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    Application starting point
    +
    + +
    +
    Store a view per player
    +
    + +
    +
    Used as Lambda expression to instantiate a View per Player stored in ClientPlayer
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/package-tree.html b/livraison/doc/client/client/fr/lnl/game/client/package-tree.html new file mode 100644 index 0000000..7da0529 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/package-tree.html @@ -0,0 +1,85 @@ + + + + +fr.lnl.game.client Class Hierarchy (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package fr.lnl.game.client

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • javafx.application.Application +
        +
      • fr.lnl.game.client.App
      • +
      +
    • +
    • java.lang.Record + +
    • +
    +
  • +
+
+
+

Interface Hierarchy

+ +
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/AbstractView.html b/livraison/doc/client/client/fr/lnl/game/client/view/AbstractView.html new file mode 100644 index 0000000..e369c3a --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/AbstractView.html @@ -0,0 +1,180 @@ + + + + +AbstractView (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class AbstractView

+
+
java.lang.Object +
fr.lnl.game.client.view.AbstractView
+
+
+
+
All Implemented Interfaces:
+
View
+
+
+
Direct Known Subclasses:
+
Terminal, Window
+
+
+
public abstract class AbstractView +extends Object +implements View
+
Abstract class implemented by every view classes
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    protected fr.lnl.game.server.games.Game
    + +
     
    +
    protected final fr.lnl.game.server.games.player.Player
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    AbstractView(fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +

    Methods inherited from interface fr.lnl.game.client.view.View

    +displayWinner, show
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      player

      +
      protected final fr.lnl.game.server.games.player.Player player
      +
      +
    • +
    • +
      +

      game

      +
      protected fr.lnl.game.server.games.Game game
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      AbstractView

      +
      public AbstractView(fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/Cell.html b/livraison/doc/client/client/fr/lnl/game/client/view/Cell.html new file mode 100644 index 0000000..79b0fe3 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/Cell.html @@ -0,0 +1,320 @@ + + + + +Cell (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class Cell

+
+
java.lang.Object +
javafx.scene.Node +
javafx.scene.shape.Shape +
javafx.scene.shape.Rectangle +
fr.lnl.game.client.view.Cell
+
+
+
+
+
+
+
All Implemented Interfaces:
+
javafx.css.Styleable, javafx.event.EventTarget
+
+
+
public class Cell +extends javafx.scene.shape.Rectangle
+
classe qui a pour but de générer chaque case de la grid et de vérifier les entités présentes dessus + (Mur, Joueur, Energie, Bombe, etc.)
+
+
+
    + +
  • +
    +

    Property Summary

    +
    +

    Properties inherited from class javafx.scene.shape.Rectangle

    +arcHeight, arcWidth, height, width, x, y
    +
    +

    Properties inherited from class javafx.scene.shape.Shape

    +fill, smooth, strokeDashOffset, strokeLineCap, strokeLineJoin, strokeMiterLimit, stroke, strokeType, strokeWidth
    +
    +

    Properties inherited from class javafx.scene.Node

    +accessibleHelp, accessibleRoleDescription, accessibleRole, accessibleText, blendMode, boundsInLocal, boundsInParent, cacheHint, cache, clip, cursor, depthTest, disabled, disable, effectiveNodeOrientation, effect, eventDispatcher, focused, focusTraversable, hover, id, inputMethodRequests, layoutBounds, layoutX, layoutY, localToParentTransform, localToSceneTransform, managed, mouseTransparent, nodeOrientation, onContextMenuRequested, onDragDetected, onDragDone, onDragDropped, onDragEntered, onDragExited, onDragOver, onInputMethodTextChanged, onKeyPressed, onKeyReleased, onKeyTyped, onMouseClicked, onMouseDragEntered, onMouseDragExited, onMouseDragged, onMouseDragOver, onMouseDragReleased, onMouseEntered, onMouseExited, onMouseMoved, onMousePressed, onMouseReleased, onRotate, onRotationFinished, onRotationStarted, onScrollFinished, onScroll, onScrollStarted, onSwipeDown, onSwipeLeft, onSwipeRight, onSwipeUp, onTouchMoved, onTouchPressed, onTouchReleased, onTouchStationary, onZoomFinished, onZoom, onZoomStarted, opacity, parent, pickOnBounds, pressed, rotate, rotationAxis, scaleX, scaleY, scaleZ, scene, style, translateX, translateY, translateZ, viewOrder, visible
    +
    +
  • + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.layout.BackgroundImage
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    private static final javafx.scene.image.Image
    + +
     
    +
    +
    +

    Fields inherited from class javafx.scene.Node

    +BASELINE_OFFSET_SAME_AS_HEIGHT
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    Cell(int x, + int y)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    static javafx.scene.image.Image
    + +
     
    +
    static javafx.scene.layout.StackPane
    +
    setImageObject(Object object, + fr.lnl.game.server.games.Game game)
    +
     
    +
    +
    +
    +
    +

    Methods inherited from class javafx.scene.shape.Rectangle

    +arcHeightProperty, arcWidthProperty, getArcHeight, getArcWidth, getClassCssMetaData, getCssMetaData, getHeight, getWidth, getX, getY, heightProperty, setArcHeight, setArcWidth, setHeight, setWidth, setX, setY, toString, widthProperty, xProperty, yProperty
    +
    +

    Methods inherited from class javafx.scene.shape.Shape

    +fillProperty, getFill, getStroke, getStrokeDashArray, getStrokeDashOffset, getStrokeLineCap, getStrokeLineJoin, getStrokeMiterLimit, getStrokeType, getStrokeWidth, intersect, isSmooth, setFill, setSmooth, setStroke, setStrokeDashOffset, setStrokeLineCap, setStrokeLineJoin, setStrokeMiterLimit, setStrokeType, setStrokeWidth, smoothProperty, strokeDashOffsetProperty, strokeLineCapProperty, strokeLineJoinProperty, strokeMiterLimitProperty, strokeProperty, strokeTypeProperty, strokeWidthProperty, subtract, union
    +
    +

    Methods inherited from class javafx.scene.Node

    +accessibleHelpProperty, accessibleRoleDescriptionProperty, accessibleRoleProperty, accessibleTextProperty, addEventFilter, addEventHandler, applyCss, autosize, blendModeProperty, boundsInLocalProperty, boundsInParentProperty, buildEventDispatchChain, cacheHintProperty, cacheProperty, clipProperty, computeAreaInScreen, contains, contains, cursorProperty, depthTestProperty, disabledProperty, disableProperty, effectiveNodeOrientationProperty, effectProperty, eventDispatcherProperty, executeAccessibleAction, fireEvent, focusedProperty, focusTraversableProperty, getAccessibleHelp, getAccessibleRole, getAccessibleRoleDescription, getAccessibleText, getBaselineOffset, getBlendMode, getBoundsInLocal, getBoundsInParent, getCacheHint, getClip, getContentBias, getCursor, getDepthTest, getEffect, getEffectiveNodeOrientation, getEventDispatcher, getId, getInitialCursor, getInitialFocusTraversable, getInputMethodRequests, getLayoutBounds, getLayoutX, getLayoutY, getLocalToParentTransform, getLocalToSceneTransform, getNodeOrientation, getOnContextMenuRequested, getOnDragDetected, getOnDragDone, getOnDragDropped, getOnDragEntered, getOnDragExited, getOnDragOver, getOnInputMethodTextChanged, getOnKeyPressed, getOnKeyReleased, getOnKeyTyped, getOnMouseClicked, getOnMouseDragEntered, getOnMouseDragExited, getOnMouseDragged, getOnMouseDragOver, getOnMouseDragReleased, getOnMouseEntered, getOnMouseExited, getOnMouseMoved, getOnMousePressed, getOnMouseReleased, getOnRotate, getOnRotationFinished, getOnRotationStarted, getOnScroll, getOnScrollFinished, getOnScrollStarted, getOnSwipeDown, getOnSwipeLeft, getOnSwipeRight, getOnSwipeUp, getOnTouchMoved, getOnTouchPressed, getOnTouchReleased, getOnTouchStationary, getOnZoom, getOnZoomFinished, getOnZoomStarted, getOpacity, getParent, getProperties, getPseudoClassStates, getRotate, getRotationAxis, getScaleX, getScaleY, getScaleZ, getScene, getStyle, getStyleableParent, getStyleClass, getTransforms, getTranslateX, getTranslateY, getTranslateZ, getTypeSelector, getUserData, getViewOrder, hasProperties, hoverProperty, idProperty, inputMethodRequestsProperty, intersects, intersects, isCache, isDisable, isDisabled, isFocused, isFocusTraversable, isHover, isManaged, isMouseTransparent, isPickOnBounds, isPressed, isResizable, isVisible, layoutBoundsProperty, layoutXProperty, layoutYProperty, localToParent, localToParent, localToParent, localToParent, localToParent, localToParentTransformProperty, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToSceneTransformProperty, localToScreen, localToScreen, localToScreen, localToScreen, localToScreen, lookup, lookupAll, managedProperty, maxHeight, maxWidth, minHeight, minWidth, mouseTransparentProperty, nodeOrientationProperty, notifyAccessibleAttributeChanged, onContextMenuRequestedProperty, onDragDetectedProperty, onDragDoneProperty, onDragDroppedProperty, onDragEnteredProperty, onDragExitedProperty, onDragOverProperty, onInputMethodTextChangedProperty, onKeyPressedProperty, onKeyReleasedProperty, onKeyTypedProperty, onMouseClickedProperty, onMouseDragEnteredProperty, onMouseDragExitedProperty, onMouseDraggedProperty, onMouseDragOverProperty, onMouseDragReleasedProperty, onMouseEnteredProperty, onMouseExitedProperty, onMouseMovedProperty, onMousePressedProperty, onMouseReleasedProperty, onRotateProperty, onRotationFinishedProperty, onRotationStartedProperty, onScrollFinishedProperty, onScrollProperty, onScrollStartedProperty, onSwipeDownProperty, onSwipeLeftProperty, onSwipeRightProperty, onSwipeUpProperty, onTouchMovedProperty, onTouchPressedProperty, onTouchReleasedProperty, onTouchStationaryProperty, onZoomFinishedProperty, onZoomProperty, onZoomStartedProperty, opacityProperty, parentProperty, parentToLocal, parentToLocal, parentToLocal, parentToLocal, parentToLocal, pickOnBoundsProperty, prefHeight, prefWidth, pressedProperty, pseudoClassStateChanged, queryAccessibleAttribute, relocate, removeEventFilter, removeEventHandler, requestFocus, resize, resizeRelocate, rotateProperty, rotationAxisProperty, scaleXProperty, scaleYProperty, scaleZProperty, sceneProperty, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, screenToLocal, screenToLocal, screenToLocal, setAccessibleHelp, setAccessibleRole, setAccessibleRoleDescription, setAccessibleText, setBlendMode, setCache, setCacheHint, setClip, setCursor, setDepthTest, setDisable, setDisabled, setEffect, setEventDispatcher, setEventHandler, setFocused, setFocusTraversable, setHover, setId, setInputMethodRequests, setLayoutX, setLayoutY, setManaged, setMouseTransparent, setNodeOrientation, setOnContextMenuRequested, setOnDragDetected, setOnDragDone, setOnDragDropped, setOnDragEntered, setOnDragExited, setOnDragOver, setOnInputMethodTextChanged, setOnKeyPressed, setOnKeyReleased, setOnKeyTyped, setOnMouseClicked, setOnMouseDragEntered, setOnMouseDragExited, setOnMouseDragged, setOnMouseDragOver, setOnMouseDragReleased, setOnMouseEntered, setOnMouseExited, setOnMouseMoved, setOnMousePressed, setOnMouseReleased, setOnRotate, setOnRotationFinished, setOnRotationStarted, setOnScroll, setOnScrollFinished, setOnScrollStarted, setOnSwipeDown, setOnSwipeLeft, setOnSwipeRight, setOnSwipeUp, setOnTouchMoved, setOnTouchPressed, setOnTouchReleased, setOnTouchStationary, setOnZoom, setOnZoomFinished, setOnZoomStarted, setOpacity, setPickOnBounds, setPressed, setRotate, setRotationAxis, setScaleX, setScaleY, setScaleZ, setStyle, setTranslateX, setTranslateY, setTranslateZ, setUserData, setViewOrder, setVisible, snapshot, snapshot, startDragAndDrop, startFullDrag, styleProperty, toBack, toFront, translateXProperty, translateYProperty, translateZProperty, usesMirroring, viewOrderProperty, visibleProperty
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
    +
    +

    Methods inherited from interface javafx.css.Styleable

    +getStyleableNode
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      PLAYER_IMAGE

      +
      private static final javafx.scene.image.Image PLAYER_IMAGE
      +
      +
    • +
    • +
      +

      PLAYER_SHIELD_IMAGE

      +
      private static final javafx.scene.image.Image PLAYER_SHIELD_IMAGE
      +
      +
    • +
    • +
      +

      PLAYER_SHOT_IMAGE

      +
      private static final javafx.scene.image.Image PLAYER_SHOT_IMAGE
      +
      +
    • +
    • +
      +

      ENERGY_BALL_IMAGE

      +
      private static final javafx.scene.image.Image ENERGY_BALL_IMAGE
      +
      +
    • +
    • +
      +

      BOMB_IMAGE

      +
      private static final javafx.scene.image.Image BOMB_IMAGE
      +
      +
    • +
    • +
      +

      MINE_IMAGE

      +
      private static final javafx.scene.image.Image MINE_IMAGE
      +
      +
    • +
    • +
      +

      WALL_IMAGE

      +
      private static final javafx.scene.image.Image WALL_IMAGE
      +
      +
    • +
    • +
      +

      BACKGROUND_IMAGE

      +
      private static final javafx.scene.image.Image BACKGROUND_IMAGE
      +
      +
    • +
    • +
      +

      BG

      +
      private static final javafx.scene.layout.BackgroundImage BG
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Cell

      +
      public Cell(int x, + int y)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      setImageObject

      +
      public static javafx.scene.layout.StackPane setImageObject(Object object, + fr.lnl.game.server.games.Game game)
      +
      +
      Parameters:
      +
      object - the object we'll define the type
      +
      Returns:
      +
      a pane which contains an image depending on the type of the object
      +
      +
      +
    • +
    • +
      +

      getPlayerImage

      +
      public static javafx.scene.image.Image getPlayerImage()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/Terminal.html b/livraison/doc/client/client/fr/lnl/game/client/view/Terminal.html new file mode 100644 index 0000000..a745c61 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/Terminal.html @@ -0,0 +1,271 @@ + + + + +Terminal (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class Terminal

+
+
java.lang.Object +
fr.lnl.game.client.view.AbstractView +
fr.lnl.game.client.view.Terminal
+
+
+
+
+
All Implemented Interfaces:
+
View
+
+
+
public class Terminal +extends AbstractView
+
View terminal, use standard input and output
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    static Scanner
    + +
    +
    Standard input
    +
    +
    +
    +

    Fields inherited from class fr.lnl.game.client.view.AbstractView

    +game, player
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    Terminal(fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    fr.lnl.game.server.games.action.Action
    + +
    +
    Used when current player is an instance of HumanPlayer and demand to it + an action to do
    +
    +
    private fr.lnl.game.server.games.action.ReunionSameAction
    +
    choseReunionSameAction(List<fr.lnl.game.server.games.action.ReunionSameAction> actions)
    +
    +
    Used when current player is an instance of HumanPlayer and demand to it + a type of action to do
    +
    +
    void
    +
    displayWinner(fr.lnl.game.server.games.player.Player winner)
    +
    +
    Used to display the winner of the game
    +
    +
    void
    + +
    +
    Used to update view
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      scanner

      +
      public static Scanner scanner
      +
      Standard input
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Terminal

      +
      public Terminal(fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      show

      +
      public void show()
      +
      Used to update view
      +
      +
    • +
    • +
      +

      displayWinner

      +
      public void displayWinner(fr.lnl.game.server.games.player.Player winner)
      +
      Used to display the winner of the game
      +
      +
      Parameters:
      +
      winner - the player who win the game, can be Null
      +
      +
      +
    • +
    • +
      +

      choseAction

      +
      public fr.lnl.game.server.games.action.Action choseAction()
      +
      Used when current player is an instance of HumanPlayer and demand to it + an action to do
      +
      +
      Returns:
      +
      chosen action
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      choseReunionSameAction

      +
      private fr.lnl.game.server.games.action.ReunionSameAction choseReunionSameAction(List<fr.lnl.game.server.games.action.ReunionSameAction> actions)
      +
      Used when current player is an instance of HumanPlayer and demand to it + a type of action to do
      +
      +
      Parameters:
      +
      actions - the list of actions possible
      +
      Returns:
      +
      the type of action to execute
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/View.html b/livraison/doc/client/client/fr/lnl/game/client/view/View.html new file mode 100644 index 0000000..a56c6ce --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/View.html @@ -0,0 +1,148 @@ + + + + +View (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Interface View

+
+
+
+
All Known Implementing Classes:
+
AbstractView, Terminal, Window
+
+
+
public interface View
+
View interface, implemented by Terminal and Window.
+
+
+
    + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    +
    displayWinner(fr.lnl.game.server.games.player.Player winner)
    +
    +
    Used to display the name of the winner
    +
    +
    void
    + +
    +
    used to update screen
    +
    +
    +
    +
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      show

      +
      void show()
      +
      used to update screen
      +
      +
    • +
    • +
      +

      displayWinner

      +
      void displayWinner(fr.lnl.game.server.games.player.Player winner)
      +
      Used to display the name of the winner
      +
      +
      Parameters:
      +
      winner - the player who win the game, can be Null
      +
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/ViewManager.html b/livraison/doc/client/client/fr/lnl/game/client/view/ViewManager.html new file mode 100644 index 0000000..2a17581 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/ViewManager.html @@ -0,0 +1,253 @@ + + + + +ViewManager (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class ViewManager

+
+
java.lang.Object +
fr.lnl.game.client.view.ViewManager
+
+
+
+
public final class ViewManager +extends Object
+
View manager, main access to every views
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private final fr.lnl.game.server.games.Game
    + +
     
    +
    HashMap<fr.lnl.game.server.games.player.Player,ClientPlayer>
    + +
     
    +
    private final Class<? extends View>
    + +
     
    +
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    ViewManager(fr.lnl.game.server.games.Game game, + Class<? extends View> viewType, + ViewLambda lambda)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    void
    +
    displayWinner(fr.lnl.game.server.games.player.Player winner)
    +
    +
    This method is call when the game is finish
    +
    +
    void
    +
    run()
    +
    +
    This method is call after initialized view manager to display a first screen
    +
    +
    void
    + +
    +
    This method is call when the view is a terminal
    +
    +
    void
    + +
    +
    Call when we need to change or update view
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      game

      +
      private final fr.lnl.game.server.games.Game game
      +
      +
    • +
    • +
      +

      viewType

      +
      private final Class<? extends View> viewType
      +
      +
    • +
    • +
      +

      players

      +
      public HashMap<fr.lnl.game.server.games.player.Player,ClientPlayer> players
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      ViewManager

      +
      public ViewManager(fr.lnl.game.server.games.Game game, + Class<? extends View> viewType, + ViewLambda lambda)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      updateView

      +
      public void updateView()
      +
      Call when we need to change or update view
      +
      +
    • +
    • +
      +

      terminalView

      +
      public void terminalView()
      +
      This method is call when the view is a terminal
      +
      +
    • +
    • +
      +

      displayWinner

      +
      public void displayWinner(fr.lnl.game.server.games.player.Player winner)
      +
      This method is call when the game is finish
      +
      +
      Parameters:
      +
      winner - The winner of the game, can be null
      +
      +
      +
    • +
    • +
      +

      run

      +
      public void run()
      +
      This method is call after initialized view manager to display a first screen
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/Window.html b/livraison/doc/client/client/fr/lnl/game/client/view/Window.html new file mode 100644 index 0000000..9cf3d96 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/Window.html @@ -0,0 +1,518 @@ + + + + +Window (client API) + + + + + + + + + + + + + + +
+ +
+
+ +
+
Module client
+ +

Class Window

+
+
java.lang.Object +
fr.lnl.game.client.view.AbstractView +
fr.lnl.game.client.view.Window
+
+
+
+
+
All Implemented Interfaces:
+
View
+
+
+
public class Window +extends AbstractView
+
Window view, use mouse and keyboard to control interface
+
+
+
    + +
  • +
    +

    Field Summary

    +
    Fields
    +
    +
    Modifier and Type
    +
    Field
    +
    Description
    +
    private static final javafx.scene.layout.Background
    + +
     
    +
    private javafx.scene.layout.Pane
    + +
     
    +
    static final int
    + +
     
    +
    private static final javafx.scene.paint.Color
    + +
     
    +
    static final int
    + +
     
    + + +
     
    +
    private fr.lnl.game.server.games.action.ReunionSameAction
    + +
     
    +
    private final javafx.stage.Stage
    + +
     
    +
    static final int
    + +
     
    +
    +
    +

    Fields inherited from class fr.lnl.game.client.view.AbstractView

    +game, player
    +
    +
  • + +
  • +
    +

    Constructor Summary

    +
    Constructors
    +
    +
    Constructor
    +
    Description
    +
    Window(javafx.stage.Stage stage, + fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
    +
     
    +
    +
    +
  • + +
  • +
    +

    Method Summary

    +
    +
    +
    +
    +
    Modifier and Type
    +
    Method
    +
    Description
    +
    private void
    +
    addButtonToPane(String content, + javafx.event.EventHandler<javafx.event.ActionEvent> listener, + javafx.scene.layout.Pane pane, + int offsetX, + int offsetY)
    +
    +
    called when we add a button in the interface
    +
    +
    void
    +
    addToPrincipalPanel(Object object, + javafx.scene.layout.Pane principalPane, + int i, + int j)
    +
    +
    Add grid element to the principal pane
    +
    +
    void
    +
    choseDirectionAction(fr.lnl.game.server.games.action.ReunionSameAction selectedReunionAction)
    +
    +
    Choose a direction between all possible from the previously selected action type
    +
    +
    private void
    +
    choseReunionSameAction(List<fr.lnl.game.server.games.action.ReunionSameAction> actions)
    +
    +
    Used when Game.getCurrentPlayer() is an instance of HumanPlayer.
    +
    +
    private javafx.scene.Parent
    + +
    +
    Create content of the stage
    +
    +
    void
    +
    displayWinner(fr.lnl.game.server.games.player.Player winner)
    +
    +
    Used to display the name of the winner
    +
    + + +
     
    +
    void
    +
    putMoveTextPane(javafx.scene.layout.Pane principalPane)
    +
    +
    build left down pane and move it to its position
    +
    +
    void
    +
    putStatePlayerPane(javafx.scene.layout.Pane principalPane)
    +
    +
    Create the right pane
    +
    +
    void
    +
    setSelectedReunionAction(fr.lnl.game.server.games.action.ReunionSameAction selectedReunionAction)
    +
     
    +
    void
    + +
    +
    used to update screen
    +
    +
    javafx.scene.layout.StackPane
    + +
    +
    Build the left down pane (contains current player information)
    +
    +
    javafx.scene.layout.StackPane
    +
    showStatePlayer(String type, + int playerNumber)
    +
    +
    Build left down pane (list all players information)
    +
    +
    +
    +
    +
    +

    Methods inherited from class java.lang.Object

    +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    +
    +
  • +
+
+
+
    + +
  • +
    +

    Field Details

    +
      +
    • +
      +

      cellSize

      +
      public static final int cellSize
      +
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      width

      +
      public static final int width
      +
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      height

      +
      public static final int height
      +
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      dark

      +
      private static final javafx.scene.paint.Color dark
      +
      +
    • +
    • +
      +

      bg

      +
      private static final javafx.scene.layout.Background bg
      +
      +
    • +
    • +
      +

      stage

      +
      private final javafx.stage.Stage stage
      +
      +
    • +
    • +
      +

      buttonPane

      +
      private javafx.scene.layout.Pane buttonPane
      +
      +
    • +
    • +
      +

      selectedReunionAction

      +
      private fr.lnl.game.server.games.action.ReunionSameAction selectedReunionAction
      +
      +
    • +
    • +
      +

      nextPlayerButtonListener

      +
      private final NextPlayerButtonListener nextPlayerButtonListener
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Constructor Details

    +
      +
    • +
      +

      Window

      +
      public Window(javafx.stage.Stage stage, + fr.lnl.game.server.games.Game game, + fr.lnl.game.server.games.player.Player player)
      +
      +
    • +
    +
    +
  • + +
  • +
    +

    Method Details

    +
      +
    • +
      +

      show

      +
      public void show()
      +
      used to update screen
      +
      +
    • +
    • +
      +

      displayWinner

      +
      public void displayWinner(fr.lnl.game.server.games.player.Player winner)
      +
      Used to display the name of the winner
      +
      +
      Parameters:
      +
      winner - the player who win the game, can be Null
      +
      +
      +
    • +
    • +
      +

      choseDirectionAction

      +
      public void choseDirectionAction(fr.lnl.game.server.games.action.ReunionSameAction selectedReunionAction)
      +
      Choose a direction between all possible from the previously selected action type
      +
      +
      Parameters:
      +
      selectedReunionAction - previously selected type of action
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      choseReunionSameAction

      +
      private void choseReunionSameAction(List<fr.lnl.game.server.games.action.ReunionSameAction> actions)
      +
      Used when Game.getCurrentPlayer() is an instance of HumanPlayer. + Display button to demand to player to choose the type of action to execute
      +
      +
      Parameters:
      +
      actions - the list of possible actions
      +
      See Also:
      +
      + +
      +
      +
      +
    • +
    • +
      +

      addButtonToPane

      +
      private void addButtonToPane(String content, + javafx.event.EventHandler<javafx.event.ActionEvent> listener, + javafx.scene.layout.Pane pane, + int offsetX, + int offsetY)
      +
      called when we add a button in the interface
      +
      +
      Parameters:
      +
      content - content of the button
      +
      listener - listener of the button
      +
      pane - pane where we add the button
      +
      offsetX - move the button from the base position of the pane to the left (when offsetX is negative) or on + the right (when offsetY is positive)
      +
      offsetY - move the button from the base position of the pane to the up (when offsetX is negative) or on + the down (when offsetY is positive)
      +
      +
      +
    • +
    • +
      +

      createContent

      +
      private javafx.scene.Parent createContent()
      +
      Create content of the stage
      +
      +
      Returns:
      +
      the parent element to set to the stage
      +
      +
      +
    • +
    • +
      +

      addToPrincipalPanel

      +
      public void addToPrincipalPanel(Object object, + javafx.scene.layout.Pane principalPane, + int i, + int j)
      +
      Add grid element to the principal pane
      +
      +
      Parameters:
      +
      object - object to add to the pane
      +
      principalPane - pane where we'll add the object
      +
      i -
      +
      j -
      +
      +
      +
    • +
    • +
      +

      putStatePlayerPane

      +
      public void putStatePlayerPane(javafx.scene.layout.Pane principalPane)
      +
      Create the right pane
      +
      +
      Parameters:
      +
      principalPane - principal pane where we'll add the left down pane
      +
      +
      +
    • +
    • +
      +

      showStatePlayer

      +
      public javafx.scene.layout.StackPane showStatePlayer(String type, + int playerNumber)
      +
      Build left down pane (list all players information)
      +
      +
      Parameters:
      +
      type -
      +
      playerNumber -
      +
      Returns:
      +
      +
      +
    • +
    • +
      +

      putMoveTextPane

      +
      public void putMoveTextPane(javafx.scene.layout.Pane principalPane)
      +
      build left down pane and move it to its position
      +
      +
      Parameters:
      +
      principalPane - the principal pane where we'll add the left down pane
      +
      +
      +
    • +
    • +
      +

      showMoveText

      +
      public javafx.scene.layout.StackPane showMoveText()
      +
      Build the left down pane (contains current player information)
      +
      +
      Returns:
      +
      the built pane
      +
      +
      +
    • +
    • +
      +

      setSelectedReunionAction

      +
      public void setSelectedReunionAction(fr.lnl.game.server.games.action.ReunionSameAction selectedReunionAction)
      +
      +
    • +
    • +
      +

      getNextPlayerButtonListener

      +
      public NextPlayerButtonListener getNextPlayerButtonListener()
      +
      +
    • +
    +
    +
  • +
+
+ +
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/package-summary.html b/livraison/doc/client/client/fr/lnl/game/client/view/package-summary.html new file mode 100644 index 0000000..c1f2fdb --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/package-summary.html @@ -0,0 +1,131 @@ + + + + +fr.lnl.game.client.view (client API) + + + + + + + + + + + + + + +
+ +
+
+
+
Module client
+

Package fr.lnl.game.client.view

+
+
+
package fr.lnl.game.client.view
+
+
View package, contains all classes about user view
+
+
+
    +
  • + +
  • +
  • +
    +
    +
    +
    +
    Class
    +
    Description
    + +
    +
    Abstract class implemented by every view classes
    +
    + +
    +
    classe qui a pour but de générer chaque case de la grid et de vérifier les entités présentes dessus + (Mur, Joueur, Energie, Bombe, etc.)
    +
    + +
    +
    View terminal, use standard input and output
    +
    + +
    +
    View interface, implemented by Terminal and Window.
    +
    + +
    +
    View manager, main access to every views
    +
    + +
    +
    Window view, use mouse and keyboard to control interface
    +
    +
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/client/fr/lnl/game/client/view/package-tree.html b/livraison/doc/client/client/fr/lnl/game/client/view/package-tree.html new file mode 100644 index 0000000..7e08065 --- /dev/null +++ b/livraison/doc/client/client/fr/lnl/game/client/view/package-tree.html @@ -0,0 +1,95 @@ + + + + +fr.lnl.game.client.view Class Hierarchy (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For Package fr.lnl.game.client.view

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • fr.lnl.game.client.view.AbstractView (implements fr.lnl.game.client.view.View) + +
    • +
    • javafx.scene.Node (implements javafx.event.EventTarget, javafx.css.Styleable) +
        +
      • javafx.scene.shape.Shape +
          +
        • javafx.scene.shape.Rectangle +
            +
          • fr.lnl.game.client.view.Cell
          • +
          +
        • +
        +
      • +
      +
    • +
    • fr.lnl.game.client.view.ViewManager
    • +
    +
  • +
+
+
+

Interface Hierarchy

+
    +
  • fr.lnl.game.client.view.View
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/client/module-summary.html b/livraison/doc/client/client/module-summary.html new file mode 100644 index 0000000..e3c3fe5 --- /dev/null +++ b/livraison/doc/client/client/module-summary.html @@ -0,0 +1,148 @@ + + + + +client (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Module client

+
+
+
module client
+
+ +
Client module, include every view and controller classes from MVC model
+
+
+
    +
  • +
    + +

    Packages

    +
    +
    Exports
    +
    +
    Package
    +
    Description
    + +
    +
    Client package
    +
    + +
    +
    Package that contains every view listeners
    +
    + +
    +
    View package, contains all classes about user view
    +
    +
    +
    +
    Indirect Exports
    +
    +
    From
    +
    Packages
    +
    java.base
    +
    com.sun.crypto.provider com.sun.security.ntlm java.io java.lang java.lang.annotation java.lang.constant java.lang.invoke java.lang.module java.lang.ref java.lang.reflect java.lang.runtime java.math java.net java.net.spi java.nio java.nio.channels java.nio.channels.spi java.nio.charset java.nio.charset.spi java.nio.file java.nio.file.attribute java.nio.file.spi java.security java.security.cert java.security.interfaces java.security.spec java.text java.text.spi java.time java.time.chrono java.time.format java.time.temporal java.time.zone java.util java.util.concurrent java.util.concurrent.atomic java.util.concurrent.locks java.util.function java.util.jar java.util.random java.util.regex java.util.spi java.util.stream java.util.zip javax.crypto javax.crypto.interfaces javax.crypto.spec javax.net javax.net.ssl javax.security.auth javax.security.auth.callback javax.security.auth.login javax.security.auth.spi javax.security.auth.x500 javax.security.cert jdk.internal.access jdk.internal.access.foreign jdk.internal.event jdk.internal.invoke jdk.internal.javac jdk.internal.jimage jdk.internal.jimage.decompressor jdk.internal.jmod jdk.internal.loader jdk.internal.logger jdk.internal.misc jdk.internal.module jdk.internal.org.objectweb.asm jdk.internal.org.objectweb.asm.commons jdk.internal.org.objectweb.asm.tree jdk.internal.org.objectweb.asm.util jdk.internal.org.xml.sax jdk.internal.org.xml.sax.helpers jdk.internal.perf jdk.internal.platform jdk.internal.ref jdk.internal.reflect jdk.internal.util jdk.internal.util.jar jdk.internal.util.random jdk.internal.util.xml jdk.internal.util.xml.impl jdk.internal.vm jdk.internal.vm.annotation jdk.internal.vm.vector sun.invoke.util sun.net sun.net.dns sun.net.ext sun.net.util sun.net.www sun.net.www.protocol.http sun.nio.ch sun.nio.cs sun.nio.fs sun.reflect.annotation sun.reflect.generics.reflectiveObjects sun.reflect.misc sun.security.action sun.security.internal.interfaces sun.security.internal.spec sun.security.jca sun.security.pkcs sun.security.provider sun.security.provider.certpath sun.security.rsa sun.security.timestamp sun.security.tools sun.security.util sun.security.util.math sun.security.util.math.intpoly sun.security.validator sun.security.x509 sun.util.cldr sun.util.locale.provider sun.util.logging sun.util.resources
    +
    javafx.base
    +
    com.sun.javafx com.sun.javafx.beans com.sun.javafx.binding com.sun.javafx.collections com.sun.javafx.event com.sun.javafx.logging com.sun.javafx.property com.sun.javafx.reflect com.sun.javafx.runtime javafx.beans javafx.beans.binding javafx.beans.property javafx.beans.property.adapter javafx.beans.value javafx.collections javafx.collections.transformation javafx.event javafx.util javafx.util.converter
    +
    javafx.controls
    +
    com.sun.javafx.scene.control com.sun.javafx.scene.control.behavior com.sun.javafx.scene.control.inputmap com.sun.javafx.scene.control.skin javafx.scene.chart javafx.scene.control javafx.scene.control.cell javafx.scene.control.skin
    +
    javafx.graphics
    +
    com.sun.glass.ui com.sun.glass.utils com.sun.javafx.application com.sun.javafx.css com.sun.javafx.cursor com.sun.javafx.embed com.sun.javafx.font com.sun.javafx.geom com.sun.javafx.geom.transform com.sun.javafx.iio com.sun.javafx.menu com.sun.javafx.scene com.sun.javafx.scene.input com.sun.javafx.scene.layout com.sun.javafx.scene.text com.sun.javafx.scene.traversal com.sun.javafx.sg.prism com.sun.javafx.stage com.sun.javafx.text com.sun.javafx.tk com.sun.javafx.util com.sun.prism com.sun.prism.image com.sun.prism.paint com.sun.scenario.effect com.sun.scenario.effect.impl com.sun.scenario.effect.impl.prism javafx.animation javafx.application javafx.concurrent javafx.css javafx.css.converter javafx.geometry javafx.print javafx.scene javafx.scene.canvas javafx.scene.effect javafx.scene.image javafx.scene.input javafx.scene.layout javafx.scene.paint javafx.scene.robot javafx.scene.shape javafx.scene.text javafx.scene.transform javafx.stage
    +
    server
    +
    fr.lnl.game.server fr.lnl.game.server.games fr.lnl.game.server.games.action fr.lnl.game.server.games.grid fr.lnl.game.server.games.grid.build fr.lnl.game.server.games.grid.elements fr.lnl.game.server.games.player fr.lnl.game.server.games.weapon fr.lnl.game.server.listener fr.lnl.game.server.utils
    +
    +
    +
  • +
  • +
    + +

    Modules

    +
    Requires
    +
    +
    Modifier
    +
    Module
    +
    Description
    +
    +
    java.base
    +
     
    +
    +
    javafx.controls
    +
     
    +
    transitive
    +
    javafx.graphics
    +
     
    +
    +
    server
    +
     
    +
    +
    Indirect Requires
    +
    +
    Modifier
    +
    Module
    +
    Description
    +
    transitive
    +
    javafx.base
    +
     
    +
    +
    +
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/constant-values.html b/livraison/doc/client/constant-values.html new file mode 100644 index 0000000..514add7 --- /dev/null +++ b/livraison/doc/client/constant-values.html @@ -0,0 +1,84 @@ + + + + +Constant Field Values (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Constant Field Values

+
+

Contents

+ +
+
+
+

fr.lnl.*

+
    +
  • +
    fr.lnl.game.client.view.Window
    +
    +
    Modifier and Type
    +
    Constant Field
    +
    Value
    +
    public static final int
    + +
    40
    +
    public static final int
    + +
    160
    +
    public static final int
    + +
    500
    +
    +
  • +
+
+
+
+
+ + diff --git a/livraison/doc/client/element-list b/livraison/doc/client/element-list new file mode 100644 index 0000000..bc8579a --- /dev/null +++ b/livraison/doc/client/element-list @@ -0,0 +1,4 @@ +module:client +fr.lnl.game.client +fr.lnl.game.client.listener +fr.lnl.game.client.view diff --git a/livraison/doc/client/help-doc.html b/livraison/doc/client/help-doc.html new file mode 100644 index 0000000..08c6272 --- /dev/null +++ b/livraison/doc/client/help-doc.html @@ -0,0 +1,185 @@ + + + + +API Help (client API) + + + + + + + + + + + + + + +
+ +
+
+

JavaDoc Help

+ +
+
+

Navigation

+Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
+
+
+

Kinds of Pages

+The following sections describe the different kinds of pages in this collection. +
+

Module

+

Each module has a page that contains a list of its packages, dependencies on other modules, and services, with a summary for each. These pages may contain the following categories:

+
    +
  • Packages
  • +
  • Modules
  • +
  • Services
  • +
+
+
+

Package

+

Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

+
    +
  • Interfaces
  • +
  • Classes
  • +
  • Enum Classes
  • +
  • Exceptions
  • +
  • Errors
  • +
  • Annotation Interfaces
  • +
+
+
+

Class or Interface

+

Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

+
    +
  • Class Inheritance Diagram
  • +
  • Direct Subclasses
  • +
  • All Known Subinterfaces
  • +
  • All Known Implementing Classes
  • +
  • Class or Interface Declaration
  • +
  • Class or Interface Description
  • +
+
+
    +
  • Nested Class Summary
  • +
  • Enum Constant Summary
  • +
  • Field Summary
  • +
  • Property Summary
  • +
  • Constructor Summary
  • +
  • Method Summary
  • +
  • Required Element Summary
  • +
  • Optional Element Summary
  • +
+
+
    +
  • Enum Constant Details
  • +
  • Field Details
  • +
  • Property Details
  • +
  • Constructor Details
  • +
  • Method Details
  • +
  • Element Details
  • +
+

Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

+

The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

+
+
+

Other Files

+

Packages and modules may contain pages with additional information related to the declarations nearby.

+
+
+

Tree (Class Hierarchy)

+

There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

+
    +
  • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
  • +
  • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
  • +
+
+
+

Constant Field Values

+

The Constant Field Values page lists the static final fields and their values.

+
+
+

All Packages

+

The All Packages page contains an alphabetic index of all packages contained in the documentation.

+
+
+

All Classes and Interfaces

+

The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

+
+
+

Index

+

The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

+
+
+
+This help file applies to API documentation generated by the standard doclet.
+
+
+ + diff --git a/livraison/doc/client/index-all.html b/livraison/doc/client/index-all.html new file mode 100644 index 0000000..f0ad56d --- /dev/null +++ b/livraison/doc/client/index-all.html @@ -0,0 +1,482 @@ + + + + +Index (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Index

+
+A B C D E F G H L M N P R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values +

A

+
+
AbstractView - Class in fr.lnl.game.client.view
+
+
Abstract class implemented by every view classes
+
+
AbstractView(Game, Player) - Constructor for class fr.lnl.game.client.view.AbstractView
+
 
+
action - Variable in class fr.lnl.game.client.listener.SelectDirectionListener
+
 
+
addButtonToPane(String, EventHandler<ActionEvent>, Pane, int, int) - Method in class fr.lnl.game.client.view.Window
+
+
called when we add a button in the interface
+
+
addToPrincipalPanel(Object, Pane, int, int) - Method in class fr.lnl.game.client.view.Window
+
+
Add grid element to the principal pane
+
+
App - Class in fr.lnl.game.client
+
+
Application starting point
+
+
App() - Constructor for class fr.lnl.game.client.App
+
 
+
argsList - Static variable in class fr.lnl.game.client.App
+
 
+
+

B

+
+
BACKGROUND_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
bg - Static variable in class fr.lnl.game.client.view.Window
+
 
+
BG - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
BOMB_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
buttonPane - Variable in class fr.lnl.game.client.view.Window
+
 
+
+

C

+
+
Cell - Class in fr.lnl.game.client.view
+
+
classe qui a pour but de générer chaque case de la grid et de vérifier les entités présentes dessus + (Mur, Joueur, Energie, Bombe, etc.)
+
+
Cell(int, int) - Constructor for class fr.lnl.game.client.view.Cell
+
 
+
cellSize - Static variable in class fr.lnl.game.client.view.Window
+
 
+
choseAction() - Method in class fr.lnl.game.client.view.Terminal
+
+
Used when current player is an instance of HumanPlayer and demand to it + an action to do
+
+
choseDirectionAction(ReunionSameAction) - Method in class fr.lnl.game.client.view.Window
+
+
Choose a direction between all possible from the previously selected action type
+
+
choseReunionSameAction(List<ReunionSameAction>) - Method in class fr.lnl.game.client.view.Terminal
+
+
Used when current player is an instance of HumanPlayer and demand to it + a type of action to do
+
+
choseReunionSameAction(List<ReunionSameAction>) - Method in class fr.lnl.game.client.view.Window
+
+
Used when Game.getCurrentPlayer() is an instance of HumanPlayer.
+
+
client - module client
+
+
Client module, include every view and controller classes from MVC model
+
+
ClientEventHandler - Record Class in fr.lnl.game.client.listener
+
+
implementation of a listener from JavaFX EventHandler
+
+
ClientEventHandler(ModelListener) - Constructor for record class fr.lnl.game.client.listener.ClientEventHandler
+
+
Creates an instance of a ClientEventHandler record class.
+
+
ClientPlayer - Record Class in fr.lnl.game.client
+
+
Store a view per player
+
+
ClientPlayer(Player, View) - Constructor for record class fr.lnl.game.client.ClientPlayer
+
+
Creates an instance of a ClientPlayer record class.
+
+
createContent() - Method in class fr.lnl.game.client.view.Window
+
+
Create content of the stage
+
+
createNewPlayer(Class<? extends AbstractPlayer>, ClassPlayer, int) - Static method in class fr.lnl.game.client.App
+
+
create a new instance of the player
+
+
createViewLambda(Player) - Method in interface fr.lnl.game.client.ViewLambda
+
+
A lambda create an anonymous class which implements this interface
+
+
+

D

+
+
dark - Static variable in class fr.lnl.game.client.view.Window
+
 
+
displayWinner(Player) - Method in class fr.lnl.game.client.view.Terminal
+
+
Used to display the winner of the game
+
+
displayWinner(Player) - Method in interface fr.lnl.game.client.view.View
+
+
Used to display the name of the winner
+
+
displayWinner(Player) - Method in class fr.lnl.game.client.view.ViewManager
+
+
This method is call when the game is finish
+
+
displayWinner(Player) - Method in class fr.lnl.game.client.view.Window
+
+
Used to display the name of the winner
+
+
displayWinnerEvent - Variable in class fr.lnl.game.client.listener.NextPlayerButtonListener
+
 
+
DisplayWinnerEvent - Class in fr.lnl.game.client.listener
+
+
Used to display the winner of the game
+
+
DisplayWinnerEvent() - Constructor for class fr.lnl.game.client.listener.DisplayWinnerEvent
+
 
+
+

E

+
+
ENERGY_BALL_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
equals(Object) - Method in record class fr.lnl.game.client.ClientPlayer
+
+
Indicates whether some other object is "equal to" this one.
+
+
equals(Object) - Method in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
Indicates whether some other object is "equal to" this one.
+
+
+

F

+
+
fr.lnl.game.client - package fr.lnl.game.client
+
+
Client package
+
+
fr.lnl.game.client.listener - package fr.lnl.game.client.listener
+
+
Package that contains every view listeners
+
+
fr.lnl.game.client.view - package fr.lnl.game.client.view
+
+
View package, contains all classes about user view
+
+
+

G

+
+
game - Static variable in class fr.lnl.game.client.App
+
 
+
game - Variable in class fr.lnl.game.client.listener.NextPlayerButtonListener
+
 
+
game - Variable in class fr.lnl.game.client.listener.SelectActionButton
+
 
+
game - Variable in class fr.lnl.game.client.listener.SelectDirectionListener
+
 
+
game - Variable in class fr.lnl.game.client.view.AbstractView
+
 
+
game - Variable in class fr.lnl.game.client.view.ViewManager
+
 
+
getGame() - Static method in class fr.lnl.game.client.App
+
 
+
getNextPlayerButtonListener() - Method in class fr.lnl.game.client.view.Window
+
 
+
getPlayerImage() - Static method in class fr.lnl.game.client.view.Cell
+
 
+
getServerPlayer() - Method in record class fr.lnl.game.client.ClientPlayer
+
 
+
getView() - Method in record class fr.lnl.game.client.ClientPlayer
+
 
+
getViewManager() - Static method in class fr.lnl.game.client.App
+
 
+
+

H

+
+
handle(ActionEvent) - Method in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
This method is call by JavaFX when we click to the button
+
+
hashCode() - Method in record class fr.lnl.game.client.ClientPlayer
+
+
Returns a hash code value for this object.
+
+
hashCode() - Method in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
Returns a hash code value for this object.
+
+
height - Static variable in class fr.lnl.game.client.view.Window
+
 
+
+

L

+
+
launchTerminal() - Static method in class fr.lnl.game.client.App
+
 
+
listener - Variable in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
The field for the listener record component.
+
+
listener() - Method in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
Returns the value of the listener record component.
+
+
+

M

+
+
main(String[]) - Static method in class fr.lnl.game.client.App
+
 
+
MINE_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
+

N

+
+
nextPlayerButtonListener - Variable in class fr.lnl.game.client.view.Window
+
 
+
NextPlayerButtonListener - Class in fr.lnl.game.client.listener
+
+
This method is call when the current player have selected an action to play (or if it's a computer player, will + select it), then we call Game.play() and we update the view
+
+
NextPlayerButtonListener(Game) - Constructor for class fr.lnl.game.client.listener.NextPlayerButtonListener
+
 
+
+

P

+
+
parsePlayers() - Static method in class fr.lnl.game.client.App
+
+
Parse players arguments and create instances for each player
+
+
parseView() - Static method in class fr.lnl.game.client.App
+
+
Parse the first argument given by user to know the view to use (Terminal or Window)
+
+
player - Variable in class fr.lnl.game.client.view.AbstractView
+
 
+
PLAYER_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
PLAYER_SHIELD_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
PLAYER_SHOT_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
players - Variable in class fr.lnl.game.client.view.ViewManager
+
 
+
putMoveTextPane(Pane) - Method in class fr.lnl.game.client.view.Window
+
+
build left down pane and move it to its position
+
+
putStatePlayerPane(Pane) - Method in class fr.lnl.game.client.view.Window
+
+
Create the right pane
+
+
+

R

+
+
reunionSameAction - Variable in class fr.lnl.game.client.listener.SelectActionButton
+
 
+
run() - Method in class fr.lnl.game.client.view.ViewManager
+
+
This method is call after initialized view manager to display a first screen
+
+
+

S

+
+
scanner - Static variable in class fr.lnl.game.client.view.Terminal
+
+
Standard input
+
+
SelectActionButton - Class in fr.lnl.game.client.listener
+
+
Used when the human player select type of action it want to play
+
+
SelectActionButton(Game, Window, ReunionSameAction) - Constructor for class fr.lnl.game.client.listener.SelectActionButton
+
 
+
SelectDirectionListener - Class in fr.lnl.game.client.listener
+
+
Call when the player selected the direction where it wants to play it
+
+
SelectDirectionListener(Game, Window, Action) - Constructor for class fr.lnl.game.client.listener.SelectDirectionListener
+
 
+
selectedReunionAction - Variable in class fr.lnl.game.client.view.Window
+
 
+
serverPlayer - Variable in record class fr.lnl.game.client.ClientPlayer
+
+
The field for the serverPlayer record component.
+
+
serverPlayer() - Method in record class fr.lnl.game.client.ClientPlayer
+
+
Returns the value of the serverPlayer record component.
+
+
setImageObject(Object, Game) - Static method in class fr.lnl.game.client.view.Cell
+
 
+
setSelectedReunionAction(ReunionSameAction) - Method in class fr.lnl.game.client.view.Window
+
 
+
show() - Method in class fr.lnl.game.client.view.Terminal
+
+
Used to update view
+
+
show() - Method in interface fr.lnl.game.client.view.View
+
+
used to update screen
+
+
show() - Method in class fr.lnl.game.client.view.Window
+
+
used to update screen
+
+
showMoveText() - Method in class fr.lnl.game.client.view.Window
+
+
Build the left down pane (contains current player information)
+
+
showStatePlayer(String, int) - Method in class fr.lnl.game.client.view.Window
+
+
Build left down pane (list all players information)
+
+
stage - Variable in class fr.lnl.game.client.view.Window
+
 
+
start(Stage) - Method in class fr.lnl.game.client.App
+
 
+
startGame() - Static method in class fr.lnl.game.client.App
+
+
Parse players arguments and create a new instance of Game
+
+
+

T

+
+
Terminal - Class in fr.lnl.game.client.view
+
+
View terminal, use standard input and output
+
+
Terminal(Game, Player) - Constructor for class fr.lnl.game.client.view.Terminal
+
 
+
terminalView() - Method in class fr.lnl.game.client.view.ViewManager
+
+
This method is call when the view is a terminal
+
+
toString() - Method in record class fr.lnl.game.client.ClientPlayer
+
+
Returns a string representation of this record class.
+
+
toString() - Method in record class fr.lnl.game.client.listener.ClientEventHandler
+
+
Returns a string representation of this record class.
+
+
+

U

+
+
updateModel(Object) - Method in class fr.lnl.game.client.listener.DisplayWinnerEvent
+
+
This method is call when the game is over
+
+
updateModel(Object) - Method in class fr.lnl.game.client.listener.NextPlayerButtonListener
+
+
Call when clicking on "SUIVANT" button if current player is a computer player or after the human player selected + action it want to play
+
+
updateModel(Object) - Method in class fr.lnl.game.client.listener.SelectActionButton
+
+
This method is call when the player select the type of action it want to play
+
+
updateModel(Object) - Method in class fr.lnl.game.client.listener.SelectDirectionListener
+
+
This method is call when the player click on the button to select the direction of the previously selected action
+
+
updateView() - Method in class fr.lnl.game.client.view.ViewManager
+
+
Call when we need to change or update view
+
+
+

V

+
+
view - Variable in record class fr.lnl.game.client.ClientPlayer
+
+
The field for the view record component.
+
+
view() - Method in record class fr.lnl.game.client.ClientPlayer
+
+
Returns the value of the view record component.
+
+
View - Interface in fr.lnl.game.client.view
+
+
View interface, implemented by Terminal and Window.
+
+
ViewLambda - Interface in fr.lnl.game.client
+
+
Used as Lambda expression to instantiate a View per Player stored in ClientPlayer
+
+
viewManager - Static variable in class fr.lnl.game.client.App
+
 
+
ViewManager - Class in fr.lnl.game.client.view
+
+
View manager, main access to every views
+
+
ViewManager(Game, Class<? extends View>, ViewLambda) - Constructor for class fr.lnl.game.client.view.ViewManager
+
 
+
viewType - Variable in class fr.lnl.game.client.view.ViewManager
+
 
+
+

W

+
+
WALL_IMAGE - Static variable in class fr.lnl.game.client.view.Cell
+
 
+
width - Static variable in class fr.lnl.game.client.view.Window
+
 
+
window - Variable in class fr.lnl.game.client.listener.SelectActionButton
+
 
+
window - Variable in class fr.lnl.game.client.listener.SelectDirectionListener
+
 
+
Window - Class in fr.lnl.game.client.view
+
+
Window view, use mouse and keyboard to control interface
+
+
Window(Stage, Game, Player) - Constructor for class fr.lnl.game.client.view.Window
+
 
+
+A B C D E F G H L M N P R S T U V W 
All Classes and Interfaces|All Packages|Constant Field Values
+
+
+ + diff --git a/livraison/doc/client/index.html b/livraison/doc/client/index.html new file mode 100644 index 0000000..93086f6 --- /dev/null +++ b/livraison/doc/client/index.html @@ -0,0 +1,25 @@ + + + + +client API + + + + + + + + + + +
+ +

client/module-summary.html

+
+ + diff --git a/livraison/doc/client/jquery-ui.overrides.css b/livraison/doc/client/jquery-ui.overrides.css new file mode 100644 index 0000000..1abff95 --- /dev/null +++ b/livraison/doc/client/jquery-ui.overrides.css @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + /* Overrides the color of selection used in jQuery UI */ + background: #F8981D; +} diff --git a/livraison/doc/client/legal/COPYRIGHT b/livraison/doc/client/legal/COPYRIGHT new file mode 100644 index 0000000..ca74fff --- /dev/null +++ b/livraison/doc/client/legal/COPYRIGHT @@ -0,0 +1 @@ +Please see ..\java.base\COPYRIGHT diff --git a/livraison/doc/client/legal/LICENSE b/livraison/doc/client/legal/LICENSE new file mode 100644 index 0000000..4ad9fe4 --- /dev/null +++ b/livraison/doc/client/legal/LICENSE @@ -0,0 +1 @@ +Please see ..\java.base\LICENSE diff --git a/livraison/doc/client/legal/jquery.md b/livraison/doc/client/legal/jquery.md new file mode 100644 index 0000000..8054a34 --- /dev/null +++ b/livraison/doc/client/legal/jquery.md @@ -0,0 +1,72 @@ +## jQuery v3.5.1 + +### jQuery License +``` +jQuery v 3.5.1 +Copyright JS Foundation and other contributors, https://js.foundation/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************** + +The jQuery JavaScript Library v3.5.1 also includes Sizzle.js + +Sizzle.js includes the following license: + +Copyright JS Foundation and other contributors, https://js.foundation/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/sizzle + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +********************* + +``` diff --git a/livraison/doc/client/legal/jqueryUI.md b/livraison/doc/client/legal/jqueryUI.md new file mode 100644 index 0000000..8031bdb --- /dev/null +++ b/livraison/doc/client/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.12.1 + +### jQuery UI License +``` +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/livraison/doc/client/member-search-index.js b/livraison/doc/client/member-search-index.js new file mode 100644 index 0000000..bf26429 --- /dev/null +++ b/livraison/doc/client/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"fr.lnl.game.client.view","c":"AbstractView","l":"AbstractView(Game, Player)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.listener","c":"SelectDirectionListener","l":"action"},{"p":"fr.lnl.game.client.view","c":"Window","l":"addButtonToPane(String, EventHandler, Pane, int, int)","u":"addButtonToPane(java.lang.String,javafx.event.EventHandler,javafx.scene.layout.Pane,int,int)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"addToPrincipalPanel(Object, Pane, int, int)","u":"addToPrincipalPanel(java.lang.Object,javafx.scene.layout.Pane,int,int)"},{"p":"fr.lnl.game.client","c":"App","l":"App()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.client","c":"App","l":"argsList"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"BACKGROUND_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Window","l":"bg"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"BG"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"BOMB_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Window","l":"buttonPane"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"Cell(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"cellSize"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"choseAction()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"choseDirectionAction(ReunionSameAction)","u":"choseDirectionAction(fr.lnl.game.server.games.action.ReunionSameAction)"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"choseReunionSameAction(List)","u":"choseReunionSameAction(java.util.List)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"choseReunionSameAction(List)","u":"choseReunionSameAction(java.util.List)"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"ClientEventHandler(ModelListener)","u":"%3Cinit%3E(fr.lnl.game.server.listener.ModelListener)"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"ClientPlayer(Player, View)","u":"%3Cinit%3E(fr.lnl.game.server.games.player.Player,fr.lnl.game.client.view.View)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"createContent()"},{"p":"fr.lnl.game.client","c":"App","l":"createNewPlayer(Class, ClassPlayer, int)","u":"createNewPlayer(java.lang.Class,fr.lnl.game.server.games.player.ClassPlayer,int)"},{"p":"fr.lnl.game.client","c":"ViewLambda","l":"createViewLambda(Player)","u":"createViewLambda(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"dark"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"displayWinner(Player)","u":"displayWinner(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.view","c":"View","l":"displayWinner(Player)","u":"displayWinner(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"displayWinner(Player)","u":"displayWinner(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"displayWinner(Player)","u":"displayWinner(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.listener","c":"NextPlayerButtonListener","l":"displayWinnerEvent"},{"p":"fr.lnl.game.client.listener","c":"DisplayWinnerEvent","l":"DisplayWinnerEvent()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"ENERGY_BALL_IMAGE"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"fr.lnl.game.client","c":"App","l":"game"},{"p":"fr.lnl.game.client.listener","c":"NextPlayerButtonListener","l":"game"},{"p":"fr.lnl.game.client.listener","c":"SelectActionButton","l":"game"},{"p":"fr.lnl.game.client.listener","c":"SelectDirectionListener","l":"game"},{"p":"fr.lnl.game.client.view","c":"AbstractView","l":"game"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"game"},{"p":"fr.lnl.game.client","c":"App","l":"getGame()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"getNextPlayerButtonListener()"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"getPlayerImage()"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"getServerPlayer()"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"getView()"},{"p":"fr.lnl.game.client","c":"App","l":"getViewManager()"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"handle(ActionEvent)","u":"handle(javafx.event.ActionEvent)"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"hashCode()"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"hashCode()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"height"},{"p":"fr.lnl.game.client","c":"App","l":"launchTerminal()"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"listener"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"listener()"},{"p":"fr.lnl.game.client","c":"App","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"MINE_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Window","l":"nextPlayerButtonListener"},{"p":"fr.lnl.game.client.listener","c":"NextPlayerButtonListener","l":"NextPlayerButtonListener(Game)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.client","c":"App","l":"parsePlayers()"},{"p":"fr.lnl.game.client","c":"App","l":"parseView()"},{"p":"fr.lnl.game.client.view","c":"AbstractView","l":"player"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"PLAYER_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"PLAYER_SHIELD_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"PLAYER_SHOT_IMAGE"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"players"},{"p":"fr.lnl.game.client.view","c":"Window","l":"putMoveTextPane(Pane)","u":"putMoveTextPane(javafx.scene.layout.Pane)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"putStatePlayerPane(Pane)","u":"putStatePlayerPane(javafx.scene.layout.Pane)"},{"p":"fr.lnl.game.client.listener","c":"SelectActionButton","l":"reunionSameAction"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"run()"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"scanner"},{"p":"fr.lnl.game.client.listener","c":"SelectActionButton","l":"SelectActionButton(Game, Window, ReunionSameAction)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.client.view.Window,fr.lnl.game.server.games.action.ReunionSameAction)"},{"p":"fr.lnl.game.client.listener","c":"SelectDirectionListener","l":"SelectDirectionListener(Game, Window, Action)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.client.view.Window,fr.lnl.game.server.games.action.Action)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"selectedReunionAction"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"serverPlayer"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"serverPlayer()"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"setImageObject(Object, Game)","u":"setImageObject(java.lang.Object,fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"setSelectedReunionAction(ReunionSameAction)","u":"setSelectedReunionAction(fr.lnl.game.server.games.action.ReunionSameAction)"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"show()"},{"p":"fr.lnl.game.client.view","c":"View","l":"show()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"show()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"showMoveText()"},{"p":"fr.lnl.game.client.view","c":"Window","l":"showStatePlayer(String, int)","u":"showStatePlayer(java.lang.String,int)"},{"p":"fr.lnl.game.client.view","c":"Window","l":"stage"},{"p":"fr.lnl.game.client","c":"App","l":"start(Stage)","u":"start(javafx.stage.Stage)"},{"p":"fr.lnl.game.client","c":"App","l":"startGame()"},{"p":"fr.lnl.game.client.view","c":"Terminal","l":"Terminal(Game, Player)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"terminalView()"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"toString()"},{"p":"fr.lnl.game.client.listener","c":"ClientEventHandler","l":"toString()"},{"p":"fr.lnl.game.client.listener","c":"DisplayWinnerEvent","l":"updateModel(Object)","u":"updateModel(java.lang.Object)"},{"p":"fr.lnl.game.client.listener","c":"NextPlayerButtonListener","l":"updateModel(Object)","u":"updateModel(java.lang.Object)"},{"p":"fr.lnl.game.client.listener","c":"SelectActionButton","l":"updateModel(Object)","u":"updateModel(java.lang.Object)"},{"p":"fr.lnl.game.client.listener","c":"SelectDirectionListener","l":"updateModel(Object)","u":"updateModel(java.lang.Object)"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"updateView()"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"view"},{"p":"fr.lnl.game.client","c":"ClientPlayer","l":"view()"},{"p":"fr.lnl.game.client","c":"App","l":"viewManager"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"ViewManager(Game, Class, ViewLambda)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,java.lang.Class,fr.lnl.game.client.ViewLambda)"},{"p":"fr.lnl.game.client.view","c":"ViewManager","l":"viewType"},{"p":"fr.lnl.game.client.view","c":"Cell","l":"WALL_IMAGE"},{"p":"fr.lnl.game.client.view","c":"Window","l":"width"},{"p":"fr.lnl.game.client.listener","c":"SelectActionButton","l":"window"},{"p":"fr.lnl.game.client.listener","c":"SelectDirectionListener","l":"window"},{"p":"fr.lnl.game.client.view","c":"Window","l":"Window(Stage, Game, Player)","u":"%3Cinit%3E(javafx.stage.Stage,fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player)"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/client/module-search-index.js b/livraison/doc/client/module-search-index.js new file mode 100644 index 0000000..52bc8f6 --- /dev/null +++ b/livraison/doc/client/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [{"l":"client"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/client/overview-tree.html b/livraison/doc/client/overview-tree.html new file mode 100644 index 0000000..88c4290 --- /dev/null +++ b/livraison/doc/client/overview-tree.html @@ -0,0 +1,117 @@ + + + + +Class Hierarchy (client API) + + + + + + + + + + + + + + +
+ +
+
+
+

Hierarchy For All Packages

+Package Hierarchies: + +
+
+

Class Hierarchy

+
    +
  • java.lang.Object +
      +
    • fr.lnl.game.server.listener.AbstractModelListening (implements fr.lnl.game.server.listener.ModelListener) + +
    • +
    • fr.lnl.game.client.view.AbstractView (implements fr.lnl.game.client.view.View) + +
    • +
    • javafx.application.Application +
        +
      • fr.lnl.game.client.App
      • +
      +
    • +
    • javafx.scene.Node (implements javafx.event.EventTarget, javafx.css.Styleable) +
        +
      • javafx.scene.shape.Shape +
          +
        • javafx.scene.shape.Rectangle +
            +
          • fr.lnl.game.client.view.Cell
          • +
          +
        • +
        +
      • +
      +
    • +
    • java.lang.Record + +
    • +
    • fr.lnl.game.client.view.ViewManager
    • +
    +
  • +
+
+
+

Interface Hierarchy

+ +
+
+
+
+ + diff --git a/livraison/doc/client/package-search-index.js b/livraison/doc/client/package-search-index.js new file mode 100644 index 0000000..6652df9 --- /dev/null +++ b/livraison/doc/client/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"m":"client","l":"fr.lnl.game.client"},{"m":"client","l":"fr.lnl.game.client.listener"},{"m":"client","l":"fr.lnl.game.client.view"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/client/resources/glass.png b/livraison/doc/client/resources/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f591f467a1c0c949bbc510156a0c1afb860a6e GIT binary patch literal 499 zcmVJoRsvExf%rEN>jUL}qZ_~k#FbE+Q;{`;0FZwVNX2n-^JoI; zP;4#$8DIy*Yk-P>VN(DUKmPse7mx+ExD4O|;?E5D0Z5($mjO3`*anwQU^s{ZDK#Lz zj>~{qyaIx5K!t%=G&2IJNzg!ChRpyLkO7}Ry!QaotAHAMpbB3AF(}|_f!G-oI|uK6 z`id_dumai5K%C3Y$;tKS_iqMPHg<*|-@e`liWLAggVM!zAP#@l;=c>S03;{#04Z~5 zN_+ss=Yg6*hTr59mzMwZ@+l~q!+?ft!fF66AXT#wWavHt30bZWFCK%!BNk}LN?0Hg z1VF_nfs`Lm^DjYZ1(1uD0u4CSIr)XAaqW6IT{!St5~1{i=i}zAy76p%_|w8rh@@c0Axr!ns=D-X+|*sY6!@wacG9%)Qn*O zl0sa739kT-&_?#oVxXF6tOnqTD)cZ}2vi$`ZU8RLAlo8=_z#*P3xI~i!lEh+Pdu-L zx{d*wgjtXbnGX_Yf@Tc7Q3YhLhPvc8noGJs2DA~1DySiA&6V{5JzFt ojAY1KXm~va;tU{v7C?Xj0BHw!K;2aXV*mgE07*qoM6N<$f;4TDA^-pY literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png b/livraison/doc/client/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..34abd18f32d3a55a297fdcf93409bd033ae573e7 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALRXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^403@vmGjdTsnLJUl-Obo4zO|=aStPBhe<(7X!(U6;;l9^VCTf=69^L{`L N44$rjF6*2UngDu&PXPb` literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png b/livraison/doc/client/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..a90afb8bf8028404d206114965669b023dcb85ea GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4hES%`s&m5HI1v5B^Uft7(lid2moiiX_$l+3hB+!{pPkNg5^ OVDNPHb6Mw<&;$T*0!_~V literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png b/livraison/doc/client/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe091f6dc036fc1dc11b005738e951e27a43f7a GIT binary patch literal 332 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�_j6WK+Gj+xJRxVvl#lh7y-4uY);t)n47k4ot z9YsU`HVk7fg4;r{;)FHk7ZHyZJ+W|$aKwj=g&_$VCVFn5%XzSA`|z}+4ItZ|`hB}R z>h-6Be`d>nmv8;kQHJg!HMr^cCGG=T5;3HhZ_JRq0_4a3TsY7Pz{V+}z>;!R^U4*c zJ>wRI59B-)92Vi?b&EWvH(`<(G5A?W)z>EuDMG@VENAb7aHa`I#tKw{0uUc3(#J8& z*_S%A_ZxCIY385{%qN-b1K)TWmCjUA4nWKx_ZnKLSvEf0($&_0@DS~ zN8JOXJXXcaFm^OCYrz(R7N5DQkXKGnnt}yzfw^8s%=A?7hxza;ylJ;XQ&XtC`pM%b z6$5Ff0{(ALcSlTKvIbr@mR`0Z)*iM`2EfO|E5OMk$jQsE!^mat*drqV literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-icons_2e83ff_256x240.png b/livraison/doc/client/script-dir/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5f49756ca64bd20a1048bd7a3a584457d4bf00 GIT binary patch literal 4549 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 literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-icons_888888_256x240.png b/livraison/doc/client/script-dir/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5e33f27235d1b5cf0259f63f3894a6be33c679 GIT binary patch literal 6999 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 literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/images/ui-icons_cd0a0a_256x240.png b/livraison/doc/client/script-dir/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8ebc180a2d2a74739059799407b8b7b57a9092 GIT binary patch literal 4549 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 Mq_Ix57W&cu0AIB!=l}o! literal 0 HcmV?d00001 diff --git a/livraison/doc/client/script-dir/jquery-3.5.1.min.js b/livraison/doc/client/script-dir/jquery-3.5.1.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/livraison/doc/client/script-dir/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"
    ",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
      ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
      ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
      ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
      ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
      ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete}); \ No newline at end of file diff --git a/livraison/doc/client/script-dir/jquery-ui.structure.min.css b/livraison/doc/client/script-dir/jquery-ui.structure.min.css new file mode 100644 index 0000000..e880892 --- /dev/null +++ b/livraison/doc/client/script-dir/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2018-12-06 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} \ No newline at end of file diff --git a/livraison/doc/client/script.js b/livraison/doc/client/script.js new file mode 100644 index 0000000..0765364 --- /dev/null +++ b/livraison/doc/client/script.js @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor); + elem.classList.add(isEvenRow ? evenRowColor : oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.querySelector('div#' + tableId +' .summary-table') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} + +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + contentDiv.addEventListener("scroll", function(e) { + var timeoutID; + if (!timeoutID) { + timeoutID = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + timeoutID = null; + }, 100); + } + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/livraison/doc/client/search.js b/livraison/doc/client/search.js new file mode 100644 index 0000000..13aba85 --- /dev/null +++ b/livraison/doc/client/search.js @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var noResult = {l: "No results found"}; +var loading = {l: "Loading search index..."}; +var catModules = "Modules"; +var catPackages = "Packages"; +var catTypes = "Classes and Interfaces"; +var catMembers = "Members"; +var catSearchTags = "Search Tags"; +var highlight = "$&"; +var searchPattern = ""; +var fallbackPattern = ""; +var RANKING_THRESHOLD = 2; +var NO_MATCH = 0xffff; +var MIN_RESULTS = 3; +var MAX_RESULTS = 500; +var UNNAMED = ""; +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(item, matcher, fallbackMatcher) { + var escapedItem = escapeHtml(item); + var highlighted = escapedItem.replace(matcher, highlight); + if (highlighted === escapedItem) { + highlighted = escapedItem.replace(fallbackMatcher, highlight) + } + return highlighted; +} +function getURLPrefix(ui) { + var urlPrefix=""; + var slash = "/"; + if (ui.item.category === catModules) { + return ui.item.l + slash; + } else if (ui.item.category === catPackages && ui.item.m) { + return ui.item.m + slash; + } else if (ui.item.category === catTypes || ui.item.category === catMembers) { + if (ui.item.m) { + urlPrefix = ui.item.m + slash; + } else { + $.each(packageSearchIndex, function(index, item) { + if (item.m && ui.item.p === item.l) { + urlPrefix = item.m + slash; + } + }); + } + } + return urlPrefix; +} +function createSearchPattern(term) { + var pattern = ""; + var isWordToken = false; + term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) { + if (index > 0) { + // whitespace between identifiers is significant + pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*"; + } + var tokens = w.split(/(?=[A-Z,.()<>[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + if (s === "") { + continue; + } + pattern += $.ui.autocomplete.escapeRegex(s); + isWordToken = /\w$/.test(s); + if (isWordToken) { + pattern += "([a-z0-9_$<>\\[\\]]*?)"; + } + } + }); + return pattern; +} +function createMatcher(pattern, flags) { + var isCamelCase = /[A-Z]/.test(pattern); + return new RegExp(pattern, flags + (isCamelCase ? "" : "i")); +} +var watermark = 'Search'; +$(function() { + var search = $("#search-input"); + var reset = $("#reset-button"); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + search.val(watermark).addClass('watermark'); + search.blur(function() { + if ($(this).val().length === 0) { + $(this).val(watermark).addClass('watermark'); + } + }); + search.on('click keydown paste', function() { + if ($(this).val() === watermark) { + $(this).val('').removeClass('watermark'); + } + }); + reset.click(function() { + search.val('').focus(); + }); + search.focus()[0].setSelectionRange(0, 0); +}); +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); + }, + _renderMenu: function(ul, items) { + var rMenu = this; + var currentCategory = ""; + rMenu.menu.bindings = $(); + $.each(items, function(index, item) { + var li; + if (item.category && item.category !== currentCategory) { + ul.append("
    • " + item.category + "
    • "); + currentCategory = item.category; + } + li = rMenu._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", item.category + " : " + item.l); + li.attr("class", "result-item"); + } else { + li.attr("aria-label", item.l); + li.attr("class", "result-item"); + } + }); + }, + _renderItem: function(ul, item) { + var label = ""; + var matcher = createMatcher(escapeHtml(searchPattern), "g"); + var fallbackMatcher = new RegExp(fallbackPattern, "gi") + if (item.category === catModules) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catPackages) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catTypes) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catMembers) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.c + "." + item.l, matcher, fallbackMatcher); + } else if (item.category === catSearchTags) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else { + label = item.l; + } + var li = $("
    • ").appendTo(ul); + var div = $("
      ").appendTo(li); + if (item.category === catSearchTags && item.h) { + if (item.d) { + div.html(label + " (" + item.h + ")
      " + + item.d + "
      "); + } else { + div.html(label + " (" + item.h + ")"); + } + } else { + if (item.m) { + div.html(item.m + "/" + label); + } else { + div.html(label); + } + } + return li; + } +}); +function rankMatch(match, category) { + if (!match) { + return NO_MATCH; + } + var index = match.index; + var input = match.input; + var leftBoundaryMatch = 2; + var periferalMatch = 0; + // make sure match is anchored on a left word boundary + if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index]) { + leftBoundaryMatch = 0; + } else if ("_" === input[index - 1] || (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input))) { + leftBoundaryMatch = 1; + } + var matchEnd = index + match[0].length; + var leftParen = input.indexOf("("); + var endOfName = leftParen > -1 ? leftParen : input.length; + // exclude peripheral matches + if (category !== catModules && category !== catSearchTags) { + var delim = category === catPackages ? "/" : "."; + if (leftParen > -1 && leftParen < index) { + periferalMatch += 2; + } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) { + periferalMatch += 2; + } + } + var delta = match[0].length === endOfName ? 0 : 1; // rank full match higher than partial match + for (var i = 1; i < match.length; i++) { + // lower ranking if parts of the name are missing + if (match[i]) + delta += match[i].length; + } + if (category === catTypes) { + // lower ranking if a type name contains unmatched camel-case parts + if (/[A-Z]/.test(input.substring(matchEnd))) + delta += 5; + if (/[A-Z]/.test(input.substring(0, index))) + delta += 5; + } + return leftBoundaryMatch + periferalMatch + (delta / 200); + +} +function doSearch(request, response) { + var result = []; + searchPattern = createSearchPattern(request.term); + fallbackPattern = createSearchPattern(request.term.toLowerCase()); + if (searchPattern === "") { + return this.close(); + } + var camelCaseMatcher = createMatcher(searchPattern, ""); + var fallbackMatcher = new RegExp(fallbackPattern, "i"); + + function searchIndexWithMatcher(indexArray, matcher, category, nameFunc) { + if (indexArray) { + var newResults = []; + $.each(indexArray, function (i, item) { + item.category = category; + var ranking = rankMatch(matcher.exec(nameFunc(item)), category); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ranking: ranking, item: item}); + } + return newResults.length <= MAX_RESULTS; + }); + return newResults.sort(function(e1, e2) { + return e1.ranking - e2.ranking; + }).map(function(e) { + return e.item; + }); + } + return []; + } + function searchIndex(indexArray, category, nameFunc) { + var primaryResults = searchIndexWithMatcher(indexArray, camelCaseMatcher, category, nameFunc); + result = result.concat(primaryResults); + if (primaryResults.length <= MIN_RESULTS && !camelCaseMatcher.ignoreCase) { + var secondaryResults = searchIndexWithMatcher(indexArray, fallbackMatcher, category, nameFunc); + result = result.concat(secondaryResults.filter(function (item) { + return primaryResults.indexOf(item) === -1; + })); + } + } + + searchIndex(moduleSearchIndex, catModules, function(item) { return item.l; }); + searchIndex(packageSearchIndex, catPackages, function(item) { + return (item.m && request.term.indexOf("/") > -1) + ? (item.m + "/" + item.l) : item.l; + }); + searchIndex(typeSearchIndex, catTypes, function(item) { + return request.term.indexOf(".") > -1 ? item.p + "." + item.l : item.l; + }); + searchIndex(memberSearchIndex, catMembers, function(item) { + return request.term.indexOf(".") > -1 + ? item.p + "." + item.c + "." + item.l : item.l; + }); + searchIndex(tagSearchIndex, catSearchTags, function(item) { return item.l; }); + + if (!indexFilesLoaded()) { + updateSearchResults = function() { + doSearch(request, response); + } + result.unshift(loading); + } else { + updateSearchResults = function() {}; + } + response(result); +} +$(function() { + $("#search-input").catcomplete({ + minLength: 1, + delay: 300, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push(noResult); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.category) { + var url = getURLPrefix(ui); + if (ui.item.category === catModules) { + url += "module-summary.html"; + } else if (ui.item.category === catPackages) { + if (ui.item.u) { + url = ui.item.u; + } else { + url += ui.item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (ui.item.category === catTypes) { + if (ui.item.u) { + url = ui.item.u; + } else if (ui.item.p === UNNAMED) { + url += ui.item.l + ".html"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html"; + } + } else if (ui.item.category === catMembers) { + if (ui.item.p === UNNAMED) { + url += ui.item.c + ".html" + "#"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#"; + } + if (ui.item.u) { + url += ui.item.u; + } else { + url += ui.item.l; + } + } else if (ui.item.category === catSearchTags) { + url += ui.item.u; + } + if (top !== window) { + parent.classFrame.location = pathtoroot + url; + } else { + window.location.href = pathtoroot + url; + } + $("#search-input").focus(); + } + } + }); +}); diff --git a/livraison/doc/client/stylesheet.css b/livraison/doc/client/stylesheet.css new file mode 100644 index 0000000..836c62d --- /dev/null +++ b/livraison/doc/client/stylesheet.css @@ -0,0 +1,865 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; +} +h4 { + font-size:15px; +} +h5 { + font-size:14px; +} +h6 { + font-size:13px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +.summary-table dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size: 14px; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0; + overflow:hidden; +} +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:11px; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +@media screen { + .flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + .flex-header { + flex: 0 0 auto; + } + .flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + min-height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.sub-nav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.sub-nav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list { + padding-top:5px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0 0 0 0; + padding:5px 6px; + clear:none; +} +.nav-list-search label { + position:relative; + right:-16px; +} +ul.sub-nav-list li { + list-style:none; + float:left; + padding-top:10px; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.nav-bar-cell1-rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header and footer. + */ +.title { + color:#2c4557; + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.see-list, ul.see-list-long { + padding-left: 0; + list-style: none; +} +ul.see-list li { + display: inline; +} +ul.see-list li:not(:last-child):after, +ul.see-list-long li:not(:last-child):after { + content: ", "; + white-space: pre-wrap; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0; + padding-top:10px; + padding-left:1px; + margin:0; + white-space:pre; +} +.caption a:link, .caption a:visited { + color:#1f389c; +} +.caption a:hover, +.caption a:active { + color:#FFFFFF; +} +.caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; +} +div.table-tabs > button.active-table-tab { + background: #F8981D; + color: #253441; +} +div.table-tabs > button.table-tab { + background: #4D7A97; + color: #FFFFFF; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto); +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +@media screen and (max-width: 800px) { + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-summary .col-last { + grid-column-end: span 2; + } +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:#dee3e9; + font-weight: bold; +} +.col-first, .col-first { + font-size:13px; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:13px; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited, +.constant-values-container a:link, .constant-values-container a:visited, +.all-classes-container a:link, .all-classes-container a:visited, +.all-packages-container a:link, .all-packages-container a:visited { + font-weight:bold; +} +.table-sub-heading-color { + background-color:#EEEEFF; +} +.even-row-color, .even-row-color .table-header { + background-color:#FFFFFF; +} +.odd-row-color, .odd-row-color .table-header { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.deprecated-content { + margin:0; + padding:10px 0; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:0 10px 5px 0; + color:#474747; +} +.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.result-item { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.result-highlight { + font-weight:bold; +} +#search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; + width:400px; +} +#reset-button { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:16px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:yellow; +} +.module-graph span { + display:none; + position:absolute; +} +.module-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0px 20px 5px 10px; + border: 1px solid #ededed; + background-color: #f8f8f8; +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +span.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak font sizes and paddings for small screens. + */ +@media screen and (max-width: 1050px) { + #search-input { + width: 300px; + } +} +@media screen and (max-width: 800px) { + #search-input { + width: 200px; + } + .top-nav, + .bottom-nav { + font-size: 11px; + padding-top: 6px; + } + .sub-nav { + font-size: 11px; + } + .about-language { + padding-right: 16px; + } + ul.nav-list li, + .sub-nav .nav-list-search { + padding: 6px; + } + ul.sub-nav-list li { + padding-top: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 500px) { + #search-input { + width: 150px; + } + .top-nav, + .bottom-nav { + font-size: 10px; + } + .sub-nav { + font-size: 10px; + } + .about-language { + font-size: 10px; + padding-right: 12px; + } +} diff --git a/livraison/doc/client/tag-search-index.js b/livraison/doc/client/tag-search-index.js new file mode 100644 index 0000000..f2a440c --- /dev/null +++ b/livraison/doc/client/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/client/type-search-index.js b/livraison/doc/client/type-search-index.js new file mode 100644 index 0000000..2af26a1 --- /dev/null +++ b/livraison/doc/client/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"p":"fr.lnl.game.client.view","l":"AbstractView"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"fr.lnl.game.client","l":"App"},{"p":"fr.lnl.game.client.view","l":"Cell"},{"p":"fr.lnl.game.client.listener","l":"ClientEventHandler"},{"p":"fr.lnl.game.client","l":"ClientPlayer"},{"p":"fr.lnl.game.client.listener","l":"DisplayWinnerEvent"},{"p":"fr.lnl.game.client.listener","l":"NextPlayerButtonListener"},{"p":"fr.lnl.game.client.listener","l":"SelectActionButton"},{"p":"fr.lnl.game.client.listener","l":"SelectDirectionListener"},{"p":"fr.lnl.game.client.view","l":"Terminal"},{"p":"fr.lnl.game.client.view","l":"View"},{"p":"fr.lnl.game.client","l":"ViewLambda"},{"p":"fr.lnl.game.client.view","l":"ViewManager"},{"p":"fr.lnl.game.client.view","l":"Window"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/index.html b/livraison/doc/index.html new file mode 100644 index 0000000..bddf364 --- /dev/null +++ b/livraison/doc/index.html @@ -0,0 +1,15 @@ + + + + + Javadoc + + +

      Accéder aux javadocs de nos modules

      +
      + + + diff --git a/livraison/doc/server/allclasses-index.html b/livraison/doc/server/allclasses-index.html new file mode 100644 index 0000000..d7ca8e0 --- /dev/null +++ b/livraison/doc/server/allclasses-index.html @@ -0,0 +1,224 @@ + + + + +All Classes and Interfaces (server API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      All Classes and Interfaces

      +
      +
      +
      +
      +
      +
      Class
      +
      Description
      + +
       
      + +
      +
      AbstractBox is instantiable (not an abstract class), but when it's the case, instance doesn't represent anything, + it's only to see if there is a lock on this position or not
      +
      + +
       
      + +
       
      + +
       
      + +
       
      + +
      +
      Bomb are elements which explode when someone walks on it or after a countdown, the explosion area is on multiple cases
      +
      + +
       
      + +
      +
      ClassPlayer contains all data about the cost of an action or the cost of a damage
      +
      + +
      +
      Super class of all Computer players
      +
      + +
      +
      A box implemented by CountdownBox is a box which do an action a certain time after being placed
      +
      + +
      +
      Represent an unrecoverable error in the program, force program to stop
      +
      + +
      +
      Used when a player want to protect himself from taking damage (shield state is reset to false at next player turn)
      +
      + +
       
      + +
      +
      Enum used to chose where to move, shot, etc.
      +
      + +
       
      + +
      +
      Used when player want to drop a Bomb, bomb explode when someone walks on it and after 3 turns
      +
      + +
      +
      Used when player want to drop a Mine, Mine only explode when someone walks on it
      +
      + +
      +
      Super class used by DropMine and DropBomb
      +
      + +
      +
      An EnergyBall is a box which give back a bit of player energy after it walks on the ball
      +
      + +
      +
      Contain everything related to error messages, theirs errors are the fault of the end-user (like we demand an integer + and user give us a floating point number + Theirs error doesn't cause the program to stop, it'll demand a correct value
      +
      + +
      +
      Super class of Bomb and Mine
      +
      + +
       
      + +
       
      + +
      +
      Class managing the board
      +
      + +
      +
      Factory pattern
      +
      + +
      +
      Instance of Human Player.
      + A human player choose an action to execute by using mouse or keyboard.
      + Human Player don't implement choseAction cause this method is executed on client part
      +
      + +
      +
      A box implemented by InteractiveBox is a box which do an action when someone walks on it
      +
      + +
       
      + +
       
      + +
      +
      A mine is an element which explose when someone walks on it, the explosion area is on 1 case only
      +
      + +
      +
      Model implemented by AbstractModelListening
      +
      + +
      +
      Used when the player want to move in a direction, it can move in a direction when there is another player or a wall
      +
      + +
      +
      This exception is throw when player has no remaining bullet
      +
      + +
      +
      This action is used when player doesn't want to move and/or loose energy
      +
      + +
      +
      throw when action instantiated and the chosen direction in constructor isn't valid
      +
      + +
      +
      Tuple associating storing two value of undefined type.
      + Unlike Python, value in this Tuple can be modified (but the type of its new value need to be the same)
      +
      + +
       
      + +
      +
      Point extends from Pair, basically a simpler ways to use Pair when using grid position
      +
      + +
       
      + +
      +
      When we generate action, we generate one per available direction (like in Move) but to improve human + readability, we list every same Action here
      +
      + +
       
      + +
       
      + +
       
      + +
      +
      A wall is an intraversable object
      +
      + +
       
      +
      +
      +
      +
      +
      +
      + + diff --git a/livraison/doc/server/allpackages-index.html b/livraison/doc/server/allpackages-index.html new file mode 100644 index 0000000..f7fe9a3 --- /dev/null +++ b/livraison/doc/server/allpackages-index.html @@ -0,0 +1,102 @@ + + + + +All Packages (server API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      All Packages

      +
      +
      Package Summary
      +
      +
      Package
      +
      Description
      + +
      +
      Server package
      +
      + +
      +
      Game package, contains all classes and sub-packages mainly related game works
      +
      + +
      +
      Package storing all actions a player can do
      +
      + +
      +
      Package containing all about Grid components
      +
      + +
      +
      Package containing all about Grid construction
      +
      + +
      +
      Package containing all the elements that can be arranged in a grid
      +
      + +
      +
      Package storing all players classes and as well AI behavior
      +
      + +
      +
      Package containing all bout player's weapons
      +
      + +
      +
      Package containing model of listener to implement + Used by listeners in client module
      +
      + +
      +
      Package containing all utility classes
      +
      +
      +
      +
      +
      + + diff --git a/livraison/doc/server/constant-values.html b/livraison/doc/server/constant-values.html new file mode 100644 index 0000000..3b04636 --- /dev/null +++ b/livraison/doc/server/constant-values.html @@ -0,0 +1,91 @@ + + + + +Constant Field Values (server API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Constant Field Values

      +
      +

      Contents

      + +
      +
      +
      +

      fr.lnl.*

      +
        +
      • +
        fr.lnl.game.server.games.grid.elements.Bomb
        +
        +
        Modifier and Type
        +
        Constant Field
        +
        Value
        +
        private static final int
        + +
        2
        +
        +
      • +
      +
        +
      • +
        fr.lnl.game.server.utils.ErrorMessage
        +
        +
        Modifier and Type
        +
        Constant Field
        +
        Value
        +
        public static final String
        + +
        "\u001b[0;31mErreur de saisie\u001b[0m : "
        +
        +
      • +
      +
      +
      +
      +
      + + diff --git a/livraison/doc/server/element-list b/livraison/doc/server/element-list new file mode 100644 index 0000000..549341f --- /dev/null +++ b/livraison/doc/server/element-list @@ -0,0 +1,11 @@ +module:server +fr.lnl.game.server +fr.lnl.game.server.games +fr.lnl.game.server.games.action +fr.lnl.game.server.games.grid +fr.lnl.game.server.games.grid.build +fr.lnl.game.server.games.grid.elements +fr.lnl.game.server.games.player +fr.lnl.game.server.games.weapon +fr.lnl.game.server.listener +fr.lnl.game.server.utils diff --git a/livraison/doc/server/help-doc.html b/livraison/doc/server/help-doc.html new file mode 100644 index 0000000..194ace9 --- /dev/null +++ b/livraison/doc/server/help-doc.html @@ -0,0 +1,190 @@ + + + + +API Help (server API) + + + + + + + + + + + + + + +
      + +
      +
      +

      JavaDoc Help

      + +
      +
      +

      Navigation

      +Starting from the Overview page, you can browse the documentation using the links in each page, and in the navigation bar at the top of each page. The Index and Search box allow you to navigate to specific declarations and summary pages, including: All Packages, All Classes and Interfaces + +
      +
      +
      +

      Kinds of Pages

      +The following sections describe the different kinds of pages in this collection. +
      +

      Module

      +

      Each module has a page that contains a list of its packages, dependencies on other modules, and services, with a summary for each. These pages may contain the following categories:

      +
        +
      • Packages
      • +
      • Modules
      • +
      • Services
      • +
      +
      +
      +

      Package

      +

      Each package has a page that contains a list of its classes and interfaces, with a summary for each. These pages may contain the following categories:

      +
        +
      • Interfaces
      • +
      • Classes
      • +
      • Enum Classes
      • +
      • Exceptions
      • +
      • Errors
      • +
      • Annotation Interfaces
      • +
      +
      +
      +

      Class or Interface

      +

      Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a declaration and description, member summary tables, and detailed member descriptions. Entries in each of these sections are omitted if they are empty or not applicable.

      +
        +
      • Class Inheritance Diagram
      • +
      • Direct Subclasses
      • +
      • All Known Subinterfaces
      • +
      • All Known Implementing Classes
      • +
      • Class or Interface Declaration
      • +
      • Class or Interface Description
      • +
      +
      +
        +
      • Nested Class Summary
      • +
      • Enum Constant Summary
      • +
      • Field Summary
      • +
      • Property Summary
      • +
      • Constructor Summary
      • +
      • Method Summary
      • +
      • Required Element Summary
      • +
      • Optional Element Summary
      • +
      +
      +
        +
      • Enum Constant Details
      • +
      • Field Details
      • +
      • Property Details
      • +
      • Constructor Details
      • +
      • Method Details
      • +
      • Element Details
      • +
      +

      Note: Annotation interfaces have required and optional elements, but not methods. Only enum classes have enum constants. The components of a record class are displayed as part of the declaration of the record class. Properties are a feature of JavaFX.

      +

      The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

      +
      +
      +

      Other Files

      +

      Packages and modules may contain pages with additional information related to the declarations nearby.

      +
      +
      +

      Tree (Class Hierarchy)

      +

      There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. Classes are organized by inheritance structure starting with java.lang.Object. Interfaces do not inherit from java.lang.Object.

      +
        +
      • When viewing the Overview page, clicking on TREE displays the hierarchy for all packages.
      • +
      • When viewing a particular package, class or interface page, clicking on TREE displays the hierarchy for only that package.
      • +
      +
      +
      +

      Constant Field Values

      +

      The Constant Field Values page lists the static final fields and their values.

      +
      +
      +

      Serialized Form

      +

      Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to those who implement rather than use the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See Also" section of the class description.

      +
      +
      +

      All Packages

      +

      The All Packages page contains an alphabetic index of all packages contained in the documentation.

      +
      +
      +

      All Classes and Interfaces

      +

      The All Classes and Interfaces page contains an alphabetic index of all classes and interfaces contained in the documentation, including annotation interfaces, enum classes, and record classes.

      +
      +
      +

      Index

      +

      The Index contains an alphabetic index of all classes, interfaces, constructors, methods, and fields in the documentation, as well as summary pages such as All Packages, All Classes and Interfaces.

      +
      +
      +
      +This help file applies to API documentation generated by the standard doclet.
      +
      +
      + + diff --git a/livraison/doc/server/index-all.html b/livraison/doc/server/index-all.html new file mode 100644 index 0000000..ced5fb0 --- /dev/null +++ b/livraison/doc/server/index-all.html @@ -0,0 +1,1090 @@ + + + + +Index (server API) + + + + + + + + + + + + + + +
      + +
      +
      +
      +

      Index

      +
      +A B C D E F G H I L M N P R S T U V W 
      All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form +

      A

      +
      +
      a - Variable in class fr.lnl.game.server.utils.Pair
      +
       
      +
      AbstractAction - Class in fr.lnl.game.server.games.action
      +
       
      +
      AbstractAction(Game, Player) - Constructor for class fr.lnl.game.server.games.action.AbstractAction
      +
       
      +
      AbstractBox - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      AbstractBox is instantiable (not an abstract class), but when it's the case, instance doesn't represent anything, + it's only to see if there is a lock on this position or not
      +
      +
      AbstractBox() - Constructor for class fr.lnl.game.server.games.grid.elements.AbstractBox
      +
       
      +
      AbstractGridFactoryBuilder - Class in fr.lnl.game.server.games.grid.build
      +
       
      +
      AbstractGridFactoryBuilder() - Constructor for class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      AbstractModelListening - Class in fr.lnl.game.server.listener
      +
       
      +
      AbstractModelListening() - Constructor for class fr.lnl.game.server.listener.AbstractModelListening
      +
       
      +
      AbstractPlayer - Class in fr.lnl.game.server.games.player
      +
       
      +
      AbstractPlayer(Integer, Point, boolean, ClassPlayer) - Constructor for class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      Action - Interface in fr.lnl.game.server.games.action
      +
       
      +
      actionName - Variable in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      actions - Variable in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      actions - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      addAction(Action) - Method in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      addListener(ModelListener) - Method in class fr.lnl.game.server.listener.AbstractModelListening
      +
       
      +
      +

      B

      +
      +
      b - Variable in class fr.lnl.game.server.utils.Pair
      +
       
      +
      board - Variable in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      boardPositionIsValid(int, int) - Method in class fr.lnl.game.server.games.grid.Grid
      +
      +
      Check if given position is in grid area
      +
      +
      boardPositionIsValid(int, int, int, int) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      boardPositionIsValid(Point) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      Bomb - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      Bomb are elements which explode when someone walks on it or after a countdown, the explosion area is on multiple cases
      +
      +
      Bomb(Point, Game) - Constructor for class fr.lnl.game.server.games.grid.elements.Bomb
      +
       
      +
      bombCost - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      Box - Interface in fr.lnl.game.server.games.grid.elements
      +
       
      +
      build() - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
      + +
      +
      build() - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      Call this method after you call {GridFactoryBuilder.energyProbability(float)}, + GridFactoryBuilder.wallProbability(float), GridFactoryBuilder.gridDimensions(int, int) and + GridFactoryBuilder.playersList(List), It'll instantiate a new Grid and initialize his components + like border walls, intern walls, and energy using parameters given previously
      +
      +
      bullet - Variable in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      +

      C

      +
      +
      choseAction(Game) - Method in class fr.lnl.game.server.games.player.ComputerPlayer
      +
      +
      Call when an AI need to choose an action to execute
      +
      +
      choseDeployShield(Game) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      choseExplosive(List<ReunionSameAction>) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      choseMove(List<ReunionSameAction>, Game) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      choseShot(List<ReunionSameAction>, Game) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      classPlayer - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      ClassPlayer - Enum Class in fr.lnl.game.server.games.player
      +
      +
      ClassPlayer contains all data about the cost of an action or the cost of a damage
      +
      +
      ClassPlayer(int, int, int, int, int, int, int, int, int, int, Weapon) - Constructor for enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      column - Variable in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      columns - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      ComputerPlayer - Class in fr.lnl.game.server.games.player
      +
      +
      Super class of all Computer players
      +
      +
      ComputerPlayer(Integer, Point, ClassPlayer) - Constructor for class fr.lnl.game.server.games.player.ComputerPlayer
      +
       
      +
      CountdownBox - Interface in fr.lnl.game.server.games.grid.elements
      +
      +
      A box implemented by CountdownBox is a box which do an action a certain time after being placed
      +
      +
      countdownGridElementsUpdate() - Method in class fr.lnl.game.server.games.Game
      +
      +
      play grid's elements that use a timer like Bomb at each game tick
      +
      +
      counter - Variable in class fr.lnl.game.server.games.grid.elements.Bomb
      +
      +
      Timer before explosion
      +
      +
      CrashException - Exception in fr.lnl.game.server.utils
      +
      +
      Represent an unrecoverable error in the program, force program to stop
      +
      +
      CrashException(String, Throwable) - Constructor for exception fr.lnl.game.server.utils.CrashException
      +
       
      +
      create() - Static method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
       
      +
      currentPlayer - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      +

      D

      +
      +
      decrementEnergy(int) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      decrementEnergy(int) - Method in interface fr.lnl.game.server.games.player.Player
      +
      +
      Call by the implementing classes Action to withdraw + a certain number of energy from a player
      +
      +
      DEFAULT - Enum constant in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      deltaX - Variable in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      deltaX - Variable in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      deltaY - Variable in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      deltaY - Variable in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      DeployShield - Class in fr.lnl.game.server.games.action
      +
      +
      Used when a player want to protect himself from taking damage (shield state is reset to false at next player turn)
      +
      +
      DeployShield(Player) - Constructor for class fr.lnl.game.server.games.action.DeployShield
      +
       
      +
      direction - Variable in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      direction - Variable in class fr.lnl.game.server.games.action.Move
      +
       
      +
      direction - Variable in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      Direction - Interface in fr.lnl.game.server.games.action
      +
       
      +
      Direction4Axis - Enum Class in fr.lnl.game.server.games.action
      +
      +
      Enum used to chose where to move, shot, etc.
      +
      +
      Direction4Axis(int, int, boolean) - Constructor for enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      Direction8Axis - Enum Class in fr.lnl.game.server.games.action
      +
       
      +
      Direction8Axis(int, int) - Constructor for enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      doAction() - Method in interface fr.lnl.game.server.games.action.Action
      +
      +
      Call by Game when player do this action
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.DeployShield
      +
      +
      Deploy player shield and decrement its energy
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.DropBomb
      +
      +
      Drop a bomb in player's selected direction and decrement its energy
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.DropMine
      +
      +
      Drop a mine in player's selected direction and decrement its energy
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.Move
      +
      +
      Move player to its new position and decrement its point
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.Nothing
      +
      +
      doAction in this context don't execute any operation
      +
      +
      doAction() - Method in class fr.lnl.game.server.games.action.Shot
      +
      +
      We decrement player's energy and shot on every of its opponents on the chosen direction by decrementing its + energy too
      +
      +
      DOWN - Enum constant in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      DOWN - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      DOWN_LEFT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      DOWN_RIGHT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      DPS - Enum constant in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      DropBomb - Class in fr.lnl.game.server.games.action
      +
      +
      Used when player want to drop a Bomb, bomb explode when someone walks on it and after 3 turns
      +
      +
      DropBomb(Game, Player, Direction8Axis) - Constructor for class fr.lnl.game.server.games.action.DropBomb
      +
       
      +
      DropMine - Class in fr.lnl.game.server.games.action
      +
      +
      Used when player want to drop a Mine, Mine only explode when someone walks on it
      +
      +
      DropMine(Game, Player, Direction8Axis) - Constructor for class fr.lnl.game.server.games.action.DropMine
      +
       
      +
      DropObject - Class in fr.lnl.game.server.games.action
      +
      +
      Super class used by DropMine and DropBomb
      +
      +
      DropObject(Game, Player, Direction8Axis) - Constructor for class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      +

      E

      +
      +
      energy - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      energy - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      EnergyBall - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      An EnergyBall is a box which give back a bit of player energy after it walks on the ball
      +
      +
      EnergyBall() - Constructor for class fr.lnl.game.server.games.grid.elements.EnergyBall
      +
       
      +
      energyProbability - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      energyProbability(float) - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      energyProbability(float) - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      Set energy probability
      +
      +
      Entry_Error_Message - Static variable in class fr.lnl.game.server.utils.ErrorMessage
      +
      +
      Error given to end-user when it give us a non integer or float value
      +
      +
      equals(Object) - Method in class fr.lnl.game.server.games.grid.elements.EnergyBall
      +
      +
      Used by tests
      +
      +
      equals(Object) - Method in class fr.lnl.game.server.games.grid.elements.Wall
      +
      +
      Used by tests
      +
      +
      equals(Object) - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      ErrorMessage - Class in fr.lnl.game.server.utils
      +
      +
      Contain everything related to error messages, theirs errors are the fault of the end-user (like we demand an integer + and user give us a floating point number + Theirs error doesn't cause the program to stop, it'll demand a correct value
      +
      +
      ErrorMessage() - Constructor for class fr.lnl.game.server.utils.ErrorMessage
      +
       
      +
      explode(Grid) - Method in class fr.lnl.game.server.games.grid.elements.Bomb
      +
       
      +
      explode(Grid) - Method in class fr.lnl.game.server.games.grid.elements.Explosive
      +
      +
      Apply damage to players and delete this object
      +
      +
      explode(Grid) - Method in class fr.lnl.game.server.games.grid.elements.Mine
      +
       
      +
      EXPLOSION_SIZE - Static variable in class fr.lnl.game.server.games.grid.elements.Bomb
      +
      +
      Explosion size, size is circle, not square
      +
      +
      Explosive - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      Super class of Bomb and Mine
      +
      +
      Explosive(Player, Point) - Constructor for class fr.lnl.game.server.games.grid.elements.Explosive
      +
       
      +
      extractReunionSameAction(List<ReunionSameAction>, Class) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      +

      F

      +
      +
      Firearm - Class in fr.lnl.game.server.games.weapon
      +
       
      +
      Firearm() - Constructor for class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      fireChange() - Method in class fr.lnl.game.server.listener.AbstractModelListening
      +
       
      +
      fr.lnl.game.server - package fr.lnl.game.server
      +
      +
      Server package
      +
      +
      fr.lnl.game.server.games - package fr.lnl.game.server.games
      +
      +
      Game package, contains all classes and sub-packages mainly related game works
      +
      +
      fr.lnl.game.server.games.action - package fr.lnl.game.server.games.action
      +
      +
      Package storing all actions a player can do
      +
      +
      fr.lnl.game.server.games.grid - package fr.lnl.game.server.games.grid
      +
      +
      Package containing all about Grid components
      +
      +
      fr.lnl.game.server.games.grid.build - package fr.lnl.game.server.games.grid.build
      +
      +
      Package containing all about Grid construction
      +
      +
      fr.lnl.game.server.games.grid.elements - package fr.lnl.game.server.games.grid.elements
      +
      +
      Package containing all the elements that can be arranged in a grid
      +
      +
      fr.lnl.game.server.games.player - package fr.lnl.game.server.games.player
      +
      +
      Package storing all players classes and as well AI behavior
      +
      +
      fr.lnl.game.server.games.weapon - package fr.lnl.game.server.games.weapon
      +
      +
      Package containing all bout player's weapons
      +
      +
      fr.lnl.game.server.listener - package fr.lnl.game.server.listener
      +
      +
      Package containing model of listener to implement + Used by listeners in client module
      +
      +
      fr.lnl.game.server.utils - package fr.lnl.game.server.utils
      +
      +
      Package containing all utility classes
      +
      +
      +

      G

      +
      +
      gainEnergy - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      game - Variable in class fr.lnl.game.server.games.action.AbstractAction
      +
       
      +
      game - Variable in class fr.lnl.game.server.games.grid.elements.Bomb
      +
       
      +
      Game - Class in fr.lnl.game.server.games
      +
       
      +
      Game(GridFactoryBuilder, List<Player>) - Constructor for class fr.lnl.game.server.games.Game
      +
       
      +
      generateAndGetPlayerActions(Player) - Method in class fr.lnl.game.server.games.Game
      +
      +
      Used to list all actions a player can execute at current time
      +
      +
      generateAvailableActions() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      generateAvailableActions() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getA() - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      getAction(int) - Method in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      getActionName() - Method in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      getActions() - Method in class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      getActions() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getActions() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getAllCountdownElements() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getB() - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      getBoard() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getBombCost() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getBullet() - Method in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      getBullet() - Method in interface fr.lnl.game.server.games.weapon.Weapon
      +
       
      +
      getClassPlayer() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getClassPlayer() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getColumn() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getCurrentPlayer() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getDeltaX() - Method in interface fr.lnl.game.server.games.action.Direction
      +
       
      +
      getDeltaX() - Method in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      getDeltaX() - Method in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      getDeltaY() - Method in interface fr.lnl.game.server.games.action.Direction
      +
       
      +
      getDeltaY() - Method in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      getDeltaY() - Method in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      getDirection() - Method in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      getDirection() - Method in class fr.lnl.game.server.games.action.Move
      +
       
      +
      getEnergy() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getEnergy() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getEnergy() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getGainEnergy() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getGrid() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getGrid() - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      getGridBox(Point) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getGridPlayer(Point) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getHorizontalDistance() - Method in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      getHorizontalDistance() - Method in interface fr.lnl.game.server.games.weapon.Weapon
      +
       
      +
      getId() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getId() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getIllusionNumberWallNeighbour(Point) - Method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      A locked place is used to try to avoid player to be blocked when playing, + A locked place can't have a wall on it
      +
      +
      getMineCost() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getMoveCost() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getNbrTurn() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getNumberNeutralBox() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getPenaltyBomb() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getPenaltyMine() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getPenaltyShoot() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getPlayer() - Method in class fr.lnl.game.server.games.grid.elements.Explosive
      +
       
      +
      getPlayers() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getPlayers() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getPlayersAlive() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getPlayersNotAlive() - Method in class fr.lnl.game.server.games.Game
      +
      + +
      +
      getPoint() - Method in interface fr.lnl.game.server.games.action.Action
      +
      +
      Used by Move, Shot and DropObject to list all direction where the action is possible
      +
      +
      getPoint() - Method in class fr.lnl.game.server.games.action.DeployShield
      +
       
      +
      getPoint() - Method in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      getPoint() - Method in class fr.lnl.game.server.games.action.Move
      +
       
      +
      getPoint() - Method in class fr.lnl.game.server.games.action.Nothing
      +
       
      +
      getPoint() - Method in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      getPosition() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getPosition() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getPreviousPlayer() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getRow() - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      getSelectedAction() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      getShieldCost() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getShootCost() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getValidPoint() - Method in interface fr.lnl.game.server.games.action.Action
      +
       
      +
      getValidPoint() - Method in class fr.lnl.game.server.games.action.DeployShield
      +
       
      +
      getValidPoint() - Method in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      getValidPoint() - Method in class fr.lnl.game.server.games.action.Move
      +
       
      +
      getValidPoint() - Method in class fr.lnl.game.server.games.action.Nothing
      +
       
      +
      getValidPoint() - Method in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      getVerticalDistance() - Method in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      getVerticalDistance() - Method in interface fr.lnl.game.server.games.weapon.Weapon
      +
       
      +
      getWeapon() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      getWeapon() - Method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      getWeapon() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      getWinner() - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      grid - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      grid - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      Grid - Class in fr.lnl.game.server.games.grid
      +
      +
      Class managing the board
      +
      +
      Grid(int, int, List<Player>) - Constructor for class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      gridDimensions(int, int) - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      gridDimensions(int, int) - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      set grid dimensions.
      +
      +
      GridFactoryBuilder - Interface in fr.lnl.game.server.games.grid.build
      +
      +
      Factory pattern
      +
      +
      gridPlayersUpdate() - Method in class fr.lnl.game.server.games.Game
      +
      +
      Remove dead players from the grid
      +
      +
      +

      H

      +
      +
      hashCode() - Method in class fr.lnl.game.server.utils.Pair
      +
      +
      Absolut useful when using HashMap or HashSet (or everything using hashCode to compare Objects
      +
      +
      horizontalDistance - Variable in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      HumanPlayer - Class in fr.lnl.game.server.games.player
      +
      +
      Instance of Human Player.
      + A human player choose an action to execute by using mouse or keyboard.
      + Human Player don't implement choseAction cause this method is executed on client part
      +
      +
      HumanPlayer(Integer, Point, ClassPlayer) - Constructor for class fr.lnl.game.server.games.player.HumanPlayer
      +
       
      +
      +

      I

      +
      +
      id - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      incrementEnergy(int) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      incrementEnergy(int) - Method in interface fr.lnl.game.server.games.player.Player
      +
      +
      Call by the implementing classes Action to add + a certain number of energy from a player
      +
      +
      initGame(GridFactoryBuilder) - Method in class fr.lnl.game.server.games.Game
      +
      +
      Initialize a game by placing players on the grid and by generating current player available actions
      +
      +
      initGrid() - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
      +
      abstract method used to initialize grid
      + We let implementation of this class the way to initialize the grid
      +
      +
      initGrid() - Method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      Method used to initialize grid
      + We place walls on every border, and we initialize board value as null where there is no need o border walls
      +
      +
      initPlaceEnergyBall() - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
      +
      abstract method used to place energy ball
      + We let implementation of this class the way to initialize the grid
      + Implementation need to use AbstractGridFactoryBuilder.energyProbability to place energy balls
      +
      +
      initPlaceEnergyBall() - Method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      Method used to initialize energy balls, we place energy balls using a random value and a probability and where + there is no walls
      +
      +
      initPlaceInternWall() - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
      +
      abstract method used to place intern walls(namely not border walls)
      + We let implementation of this class the way to initialize the grid.
      + Implementation need to use AbstractGridFactoryBuilder.wallProbability to place energy balls
      +
      +
      initPlaceInternWall() - Method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      Method used to place intern walls (opposite of border walls), we place walls using a random value and a + probability and where there is no walls or where the position haven't a lock
      +
      +
      initPlacePlayers() - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      call when initializing the game, it'll place player depending on the strategy used by its implementation, + need to be call after build, call an NullPointerException otherwise
      +
      +
      initPlacePlayers() - Method in class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      Simply place player randomly where it's possible
      +
      +
      interact(Grid, Player, Point) - Method in class fr.lnl.game.server.games.grid.elements.EnergyBall
      +
      +
      Increment energy of player who walks on this element
      +
      +
      interact(Grid, Player, Point) - Method in class fr.lnl.game.server.games.grid.elements.Explosive
      +
      +
      Decrement energy of the player who walks on this element
      +
      +
      interact(Grid, Player, Point) - Method in interface fr.lnl.game.server.games.grid.elements.InteractiveBox
      +
      +
      Call when a player walk on it
      +
      +
      InteractiveBox - Interface in fr.lnl.game.server.games.grid.elements
      +
      +
      A box implemented by InteractiveBox is a box which do an action when someone walks on it
      +
      +
      isAlive() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      isAlive() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      isFloat(String) - Static method in class fr.lnl.game.server.utils.Maths
      +
       
      +
      isInReunion(List<ReunionSameAction>, Class) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      isInteger(String) - Static method in class fr.lnl.game.server.utils.Maths
      +
       
      +
      isLock() - Method in class fr.lnl.game.server.games.grid.elements.AbstractBox
      +
       
      +
      isLock() - Method in interface fr.lnl.game.server.games.grid.elements.Box
      +
       
      +
      isNeutralBox(Box) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      isOver() - Method in class fr.lnl.game.server.games.Game
      +
      +
      A game is over if the number of alive players is inferior to 2
      +
      +
      isPossible() - Method in interface fr.lnl.game.server.games.action.Action
      +
       
      +
      isPossible() - Method in class fr.lnl.game.server.games.action.DeployShield
      +
      +
      This action is always possible
      +
      +
      isPossible() - Method in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      isPossible() - Method in class fr.lnl.game.server.games.action.Move
      +
       
      +
      isPossible() - Method in class fr.lnl.game.server.games.action.Nothing
      +
      +
      This action is always possible
      +
      +
      isPossible() - Method in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      isShieldDeploy() - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      isShieldDeploy() - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      isVertical - Variable in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      isVertical() - Method in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
      +
      Used by Shot to know if the direction is in vertical direction cause shot action can have a different + distance depending on the direction
      +
      +
      +

      L

      +
      +
      LEFT - Enum constant in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      LEFT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      listeners - Variable in class fr.lnl.game.server.listener.AbstractModelListening
      +
       
      +
      lock - Variable in class fr.lnl.game.server.games.grid.elements.AbstractBox
      +
       
      +
      LockGridFactoryBuilder - Class in fr.lnl.game.server.games.grid.build
      +
       
      +
      LockGridFactoryBuilder() - Constructor for class fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
      +
      +
      this method is protected to avoid new instance outside of GridFactoryBuilder context
      +
      +
      +

      M

      +
      +
      main(String[]) - Static method in class fr.lnl.game.server.ServerMain
      +
       
      +
      Maths - Class in fr.lnl.game.server.utils
      +
       
      +
      Maths() - Constructor for class fr.lnl.game.server.utils.Maths
      +
       
      +
      Mine - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      A mine is an element which explose when someone walks on it, the explosion area is on 1 case only
      +
      +
      Mine(Player, Point) - Constructor for class fr.lnl.game.server.games.grid.elements.Mine
      +
       
      +
      mineCost - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      ModelListener - Interface in fr.lnl.game.server.listener
      +
      +
      Model implemented by AbstractModelListening
      +
      +
      Move - Class in fr.lnl.game.server.games.action
      +
      +
      Used when the player want to move in a direction, it can move in a direction when there is another player or a wall
      +
      +
      Move(Game, Player, Direction4Axis) - Constructor for class fr.lnl.game.server.games.action.Move
      +
       
      +
      moveCost - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      +

      N

      +
      +
      nbrTurn - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      nextCurrentPlayer() - Method in class fr.lnl.game.server.games.Game
      +
      +
      Change player to the next available in the list.
      + We set its shield deploy state to false.
      +
      +
      NoMoreBulletInWeaponException - Exception in fr.lnl.game.server.games.action
      +
      +
      This exception is throw when player has no remaining bullet
      +
      +
      NoMoreBulletInWeaponException() - Constructor for exception fr.lnl.game.server.games.action.NoMoreBulletInWeaponException
      +
       
      +
      Nothing - Class in fr.lnl.game.server.games.action
      +
      +
      This action is used when player doesn't want to move and/or loose energy
      +
      +
      Nothing() - Constructor for class fr.lnl.game.server.games.action.Nothing
      +
       
      +
      NotValidDirectionException - Exception in fr.lnl.game.server.games.action
      +
      +
      throw when action instantiated and the chosen direction in constructor isn't valid
      +
      +
      NotValidDirectionException(String) - Constructor for exception fr.lnl.game.server.games.action.NotValidDirectionException
      +
       
      +
      +

      P

      +
      +
      Pair<A,B> - Class in fr.lnl.game.server.utils
      +
      +
      Tuple associating storing two value of undefined type.
      + Unlike Python, value in this Tuple can be modified (but the type of its new value need to be the same)
      +
      +
      Pair(A, B) - Constructor for class fr.lnl.game.server.utils.Pair
      +
       
      +
      penaltyBomb - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      penaltyMine - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      penaltyShoot - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      play() - Method in class fr.lnl.game.server.games.Game
      +
      +
      Game "main" method, call by a controller after human chose an action or when a computer player play an action + Method is call everytime an action has been chosen by a human or when aa computer player need to play
      +
      +
      player - Variable in class fr.lnl.game.server.games.action.AbstractAction
      +
       
      +
      player - Variable in class fr.lnl.game.server.games.grid.elements.Explosive
      +
      +
      Owner of the explosive
      +
      +
      Player - Interface in fr.lnl.game.server.games.player
      +
       
      +
      players - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      players - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      players - Variable in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      playersList(List<Player>) - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      playersList(List<Player>) - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      set players list.
      +
      +
      point - Variable in class fr.lnl.game.server.games.action.DropObject
      +
       
      +
      point - Variable in class fr.lnl.game.server.games.action.Move
      +
       
      +
      point - Variable in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      point - Variable in class fr.lnl.game.server.games.grid.elements.Explosive
      +
      +
      Position of the explosive
      +
      +
      Point - Class in fr.lnl.game.server.utils
      +
      +
      Point extends from Pair, basically a simpler ways to use Pair when using grid position
      +
      +
      Point(int, int) - Constructor for class fr.lnl.game.server.utils.Point
      +
       
      +
      position - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      previousPlayer - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      privateView(Player) - Method in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      pythagoras(double, double) - Method in class fr.lnl.game.server.games.grid.elements.Bomb
      +
       
      +
      +

      R

      +
      +
      RandomComputerPlayer - Class in fr.lnl.game.server.games.player
      +
       
      +
      RandomComputerPlayer(Integer, Point, ClassPlayer) - Constructor for class fr.lnl.game.server.games.player.RandomComputerPlayer
      +
       
      +
      removalListener(ModelListener) - Method in class fr.lnl.game.server.listener.AbstractModelListening
      +
       
      +
      ReunionSameAction - Class in fr.lnl.game.server.games.action
      +
      +
      When we generate action, we generate one per available direction (like in Move) but to improve human + readability, we list every same Action here
      +
      +
      ReunionSameAction(String) - Constructor for class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      ReunionSameAction(String, Action) - Constructor for class fr.lnl.game.server.games.action.ReunionSameAction
      +
       
      +
      RIGHT - Enum constant in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      RIGHT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      row - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      row - Variable in class fr.lnl.game.server.games.grid.Grid
      +
       
      +
      +

      S

      +
      +
      seeNeighbour(Point, int, int, int) - Method in class fr.lnl.game.server.games.action.Shot
      +
       
      +
      selectedAction - Variable in class fr.lnl.game.server.games.Game
      +
       
      +
      server - module server
      +
      +
      Server module, include every model classes
      +
      +
      ServerMain - Class in fr.lnl.game.server
      +
       
      +
      ServerMain() - Constructor for class fr.lnl.game.server.ServerMain
      +
       
      +
      setA(A) - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      setActions(List<Action>) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      setActions(List<Action>) - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      setB(B) - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      setCurrentPlayer(Player) - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      setEnergy(int) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      setEnergy(int) - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      setLock(boolean) - Method in class fr.lnl.game.server.games.grid.elements.AbstractBox
      +
       
      +
      setLock(boolean) - Method in interface fr.lnl.game.server.games.grid.elements.Box
      +
       
      +
      setPosition(Point) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      setPosition(Point) - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      setSelectedAction(Action) - Method in class fr.lnl.game.server.games.Game
      +
       
      +
      setShieldDeploy(boolean) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      setShieldDeploy(boolean) - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      setWeapon(Weapon) - Method in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      setWeapon(Weapon) - Method in interface fr.lnl.game.server.games.player.Player
      +
       
      +
      shieldCost - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      shieldDeploy - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      shootCost - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      Shot - Class in fr.lnl.game.server.games.action
      +
       
      +
      Shot(Game, Player) - Constructor for class fr.lnl.game.server.games.action.Shot
      +
       
      +
      Shot(Game, Player, Direction4Axis) - Constructor for class fr.lnl.game.server.games.action.Shot
      +
       
      +
      strategy(Game) - Method in class fr.lnl.game.server.games.player.ComputerPlayer
      +
      +
      Method belonging to classes which extend this class to define the specific strategy of the player
      +
      +
      strategy(Game) - Method in class fr.lnl.game.server.games.player.RandomComputerPlayer
      +
      +
      Choose an action fully randomly
      +
      +
      strategy(Game) - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
      +
      Choose an action following the strategy
      +
      +
      StrategyComputerPlayer - Class in fr.lnl.game.server.games.player
      +
       
      +
      StrategyComputerPlayer(Integer, Point, ClassPlayer) - Constructor for class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      SUPPORT - Enum constant in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      +

      T

      +
      +
      TANK - Enum constant in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      testFloat(String, Scanner, String) - Static method in class fr.lnl.game.server.utils.Maths
      +
      +
      Convert entry to a float
      +
      +
      testInteger(String, Scanner, String) - Static method in class fr.lnl.game.server.utils.Maths
      +
      +
      Convert entry to an integer
      +
      +
      toString() - Method in class fr.lnl.game.server.games.grid.Grid
      +
      +
      Given a string representation of the board.
      + Some characters in given string are in UTF-8 and can be poorly displayed if using an incompatible encoding, like + on Windows where french regional encoding is windows-1252
      +
      +
      toString() - Method in class fr.lnl.game.server.games.player.HumanPlayer
      +
       
      +
      toString() - Method in class fr.lnl.game.server.games.player.RandomComputerPlayer
      +
       
      +
      toString() - Method in class fr.lnl.game.server.games.player.StrategyComputerPlayer
      +
       
      +
      toString() - Method in class fr.lnl.game.server.utils.Pair
      +
       
      +
      +

      U

      +
      +
      UP - Enum constant in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
       
      +
      UP - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      UP_LEFT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      UP_RIGHT - Enum constant in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
       
      +
      update() - Method in class fr.lnl.game.server.games.grid.elements.Bomb
      +
      +
      When the timer (counter) goes down to 0, the bomb explode
      +
      +
      update() - Method in interface fr.lnl.game.server.games.grid.elements.CountdownBox
      +
      +
      Call at each game tick (After a player do an action)
      +
      +
      updateModel(Object) - Method in interface fr.lnl.game.server.listener.ModelListener
      +
      +
      this method is call everytime, an action on the view forces a controller to sens an update to model
      +
      +
      +

      V

      +
      +
      valueOf(String) - Static method in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
      +
      Returns the enum constant of this class with the specified name.
      +
      +
      valueOf(String) - Static method in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
      +
      Returns the enum constant of this class with the specified name.
      +
      +
      valueOf(String) - Static method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
      +
      Returns the enum constant of this class with the specified name.
      +
      +
      values() - Static method in enum class fr.lnl.game.server.games.action.Direction4Axis
      +
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      values() - Static method in enum class fr.lnl.game.server.games.action.Direction8Axis
      +
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      values() - Static method in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
      +
      Returns an array containing the constants of this enum class, in +the order they are declared.
      +
      +
      verticalDistance - Variable in class fr.lnl.game.server.games.weapon.Firearm
      +
       
      +
      +

      W

      +
      +
      Wall - Class in fr.lnl.game.server.games.grid.elements
      +
      +
      A wall is an intraversable object
      +
      +
      Wall() - Constructor for class fr.lnl.game.server.games.grid.elements.Wall
      +
       
      +
      wallProbability - Variable in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      wallProbability(float) - Method in class fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
      +
       
      +
      wallProbability(float) - Method in interface fr.lnl.game.server.games.grid.build.GridFactoryBuilder
      +
      +
      Set wall probability
      +
      +
      weapon - Variable in class fr.lnl.game.server.games.player.AbstractPlayer
      +
       
      +
      weapon - Variable in enum class fr.lnl.game.server.games.player.ClassPlayer
      +
       
      +
      Weapon - Interface in fr.lnl.game.server.games.weapon
      +
       
      +
      +A B C D E F G H I L M N P R S T U V W 
      All Classes and Interfaces|All Packages|Constant Field Values|Serialized Form
      +
      +
      + + diff --git a/livraison/doc/server/index.html b/livraison/doc/server/index.html new file mode 100644 index 0000000..44682ef --- /dev/null +++ b/livraison/doc/server/index.html @@ -0,0 +1,25 @@ + + + + +server API + + + + + + + + + + +
      + +

      server/module-summary.html

      +
      + + diff --git a/livraison/doc/server/jquery-ui.overrides.css b/livraison/doc/server/jquery-ui.overrides.css new file mode 100644 index 0000000..1abff95 --- /dev/null +++ b/livraison/doc/server/jquery-ui.overrides.css @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + /* Overrides the color of selection used in jQuery UI */ + background: #F8981D; +} diff --git a/livraison/doc/server/legal/COPYRIGHT b/livraison/doc/server/legal/COPYRIGHT new file mode 100644 index 0000000..ca74fff --- /dev/null +++ b/livraison/doc/server/legal/COPYRIGHT @@ -0,0 +1 @@ +Please see ..\java.base\COPYRIGHT diff --git a/livraison/doc/server/legal/LICENSE b/livraison/doc/server/legal/LICENSE new file mode 100644 index 0000000..4ad9fe4 --- /dev/null +++ b/livraison/doc/server/legal/LICENSE @@ -0,0 +1 @@ +Please see ..\java.base\LICENSE diff --git a/livraison/doc/server/legal/jquery.md b/livraison/doc/server/legal/jquery.md new file mode 100644 index 0000000..8054a34 --- /dev/null +++ b/livraison/doc/server/legal/jquery.md @@ -0,0 +1,72 @@ +## jQuery v3.5.1 + +### jQuery License +``` +jQuery v 3.5.1 +Copyright JS Foundation and other contributors, https://js.foundation/ + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +****************************************** + +The jQuery JavaScript Library v3.5.1 also includes Sizzle.js + +Sizzle.js includes the following license: + +Copyright JS Foundation and other contributors, https://js.foundation/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/sizzle + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +********************* + +``` diff --git a/livraison/doc/server/legal/jqueryUI.md b/livraison/doc/server/legal/jqueryUI.md new file mode 100644 index 0000000..8031bdb --- /dev/null +++ b/livraison/doc/server/legal/jqueryUI.md @@ -0,0 +1,49 @@ +## jQuery UI v1.12.1 + +### jQuery UI License +``` +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. + +``` diff --git a/livraison/doc/server/member-search-index.js b/livraison/doc/server/member-search-index.js new file mode 100644 index 0000000..473329d --- /dev/null +++ b/livraison/doc/server/member-search-index.js @@ -0,0 +1 @@ +memberSearchIndex = [{"p":"fr.lnl.game.server.utils","c":"Pair","l":"a"},{"p":"fr.lnl.game.server.games.action","c":"AbstractAction","l":"AbstractAction(Game, Player)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"AbstractBox","l":"AbstractBox()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"AbstractGridFactoryBuilder()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.listener","c":"AbstractModelListening","l":"AbstractModelListening()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"AbstractPlayer(Integer, Point, boolean, ClassPlayer)","u":"%3Cinit%3E(java.lang.Integer,fr.lnl.game.server.utils.Point,boolean,fr.lnl.game.server.games.player.ClassPlayer)"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"actionName"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"actions"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"actions"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"addAction(Action)","u":"addAction(fr.lnl.game.server.games.action.Action)"},{"p":"fr.lnl.game.server.listener","c":"AbstractModelListening","l":"addListener(ModelListener)","u":"addListener(fr.lnl.game.server.listener.ModelListener)"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"b"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"board"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"boardPositionIsValid(int, int)","u":"boardPositionIsValid(int,int)"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"boardPositionIsValid(int, int, int, int)","u":"boardPositionIsValid(int,int,int,int)"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"boardPositionIsValid(Point)","u":"boardPositionIsValid(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"Bomb(Point, Game)","u":"%3Cinit%3E(fr.lnl.game.server.utils.Point,fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"bombCost"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"build()"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"build()"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"bullet"},{"p":"fr.lnl.game.server.games.player","c":"ComputerPlayer","l":"choseAction(Game)","u":"choseAction(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"choseDeployShield(Game)","u":"choseDeployShield(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"choseExplosive(List)","u":"choseExplosive(java.util.List)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"choseMove(List, Game)","u":"choseMove(java.util.List,fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"choseShot(List, Game)","u":"choseShot(java.util.List,fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"classPlayer"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"ClassPlayer(int, int, int, int, int, int, int, int, int, int, Weapon)","u":"%3Cinit%3E(int,int,int,int,int,int,int,int,int,int,fr.lnl.game.server.games.weapon.Weapon)"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"column"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"columns"},{"p":"fr.lnl.game.server.games.player","c":"ComputerPlayer","l":"ComputerPlayer(Integer, Point, ClassPlayer)","u":"%3Cinit%3E(java.lang.Integer,fr.lnl.game.server.utils.Point,fr.lnl.game.server.games.player.ClassPlayer)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"countdownGridElementsUpdate()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"counter"},{"p":"fr.lnl.game.server.utils","c":"CrashException","l":"CrashException(String, Throwable)","u":"%3Cinit%3E(java.lang.String,java.lang.Throwable)"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"create()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"currentPlayer"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"decrementEnergy(int)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"decrementEnergy(int)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"DEFAULT"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"deltaX"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"deltaX"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"deltaY"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"deltaY"},{"p":"fr.lnl.game.server.games.action","c":"DeployShield","l":"DeployShield(Player)","u":"%3Cinit%3E(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"direction"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"direction"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"direction"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"Direction4Axis(int, int, boolean)","u":"%3Cinit%3E(int,int,boolean)"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"Direction8Axis(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"fr.lnl.game.server.games.action","c":"Action","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"DeployShield","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"DropBomb","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"DropMine","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"Nothing","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"doAction()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"DOWN"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"DOWN"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"DOWN_LEFT"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"DOWN_RIGHT"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"DPS"},{"p":"fr.lnl.game.server.games.action","c":"DropBomb","l":"DropBomb(Game, Player, Direction8Axis)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.games.action.Direction8Axis)"},{"p":"fr.lnl.game.server.games.action","c":"DropMine","l":"DropMine(Game, Player, Direction8Axis)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.games.action.Direction8Axis)"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"DropObject(Game, Player, Direction8Axis)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.games.action.Direction8Axis)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"energy"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"energy"},{"p":"fr.lnl.game.server.games.grid.elements","c":"EnergyBall","l":"EnergyBall()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"energyProbability"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"energyProbability(float)"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"energyProbability(float)"},{"p":"fr.lnl.game.server.utils","c":"ErrorMessage","l":"Entry_Error_Message"},{"p":"fr.lnl.game.server.games.grid.elements","c":"EnergyBall","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Wall","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"equals(Object)","u":"equals(java.lang.Object)"},{"p":"fr.lnl.game.server.utils","c":"ErrorMessage","l":"ErrorMessage()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"explode(Grid)","u":"explode(fr.lnl.game.server.games.grid.Grid)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"explode(Grid)","u":"explode(fr.lnl.game.server.games.grid.Grid)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Mine","l":"explode(Grid)","u":"explode(fr.lnl.game.server.games.grid.Grid)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"EXPLOSION_SIZE"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"Explosive(Player, Point)","u":"%3Cinit%3E(fr.lnl.game.server.games.player.Player,fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"extractReunionSameAction(List, Class)","u":"extractReunionSameAction(java.util.List,java.lang.Class)"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"Firearm()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.listener","c":"AbstractModelListening","l":"fireChange()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"gainEnergy"},{"p":"fr.lnl.game.server.games.action","c":"AbstractAction","l":"game"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"game"},{"p":"fr.lnl.game.server.games","c":"Game","l":"Game(GridFactoryBuilder, List)","u":"%3Cinit%3E(fr.lnl.game.server.games.grid.build.GridFactoryBuilder,java.util.List)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"generateAndGetPlayerActions(Player)","u":"generateAndGetPlayerActions(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"generateAvailableActions()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"generateAvailableActions()"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"getA()"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"getAction(int)"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"getActionName()"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"getActions()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getActions()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getActions()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getAllCountdownElements()"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"getB()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getBoard()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getBombCost()"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"getBullet()"},{"p":"fr.lnl.game.server.games.weapon","c":"Weapon","l":"getBullet()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getClassPlayer()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getClassPlayer()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getColumn()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getCurrentPlayer()"},{"p":"fr.lnl.game.server.games.action","c":"Direction","l":"getDeltaX()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"getDeltaX()"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"getDeltaX()"},{"p":"fr.lnl.game.server.games.action","c":"Direction","l":"getDeltaY()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"getDeltaY()"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"getDeltaY()"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"getDirection()"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"getDirection()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getEnergy()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getEnergy()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getEnergy()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getGainEnergy()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getGrid()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"getGrid()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getGridBox(Point)","u":"getGridBox(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getGridPlayer(Point)","u":"getGridPlayer(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"getHorizontalDistance()"},{"p":"fr.lnl.game.server.games.weapon","c":"Weapon","l":"getHorizontalDistance()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getId()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getId()"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"getIllusionNumberWallNeighbour(Point)","u":"getIllusionNumberWallNeighbour(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getMineCost()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getMoveCost()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getNbrTurn()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getNumberNeutralBox()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getPenaltyBomb()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getPenaltyMine()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getPenaltyShoot()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"getPlayer()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getPlayers()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getPlayers()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getPlayersAlive()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getPlayersNotAlive()"},{"p":"fr.lnl.game.server.games.action","c":"Action","l":"getPoint()"},{"p":"fr.lnl.game.server.games.action","c":"DeployShield","l":"getPoint()"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"getPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"getPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Nothing","l":"getPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"getPoint()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getPosition()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getPosition()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getPreviousPlayer()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"getRow()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getSelectedAction()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getShieldCost()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getShootCost()"},{"p":"fr.lnl.game.server.games.action","c":"Action","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.action","c":"DeployShield","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Nothing","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"getValidPoint()"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"getVerticalDistance()"},{"p":"fr.lnl.game.server.games.weapon","c":"Weapon","l":"getVerticalDistance()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"getWeapon()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"getWeapon()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"getWeapon()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"getWinner()"},{"p":"fr.lnl.game.server.games","c":"Game","l":"grid"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"grid"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"Grid(int, int, List)","u":"%3Cinit%3E(int,int,java.util.List)"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"gridDimensions(int, int)","u":"gridDimensions(int,int)"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"gridDimensions(int, int)","u":"gridDimensions(int,int)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"gridPlayersUpdate()"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"hashCode()"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"horizontalDistance"},{"p":"fr.lnl.game.server.games.player","c":"HumanPlayer","l":"HumanPlayer(Integer, Point, ClassPlayer)","u":"%3Cinit%3E(java.lang.Integer,fr.lnl.game.server.utils.Point,fr.lnl.game.server.games.player.ClassPlayer)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"id"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"incrementEnergy(int)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"incrementEnergy(int)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"initGame(GridFactoryBuilder)","u":"initGame(fr.lnl.game.server.games.grid.build.GridFactoryBuilder)"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"initGrid()"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"initGrid()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"initPlaceEnergyBall()"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"initPlaceEnergyBall()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"initPlaceInternWall()"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"initPlaceInternWall()"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"initPlacePlayers()"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"initPlacePlayers()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"EnergyBall","l":"interact(Grid, Player, Point)","u":"interact(fr.lnl.game.server.games.grid.Grid,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"interact(Grid, Player, Point)","u":"interact(fr.lnl.game.server.games.grid.Grid,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"InteractiveBox","l":"interact(Grid, Player, Point)","u":"interact(fr.lnl.game.server.games.grid.Grid,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"isAlive()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"isAlive()"},{"p":"fr.lnl.game.server.utils","c":"Maths","l":"isFloat(String)","u":"isFloat(java.lang.String)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"isInReunion(List, Class)","u":"isInReunion(java.util.List,java.lang.Class)"},{"p":"fr.lnl.game.server.utils","c":"Maths","l":"isInteger(String)","u":"isInteger(java.lang.String)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"AbstractBox","l":"isLock()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Box","l":"isLock()"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"isNeutralBox(Box)","u":"isNeutralBox(fr.lnl.game.server.games.grid.elements.Box)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"isOver()"},{"p":"fr.lnl.game.server.games.action","c":"Action","l":"isPossible()"},{"p":"fr.lnl.game.server.games.action","c":"DeployShield","l":"isPossible()"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"isPossible()"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"isPossible()"},{"p":"fr.lnl.game.server.games.action","c":"Nothing","l":"isPossible()"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"isPossible()"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"isShieldDeploy()"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"isShieldDeploy()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"isVertical"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"isVertical()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"LEFT"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"LEFT"},{"p":"fr.lnl.game.server.listener","c":"AbstractModelListening","l":"listeners"},{"p":"fr.lnl.game.server.games.grid.elements","c":"AbstractBox","l":"lock"},{"p":"fr.lnl.game.server.games.grid.build","c":"LockGridFactoryBuilder","l":"LockGridFactoryBuilder()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server","c":"ServerMain","l":"main(String[])","u":"main(java.lang.String[])"},{"p":"fr.lnl.game.server.utils","c":"Maths","l":"Maths()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Mine","l":"Mine(Player, Point)","u":"%3Cinit%3E(fr.lnl.game.server.games.player.Player,fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"mineCost"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"Move(Game, Player, Direction4Axis)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.games.action.Direction4Axis)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"moveCost"},{"p":"fr.lnl.game.server.games","c":"Game","l":"nbrTurn"},{"p":"fr.lnl.game.server.games","c":"Game","l":"nextCurrentPlayer()"},{"p":"fr.lnl.game.server.games.action","c":"NoMoreBulletInWeaponException","l":"NoMoreBulletInWeaponException()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.action","c":"Nothing","l":"Nothing()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.action","c":"NotValidDirectionException","l":"NotValidDirectionException(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"Pair(A, B)","u":"%3Cinit%3E(A,B)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"penaltyBomb"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"penaltyMine"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"penaltyShoot"},{"p":"fr.lnl.game.server.games","c":"Game","l":"play()"},{"p":"fr.lnl.game.server.games.action","c":"AbstractAction","l":"player"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"player"},{"p":"fr.lnl.game.server.games","c":"Game","l":"players"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"players"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"players"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"playersList(List)","u":"playersList(java.util.List)"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"playersList(List)","u":"playersList(java.util.List)"},{"p":"fr.lnl.game.server.games.action","c":"DropObject","l":"point"},{"p":"fr.lnl.game.server.games.action","c":"Move","l":"point"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"point"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Explosive","l":"point"},{"p":"fr.lnl.game.server.utils","c":"Point","l":"Point(int, int)","u":"%3Cinit%3E(int,int)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"position"},{"p":"fr.lnl.game.server.games","c":"Game","l":"previousPlayer"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"privateView(Player)","u":"privateView(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"pythagoras(double, double)","u":"pythagoras(double,double)"},{"p":"fr.lnl.game.server.games.player","c":"RandomComputerPlayer","l":"RandomComputerPlayer(Integer, Point, ClassPlayer)","u":"%3Cinit%3E(java.lang.Integer,fr.lnl.game.server.utils.Point,fr.lnl.game.server.games.player.ClassPlayer)"},{"p":"fr.lnl.game.server.listener","c":"AbstractModelListening","l":"removalListener(ModelListener)","u":"removalListener(fr.lnl.game.server.listener.ModelListener)"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"ReunionSameAction(String)","u":"%3Cinit%3E(java.lang.String)"},{"p":"fr.lnl.game.server.games.action","c":"ReunionSameAction","l":"ReunionSameAction(String, Action)","u":"%3Cinit%3E(java.lang.String,fr.lnl.game.server.games.action.Action)"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"RIGHT"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"RIGHT"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"row"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"row"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"seeNeighbour(Point, int, int, int)","u":"seeNeighbour(fr.lnl.game.server.utils.Point,int,int,int)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"selectedAction"},{"p":"fr.lnl.game.server","c":"ServerMain","l":"ServerMain()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"setA(A)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"setActions(List)","u":"setActions(java.util.List)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"setActions(List)","u":"setActions(java.util.List)"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"setB(B)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"setCurrentPlayer(Player)","u":"setCurrentPlayer(fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"setEnergy(int)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"setEnergy(int)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"AbstractBox","l":"setLock(boolean)"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Box","l":"setLock(boolean)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"setPosition(Point)","u":"setPosition(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"setPosition(Point)","u":"setPosition(fr.lnl.game.server.utils.Point)"},{"p":"fr.lnl.game.server.games","c":"Game","l":"setSelectedAction(Action)","u":"setSelectedAction(fr.lnl.game.server.games.action.Action)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"setShieldDeploy(boolean)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"setShieldDeploy(boolean)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"setWeapon(Weapon)","u":"setWeapon(fr.lnl.game.server.games.weapon.Weapon)"},{"p":"fr.lnl.game.server.games.player","c":"Player","l":"setWeapon(Weapon)","u":"setWeapon(fr.lnl.game.server.games.weapon.Weapon)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"shieldCost"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"shieldDeploy"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"shootCost"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"Shot(Game, Player)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player)"},{"p":"fr.lnl.game.server.games.action","c":"Shot","l":"Shot(Game, Player, Direction4Axis)","u":"%3Cinit%3E(fr.lnl.game.server.games.Game,fr.lnl.game.server.games.player.Player,fr.lnl.game.server.games.action.Direction4Axis)"},{"p":"fr.lnl.game.server.games.player","c":"ComputerPlayer","l":"strategy(Game)","u":"strategy(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"RandomComputerPlayer","l":"strategy(Game)","u":"strategy(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"strategy(Game)","u":"strategy(fr.lnl.game.server.games.Game)"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"StrategyComputerPlayer(Integer, Point, ClassPlayer)","u":"%3Cinit%3E(java.lang.Integer,fr.lnl.game.server.utils.Point,fr.lnl.game.server.games.player.ClassPlayer)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"SUPPORT"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"TANK"},{"p":"fr.lnl.game.server.utils","c":"Maths","l":"testFloat(String, Scanner, String)","u":"testFloat(java.lang.String,java.util.Scanner,java.lang.String)"},{"p":"fr.lnl.game.server.utils","c":"Maths","l":"testInteger(String, Scanner, String)","u":"testInteger(java.lang.String,java.util.Scanner,java.lang.String)"},{"p":"fr.lnl.game.server.games.grid","c":"Grid","l":"toString()"},{"p":"fr.lnl.game.server.games.player","c":"HumanPlayer","l":"toString()"},{"p":"fr.lnl.game.server.games.player","c":"RandomComputerPlayer","l":"toString()"},{"p":"fr.lnl.game.server.games.player","c":"StrategyComputerPlayer","l":"toString()"},{"p":"fr.lnl.game.server.utils","c":"Pair","l":"toString()"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"UP"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"UP"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"UP_LEFT"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"UP_RIGHT"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Bomb","l":"update()"},{"p":"fr.lnl.game.server.games.grid.elements","c":"CountdownBox","l":"update()"},{"p":"fr.lnl.game.server.listener","c":"ModelListener","l":"updateModel(Object)","u":"updateModel(java.lang.Object)"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"valueOf(String)","u":"valueOf(java.lang.String)"},{"p":"fr.lnl.game.server.games.action","c":"Direction4Axis","l":"values()"},{"p":"fr.lnl.game.server.games.action","c":"Direction8Axis","l":"values()"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"values()"},{"p":"fr.lnl.game.server.games.weapon","c":"Firearm","l":"verticalDistance"},{"p":"fr.lnl.game.server.games.grid.elements","c":"Wall","l":"Wall()","u":"%3Cinit%3E()"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"wallProbability"},{"p":"fr.lnl.game.server.games.grid.build","c":"AbstractGridFactoryBuilder","l":"wallProbability(float)"},{"p":"fr.lnl.game.server.games.grid.build","c":"GridFactoryBuilder","l":"wallProbability(float)"},{"p":"fr.lnl.game.server.games.player","c":"AbstractPlayer","l":"weapon"},{"p":"fr.lnl.game.server.games.player","c":"ClassPlayer","l":"weapon"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/server/module-search-index.js b/livraison/doc/server/module-search-index.js new file mode 100644 index 0000000..3b67c2a --- /dev/null +++ b/livraison/doc/server/module-search-index.js @@ -0,0 +1 @@ +moduleSearchIndex = [{"l":"server"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/server/overview-tree.html b/livraison/doc/server/overview-tree.html new file mode 100644 index 0000000..5e16b11 --- /dev/null +++ b/livraison/doc/server/overview-tree.html @@ -0,0 +1,178 @@ + + + + +Class Hierarchy (server API) + + + + + + + + + + + + + + +
      + +
      +
      + +
      +

      Class Hierarchy

      + +
      +
      +

      Interface Hierarchy

      + +
      +
      +

      Enum Class Hierarchy

      + +
      +
      +
      +
      + + diff --git a/livraison/doc/server/package-search-index.js b/livraison/doc/server/package-search-index.js new file mode 100644 index 0000000..447b3ab --- /dev/null +++ b/livraison/doc/server/package-search-index.js @@ -0,0 +1 @@ +packageSearchIndex = [{"l":"All Packages","u":"allpackages-index.html"},{"m":"server","l":"fr.lnl.game.server"},{"m":"server","l":"fr.lnl.game.server.games"},{"m":"server","l":"fr.lnl.game.server.games.action"},{"m":"server","l":"fr.lnl.game.server.games.grid"},{"m":"server","l":"fr.lnl.game.server.games.grid.build"},{"m":"server","l":"fr.lnl.game.server.games.grid.elements"},{"m":"server","l":"fr.lnl.game.server.games.player"},{"m":"server","l":"fr.lnl.game.server.games.weapon"},{"m":"server","l":"fr.lnl.game.server.listener"},{"m":"server","l":"fr.lnl.game.server.utils"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/server/resources/glass.png b/livraison/doc/server/resources/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..a7f591f467a1c0c949bbc510156a0c1afb860a6e GIT binary patch literal 499 zcmVJoRsvExf%rEN>jUL}qZ_~k#FbE+Q;{`;0FZwVNX2n-^JoI; zP;4#$8DIy*Yk-P>VN(DUKmPse7mx+ExD4O|;?E5D0Z5($mjO3`*anwQU^s{ZDK#Lz zj>~{qyaIx5K!t%=G&2IJNzg!ChRpyLkO7}Ry!QaotAHAMpbB3AF(}|_f!G-oI|uK6 z`id_dumai5K%C3Y$;tKS_iqMPHg<*|-@e`liWLAggVM!zAP#@l;=c>S03;{#04Z~5 zN_+ss=Yg6*hTr59mzMwZ@+l~q!+?ft!fF66AXT#wWavHt30bZWFCK%!BNk}LN?0Hg z1VF_nfs`Lm^DjYZ1(1uD0u4CSIr)XAaqW6IT{!St5~1{i=i}zAy76p%_|w8rh@@c0Axr!ns=D-X+|*sY6!@wacG9%)Qn*O zl0sa739kT-&_?#oVxXF6tOnqTD)cZ}2vi$`ZU8RLAlo8=_z#*P3xI~i!lEh+Pdu-L zx{d*wgjtXbnGX_Yf@Tc7Q3YhLhPvc8noGJs2DA~1DySiA&6V{5JzFt ojAY1KXm~va;tU{v7C?Xj0BHw!K;2aXV*mgE07*qoM6N<$f;4TDA^-pY literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png b/livraison/doc/server/script-dir/images/ui-bg_glass_55_fbf9ee_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..34abd18f32d3a55a297fdcf93409bd033ae573e7 GIT binary patch literal 335 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&fCnc6a#?2AmP!?*K(O3p^r= zfwTu0yPeFo12TF&T^vI^j=w#x$i?I+((tf;UXnmgbH|3oY>pC!)f}(GR!16S-u+#{ ze6YEqRkW=8vGl=5qArKM<9}TC-}iEvB{zdaTcX5$wyRTK&ALRXUCGx5b?-VBQkUm|IuXOmYJrBRJgj{Vx zMbNnqUkncy+qa2-mWYc>swkcIuvGK#>(0d)B7)5f`@$Ei28nH~0h*~=;u=wsl30>z zm0Xkxq!^403@vmGjdTsnLJUl-Obo4zO|=aStPBhe<(7X!(U6;;l9^VCTf=69^L{`L N44$rjF6*2UngDu&PXPb` literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png b/livraison/doc/server/script-dir/images/ui-bg_glass_75_e6e6e6_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..a90afb8bf8028404d206114965669b023dcb85ea GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^j6gI&0LWmFTHNUZq?nSt-Ch3w7g=q17Rci)@Q5r1 z(jH*!b~4)z#PD=+46!(!TrvH)L6@80)r*_cdCvDr%)6ghVL16=s@mbz7H!uRdGeDa z?kzLg)16i!f8fKx84s0>4hES%`s&m5HI1v5B^Uft7(lid2moiiX_$l+3hB+!{pPkNg5^ OVDNPHb6Mw<&;$T*0!_~V literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png b/livraison/doc/server/script-dir/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..dbe091f6dc036fc1dc11b005738e951e27a43f7a GIT binary patch literal 332 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�_j6WK+Gj+xJRxVvl#lh7y-4uY);t)n47k4ot z9YsU`HVk7fg4;r{;)FHk7ZHyZJ+W|$aKwj=g&_$VCVFn5%XzSA`|z}+4ItZ|`hB}R z>h-6Be`d>nmv8;kQHJg!HMr^cCGG=T5;3HhZ_JRq0_4a3TsY7Pz{V+}z>;!R^U4*c zJ>wRI59B-)92Vi?b&EWvH(`<(G5A?W)z>EuDMG@VENAb7aHa`I#tKw{0uUc3(#J8& z*_S%A_ZxCIY385{%qN-b1K)TWmCjUA4nWKx_ZnKLSvEf0($&_0@DS~ zN8JOXJXXcaFm^OCYrz(R7N5DQkXKGnnt}yzfw^8s%=A?7hxza;ylJ;XQ&XtC`pM%b z6$5Ff0{(ALcSlTKvIbr@mR`0Z)*iM`2EfO|E5OMk$jQsE!^mat*drqV literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-icons_2e83ff_256x240.png b/livraison/doc/server/script-dir/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..1f5f49756ca64bd20a1048bd7a3a584457d4bf00 GIT binary patch literal 4549 zcmeHK2U8PFw@yL`geFZ|P@*V;w1D&)N-z*QNarO;QRz)l2oR(yU5bE$@JbZ~M4A){ zMUW<7Xc|gHkY1#>kc)mZ-`x8j?lU`k&hG3pXZP8eGv_=pHoVEqz{dap0GM^r+NJ;i z@XQ5l($k#H6S{hbXB#ZW`sOH!2L%N^&k_wk58Uw#*BX~{9Oe{(!2H)ZKd9X_X#oyfU5m#1Q82_f^tw6O11(<7c zWrG0%qDlJqcA8#ZrRU7cn@;N9VJUYHk^lTY3j(~2xv33^rM-YYTR?r#*8XSqkBCLbg&Z9G zp-dC_BuoqAkc7;MJ$9jCDbZN_FFIp=mvYI8l)OlkJ2GcKGFRh03>eyeeRF`W3VO-< zC@;;5k3f&*z5C#XoxT-q8o(%^R8K&f=k{8C{Y0uqmWi%PaU6jYo(5);yFd`Pn(!El z9h1vEhwlH1Q*|5X!lGvH`BD!7(^?OdAd$XP8=x~O{-Q}sy<2@T8`8IN;o*)L;K1*C zz~`x^5S%i=-8fHXQ{cyPiZj`|pV*e}T1g-QFmGBzZJ}z9t&~LL?-9yqp3x_EMw?h% zR0P^RfsG7yxX`l^uHgxl8V3PJTxM-b@>%bt-xEPCC)WNC4L*~?BL_6;e`XLVLVOkZ zaY1crUf;C9r#r|ebAHIp$KdM#$G60s#+4?*)mH)^4Rrn^&ZPOyOvZQO09veRcnbCX zWQc5fEAPmQd7=aqrZPBYAy;!Ph{cmfC@z-hpTuotqr$Mt? zY7woww1bOdZZNt7uHxGKm9$w8ozW}U!S8~V?{0A^bi{^$t00v7M zy;S7sm>vMCBz+=8TH~>zJ3!E9INJ1E6=!x^{;q9Biu$){2DGEIbB=oh!`QMCEx$ds$)Rc&7P*}`pd3{PqA}tIjp&y&{w{YrsPqhxaO4qerTDpM`WTlW5 zu*{F5ID98N%XU%ltVphxZ4Tra!)bpNih&)&Xx+d#q1{G`5icBuvTfv^7X{W}JXD*B z5!u=L*x{^0TXODlF@ziPt+=ars9OiJOv1hU4sSKFa z=)|j@+%OFH1Oa3f>ffz{O6~wHhDJrN4=)Y|I6DD)9CPw@Ytx6M2-O;{GQTQG&gg?A zr_VPJ&6+f^hXn|7pvwa+o;bXAc{n)lTn{~TF;3#>=AS1_iaGZheU=*xbHD8CUNUCj z^3&DKA#op+3tPQa@eK1RUg%D!n%5J4ICni7xELQIvd$Qz&+%!EZ!S{js)F!S5x>3O zLCB>-TbYHXS1?}__Xfm{r>(wAU3INPvHaWIIYbsxO^Oe0h0xglZWFakn6z+$6`V(< zSimFunLw;GdHMnWx=-GqPeuvo)l|sHaFJ~`DxMN)4Y7U!J8D=^MqeQn$`lS|1%mdN zK^morEND%3ee@_Yb<>IVIW2*6NZ^*QDg@w`H$3}uYsbleFidycDox+uzraGexRKEV z)Wd(JYU$(enZkGJ3{9REQOJppi6EBrWrXU;Ho*EGRUG&RC-ceTd@*C1J$c=Jk~Ty0 zAJE}+ZgP611Nw}-*K%$Od}R)=^6W|sl);faH`l2OA>=zFmy@8vVK$&%4OTWEhnx^< zs6V-c51bUMvJ@`4zcieGu?{L+ z6(ZMYhQND%M5s7uB)($Pv`1e&xPRDwWGD>e&;;;sA;yn_>F>rJH-M!+=wbl1_|+h6ttu(NB3r*FCdU;|1QOB?AGaVz-O zFMj-^FpfDR$apG zp!5Ji|53`FLrz-d>YnYEv6T0wDN8?-+$@_Nk-6nai){TtA=w&Qa=^woXbB~azV{PSFnB7zJF-k|zJbp8E$W1!v#tcX8%TiKFo-n7uCut-v(fLn$6ypSnrZ z$*S34s_(`S1jtESyVuI|{3uW2BhK-{jQp05>-^UGi}#K$%3bE8bM>i8<~MKu=Z4e! zh0A#tX_IOB39o+SdnJzu7<`KoCri$9{I*mr4A2uJr&$q1-r=Lzfussme7r{sQYl;m0a`a^hI)69ux681k(h4* zN9|Ywb^i7xF=uPVr*az7RYlVWPxhKmOE)Fgo>mlB<7pYaz6VsBW7J04%DxENck4rx zgM6#>hT78o;>S1Jt8MqV+4Jng1ERmSoX9dGIW`CC2VaF9CwL8-Bi|83mD2!Dee`Lm zCU-luuD>aLYJU7ZD?3R8tYYSVzoEVM_7n=hEcv1FN{h`Dk*ik1Q)z?ie^&}a1;86B!(s%}s%T_y4o&Ilh~d4DHn(86bo>p-*Ct4!-v)W$h1{J?4IrLKT@^?`26FF*@(2A4^@6og<7ngtWmIBVp>g{gwCG=1WX4srm*>E(6gC>!E~o-<{=AHg;~h zr)4{j`glAMBt_n{+%n8))~tNAyYCizc)D8wlZ8(Mn(svkWSi{A*vq>kCT}fIzl|Cn zy>PR|9cIRx;PBE5*-4+O?~_|$F<}5ur(2S|FAw=N&4pNnTk#=xhxAK3L=6a{X{DRocw%r8utUc^U?}*_ zr(y*T#U}{tCh=GT-ig;Dn~K`ilK*9stV#@EBAC9TOf4ugkA;~Nt2ej0?du%%-=F_m zz_LA$2jOO2Xk0r}zAZwZs7;VwA4S}3#)0t0SXSerLIo`;%;<|0ji~+vl}hOk9i+zx zUuZGWeo-DskUoPx=uJ)C!2Ep5@-PzwsF1^fj6kXJV!gU9L;{+5Gue#|!$uOssQo@K zR+uvJS*YTwuIPpVsz4PRkj93f17`97b|eBhl?7-Z9~n0f6EDor>foo2fPb$h4?A7> zT%r7x%5bpcUlV8+ByvZ7G1za^zhKiWJonD$xaS#k!hAE4p;QgaM*&tH)GI*HnxRE` zKM&1Lk7kAdR0w0M^qbP-LBil+NXKi;ihqCio{6=#|O(C$v0m`Z##4NXD+__-g z(_-U=I?+`IvcD6z77?Nw;fys4D9CFwg)Aldh6fQ?7N5`ui7^y6CC!+Es(Gr9qTHPK z-0ma)tFN+?V$ZP1e1t=yi(Zs8_S&zkh{hmaoulswfZ1Dqa1RNYC-25^Rm!I<>GW3k zjUOHLY78yVOfQ4@4mA&>xohn_3&n{JwbI7c3dEV^o%%0Fv=51+iH6T4?jF;IPPfqw zokxnwN5uxo9?XI&Sz@-f12P;WQ%GNbFK1CCdDhs}sVDCdBr~;?W)WZ)U0iw42JJnB z7i*tnrsnBMBpw^Ay}gobnSM$V#D;&2_@aql^X86vylX4gc?Y;m(y8v2NuB;;wJQoV^z3UpIO6adgOK|rh`I83cQ92vN z*nDrN5bxLa^N8pN&PPh7e;t?O#;^ACf0T)hr9bD^{p0K0aKs6fP=#ZL0@Q)?jH1G4 zmGhC&x$cBzQD~bW$K$+5{ylRuGYJ=lL0%_3KE(evW+WZI`zqmN3H0Yi?*N0(R64#J z>}+>eAmE{uko29IXjycIN3NS#IqY;9$u>caW?(bvKw+_ zgG{F`FVBpFDwJwR~R;O-V!9D+Lphp>2% zCAeJPdrp0I&;9O?nVzZYuAY9Td#2`@Ff|ofJRC|K004j|F9+2C0DzA}z%e%ZV=t5G zEb%Bnri!vqfK1uzM9#CcN_%;z#n=8gA#PS3;tcI;~uofXisxsK~{&;VR#1 z!o>>A2X%jk6mmfdq0-jyMN=cu0=VG)#_Jf_>&KuMX8ti@lH{h`>lhL}=z0k4IB519 z2z+_ZC;46kNd^v6LH`zyWz zc=pCDRd~N_<2su2s8&{(HU!aVC@&H;3-}=D4 zmn4&Xqtz|N;fr4ZX*`x)O>~I#fDAFWbF}%9b@c^V1-YMxSf6U)DQRkB+43Xqb9MFy zjo;f7Zl(+0@U{ZOZ-5LtI^A(gphls-(I>bAO%b)X0%Rr}JgWGZvD+JlsTxN^% zxJBLbH-$q!0L=#%jxX5Vq_FKJ<2w!*===-Y@qzQ*_ z&ov@B+(5Xb?{lf2ViA!OfgI3o#$9BtFq%%7KSq&MDxi7pySJYoi*Mo(W6r!DLSMQT z5R^D?yx*g7)k}}4ziwHEoWI5K%3hPst6voipJkIw?!%9N$K$TWC4VuQM9)7yVq;a$ z=Z;n#4~)-1561t|Pxey=Qu^0P2#JYboJR5co5Ktl*iAC2?$BN>JINDo_+7dptH4MZ z=#a=xrMtj%`CVN()`GKp3RFADpy$xF7~O&&p0-yeG=xW8uhj9Af`YV6uf@~_v;;D#h=*T)D!O`_6(IwY zIw^B!$W|O05eRI*b>Pe%GGlOW`<(mkpbS$G@7HEko`s{=g~2c4kqO2D{R_c$HXzr|(vU9~bVZ9Zw90;2AsK2ig}XTGY6fY#HgGpEaxY zO`D_Z@O8%f#^@5G;myQ5fA(JXK{rgcieDr!{s`~{nU%CRe=1;4og^%^Ts{A8>Sq8@ z7MLFuiJ9lh@TXEbSXQb0;l#nbg^u{Ky;vCuCLR537HT%5FxM^fs5pS1gq3J(Tf!*6 zAc~!aiCB8(;cEmBeX<`V&xqvsk92&%dsXd*G@M$W7!TVsoD%c%!p~lGHEz(ckd{tR z##JAyc1)YR0b@JW|HWX=EIHNMaui<>jUPal5F|-#l#?ar-oHSbCyZG*EuqOC?V5Iz zROd8mBy{ukJ_DuzLTBsPdF^WZ7NW}CWcww?Uwp))_brh+D#JdL%%G}bh zEbmg}yJc_xX1_|6iSomOV4IgTV&UNVe-P4B!*v}&@hLXe=h7%`bcW^Eta_BE?bf*&82)UKj^6nE@ zA$RoKncM;1&!nmY^=yjr6=wgBr%e9BXAxKh^0A1=&iQhn5mfUB$_1N5DJ-DZ4!pLCChW*MHin>-!AX+Twe_SsV%)n#? z9m<01Z}*b;{SU$Rd-`axfZ;y8#-Dau@wD~tukEo#I1b5JhkDp%r;hf2&TH29Y`$=G zCT=}&CU#_(G5)E0y~*>piG@IHnT&WP>Bef5eoMnuRP?tb7aFH_AYy@I!S34oD{g9j zt&5vt`pheqh=GvgZDzlqDuidT)11qC;R35@PC4Z4(p=SICoeHq+3uEqgbmq)}q|_NRzcOHv0J`WLpt+1=j?0A{<5%OLxd!f~^V zfofe-Y;s4+yganmBlRs9L-MCkb@HkcIGzakx6p52sHx;MA}LA_@xo(MP} zDc);OVH(SgwrVlgqy!Vb7cIqe8X$!ECB5e#-)15warssOnkR%x%-o>1T_T=}^z83m z>?c?Vcl|}zH)Gve#!UTymO66c$B^I*%B*@2y23hf5=?aCeBzz7EJe|b9Sex0(wO>7 zRb>P4peOZ<5iwK?l!Imu++&w7Syj6VQ7HaGhAd%tr!?^1W9BpDb9K6w6&K*5X?Mg{ zJ-9!QlR>z>DK+)226mPe<+h_rzFAHI!mzVV#GU?Fzw~_RoaIT4yg6y4BAsT`&lzDE zN8&hg3mPdVnZE*z(B&{cUCbdEZcwCc!M07oJQWk{gQd-> zr9dqLy@o0}77srWq=#f}hD*4;Wr{`XhNy3(QRG7u=})1~*VvvJg7)}?r}&$RlQwv$ zXdGV%bswf)=onk3jFfL;P++Q%v8Zx@HLpgdXD??Rgfd0J7%TheMo&G8Ri zY%xQ58GYjiumJ@R#%;;*4f6=Jqyt;B^WLz4)&y*MwAuEm);Ad)VfKQ8Sr0CY@t@~> zUQjgZ#QB*y&{~9gc(!{BsVt<##<@4;&)IsJD6YtQmo_p%?&3O=8)wZazJdioWa<4X zlrD5`HRzYUVx9XSHNrRMeJbsZXE$L%`CjK>#AvI+17q)*ws2o~m+2h|RXRpuvZ;D* zQY%WR`fzBy@JjoZU*XW8`Fqv?ZRVOCeS4``J028Q{72zS6OggtuOq;?NrF=gLU{T1 z2Ey5bAX2R!_@I`V<&n7vuSD$!&t^oE$C16?6i^2+oXgJEQ^GRtyq7y|3J zjS5W(iH2Od&+O~1mD#qt_V(U2`D~yWIe}Wmh)Pz z`3B*tPj%Q1@@njj!dC^nL67Y3HjBux!~dkMt88TTtEyZ&gy!?kq=hW3X+P_Vrv0a= zk$G`d4jR#UC3q&uVr_NfxeAI|1?9Qb7nKH>x*7HzWEl1J7=Vy~_xZtg^d+=;~q6HX~P<3!HF61g_w>7y^ge1>z>0>CJBlwhy*m zu^e%|FDE`Pg>^K2tw_~`;#;lt;kHE=dWx%}d@{Ep`+}fUYEkRY@7R4z^Gi3a z%p3!^U0{T-%L?kl_g;>HbVbT_)6tT-&YtzE=5CeyU1!c&e8r`X(rWY(&&Hn$;!z<3 z@ZD^M|7w69ux8!!$a=u3Jm9vMnxk@c@;-#Vi;?20XYrZU4{Zg*wkL!!)33(XXlz1R zYdSCxbAF4VGcc|P>jR^>ye$Fvd;}`W;VnrnsgUp09az2h?}6$Hh^S}<)Tc=<&3>*uCLEyR_hY_tr{or zrLSkS#T^|h1|_TSdo$fLueegLlN{0i)^=e2EtbySBh*?saAY}fWW_pZPj89qIdGQG zuxq;}FZf}T8*ZUnyil7Q8o@Dmf8dp6l_IDkJXm0=&ivCe1tvmX*|Y9)KZx>*u)cj!gV3~eOWE0KE$Vd(C$NowTz3Z#GR58MoW7U>(7WibQR7zU zr(M+U)R3#cCD?IbC3MmtR7?nlyi9(d)Z8dBwm5Yv#gE zH~5Y@zD>tVcGN_vSwLt5=jvf;p2JDnXQDL55iWH_(o7-&$C@w1ezEAGF`loMo{^9s z+qL-4cT!g|bS7(^aDM{#4CP=QsdpQhA-B3WQ@8x}1Z~5_L6>yv41-IOKT3S%nn6e5 zjJw+eepy<9mtX+LaCH|?5I*+c*Y9Mnr%8@i5vn4Hu@i=9XtWGol{AM#ixz~m!Q15N zdc*o)e1I~VccQpl$M!|<;DHX$F%un;kJwM!;3X{(+24sQz;UoP+D;pG5OrK;NSpRJ zAoo7h4z`5^2%$YZK@il;j!YY-k-Zk}e^u&AqL*9qyz-Oxo3!(5hwER%GJ1>eeJHnI(0ne%RzAyI5mDgG%|(-4~b=*CY8r|1uLy`6pa z`a`AqLvAMzmPMnOi;v!%;Z#k2RPeMo!UaOYtBz2^Z@;8%ZuCM|L0q-P*6`3fqiw^L zL3`*T0~C5-#Fy`zV$lw~_4mI6WLZS@zu$b)@(M16E0J%hHBZ=3P0gJyo*6+fXZ0|) zB~_}943 z?Lc#&-_51qs+HcN0==Y{;S2E*(c#J}TF1dOq>+oBq7^BO)gtN36`@RskHQ1S3iYcE zdr^>R{%$WSvX(kRE8=0x3WtG3iW!hA)a`Qss{lN*6S62fAT80qpF>~U0K*^ef>uYa zroXwa>=4bE(Me{aSAcQ#S=$1-=uQTg;;=5KvvH5q>2fiJX)f+RsBB9uXVi%6<=o_J z;Fb|nE-|%J+QxjX*FPtOMZ0yTw$HWu++eB$65&pLY_$8rd6A`F5DZM&a@ox>EyZF; zI35+4PUyZ(Fq1PdiWWylndF0L`Bi&mEFQ4%ig#h6sXl- zY}`wuiiW&n92*N#!?nXU?R|&(llg1N@n!AqFF{IZ&>!ujl|0-wU5gGY2E08{lSjF4 zt|sNhwGNVmJc`EVWEc7S%r0=*uWj19qAzg@1=s-H)o&Wz<Lli7-+}2Ha{kq=!XZ~pZc&+Q=0Cr|?#_d2wy>XJyrz^0!NJym zO7^0TjMo8~-}C35db!jXTrFn2nwOg2p{IJ)TMKtnrmOTK9*AKe0{j(&<)*eqt8N!v zpq|U58&sl=USB36p%G@>`5=>n9`TBDZ+p}y$w2uADdGxvcz^~D|-g+X6KZ?b`a6w%sL2=P|o1#BP})wq9P6^I;EBnI=7-f6T*2aKAh(r zXjh?;*}}bE?&sMes#m4`20olUS!0kmkhy2DS0V9I zOVfN+i{L@-)F3v$JA2t)D}TAUs6WZNKJ{$kx`%Omgx%I7Je24zhTUZh(V%L!aHijs zeCcMA`}iNqfj%Fu?+*QOj<}bl1LV*Ss@{fNU5=lL+RyR}X`nw|5$c(I=~X%=VUF8A zjt6XyO6Eiq%OTZ+GJkTSuKVD2LWrlV!?~tMbg?upc?2iFnnE_oJ8?xt5w%`pFE$TSofbGY9Nn%^00N{i~> z!<-d}5xbK}N##I0*iFO8_PIgdMSVO=^HewXRYhMjzGFhagblsyGGu2-wW7GZZ{ zQoU1S*zc%l7-^UdxP0GxT<1fpCrTSsH9D$z?_|R6 z_Vg7Qh~N<#KqCEj{{Z9*u}7$G?~LK>=6PI~v3uf)l@UJV^0t@wG+ak)aZ`yOwUxZ0 ziHYw>>qDBv?tyTN>lry=XZ*IuTz=$P-6wpGW>1{a66PVs?H#@p6~=_6dhZ zQ_C6oC7I*oSKm7UI^y|S@_%pNF_jc0z9XL9|03`HyXxpE1D3c|=~P-|F$QK4)n|(p zysic<{o^^p=+kD)6#_wCVnRh3{vm;FfO(3hp^DhdCadwzK8XzOBXkoPy^at}Pap*v zBU(QN-y|aejaOi@kWw<2H}EDHC;A&JKG2L*Bi1ZUvuMuO9`swC=#*((@P6()>?sWt zSXDf0QV4qoH^Tn-f32+A7sI%V8~ZP)1~6@8g`2`)UUIaRX&f=wzC8&T0D+%B;88ZL z&{X@v#(SwT20&G$4|rq^D~AiK(oG-XF=1UsB7s4^AE5^`5hh(e;#fOR%+1EhfO@H| z^%1^X;6oC2lZX7+_QP$!5C2yH7CdlD4a*frVc;CDYPb|XeSReoPs*JS;SMlZ9?j#N z08l}h{pNsNINt0bkR@G~?a{{%xO{8T{LwZ*OrlaiqT}-+i-P#Wt~zlIz^>o7J46EY zIKG)9Tbm%h6~Cx4ESc-WZhQQJVs@2z?`m%1Y5_5Gws;f(UNDa!Cs>G+hwmK^7{bc~ z5fI@3gCSrr6)-H~KMd?0&220_|EB?11i~u_5#axq0cs?h@X_G;KOQt4EnVGBoGk#7 j=8mQoFXZh_tSmGvOw2u<1}#J%l>qWGD$oikWB>mG5~xOM literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-icons_888888_256x240.png b/livraison/doc/server/script-dir/images/ui-icons_888888_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..ee5e33f27235d1b5cf0259f63f3894a6be33c679 GIT binary patch literal 6999 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 literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/images/ui-icons_cd0a0a_256x240.png b/livraison/doc/server/script-dir/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7e8ebc180a2d2a74739059799407b8b7b57a9092 GIT binary patch literal 4549 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 Mq_Ix57W&cu0AIB!=l}o! literal 0 HcmV?d00001 diff --git a/livraison/doc/server/script-dir/jquery-3.5.1.min.js b/livraison/doc/server/script-dir/jquery-3.5.1.min.js new file mode 100644 index 0000000..b061403 --- /dev/null +++ b/livraison/doc/server/script-dir/jquery-3.5.1.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.5.1",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
      "],col:[2,"","
      "],tr:[2,"","
      "],td:[3,"","
      "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
      ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0a;a++)for(s in o[a])n=o[a][s],o[a].hasOwnProperty(s)&&void 0!==n&&(e[s]=t.isPlainObject(n)?t.isPlainObject(e[s])?t.widget.extend({},e[s],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,s){var n=s.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=i.call(arguments,1),l=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(l=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(l=i&&i.jquery?l.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):l=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new s(o,this))})),l}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
      ",options:{classes:{},disabled:!1,create:null},_createWidget:function(i,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=e++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),i),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var l=s.match(/^([\w:-]*)\s*(.*)$/),h=l[1]+o.eventNamespace,c=l[2];c?n.on(h,c,r):i.on(h,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,l=/top|center|bottom/,h=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
      "),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};h>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),l.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,l=n-r,h=r+e.collisionWidth-a-n;e.collisionWidth>a?l>0&&0>=h?(i=t.left+l+e.collisionWidth-a-n,t.left+=l-i):t.left=h>0&&0>=l?n:l>h?n+a-e.collisionWidth:n:l>0?t.left+=l:h>0?t.left-=h:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,l=n-r,h=r+e.collisionHeight-a-n;e.collisionHeight>a?l>0&&0>=h?(i=t.top+l+e.collisionHeight-a-n,t.top+=l-i):t.top=h>0&&0>=l?n:l>h?n+a-e.collisionHeight:n:l>0?t.top+=l:h>0?t.top-=h:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,l=n.isWindow?n.scrollLeft:n.offset.left,h=t.left-e.collisionPosition.marginLeft,c=h-l,u=h+e.collisionWidth-r-l,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-l,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,l=n.isWindow?n.scrollTop:n.offset.top,h=t.top-e.collisionPosition.marginTop,c=h-l,u=h+e.collisionHeight-r-l,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,g=-2*e.offset[1];0>c?(s=t.top+p+f+g+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+g)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+g-l,(i>0||u>a(i))&&(t.top+=p+f+g))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.safeActiveElement=function(t){var e;try{e=t.activeElement}catch(i){e=t.body}return e||(e=t.body),e.nodeName||(e=t.body),e},t.widget("ui.menu",{version:"1.12.1",defaultElement:"
        ",delay:300,options:{icons:{submenu:"ui-icon-caret-1-e"},items:"> *",menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.mouseHandled=!1,this.element.uniqueId().attr({role:this.options.role,tabIndex:0}),this._addClass("ui-menu","ui-widget ui-widget-content"),this._on({"mousedown .ui-menu-item":function(t){t.preventDefault()},"click .ui-menu-item":function(e){var i=t(e.target),s=t(t.ui.safeActiveElement(this.document[0]));!this.mouseHandled&&i.not(".ui-state-disabled").length&&(this.select(e),e.isPropagationStopped()||(this.mouseHandled=!0),i.has(".ui-menu").length?this.expand(e):!this.element.is(":focus")&&s.closest(".ui-menu").length&&(this.element.trigger("focus",[!0]),this.active&&1===this.active.parents(".ui-menu").length&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(e){if(!this.previousFilter){var i=t(e.target).closest(".ui-menu-item"),s=t(e.currentTarget);i[0]===s[0]&&(this._removeClass(s.siblings().children(".ui-state-active"),null,"ui-state-active"),this.focus(e,s))}},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(t,e){var i=this.active||this.element.find(this.options.items).eq(0);e||this.focus(t,i)},blur:function(e){this._delay(function(){var i=!t.contains(this.element[0],t.ui.safeActiveElement(this.document[0]));i&&this.collapseAll(e)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){this._closeOnDocumentClick(t)&&this.collapseAll(t),this.mouseHandled=!1}})},_destroy:function(){var e=this.element.find(".ui-menu-item").removeAttr("role aria-disabled"),i=e.children(".ui-menu-item-wrapper").removeUniqueId().removeAttr("tabIndex role aria-haspopup");this.element.removeAttr("aria-activedescendant").find(".ui-menu").addBack().removeAttr("role aria-labelledby aria-expanded aria-hidden aria-disabled tabIndex").removeUniqueId().show(),i.children().each(function(){var e=t(this);e.data("ui-menu-submenu-caret")&&e.remove()})},_keydown:function(e){var i,s,n,o,a=!0;switch(e.keyCode){case t.ui.keyCode.PAGE_UP:this.previousPage(e);break;case t.ui.keyCode.PAGE_DOWN:this.nextPage(e);break;case t.ui.keyCode.HOME:this._move("first","first",e);break;case t.ui.keyCode.END:this._move("last","last",e);break;case t.ui.keyCode.UP:this.previous(e);break;case t.ui.keyCode.DOWN:this.next(e);break;case t.ui.keyCode.LEFT:this.collapse(e);break;case t.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(e);break;case t.ui.keyCode.ENTER:case t.ui.keyCode.SPACE:this._activate(e);break;case t.ui.keyCode.ESCAPE:this.collapse(e);break;default:a=!1,s=this.previousFilter||"",o=!1,n=e.keyCode>=96&&105>=e.keyCode?""+(e.keyCode-96):String.fromCharCode(e.keyCode),clearTimeout(this.filterTimer),n===s?o=!0:n=s+n,i=this._filterMenuItems(n),i=o&&-1!==i.index(this.active.next())?this.active.nextAll(".ui-menu-item"):i,i.length||(n=String.fromCharCode(e.keyCode),i=this._filterMenuItems(n)),i.length?(this.focus(e,i),this.previousFilter=n,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter}a&&e.preventDefault()},_activate:function(t){this.active&&!this.active.is(".ui-state-disabled")&&(this.active.children("[aria-haspopup='true']").length?this.expand(t):this.select(t))},refresh:function(){var e,i,s,n,o,a=this,r=this.options.icons.submenu,l=this.element.find(this.options.menus);this._toggleClass("ui-menu-icons",null,!!this.element.find(".ui-icon").length),s=l.filter(":not(.ui-menu)").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"}).each(function(){var e=t(this),i=e.prev(),s=t("").data("ui-menu-submenu-caret",!0);a._addClass(s,"ui-menu-icon","ui-icon "+r),i.attr("aria-haspopup","true").prepend(s),e.attr("aria-labelledby",i.attr("id"))}),this._addClass(s,"ui-menu","ui-widget ui-widget-content ui-front"),e=l.add(this.element),i=e.find(this.options.items),i.not(".ui-menu-item").each(function(){var e=t(this);a._isDivider(e)&&a._addClass(e,"ui-menu-divider","ui-widget-content")}),n=i.not(".ui-menu-item, .ui-menu-divider"),o=n.children().not(".ui-menu").uniqueId().attr({tabIndex:-1,role:this._itemRole()}),this._addClass(n,"ui-menu-item")._addClass(o,"ui-menu-item-wrapper"),i.filter(".ui-state-disabled").attr("aria-disabled","true"),this.active&&!t.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},_setOption:function(t,e){if("icons"===t){var i=this.element.find(".ui-menu-icon");this._removeClass(i,null,this.options.icons.submenu)._addClass(i,null,e.submenu)}this._super(t,e)},_setOptionDisabled:function(t){this._super(t),this.element.attr("aria-disabled",t+""),this._toggleClass(null,"ui-state-disabled",!!t)},focus:function(t,e){var i,s,n;this.blur(t,t&&"focus"===t.type),this._scrollIntoView(e),this.active=e.first(),s=this.active.children(".ui-menu-item-wrapper"),this._addClass(s,null,"ui-state-active"),this.options.role&&this.element.attr("aria-activedescendant",s.attr("id")),n=this.active.parent().closest(".ui-menu-item").children(".ui-menu-item-wrapper"),this._addClass(n,null,"ui-state-active"),t&&"keydown"===t.type?this._close():this.timer=this._delay(function(){this._close()},this.delay),i=e.children(".ui-menu"),i.length&&t&&/^mouse/.test(t.type)&&this._startOpening(i),this.activeMenu=e.parent(),this._trigger("focus",t,{item:e})},_scrollIntoView:function(e){var i,s,n,o,a,r;this._hasScroll()&&(i=parseFloat(t.css(this.activeMenu[0],"borderTopWidth"))||0,s=parseFloat(t.css(this.activeMenu[0],"paddingTop"))||0,n=e.offset().top-this.activeMenu.offset().top-i-s,o=this.activeMenu.scrollTop(),a=this.activeMenu.height(),r=e.outerHeight(),0>n?this.activeMenu.scrollTop(o+n):n+r>a&&this.activeMenu.scrollTop(o+n-a+r))},blur:function(t,e){e||clearTimeout(this.timer),this.active&&(this._removeClass(this.active.children(".ui-menu-item-wrapper"),null,"ui-state-active"),this._trigger("blur",t,{item:this.active}),this.active=null)},_startOpening:function(t){clearTimeout(this.timer),"true"===t.attr("aria-hidden")&&(this.timer=this._delay(function(){this._close(),this._open(t)},this.delay))},_open:function(e){var i=t.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(e.parents(".ui-menu")).hide().attr("aria-hidden","true"),e.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(i)},collapseAll:function(e,i){clearTimeout(this.timer),this.timer=this._delay(function(){var s=i?this.element:t(e&&e.target).closest(this.element.find(".ui-menu"));s.length||(s=this.element),this._close(s),this.blur(e),this._removeClass(s.find(".ui-state-active"),null,"ui-state-active"),this.activeMenu=s},this.delay)},_close:function(t){t||(t=this.active?this.active.parent():this.element),t.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false")},_closeOnDocumentClick:function(e){return!t(e.target).closest(".ui-menu").length},_isDivider:function(t){return!/[^\-\u2014\u2013\s]/.test(t.text())},collapse:function(t){var e=this.active&&this.active.parent().closest(".ui-menu-item",this.element);e&&e.length&&(this._close(),this.focus(t,e))},expand:function(t){var e=this.active&&this.active.children(".ui-menu ").find(this.options.items).first();e&&e.length&&(this._open(e.parent()),this._delay(function(){this.focus(t,e)}))},next:function(t){this._move("next","first",t)},previous:function(t){this._move("prev","last",t)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(t,e,i){var s;this.active&&(s="first"===t||"last"===t?this.active["first"===t?"prevAll":"nextAll"](".ui-menu-item").eq(-1):this.active[t+"All"](".ui-menu-item").eq(0)),s&&s.length&&this.active||(s=this.activeMenu.find(this.options.items)[e]()),this.focus(i,s)},nextPage:function(e){var i,s,n;return this.active?(this.isLastItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return i=t(this),0>i.offset().top-s-n}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items)[this.active?"last":"first"]())),void 0):(this.next(e),void 0)},previousPage:function(e){var i,s,n;return this.active?(this.isFirstItem()||(this._hasScroll()?(s=this.active.offset().top,n=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return i=t(this),i.offset().top-s+n>0}),this.focus(e,i)):this.focus(e,this.activeMenu.find(this.options.items).first())),void 0):(this.next(e),void 0)},_hasScroll:function(){return this.element.outerHeight()",options:{appendTo:null,autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},requestIndex:0,pending:0,_create:function(){var e,i,s,n=this.element[0].nodeName.toLowerCase(),o="textarea"===n,a="input"===n;this.isMultiLine=o||!a&&this._isContentEditable(this.element),this.valueMethod=this.element[o||a?"val":"text"],this.isNewMenu=!0,this._addClass("ui-autocomplete-input"),this.element.attr("autocomplete","off"),this._on(this.element,{keydown:function(n){if(this.element.prop("readOnly"))return e=!0,s=!0,i=!0,void 0;e=!1,s=!1,i=!1;var o=t.ui.keyCode;switch(n.keyCode){case o.PAGE_UP:e=!0,this._move("previousPage",n);break;case o.PAGE_DOWN:e=!0,this._move("nextPage",n);break;case o.UP:e=!0,this._keyEvent("previous",n);break;case o.DOWN:e=!0,this._keyEvent("next",n);break;case o.ENTER:this.menu.active&&(e=!0,n.preventDefault(),this.menu.select(n));break;case o.TAB:this.menu.active&&this.menu.select(n);break;case o.ESCAPE:this.menu.element.is(":visible")&&(this.isMultiLine||this._value(this.term),this.close(n),n.preventDefault());break;default:i=!0,this._searchTimeout(n)}},keypress:function(s){if(e)return e=!1,(!this.isMultiLine||this.menu.element.is(":visible"))&&s.preventDefault(),void 0;if(!i){var n=t.ui.keyCode;switch(s.keyCode){case n.PAGE_UP:this._move("previousPage",s);break;case n.PAGE_DOWN:this._move("nextPage",s);break;case n.UP:this._keyEvent("previous",s);break;case n.DOWN:this._keyEvent("next",s)}}},input:function(t){return s?(s=!1,t.preventDefault(),void 0):(this._searchTimeout(t),void 0)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(t){return this.cancelBlur?(delete this.cancelBlur,void 0):(clearTimeout(this.searching),this.close(t),this._change(t),void 0)}}),this._initSource(),this.menu=t("
          ").appendTo(this._appendTo()).menu({role:null}).hide().menu("instance"),this._addClass(this.menu.element,"ui-autocomplete","ui-front"),this._on(this.menu.element,{mousedown:function(e){e.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,this.element[0]!==t.ui.safeActiveElement(this.document[0])&&this.element.trigger("focus")})},menufocus:function(e,i){var s,n;return this.isNewMenu&&(this.isNewMenu=!1,e.originalEvent&&/^mouse/.test(e.originalEvent.type))?(this.menu.blur(),this.document.one("mousemove",function(){t(e.target).trigger(e.originalEvent)}),void 0):(n=i.item.data("ui-autocomplete-item"),!1!==this._trigger("focus",e,{item:n})&&e.originalEvent&&/^key/.test(e.originalEvent.type)&&this._value(n.value),s=i.item.attr("aria-label")||n.value,s&&t.trim(s).length&&(this.liveRegion.children().hide(),t("
          ").text(s).appendTo(this.liveRegion)),void 0)},menuselect:function(e,i){var s=i.item.data("ui-autocomplete-item"),n=this.previous;this.element[0]!==t.ui.safeActiveElement(this.document[0])&&(this.element.trigger("focus"),this.previous=n,this._delay(function(){this.previous=n,this.selectedItem=s})),!1!==this._trigger("select",e,{item:s})&&this._value(s.value),this.term=this._value(),this.close(e),this.selectedItem=s}}),this.liveRegion=t("
          ",{role:"status","aria-live":"assertive","aria-relevant":"additions"}).appendTo(this.document[0].body),this._addClass(this.liveRegion,null,"ui-helper-hidden-accessible"),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(t,e){this._super(t,e),"source"===t&&this._initSource(),"appendTo"===t&&this.menu.element.appendTo(this._appendTo()),"disabled"===t&&e&&this.xhr&&this.xhr.abort()},_isEventTargetInWidget:function(e){var i=this.menu.element[0];return e.target===this.element[0]||e.target===i||t.contains(i,e.target)},_closeOnClickOutside:function(t){this._isEventTargetInWidget(t)||this.close()},_appendTo:function(){var e=this.options.appendTo;return e&&(e=e.jquery||e.nodeType?t(e):this.document.find(e).eq(0)),e&&e[0]||(e=this.element.closest(".ui-front, dialog")),e.length||(e=this.document[0].body),e},_initSource:function(){var e,i,s=this;t.isArray(this.options.source)?(e=this.options.source,this.source=function(i,s){s(t.ui.autocomplete.filter(e,i.term))}):"string"==typeof this.options.source?(i=this.options.source,this.source=function(e,n){s.xhr&&s.xhr.abort(),s.xhr=t.ajax({url:i,data:e,dataType:"json",success:function(t){n(t)},error:function(){n([])}})}):this.source=this.options.source},_searchTimeout:function(t){clearTimeout(this.searching),this.searching=this._delay(function(){var e=this.term===this._value(),i=this.menu.element.is(":visible"),s=t.altKey||t.ctrlKey||t.metaKey||t.shiftKey;(!e||e&&!i&&!s)&&(this.selectedItem=null,this.search(null,t))},this.options.delay)},search:function(t,e){return t=null!=t?t:this._value(),this.term=this._value(),t.length").append(t("
          ").text(i.label)).appendTo(e)},_move:function(t,e){return this.menu.element.is(":visible")?this.menu.isFirstItem()&&/^previous/.test(t)||this.menu.isLastItem()&&/^next/.test(t)?(this.isMultiLine||this._value(this.term),this.menu.blur(),void 0):(this.menu[t](e),void 0):(this.search(null,e),void 0)},widget:function(){return this.menu.element},_value:function(){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(t,e){(!this.isMultiLine||this.menu.element.is(":visible"))&&(this._move(t,e),e.preventDefault())},_isContentEditable:function(t){if(!t.length)return!1;var e=t.prop("contentEditable");return"inherit"===e?this._isContentEditable(t.parent()):"true"===e}}),t.extend(t.ui.autocomplete,{escapeRegex:function(t){return t.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(e,i){var s=RegExp(t.ui.autocomplete.escapeRegex(i),"i");return t.grep(e,function(t){return s.test(t.label||t.value||t)})}}),t.widget("ui.autocomplete",t.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(t){return t+(t>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var i;this._superApply(arguments),this.options.disabled||this.cancelSearch||(i=e&&e.length?this.options.messages.results(e.length):this.options.messages.noResults,this.liveRegion.children().hide(),t("
          ").text(i).appendTo(this.liveRegion))}}),t.ui.autocomplete}); \ No newline at end of file diff --git a/livraison/doc/server/script-dir/jquery-ui.structure.min.css b/livraison/doc/server/script-dir/jquery-ui.structure.min.css new file mode 100644 index 0000000..e880892 --- /dev/null +++ b/livraison/doc/server/script-dir/jquery-ui.structure.min.css @@ -0,0 +1,5 @@ +/*! jQuery UI - v1.12.1 - 2018-12-06 +* http://jqueryui.com +* Copyright jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0} \ No newline at end of file diff --git a/livraison/doc/server/script.js b/livraison/doc/server/script.js new file mode 100644 index 0000000..0765364 --- /dev/null +++ b/livraison/doc/server/script.js @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var moduleSearchIndex; +var packageSearchIndex; +var typeSearchIndex; +var memberSearchIndex; +var tagSearchIndex; +function loadScripts(doc, tag) { + createElem(doc, tag, 'search.js'); + + createElem(doc, tag, 'module-search-index.js'); + createElem(doc, tag, 'package-search-index.js'); + createElem(doc, tag, 'type-search-index.js'); + createElem(doc, tag, 'member-search-index.js'); + createElem(doc, tag, 'tag-search-index.js'); +} + +function createElem(doc, tag, path) { + var script = doc.createElement(tag); + var scriptElement = doc.getElementsByTagName(tag)[0]; + script.src = pathtoroot + path; + scriptElement.parentNode.insertBefore(script, scriptElement); +} + +function show(tableId, selected, columns) { + if (tableId !== selected) { + document.querySelectorAll('div.' + tableId + ':not(.' + selected + ')') + .forEach(function(elem) { + elem.style.display = 'none'; + }); + } + document.querySelectorAll('div.' + selected) + .forEach(function(elem, index) { + elem.style.display = ''; + var isEvenRow = index % (columns * 2) < columns; + elem.classList.remove(isEvenRow ? oddRowColor : evenRowColor); + elem.classList.add(isEvenRow ? evenRowColor : oddRowColor); + }); + updateTabs(tableId, selected); +} + +function updateTabs(tableId, selected) { + document.querySelector('div#' + tableId +' .summary-table') + .setAttribute('aria-labelledby', selected); + document.querySelectorAll('button[id^="' + tableId + '"]') + .forEach(function(tab, index) { + if (selected === tab.id || (tableId === selected && index === 0)) { + tab.className = activeTableTab; + tab.setAttribute('aria-selected', true); + tab.setAttribute('tabindex',0); + } else { + tab.className = tableTab; + tab.setAttribute('aria-selected', false); + tab.setAttribute('tabindex',-1); + } + }); +} + +function switchTab(e) { + var selected = document.querySelector('[aria-selected=true]'); + if (selected) { + if ((e.keyCode === 37 || e.keyCode === 38) && selected.previousSibling) { + // left or up arrow key pressed: move focus to previous tab + selected.previousSibling.click(); + selected.previousSibling.focus(); + e.preventDefault(); + } else if ((e.keyCode === 39 || e.keyCode === 40) && selected.nextSibling) { + // right or down arrow key pressed: move focus to next tab + selected.nextSibling.click(); + selected.nextSibling.focus(); + e.preventDefault(); + } + } +} + +var updateSearchResults = function() {}; + +function indexFilesLoaded() { + return moduleSearchIndex + && packageSearchIndex + && typeSearchIndex + && memberSearchIndex + && tagSearchIndex; +} + +// Workaround for scroll position not being included in browser history (8249133) +document.addEventListener("DOMContentLoaded", function(e) { + var contentDiv = document.querySelector("div.flex-content"); + window.addEventListener("popstate", function(e) { + if (e.state !== null) { + contentDiv.scrollTop = e.state; + } + }); + window.addEventListener("hashchange", function(e) { + history.replaceState(contentDiv.scrollTop, document.title); + }); + contentDiv.addEventListener("scroll", function(e) { + var timeoutID; + if (!timeoutID) { + timeoutID = setTimeout(function() { + history.replaceState(contentDiv.scrollTop, document.title); + timeoutID = null; + }, 100); + } + }); + if (!location.hash) { + history.replaceState(contentDiv.scrollTop, document.title); + } +}); diff --git a/livraison/doc/server/search.js b/livraison/doc/server/search.js new file mode 100644 index 0000000..13aba85 --- /dev/null +++ b/livraison/doc/server/search.js @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2015, 2020, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ + +var noResult = {l: "No results found"}; +var loading = {l: "Loading search index..."}; +var catModules = "Modules"; +var catPackages = "Packages"; +var catTypes = "Classes and Interfaces"; +var catMembers = "Members"; +var catSearchTags = "Search Tags"; +var highlight = "$&"; +var searchPattern = ""; +var fallbackPattern = ""; +var RANKING_THRESHOLD = 2; +var NO_MATCH = 0xffff; +var MIN_RESULTS = 3; +var MAX_RESULTS = 500; +var UNNAMED = ""; +function escapeHtml(str) { + return str.replace(//g, ">"); +} +function getHighlightedText(item, matcher, fallbackMatcher) { + var escapedItem = escapeHtml(item); + var highlighted = escapedItem.replace(matcher, highlight); + if (highlighted === escapedItem) { + highlighted = escapedItem.replace(fallbackMatcher, highlight) + } + return highlighted; +} +function getURLPrefix(ui) { + var urlPrefix=""; + var slash = "/"; + if (ui.item.category === catModules) { + return ui.item.l + slash; + } else if (ui.item.category === catPackages && ui.item.m) { + return ui.item.m + slash; + } else if (ui.item.category === catTypes || ui.item.category === catMembers) { + if (ui.item.m) { + urlPrefix = ui.item.m + slash; + } else { + $.each(packageSearchIndex, function(index, item) { + if (item.m && ui.item.p === item.l) { + urlPrefix = item.m + slash; + } + }); + } + } + return urlPrefix; +} +function createSearchPattern(term) { + var pattern = ""; + var isWordToken = false; + term.replace(/,\s*/g, ", ").trim().split(/\s+/).forEach(function(w, index) { + if (index > 0) { + // whitespace between identifiers is significant + pattern += (isWordToken && /^\w/.test(w)) ? "\\s+" : "\\s*"; + } + var tokens = w.split(/(?=[A-Z,.()<>[\/])/); + for (var i = 0; i < tokens.length; i++) { + var s = tokens[i]; + if (s === "") { + continue; + } + pattern += $.ui.autocomplete.escapeRegex(s); + isWordToken = /\w$/.test(s); + if (isWordToken) { + pattern += "([a-z0-9_$<>\\[\\]]*?)"; + } + } + }); + return pattern; +} +function createMatcher(pattern, flags) { + var isCamelCase = /[A-Z]/.test(pattern); + return new RegExp(pattern, flags + (isCamelCase ? "" : "i")); +} +var watermark = 'Search'; +$(function() { + var search = $("#search-input"); + var reset = $("#reset-button"); + search.val(''); + search.prop("disabled", false); + reset.prop("disabled", false); + search.val(watermark).addClass('watermark'); + search.blur(function() { + if ($(this).val().length === 0) { + $(this).val(watermark).addClass('watermark'); + } + }); + search.on('click keydown paste', function() { + if ($(this).val() === watermark) { + $(this).val('').removeClass('watermark'); + } + }); + reset.click(function() { + search.val('').focus(); + }); + search.focus()[0].setSelectionRange(0, 0); +}); +$.widget("custom.catcomplete", $.ui.autocomplete, { + _create: function() { + this._super(); + this.widget().menu("option", "items", "> :not(.ui-autocomplete-category)"); + }, + _renderMenu: function(ul, items) { + var rMenu = this; + var currentCategory = ""; + rMenu.menu.bindings = $(); + $.each(items, function(index, item) { + var li; + if (item.category && item.category !== currentCategory) { + ul.append("
        • " + item.category + "
        • "); + currentCategory = item.category; + } + li = rMenu._renderItemData(ul, item); + if (item.category) { + li.attr("aria-label", item.category + " : " + item.l); + li.attr("class", "result-item"); + } else { + li.attr("aria-label", item.l); + li.attr("class", "result-item"); + } + }); + }, + _renderItem: function(ul, item) { + var label = ""; + var matcher = createMatcher(escapeHtml(searchPattern), "g"); + var fallbackMatcher = new RegExp(fallbackPattern, "gi") + if (item.category === catModules) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catPackages) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catTypes) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.l, matcher, fallbackMatcher); + } else if (item.category === catMembers) { + label = (item.p && item.p !== UNNAMED) + ? getHighlightedText(item.p + "." + item.c + "." + item.l, matcher, fallbackMatcher) + : getHighlightedText(item.c + "." + item.l, matcher, fallbackMatcher); + } else if (item.category === catSearchTags) { + label = getHighlightedText(item.l, matcher, fallbackMatcher); + } else { + label = item.l; + } + var li = $("
        • ").appendTo(ul); + var div = $("
          ").appendTo(li); + if (item.category === catSearchTags && item.h) { + if (item.d) { + div.html(label + " (" + item.h + ")
          " + + item.d + "
          "); + } else { + div.html(label + " (" + item.h + ")"); + } + } else { + if (item.m) { + div.html(item.m + "/" + label); + } else { + div.html(label); + } + } + return li; + } +}); +function rankMatch(match, category) { + if (!match) { + return NO_MATCH; + } + var index = match.index; + var input = match.input; + var leftBoundaryMatch = 2; + var periferalMatch = 0; + // make sure match is anchored on a left word boundary + if (index === 0 || /\W/.test(input[index - 1]) || "_" === input[index]) { + leftBoundaryMatch = 0; + } else if ("_" === input[index - 1] || (input[index] === input[index].toUpperCase() && !/^[A-Z0-9_$]+$/.test(input))) { + leftBoundaryMatch = 1; + } + var matchEnd = index + match[0].length; + var leftParen = input.indexOf("("); + var endOfName = leftParen > -1 ? leftParen : input.length; + // exclude peripheral matches + if (category !== catModules && category !== catSearchTags) { + var delim = category === catPackages ? "/" : "."; + if (leftParen > -1 && leftParen < index) { + periferalMatch += 2; + } else if (input.lastIndexOf(delim, endOfName) >= matchEnd) { + periferalMatch += 2; + } + } + var delta = match[0].length === endOfName ? 0 : 1; // rank full match higher than partial match + for (var i = 1; i < match.length; i++) { + // lower ranking if parts of the name are missing + if (match[i]) + delta += match[i].length; + } + if (category === catTypes) { + // lower ranking if a type name contains unmatched camel-case parts + if (/[A-Z]/.test(input.substring(matchEnd))) + delta += 5; + if (/[A-Z]/.test(input.substring(0, index))) + delta += 5; + } + return leftBoundaryMatch + periferalMatch + (delta / 200); + +} +function doSearch(request, response) { + var result = []; + searchPattern = createSearchPattern(request.term); + fallbackPattern = createSearchPattern(request.term.toLowerCase()); + if (searchPattern === "") { + return this.close(); + } + var camelCaseMatcher = createMatcher(searchPattern, ""); + var fallbackMatcher = new RegExp(fallbackPattern, "i"); + + function searchIndexWithMatcher(indexArray, matcher, category, nameFunc) { + if (indexArray) { + var newResults = []; + $.each(indexArray, function (i, item) { + item.category = category; + var ranking = rankMatch(matcher.exec(nameFunc(item)), category); + if (ranking < RANKING_THRESHOLD) { + newResults.push({ranking: ranking, item: item}); + } + return newResults.length <= MAX_RESULTS; + }); + return newResults.sort(function(e1, e2) { + return e1.ranking - e2.ranking; + }).map(function(e) { + return e.item; + }); + } + return []; + } + function searchIndex(indexArray, category, nameFunc) { + var primaryResults = searchIndexWithMatcher(indexArray, camelCaseMatcher, category, nameFunc); + result = result.concat(primaryResults); + if (primaryResults.length <= MIN_RESULTS && !camelCaseMatcher.ignoreCase) { + var secondaryResults = searchIndexWithMatcher(indexArray, fallbackMatcher, category, nameFunc); + result = result.concat(secondaryResults.filter(function (item) { + return primaryResults.indexOf(item) === -1; + })); + } + } + + searchIndex(moduleSearchIndex, catModules, function(item) { return item.l; }); + searchIndex(packageSearchIndex, catPackages, function(item) { + return (item.m && request.term.indexOf("/") > -1) + ? (item.m + "/" + item.l) : item.l; + }); + searchIndex(typeSearchIndex, catTypes, function(item) { + return request.term.indexOf(".") > -1 ? item.p + "." + item.l : item.l; + }); + searchIndex(memberSearchIndex, catMembers, function(item) { + return request.term.indexOf(".") > -1 + ? item.p + "." + item.c + "." + item.l : item.l; + }); + searchIndex(tagSearchIndex, catSearchTags, function(item) { return item.l; }); + + if (!indexFilesLoaded()) { + updateSearchResults = function() { + doSearch(request, response); + } + result.unshift(loading); + } else { + updateSearchResults = function() {}; + } + response(result); +} +$(function() { + $("#search-input").catcomplete({ + minLength: 1, + delay: 300, + source: doSearch, + response: function(event, ui) { + if (!ui.content.length) { + ui.content.push(noResult); + } else { + $("#search-input").empty(); + } + }, + autoFocus: true, + focus: function(event, ui) { + return false; + }, + position: { + collision: "flip" + }, + select: function(event, ui) { + if (ui.item.category) { + var url = getURLPrefix(ui); + if (ui.item.category === catModules) { + url += "module-summary.html"; + } else if (ui.item.category === catPackages) { + if (ui.item.u) { + url = ui.item.u; + } else { + url += ui.item.l.replace(/\./g, '/') + "/package-summary.html"; + } + } else if (ui.item.category === catTypes) { + if (ui.item.u) { + url = ui.item.u; + } else if (ui.item.p === UNNAMED) { + url += ui.item.l + ".html"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.l + ".html"; + } + } else if (ui.item.category === catMembers) { + if (ui.item.p === UNNAMED) { + url += ui.item.c + ".html" + "#"; + } else { + url += ui.item.p.replace(/\./g, '/') + "/" + ui.item.c + ".html" + "#"; + } + if (ui.item.u) { + url += ui.item.u; + } else { + url += ui.item.l; + } + } else if (ui.item.category === catSearchTags) { + url += ui.item.u; + } + if (top !== window) { + parent.classFrame.location = pathtoroot + url; + } else { + window.location.href = pathtoroot + url; + } + $("#search-input").focus(); + } + } + }); +}); diff --git a/livraison/doc/server/serialized-form.html b/livraison/doc/server/serialized-form.html new file mode 100644 index 0000000..cac8889 --- /dev/null +++ b/livraison/doc/server/serialized-form.html @@ -0,0 +1,90 @@ + + + + +Serialized Form (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Serialized Form

          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/ServerMain.html b/livraison/doc/server/server/fr/lnl/game/server/ServerMain.html new file mode 100644 index 0000000..531e7b7 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/ServerMain.html @@ -0,0 +1,158 @@ + + + + +ServerMain (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class ServerMain

          +
          +
          java.lang.Object +
          fr.lnl.game.server.ServerMain
          +
          +
          +
          +
          public class ServerMain +extends Object
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              ServerMain

              +
              public ServerMain()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              main

              +
              public static void main(String[] args)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/Game.html b/livraison/doc/server/server/fr/lnl/game/server/games/Game.html new file mode 100644 index 0000000..287817e --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/Game.html @@ -0,0 +1,471 @@ + + + + +Game (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Game

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.Game
          +
          +
          +
          +
          public class Game +extends Object
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              grid

              +
              private final Grid grid
              +
              +
            • +
            • +
              +

              players

              +
              private final List<Player> players
              +
              +
            • +
            • +
              +

              currentPlayer

              +
              private Player currentPlayer
              +
              +
            • +
            • +
              +

              selectedAction

              +
              private Action selectedAction
              +
              +
            • +
            • +
              +

              nbrTurn

              +
              private int nbrTurn
              +
              +
            • +
            • +
              +

              previousPlayer

              +
              private Player previousPlayer
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              initGame

              +
              public void initGame(GridFactoryBuilder buildStrategy)
              +
              Initialize a game by placing players on the grid and by generating current player available actions
              +
              +
              Parameters:
              +
              buildStrategy - builder used to create a grid
              +
              +
              +
            • +
            • +
              +

              play

              +
              public boolean play()
              +
              Game "main" method, call by a controller after human chose an action or when a computer player play an action + Method is call everytime an action has been chosen by a human or when aa computer player need to play
              +
              +
              Returns:
              +
              true if game is over, false otherwise
              +
              +
              +
            • +
            • +
              +

              gridPlayersUpdate

              +
              private void gridPlayersUpdate()
              +
              Remove dead players from the grid
              +
              +
            • +
            • +
              +

              countdownGridElementsUpdate

              +
              private void countdownGridElementsUpdate()
              +
              play grid's elements that use a timer like Bomb at each game tick
              +
              +
            • +
            • +
              +

              generateAndGetPlayerActions

              +
              public List<Action> generateAndGetPlayerActions(Player player)
              +
              Used to list all actions a player can execute at current time
              +
              +
              Parameters:
              +
              player - the player to generate actions
              +
              Returns:
              +
              a list of available actions
              +
              +
              +
            • +
            • +
              +

              getPlayersAlive

              +
              public Stream<Player> getPlayersAlive()
              +
              +
              Returns:
              +
              a list of alive players
              +
              +
              +
            • +
            • +
              +

              getPlayersNotAlive

              +
              public Stream<Player> getPlayersNotAlive()
              +
              Opposite of getPlayersAlive()
              +
              +
              Returns:
              +
              a list of dead players
              +
              +
              +
            • +
            • +
              +

              isOver

              +
              public boolean isOver()
              +
              A game is over if the number of alive players is inferior to 2
              +
              +
              Returns:
              +
              true if game is over, false otherwise
              +
              +
              +
            • +
            • +
              +

              getWinner

              +
              public Player getWinner()
              +
              +
              Returns:
              +
              the winner of the game if exists, null otherwise.
              + return the only remaining alive player when it exists, or null if everyone is dead, per example when a bomb kill + the 2 remaining players
              +
              +
              +
            • +
            • +
              +

              getCurrentPlayer

              +
              public Player getCurrentPlayer()
              +
              +
              Returns:
              +
              the player who is currently playing
              +
              +
              +
            • +
            • +
              +

              nextCurrentPlayer

              +
              public void nextCurrentPlayer()
              +
              Change player to the next available in the list.
              + We set its shield deploy state to false.
              +
              +
            • +
            • +
              +

              setCurrentPlayer

              +
              public void setCurrentPlayer(Player current_player)
              +
              +
              Parameters:
              +
              current_player - the new current player
              +
              +
              +
            • +
            • +
              +

              getGrid

              +
              public Grid getGrid()
              +
              +
            • +
            • +
              +

              getPlayers

              +
              public List<Player> getPlayers()
              +
              +
            • +
            • +
              +

              getSelectedAction

              +
              public Action getSelectedAction()
              +
              +
              Returns:
              +
              action selected by current player if not already executed or last player if already executed
              +
              +
              +
            • +
            • +
              +

              setSelectedAction

              +
              public void setSelectedAction(Action selectedAction)
              +
              +
              Parameters:
              +
              selectedAction - set the action selected by current player before doing it
              +
              +
              +
            • +
            • +
              +

              getNbrTurn

              +
              public int getNbrTurn()
              +
              +
            • +
            • +
              +

              getPreviousPlayer

              +
              public Player getPreviousPlayer()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/AbstractAction.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/AbstractAction.html new file mode 100644 index 0000000..b04145c --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/AbstractAction.html @@ -0,0 +1,179 @@ + + + + +AbstractAction (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class AbstractAction

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          Direct Known Subclasses:
          +
          DeployShield, DropObject, Move, Nothing, Shot
          +
          +
          +
          public abstract class AbstractAction +extends Object +implements Action
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              game

              +
              protected final Game game
              +
              +
            • +
            • +
              +

              player

              +
              protected final Player player
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              AbstractAction

              +
              public AbstractAction(Game game, + Player player)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Action.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Action.html new file mode 100644 index 0000000..38a3b4a --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Action.html @@ -0,0 +1,169 @@ + + + + +Action (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface Action

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          AbstractAction, DeployShield, DropBomb, DropMine, DropObject, Move, Nothing, Shot
          +
          +
          +
          public interface Action
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              doAction

              +
              void doAction()
              +
              Call by Game when player do this action
              +
              +
            • +
            • +
              +

              isPossible

              +
              boolean isPossible()
              +
              +
              Returns:
              +
              true if this action is possible, false otherwise
              +
              +
              +
            • +
            • +
              +

              getPoint

              +
              Point getPoint()
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              List<Point> getValidPoint()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/DeployShield.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/DeployShield.html new file mode 100644 index 0000000..7c20cbb --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/DeployShield.html @@ -0,0 +1,219 @@ + + + + +DeployShield (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class DeployShield

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction +
          fr.lnl.game.server.games.action.DeployShield
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class DeployShield +extends AbstractAction
          +
          Used when a player want to protect himself from taking damage (shield state is reset to false at next player turn)
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              DeployShield

              +
              public DeployShield(Player player)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              doAction

              +
              public void doAction()
              +
              Deploy player shield and decrement its energy
              +
              +
            • +
            • +
              +

              isPossible

              +
              public boolean isPossible()
              +
              This action is always possible
              +
              +
              Returns:
              +
              always true
              +
              +
              +
            • +
            • +
              +

              getPoint

              +
              public Point getPoint()
              +
              Description copied from interface: Action
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              public List<Point> getValidPoint()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction.html new file mode 100644 index 0000000..1048eb6 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction.html @@ -0,0 +1,137 @@ + + + + +Direction (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface Direction

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          Direction4Axis, Direction8Axis
          +
          +
          +
          public interface Direction
          +
          +
          +
            + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            int
            + +
             
            +
            int
            + +
             
            +
            +
            +
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              getDeltaX

              +
              int getDeltaX()
              +
              +
            • +
            • +
              +

              getDeltaY

              +
              int getDeltaY()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction4Axis.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction4Axis.html new file mode 100644 index 0000000..72c4414 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction4Axis.html @@ -0,0 +1,359 @@ + + + + +Direction4Axis (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Enum Class Direction4Axis

          +
          +
          java.lang.Object +
          java.lang.Enum<Direction4Axis> +
          fr.lnl.game.server.games.action.Direction4Axis
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Direction, Serializable, Comparable<Direction4Axis>, Constable
          +
          +
          +
          public enum Direction4Axis +extends Enum<Direction4Axis> +implements Direction
          +
          Enum used to chose where to move, shot, etc.
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Enum Constant Details

            + +
            +
          • + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              deltaX

              +
              private final int deltaX
              +
              +
            • +
            • +
              +

              deltaY

              +
              private final int deltaY
              +
              +
            • +
            • +
              +

              isVertical

              +
              private final boolean isVertical
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Direction4Axis

              +
              private Direction4Axis(int i, + int i1, + boolean isVertical)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              values

              +
              public static Direction4Axis[] values()
              +
              Returns an array containing the constants of this enum class, in +the order they are declared.
              +
              +
              Returns:
              +
              an array containing the constants of this enum class, in the order they are declared
              +
              +
              +
            • +
            • +
              +

              valueOf

              +
              public static Direction4Axis valueOf(String name)
              +
              Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
              +
              +
              Parameters:
              +
              name - the name of the enum constant to be returned.
              +
              Returns:
              +
              the enum constant with the specified name
              +
              Throws:
              +
              IllegalArgumentException - if this enum class has no constant with the specified name
              +
              NullPointerException - if the argument is null
              +
              +
              +
            • +
            • +
              +

              getDeltaX

              +
              public int getDeltaX()
              +
              +
              Specified by:
              +
              getDeltaX in interface Direction
              +
              +
              +
            • +
            • +
              +

              getDeltaY

              +
              public int getDeltaY()
              +
              +
              Specified by:
              +
              getDeltaY in interface Direction
              +
              +
              +
            • +
            • +
              +

              isVertical

              +
              public boolean isVertical()
              +
              Used by Shot to know if the direction is in vertical direction cause shot action can have a different + distance depending on the direction
              +
              +
              Returns:
              +
              true if the direction is vertical
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction8Axis.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction8Axis.html new file mode 100644 index 0000000..9f3ad4d --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Direction8Axis.html @@ -0,0 +1,361 @@ + + + + +Direction8Axis (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Enum Class Direction8Axis

          +
          +
          java.lang.Object +
          java.lang.Enum<Direction8Axis> +
          fr.lnl.game.server.games.action.Direction8Axis
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Direction, Serializable, Comparable<Direction8Axis>, Constable
          +
          +
          +
          public enum Direction8Axis +extends Enum<Direction8Axis> +implements Direction
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Enum Constant Details

            + +
            +
          • + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              deltaX

              +
              private final int deltaX
              +
              +
            • +
            • +
              +

              deltaY

              +
              private final int deltaY
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Direction8Axis

              +
              private Direction8Axis(int i, + int i1)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              values

              +
              public static Direction8Axis[] values()
              +
              Returns an array containing the constants of this enum class, in +the order they are declared.
              +
              +
              Returns:
              +
              an array containing the constants of this enum class, in the order they are declared
              +
              +
              +
            • +
            • +
              +

              valueOf

              +
              public static Direction8Axis valueOf(String name)
              +
              Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
              +
              +
              Parameters:
              +
              name - the name of the enum constant to be returned.
              +
              Returns:
              +
              the enum constant with the specified name
              +
              Throws:
              +
              IllegalArgumentException - if this enum class has no constant with the specified name
              +
              NullPointerException - if the argument is null
              +
              +
              +
            • +
            • +
              +

              getDeltaX

              +
              public int getDeltaX()
              +
              +
              Specified by:
              +
              getDeltaX in interface Direction
              +
              +
              +
            • +
            • +
              +

              getDeltaY

              +
              public int getDeltaY()
              +
              +
              Specified by:
              +
              getDeltaY in interface Direction
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/DropBomb.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropBomb.html new file mode 100644 index 0000000..cd9945a --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropBomb.html @@ -0,0 +1,194 @@ + + + + +DropBomb (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class DropBomb

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class DropBomb +extends DropObject
          +
          Used when player want to drop a Bomb, bomb explode when someone walks on it and after 3 turns
          +
          +
          + +
          +
          + +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/DropMine.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropMine.html new file mode 100644 index 0000000..6f086f2 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropMine.html @@ -0,0 +1,194 @@ + + + + +DropMine (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class DropMine

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class DropMine +extends DropObject
          +
          Used when player want to drop a Mine, Mine only explode when someone walks on it
          +
          +
          + +
          +
          + +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/DropObject.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropObject.html new file mode 100644 index 0000000..4ecfd27 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/DropObject.html @@ -0,0 +1,275 @@ + + + + +DropObject (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class DropObject

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction +
          fr.lnl.game.server.games.action.DropObject
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          Direct Known Subclasses:
          +
          DropBomb, DropMine
          +
          +
          +
          public abstract class DropObject +extends AbstractAction
          +
          Super class used by DropMine and DropBomb
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              point

              +
              protected final Point point
              +
              +
            • +
            • +
              +

              direction

              +
              private final Direction8Axis direction
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              isPossible

              +
              public boolean isPossible()
              +
              +
              Returns:
              +
              true if player can play this action in current context, false otherwise
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              public List<Point> getValidPoint()
              +
              +
              Returns:
              +
              a list of point where it's possible to place a bomb of a mine. + We add a point where there is nothing on the board.
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              getDirection

              +
              public Direction8Axis getDirection()
              +
              +
            • +
            • +
              +

              getPoint

              +
              public Point getPoint()
              +
              Description copied from interface: Action
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Move.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Move.html new file mode 100644 index 0000000..4e46a39 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Move.html @@ -0,0 +1,277 @@ + + + + +Move (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Move

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction +
          fr.lnl.game.server.games.action.Move
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class Move +extends AbstractAction
          +
          Used when the player want to move in a direction, it can move in a direction when there is another player or a wall
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              point

              +
              private final Point point
              +
              +
            • +
            • +
              +

              direction

              +
              private final Direction4Axis direction
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              doAction

              +
              public void doAction()
              +
              Move player to its new position and decrement its point
              +
              +
            • +
            • +
              +

              isPossible

              +
              public boolean isPossible()
              +
              +
              Returns:
              +
              true if player can play this action in current context, false otherwise
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              public List<Point> getValidPoint()
              +
              +
              Returns:
              +
              a list of point where it's possible to move. + We add a point to the list where there is nothing on the board.
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              getPoint

              +
              public Point getPoint()
              +
              Description copied from interface: Action
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            • +
              +

              getDirection

              +
              public Direction4Axis getDirection()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.html new file mode 100644 index 0000000..7b87a18 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.html @@ -0,0 +1,147 @@ + + + + +NoMoreBulletInWeaponException (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class NoMoreBulletInWeaponException

          +
          +
          java.lang.Object +
          java.lang.Throwable +
          java.lang.Exception +
          fr.lnl.game.server.games.action.NoMoreBulletInWeaponException
          +
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Serializable
          +
          +
          +
          public class NoMoreBulletInWeaponException +extends Exception
          +
          This exception is throw when player has no remaining bullet
          +
          +
          See Also:
          +
          + +
          +
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              NoMoreBulletInWeaponException

              +
              public NoMoreBulletInWeaponException()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/NotValidDirectionException.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/NotValidDirectionException.html new file mode 100644 index 0000000..d06fc03 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/NotValidDirectionException.html @@ -0,0 +1,147 @@ + + + + +NotValidDirectionException (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class NotValidDirectionException

          +
          +
          java.lang.Object +
          java.lang.Throwable +
          java.lang.Exception +
          fr.lnl.game.server.games.action.NotValidDirectionException
          +
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Serializable
          +
          +
          +
          public class NotValidDirectionException +extends Exception
          +
          throw when action instantiated and the chosen direction in constructor isn't valid
          +
          +
          See Also:
          +
          + +
          +
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              NotValidDirectionException

              +
              public NotValidDirectionException(String message)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Nothing.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Nothing.html new file mode 100644 index 0000000..2fdf389 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Nothing.html @@ -0,0 +1,219 @@ + + + + +Nothing (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Nothing

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction +
          fr.lnl.game.server.games.action.Nothing
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class Nothing +extends AbstractAction
          +
          This action is used when player doesn't want to move and/or loose energy
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Nothing

              +
              public Nothing()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              doAction

              +
              public void doAction()
              +
              doAction in this context don't execute any operation
              +
              +
            • +
            • +
              +

              isPossible

              +
              public boolean isPossible()
              +
              This action is always possible
              +
              +
              Returns:
              +
              always true
              +
              +
              +
            • +
            • +
              +

              getPoint

              +
              public Point getPoint()
              +
              Description copied from interface: Action
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              public List<Point> getValidPoint()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/ReunionSameAction.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/ReunionSameAction.html new file mode 100644 index 0000000..0f9c756 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/ReunionSameAction.html @@ -0,0 +1,235 @@ + + + + +ReunionSameAction (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class ReunionSameAction

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.ReunionSameAction
          +
          +
          +
          +
          public class ReunionSameAction +extends Object
          +
          When we generate action, we generate one per available direction (like in Move) but to improve human + readability, we list every same Action here
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              actionName

              +
              private final String actionName
              +
              +
            • +
            • +
              +

              actions

              +
              private List<Action> actions
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              ReunionSameAction

              +
              public ReunionSameAction(String actionName)
              +
              +
            • +
            • +
              +

              ReunionSameAction

              +
              public ReunionSameAction(String actionName, + Action action)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              getActions

              +
              public List<Action> getActions()
              +
              +
            • +
            • +
              +

              getActionName

              +
              public String getActionName()
              +
              +
            • +
            • +
              +

              getAction

              +
              public Action getAction(int value)
              +
              +
            • +
            • +
              +

              addAction

              +
              public void addAction(Action action)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/Shot.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/Shot.html new file mode 100644 index 0000000..eef30b1 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/Shot.html @@ -0,0 +1,306 @@ + + + + +Shot (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Shot

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.action.AbstractAction +
          fr.lnl.game.server.games.action.Shot
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Action
          +
          +
          +
          public class Shot +extends AbstractAction
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              point

              +
              private final Point point
              +
              +
            • +
            • +
              +

              direction

              +
              private final Direction4Axis direction
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              doAction

              +
              public void doAction()
              +
              We decrement player's energy and shot on every of its opponents on the chosen direction by decrementing its + energy too
              +
              +
            • +
            • +
              +

              isPossible

              +
              public boolean isPossible()
              +
              +
              Returns:
              +
              true if player can play this action in current context, false otherwise
              +
              +
              +
            • +
            • +
              +

              getValidPoint

              +
              public List<Point> getValidPoint()
              +
              +
              Returns:
              +
              a list of point where it's possible to shot. + We add a point to the list where there is a player depending on the direction and the distance the weapon can + shoot.
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              seeNeighbour

              +
              public Point seeNeighbour(Point point, + int deltaX, + int deltaY, + int range)
              +
              +
              Parameters:
              +
              point - player current position
              +
              deltaX - given by Direction4Axis
              +
              deltaY - given by Direction4Axis
              +
              range - given by Weapon.getHorizontalDistance() or Weapon.getVerticalDistance()
              +
              Returns:
              +
              true if there is a player in the chosen direction, false otherwise
              +
              +
              +
            • +
            • +
              +

              getPoint

              +
              public Point getPoint()
              +
              Description copied from interface: Action
              +
              Used by Move, Shot and DropObject to list all direction where the action is possible
              +
              +
              Returns:
              +
              a list a point where the action is possible (not block by a wall per example)
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/package-summary.html new file mode 100644 index 0000000..e428e16 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/package-summary.html @@ -0,0 +1,165 @@ + + + + +fr.lnl.game.server.games.action (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.action

          +
          +
          +
          package fr.lnl.game.server.games.action
          +
          +
          Package storing all actions a player can do
          +
          +
          +
            +
          • + +
          • +
          • +
            +
            +
            +
            +
            Class
            +
            Description
            + +
             
            + +
             
            + +
            +
            Used when a player want to protect himself from taking damage (shield state is reset to false at next player turn)
            +
            + +
             
            + +
            +
            Enum used to chose where to move, shot, etc.
            +
            + +
             
            + +
            +
            Used when player want to drop a Bomb, bomb explode when someone walks on it and after 3 turns
            +
            + +
            +
            Used when player want to drop a Mine, Mine only explode when someone walks on it
            +
            + +
            +
            Super class used by DropMine and DropBomb
            +
            + +
            +
            Used when the player want to move in a direction, it can move in a direction when there is another player or a wall
            +
            + +
            +
            This exception is throw when player has no remaining bullet
            +
            + +
            +
            This action is used when player doesn't want to move and/or loose energy
            +
            + +
            +
            throw when action instantiated and the chosen direction in constructor isn't valid
            +
            + +
            +
            When we generate action, we generate one per available direction (like in Move) but to improve human + readability, we list every same Action here
            +
            + +
             
            +
            +
            +
            +
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/action/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/action/package-tree.html new file mode 100644 index 0000000..b15f2d2 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/action/package-tree.html @@ -0,0 +1,116 @@ + + + + +fr.lnl.game.server.games.action Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.action

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +

          Interface Hierarchy

          +
            +
          • fr.lnl.game.server.games.action.Action
          • +
          • fr.lnl.game.server.games.action.Direction
          • +
          +
          +
          +

          Enum Class Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/Grid.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/Grid.html new file mode 100644 index 0000000..e8731d4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/Grid.html @@ -0,0 +1,396 @@ + + + + +Grid (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Grid

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.Grid
          +
          +
          +
          +
          public class Grid +extends Object
          +
          Class managing the board
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              board

              +
              private final HashMap<Point,Pair<Player,Box>> board
              +
              +
            • +
            • +
              +

              row

              +
              private final int row
              +
              +
            • +
            • +
              +

              column

              +
              private final int column
              +
              +
            • +
            • +
              +

              players

              +
              private final List<Player> players
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Grid

              +
              public Grid(int row, + int column, + List<Player> players)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              boardPositionIsValid

              +
              public boolean boardPositionIsValid(int row, + int deltaRow, + int column, + int deltaColumn)
              +
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              boardPositionIsValid

              +
              public boolean boardPositionIsValid(int row, + int column)
              +
              Check if given position is in grid area
              +
              +
              Returns:
              +
              true if position is valid, false otehrwise
              +
              +
              +
            • +
            • +
              +

              boardPositionIsValid

              +
              public boolean boardPositionIsValid(Point point)
              +
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              getNumberNeutralBox

              +
              public int getNumberNeutralBox()
              +
              +
              Returns:
              +
              the number of neutral box
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              isNeutralBox

              +
              public boolean isNeutralBox(Box box)
              +
              +
              Parameters:
              +
              box - the box we'll look state
              +
              Returns:
              +
              true if box isn't a Wall or a EnergyBall
              +
              +
              +
            • +
            • +
              +

              toString

              +
              public String toString()
              +
              Given a string representation of the board.
              + Some characters in given string are in UTF-8 and can be poorly displayed if using an incompatible encoding, like + on Windows where french regional encoding is windows-1252
              +
              +
              Overrides:
              +
              toString in class Object
              +
              Returns:
              +
              a string view of a board
              +
              +
              +
            • +
            • +
              +

              privateView

              +
              public String privateView(Player player)
              +
              +
            • +
            • +
              +

              getBoard

              +
              public HashMap<Point,Pair<Player,Box>> getBoard()
              +
              +
            • +
            • +
              +

              getGridPlayer

              +
              public Player getGridPlayer(Point point)
              +
              +
            • +
            • +
              +

              getGridBox

              +
              public Box getGridBox(Point point)
              +
              +
            • +
            • +
              +

              getPlayers

              +
              public List<Player> getPlayers()
              +
              +
            • +
            • +
              +

              getRow

              +
              public int getRow()
              +
              +
            • +
            • +
              +

              getColumn

              +
              public int getColumn()
              +
              +
            • +
            • +
              +

              getAllCountdownElements

              +
              public List<CountdownBox> getAllCountdownElements()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.html new file mode 100644 index 0000000..e8fe82c --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.html @@ -0,0 +1,430 @@ + + + + +AbstractGridFactoryBuilder (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class AbstractGridFactoryBuilder

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          GridFactoryBuilder
          +
          +
          +
          Direct Known Subclasses:
          +
          LockGridFactoryBuilder
          +
          +
          +
          public abstract class AbstractGridFactoryBuilder +extends Object +implements GridFactoryBuilder
          +
          +
          + +
          +
          + +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.html new file mode 100644 index 0000000..dc8e6b0 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.html @@ -0,0 +1,235 @@ + + + + +GridFactoryBuilder (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface GridFactoryBuilder

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          AbstractGridFactoryBuilder, LockGridFactoryBuilder
          +
          +
          +
          public interface GridFactoryBuilder
          +
          Factory pattern
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              energyProbability

              +
              GridFactoryBuilder energyProbability(float probability)
              +
              Set energy probability
              +
              +
              Parameters:
              +
              probability - energy probability, which will be used by + AbstractGridFactoryBuilder.initPlaceEnergyBall() when calling build()
              +
              Returns:
              +
              this
              +
              +
              +
            • +
            • +
              +

              wallProbability

              +
              GridFactoryBuilder wallProbability(float probability)
              +
              Set wall probability
              +
              +
              Parameters:
              +
              probability - wall probability, which will be used by + AbstractGridFactoryBuilder.initPlaceInternWall() when calling build()
              +
              Returns:
              +
              this
              +
              +
              +
            • +
            • +
              +

              gridDimensions

              +
              GridFactoryBuilder gridDimensions(int row, + int columns)
              +
              set grid dimensions. + Arguments are given when instancing Grid when using build()
              +
              +
              Parameters:
              +
              row - row grid's size
              +
              columns - columns grid's size
              +
              Returns:
              +
              this
              +
              +
              +
            • +
            • +
              +

              playersList

              +
              GridFactoryBuilder playersList(List<Player> players)
              +
              set players list. + Argument given to Grid when calling build()
              +
              +
              Parameters:
              +
              players - list a players
              +
              Returns:
              +
              this
              +
              +
              +
            • +
            • +
              +

              build

              +
              Grid build()
              +
              Call this method after you call {energyProbability(float)}, + wallProbability(float), gridDimensions(int, int) and + playersList(List), It'll instantiate a new Grid and initialize his components + like border walls, intern walls, and energy using parameters given previously
              +
              +
              Returns:
              +
              an instance of Grid
              +
              +
              +
            • +
            • +
              +

              initPlacePlayers

              +
              void initPlacePlayers()
              +
              call when initializing the game, it'll place player depending on the strategy used by its implementation, + need to be call after build, call an NullPointerException otherwise
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.html new file mode 100644 index 0000000..022ee9c --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.html @@ -0,0 +1,289 @@ + + + + +LockGridFactoryBuilder (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class LockGridFactoryBuilder

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.build.AbstractGridFactoryBuilder +
          fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          GridFactoryBuilder
          +
          +
          +
          public class LockGridFactoryBuilder +extends AbstractGridFactoryBuilder
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              LockGridFactoryBuilder

              +
              protected LockGridFactoryBuilder()
              +
              this method is protected to avoid new instance outside of GridFactoryBuilder context
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              create

              +
              public static GridFactoryBuilder create()
              +
              +
              Returns:
              +
              a new instance of LockGridFactoryBuilder used to construct a Grid
              +
              +
              +
            • +
            • +
              +

              initGrid

              +
              protected void initGrid()
              +
              Method used to initialize grid
              + We place walls on every border, and we initialize board value as null where there is no need o border walls
              +
              +
              Specified by:
              +
              initGrid in class AbstractGridFactoryBuilder
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              initPlaceEnergyBall

              +
              protected void initPlaceEnergyBall()
              +
              Method used to initialize energy balls, we place energy balls using a random value and a probability and where + there is no walls
              +
              +
              Specified by:
              +
              initPlaceEnergyBall in class AbstractGridFactoryBuilder
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              initPlaceInternWall

              +
              protected void initPlaceInternWall()
              +
              Method used to place intern walls (opposite of border walls), we place walls using a random value and a + probability and where there is no walls or where the position haven't a lock
              +
              +
              Specified by:
              +
              initPlaceInternWall in class AbstractGridFactoryBuilder
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              initPlacePlayers

              +
              public void initPlacePlayers()
              +
              Simply place player randomly where it's possible
              +
              +
            • +
            • +
              +

              getIllusionNumberWallNeighbour

              +
              private int getIllusionNumberWallNeighbour(Point point)
              +
              A locked place is used to try to avoid player to be blocked when playing, + A locked place can't have a wall on it
              +
              +
              Parameters:
              +
              point - the position where we want to place a new wall
              +
              Returns:
              +
              number of walls and locked place around position
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-summary.html new file mode 100644 index 0000000..16d7b06 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-summary.html @@ -0,0 +1,114 @@ + + + + +fr.lnl.game.server.games.grid.build (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.grid.build

          +
          +
          +
          package fr.lnl.game.server.games.grid.build
          +
          +
          Package containing all about Grid construction
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-tree.html new file mode 100644 index 0000000..c6d6897 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/build/package-tree.html @@ -0,0 +1,80 @@ + + + + +fr.lnl.game.server.games.grid.build Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.grid.build

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +

          Interface Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/AbstractBox.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/AbstractBox.html new file mode 100644 index 0000000..f83a464 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/AbstractBox.html @@ -0,0 +1,223 @@ + + + + +AbstractBox (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class AbstractBox

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.elements.AbstractBox
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Box
          +
          +
          +
          Direct Known Subclasses:
          +
          EnergyBall, Explosive, Wall
          +
          +
          +
          public class AbstractBox +extends Object +implements Box
          +
          AbstractBox is instantiable (not an abstract class), but when it's the case, instance doesn't represent anything, + it's only to see if there is a lock on this position or not
          +
          +
          +
            + +
          • +
            +

            Field Summary

            +
            Fields
            +
            +
            Modifier and Type
            +
            Field
            +
            Description
            +
            (package private) boolean
            + +
             
            +
            +
            +
          • + +
          • +
            +

            Constructor Summary

            +
            Constructors
            +
            +
            Constructor
            +
            Description
            + +
             
            +
            +
            +
          • + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            boolean
            + +
             
            +
            void
            +
            setLock(boolean lock)
            +
             
            +
            +
            +
            +
            +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              lock

              +
              boolean lock
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              AbstractBox

              +
              public AbstractBox()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              setLock

              +
              public void setLock(boolean lock)
              +
              +
              Specified by:
              +
              setLock in interface Box
              +
              +
              +
            • +
            • +
              +

              isLock

              +
              public boolean isLock()
              +
              +
              Specified by:
              +
              isLock in interface Box
              +
              Returns:
              +
              true if this box is locked (can't place wall on this position)
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Bomb.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Bomb.html new file mode 100644 index 0000000..1b0ab57 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Bomb.html @@ -0,0 +1,293 @@ + + + + +Bomb (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Bomb

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Box, CountdownBox, InteractiveBox
          +
          +
          +
          public class Bomb +extends Explosive +implements CountdownBox
          +
          Bomb are elements which explode when someone walks on it or after a countdown, the explosion area is on multiple cases
          +
          +
          +
            + +
          • +
            +

            Field Summary

            +
            Fields
            +
            +
            Modifier and Type
            +
            Field
            +
            Description
            +
            private int
            + +
            +
            Timer before explosion
            +
            +
            private static final int
            + +
            +
            Explosion size, size is circle, not square
            +
            +
            private final Game
            + +
             
            +
            +
            +

            Fields inherited from class fr.lnl.game.server.games.grid.elements.Explosive

            +player, point
            +
            +

            Fields inherited from class fr.lnl.game.server.games.grid.elements.AbstractBox

            +lock
            +
            +
          • + +
          • +
            +

            Constructor Summary

            +
            Constructors
            +
            +
            Constructor
            +
            Description
            +
            Bomb(Point point, + Game game)
            +
             
            +
            +
            +
          • + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            protected void
            +
            explode(Grid grid)
            +
            +
            Apply damage to players and delete this object
            +
            +
            double
            +
            pythagoras(double a, + double b)
            +
             
            +
            void
            + +
            +
            When the timer (counter) goes down to 0, the bomb explode
            +
            +
            +
            +
            +
            +

            Methods inherited from class fr.lnl.game.server.games.grid.elements.Explosive

            +getPlayer, interact
            +
            +

            Methods inherited from class fr.lnl.game.server.games.grid.elements.AbstractBox

            +isLock, setLock
            +
            +

            Methods inherited from class java.lang.Object

            +clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              game

              +
              private final Game game
              +
              +
            • +
            • +
              +

              counter

              +
              private int counter
              +
              Timer before explosion
              +
              +
            • +
            • +
              +

              EXPLOSION_SIZE

              +
              private static final int EXPLOSION_SIZE
              +
              Explosion size, size is circle, not square
              +
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Bomb

              +
              public Bomb(Point point, + Game game)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              explode

              +
              protected void explode(Grid grid)
              +
              Description copied from class: Explosive
              +
              Apply damage to players and delete this object
              +
              +
              Overrides:
              +
              explode in class Explosive
              +
              Parameters:
              +
              grid - game's grid
              +
              +
              +
            • +
            • +
              +

              update

              +
              public void update()
              +
              When the timer (counter) goes down to 0, the bomb explode
              +
              +
              Specified by:
              +
              update in interface CountdownBox
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              pythagoras

              +
              public double pythagoras(double a, + double b)
              +
              +
              Parameters:
              +
              a - adjacent side of a triangle
              +
              b - opposite side of a triangle
              +
              Returns:
              +
              Pythagoras' theorem value
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Box.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Box.html new file mode 100644 index 0000000..04e23d6 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Box.html @@ -0,0 +1,147 @@ + + + + +Box (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface Box

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          AbstractBox, Bomb, EnergyBall, Explosive, Mine, Wall
          +
          +
          +
          public interface Box
          +
          +
          +
            + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            boolean
            + +
             
            +
            void
            +
            setLock(boolean lock)
            +
             
            +
            +
            +
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              isLock

              +
              boolean isLock()
              +
              +
              Returns:
              +
              true if this box is locked (can't place wall on this position)
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              setLock

              +
              void setLock(boolean lock)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/CountdownBox.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/CountdownBox.html new file mode 100644 index 0000000..9263d13 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/CountdownBox.html @@ -0,0 +1,132 @@ + + + + +CountdownBox (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface CountdownBox

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          Bomb
          +
          +
          +
          public interface CountdownBox
          +
          A box implemented by CountdownBox is a box which do an action a certain time after being placed
          +
          +
          +
            + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            void
            + +
            +
            Call at each game tick (After a player do an action)
            +
            +
            +
            +
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              update

              +
              void update()
              +
              Call at each game tick (After a player do an action)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/EnergyBall.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/EnergyBall.html new file mode 100644 index 0000000..b67bcb7 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/EnergyBall.html @@ -0,0 +1,219 @@ + + + + +EnergyBall (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class EnergyBall

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.elements.AbstractBox +
          fr.lnl.game.server.games.grid.elements.EnergyBall
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Box, InteractiveBox
          +
          +
          +
          public class EnergyBall +extends AbstractBox +implements InteractiveBox
          +
          An EnergyBall is a box which give back a bit of player energy after it walks on the ball
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              EnergyBall

              +
              public EnergyBall()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              interact

              +
              public void interact(Grid grid, + Player player, + Point position)
              +
              Increment energy of player who walks on this element
              +
              +
              Specified by:
              +
              interact in interface InteractiveBox
              +
              Parameters:
              +
              grid - Game's grid
              +
              player - the player who walks on this element
              +
              position - position of this element on the grid
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              equals

              +
              public boolean equals(Object obj)
              +
              Used by tests
              +
              +
              Overrides:
              +
              equals in class Object
              +
              Parameters:
              +
              obj - the object to compare
              +
              Returns:
              +
              true if obj is an instance of EnergyBall, false otherwise
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Explosive.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Explosive.html new file mode 100644 index 0000000..a0eb6b8 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Explosive.html @@ -0,0 +1,269 @@ + + + + +Explosive (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Explosive

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.elements.AbstractBox +
          fr.lnl.game.server.games.grid.elements.Explosive
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Box, InteractiveBox
          +
          +
          +
          Direct Known Subclasses:
          +
          Bomb, Mine
          +
          +
          +
          public abstract class Explosive +extends AbstractBox +implements InteractiveBox
          +
          Super class of Bomb and Mine
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              point

              +
              protected final Point point
              +
              Position of the explosive
              +
              +
            • +
            • +
              +

              player

              +
              protected final Player player
              +
              Owner of the explosive
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Explosive

              +
              public Explosive(Player player, + Point point)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              interact

              +
              public void interact(Grid grid, + Player player, + Point position)
              +
              Decrement energy of the player who walks on this element
              +
              +
              Specified by:
              +
              interact in interface InteractiveBox
              +
              Parameters:
              +
              grid - Game's grid
              +
              player - the player who walks on this element
              +
              position - position of this element on the grid
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              explode

              +
              protected void explode(Grid grid)
              +
              Apply damage to players and delete this object
              +
              +
              Parameters:
              +
              grid - game's grid
              +
              +
              +
            • +
            • +
              +

              getPlayer

              +
              public Player getPlayer()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/InteractiveBox.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/InteractiveBox.html new file mode 100644 index 0000000..236cf6c --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/InteractiveBox.html @@ -0,0 +1,142 @@ + + + + +InteractiveBox (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface InteractiveBox

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          Bomb, EnergyBall, Explosive, Mine
          +
          +
          +
          public interface InteractiveBox
          +
          A box implemented by InteractiveBox is a box which do an action when someone walks on it
          +
          +
          +
            + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            void
            +
            interact(Grid grid, + Player player, + Point position)
            +
            +
            Call when a player walk on it
            +
            +
            +
            +
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              interact

              +
              void interact(Grid grid, + Player player, + Point position)
              +
              Call when a player walk on it
              +
              +
              Parameters:
              +
              grid - Game's grid
              +
              player - the player who walks on this element
              +
              position - position of this element on the grid
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Mine.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Mine.html new file mode 100644 index 0000000..e6e5540 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Mine.html @@ -0,0 +1,197 @@ + + + + +Mine (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Mine

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Box, InteractiveBox
          +
          +
          +
          public class Mine +extends Explosive
          +
          A mine is an element which explose when someone walks on it, the explosion area is on 1 case only
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Mine

              +
              public Mine(Player player, + Point point)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              explode

              +
              protected void explode(Grid grid)
              +
              Description copied from class: Explosive
              +
              Apply damage to players and delete this object
              +
              +
              Overrides:
              +
              explode in class Explosive
              +
              Parameters:
              +
              grid - game's grid
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Wall.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Wall.html new file mode 100644 index 0000000..8f086b4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/Wall.html @@ -0,0 +1,188 @@ + + + + +Wall (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Wall

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.grid.elements.AbstractBox +
          fr.lnl.game.server.games.grid.elements.Wall
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Box
          +
          +
          +
          public class Wall +extends AbstractBox
          +
          A wall is an intraversable object
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Wall

              +
              public Wall()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              equals

              +
              public boolean equals(Object obj)
              +
              Used by tests
              +
              +
              Overrides:
              +
              equals in class Object
              +
              Parameters:
              +
              obj - the object to compare
              +
              Returns:
              +
              true if obj is an instance of wall, false otherwise
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-summary.html new file mode 100644 index 0000000..3d16a61 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-summary.html @@ -0,0 +1,141 @@ + + + + +fr.lnl.game.server.games.grid.elements (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.grid.elements

          +
          +
          +
          package fr.lnl.game.server.games.grid.elements
          +
          +
          Package containing all the elements that can be arranged in a grid
          +
          +
          +
            +
          • + +
          • +
          • +
            +
            +
            +
            +
            Class
            +
            Description
            + +
            +
            AbstractBox is instantiable (not an abstract class), but when it's the case, instance doesn't represent anything, + it's only to see if there is a lock on this position or not
            +
            + +
            +
            Bomb are elements which explode when someone walks on it or after a countdown, the explosion area is on multiple cases
            +
            + +
             
            + +
            +
            A box implemented by CountdownBox is a box which do an action a certain time after being placed
            +
            + +
            +
            An EnergyBall is a box which give back a bit of player energy after it walks on the ball
            +
            + +
            +
            Super class of Bomb and Mine
            +
            + +
            +
            A box implemented by InteractiveBox is a box which do an action when someone walks on it
            +
            + +
            +
            A mine is an element which explose when someone walks on it, the explosion area is on 1 case only
            +
            + +
            +
            A wall is an intraversable object
            +
            +
            +
            +
            +
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-tree.html new file mode 100644 index 0000000..82abfc4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/elements/package-tree.html @@ -0,0 +1,89 @@ + + + + +fr.lnl.game.server.games.grid.elements Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.grid.elements

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          +
            +
          • java.lang.Object +
              +
            • fr.lnl.game.server.games.grid.elements.AbstractBox (implements fr.lnl.game.server.games.grid.elements.Box) +
                +
              • fr.lnl.game.server.games.grid.elements.EnergyBall (implements fr.lnl.game.server.games.grid.elements.InteractiveBox)
              • +
              • fr.lnl.game.server.games.grid.elements.Explosive (implements fr.lnl.game.server.games.grid.elements.InteractiveBox) +
                  +
                • fr.lnl.game.server.games.grid.elements.Bomb (implements fr.lnl.game.server.games.grid.elements.CountdownBox)
                • +
                • fr.lnl.game.server.games.grid.elements.Mine
                • +
                +
              • +
              • fr.lnl.game.server.games.grid.elements.Wall
              • +
              +
            • +
            +
          • +
          +
          +
          +

          Interface Hierarchy

          +
            +
          • fr.lnl.game.server.games.grid.elements.Box
          • +
          • fr.lnl.game.server.games.grid.elements.CountdownBox
          • +
          • fr.lnl.game.server.games.grid.elements.InteractiveBox
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-summary.html new file mode 100644 index 0000000..957ffa8 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-summary.html @@ -0,0 +1,120 @@ + + + + +fr.lnl.game.server.games.grid (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.grid

          +
          +
          +
          package fr.lnl.game.server.games.grid
          +
          +
          Package containing all about Grid components
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-tree.html new file mode 100644 index 0000000..1d79eb3 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/grid/package-tree.html @@ -0,0 +1,70 @@ + + + + +fr.lnl.game.server.games.grid Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.grid

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          +
            +
          • java.lang.Object +
              +
            • fr.lnl.game.server.games.grid.Grid
            • +
            +
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/package-summary.html new file mode 100644 index 0000000..38d096d --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/package-summary.html @@ -0,0 +1,123 @@ + + + + +fr.lnl.game.server.games (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games

          +
          +
          +
          package fr.lnl.game.server.games
          +
          +
          Game package, contains all classes and sub-packages mainly related game works
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/package-tree.html new file mode 100644 index 0000000..a502127 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/package-tree.html @@ -0,0 +1,70 @@ + + + + +fr.lnl.game.server.games Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          +
            +
          • java.lang.Object +
              +
            • fr.lnl.game.server.games.Game
            • +
            +
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/AbstractPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/AbstractPlayer.html new file mode 100644 index 0000000..e5996ee --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/AbstractPlayer.html @@ -0,0 +1,474 @@ + + + + +AbstractPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class AbstractPlayer

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.player.AbstractPlayer
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Player
          +
          +
          +
          Direct Known Subclasses:
          +
          ComputerPlayer, HumanPlayer
          +
          +
          +
          public abstract class AbstractPlayer +extends Object +implements Player
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              id

              +
              private final int id
              +
              +
            • +
            • +
              +

              position

              +
              private Point position
              +
              +
            • +
            • +
              +

              energy

              +
              private int energy
              +
              +
            • +
            • +
              +

              weapon

              +
              private Weapon weapon
              +
              +
            • +
            • +
              +

              shieldDeploy

              +
              private boolean shieldDeploy
              +
              +
            • +
            • +
              +

              actions

              +
              private List<Action> actions
              +
              +
            • +
            • +
              +

              classPlayer

              +
              private final ClassPlayer classPlayer
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              AbstractPlayer

              +
              public AbstractPlayer(Integer id, + Point position, + boolean shieldDeploy, + ClassPlayer classPlayer)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              generateAvailableActions

              +
              public List<ReunionSameAction> generateAvailableActions()
              +
              +
              Specified by:
              +
              generateAvailableActions in interface Player
              +
              Returns:
              +
              a list of ReunionSameAction which groups the same types of actions together. + It is used by the player action choice strategy
              +
              +
              +
            • +
            • +
              +

              isAlive

              +
              public boolean isAlive()
              +
              +
              Specified by:
              +
              isAlive in interface Player
              +
              Returns:
              +
              true if this player is Alive, false otherwise
              +
              +
              +
            • +
            • +
              +

              getId

              +
              public int getId()
              +
              +
              Specified by:
              +
              getId in interface Player
              +
              +
              +
            • +
            • +
              +

              getEnergy

              +
              public int getEnergy()
              +
              +
              Specified by:
              +
              getEnergy in interface Player
              +
              +
              +
            • +
            • +
              +

              getWeapon

              +
              public Weapon getWeapon()
              +
              +
              Specified by:
              +
              getWeapon in interface Player
              +
              +
              +
            • +
            • +
              +

              isShieldDeploy

              +
              public boolean isShieldDeploy()
              +
              +
              Specified by:
              +
              isShieldDeploy in interface Player
              +
              Returns:
              +
              true if this player has his shield activated, false otherwise
              +
              +
              +
            • +
            • +
              +

              setEnergy

              +
              public void setEnergy(int energy)
              +
              +
              Specified by:
              +
              setEnergy in interface Player
              +
              +
              +
            • +
            • +
              +

              setShieldDeploy

              +
              public void setShieldDeploy(boolean shieldDeploy)
              +
              +
              Specified by:
              +
              setShieldDeploy in interface Player
              +
              +
              +
            • +
            • +
              +

              setWeapon

              +
              public void setWeapon(Weapon weapon)
              +
              +
              Specified by:
              +
              setWeapon in interface Player
              +
              +
              +
            • +
            • +
              +

              getActions

              +
              public List<Action> getActions()
              +
              +
              Specified by:
              +
              getActions in interface Player
              +
              +
              +
            • +
            • +
              +

              setActions

              +
              public void setActions(List<Action> actions)
              +
              +
              Specified by:
              +
              setActions in interface Player
              +
              +
              +
            • +
            • +
              +

              getClassPlayer

              +
              public ClassPlayer getClassPlayer()
              +
              +
              Specified by:
              +
              getClassPlayer in interface Player
              +
              +
              +
            • +
            • +
              +

              getPosition

              +
              public Point getPosition()
              +
              +
              Specified by:
              +
              getPosition in interface Player
              +
              +
              +
            • +
            • +
              +

              setPosition

              +
              public void setPosition(Point position)
              +
              +
              Specified by:
              +
              setPosition in interface Player
              +
              +
              +
            • +
            • +
              +

              decrementEnergy

              +
              public void decrementEnergy(int energy)
              +
              Description copied from interface: Player
              +
              Call by the implementing classes Action to withdraw + a certain number of energy from a player
              +
              +
              Specified by:
              +
              decrementEnergy in interface Player
              +
              +
              +
            • +
            • +
              +

              incrementEnergy

              +
              public void incrementEnergy(int energy)
              +
              Description copied from interface: Player
              +
              Call by the implementing classes Action to add + a certain number of energy from a player
              +
              +
              Specified by:
              +
              incrementEnergy in interface Player
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/ClassPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/ClassPlayer.html new file mode 100644 index 0000000..f73fa75 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/ClassPlayer.html @@ -0,0 +1,501 @@ + + + + +ClassPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Enum Class ClassPlayer

          +
          +
          java.lang.Object +
          java.lang.Enum<ClassPlayer> +
          fr.lnl.game.server.games.player.ClassPlayer
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Serializable, Comparable<ClassPlayer>, Constable
          +
          +
          +
          public enum ClassPlayer +extends Enum<ClassPlayer>
          +
          ClassPlayer contains all data about the cost of an action or the cost of a damage
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Enum Constant Details

            +
              +
            • +
              +

              DEFAULT

              +
              public static final ClassPlayer DEFAULT
              +
              +
            • +
            • +
              +

              TANK

              +
              public static final ClassPlayer TANK
              +
              +
            • +
            • +
              +

              DPS

              +
              public static final ClassPlayer DPS
              +
              +
            • +
            • +
              +

              SUPPORT

              +
              public static final ClassPlayer SUPPORT
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              energy

              +
              private final int energy
              +
              +
            • +
            • +
              +

              shieldCost

              +
              private final int shieldCost
              +
              +
            • +
            • +
              +

              shootCost

              +
              private final int shootCost
              +
              +
            • +
            • +
              +

              mineCost

              +
              private final int mineCost
              +
              +
            • +
            • +
              +

              bombCost

              +
              private final int bombCost
              +
              +
            • +
            • +
              +

              moveCost

              +
              private final int moveCost
              +
              +
            • +
            • +
              +

              gainEnergy

              +
              private final int gainEnergy
              +
              +
            • +
            • +
              +

              penaltyShoot

              +
              private final int penaltyShoot
              +
              +
            • +
            • +
              +

              penaltyBomb

              +
              private final int penaltyBomb
              +
              +
            • +
            • +
              +

              penaltyMine

              +
              private final int penaltyMine
              +
              +
            • +
            • +
              +

              weapon

              +
              private final Weapon weapon
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              ClassPlayer

              +
              private ClassPlayer(int energy, + int shieldCost, + int shootCost, + int mineCost, + int bombCost, + int moveCost, + int gainEnergy, + int penaltyShoot, + int penaltyBomb, + int penaltyMine, + Weapon weapon)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              values

              +
              public static ClassPlayer[] values()
              +
              Returns an array containing the constants of this enum class, in +the order they are declared.
              +
              +
              Returns:
              +
              an array containing the constants of this enum class, in the order they are declared
              +
              +
              +
            • +
            • +
              +

              valueOf

              +
              public static ClassPlayer valueOf(String name)
              +
              Returns the enum constant of this class with the specified name. +The string must match exactly an identifier used to declare an +enum constant in this class. (Extraneous whitespace characters are +not permitted.)
              +
              +
              Parameters:
              +
              name - the name of the enum constant to be returned.
              +
              Returns:
              +
              the enum constant with the specified name
              +
              Throws:
              +
              IllegalArgumentException - if this enum class has no constant with the specified name
              +
              NullPointerException - if the argument is null
              +
              +
              +
            • +
            • +
              +

              getEnergy

              +
              public int getEnergy()
              +
              +
            • +
            • +
              +

              getShieldCost

              +
              public int getShieldCost()
              +
              +
            • +
            • +
              +

              getShootCost

              +
              public int getShootCost()
              +
              +
            • +
            • +
              +

              getMineCost

              +
              public int getMineCost()
              +
              +
            • +
            • +
              +

              getBombCost

              +
              public int getBombCost()
              +
              +
            • +
            • +
              +

              getMoveCost

              +
              public int getMoveCost()
              +
              +
            • +
            • +
              +

              getGainEnergy

              +
              public int getGainEnergy()
              +
              +
            • +
            • +
              +

              getPenaltyShoot

              +
              public int getPenaltyShoot()
              +
              +
            • +
            • +
              +

              getPenaltyBomb

              +
              public int getPenaltyBomb()
              +
              +
            • +
            • +
              +

              getPenaltyMine

              +
              public int getPenaltyMine()
              +
              +
            • +
            • +
              +

              getWeapon

              +
              public Weapon getWeapon()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/ComputerPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/ComputerPlayer.html new file mode 100644 index 0000000..cf98623 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/ComputerPlayer.html @@ -0,0 +1,199 @@ + + + + +ComputerPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class ComputerPlayer

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.player.AbstractPlayer +
          fr.lnl.game.server.games.player.ComputerPlayer
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Player
          +
          +
          +
          Direct Known Subclasses:
          +
          RandomComputerPlayer, StrategyComputerPlayer
          +
          +
          +
          public abstract class ComputerPlayer +extends AbstractPlayer
          +
          Super class of all Computer players
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              choseAction

              +
              public Action choseAction(Game game)
              +
              Call when an AI need to choose an action to execute
              +
              +
              Returns:
              +
              the chosen action
              +
              +
              +
            • +
            • +
              +

              strategy

              +
              public abstract Action strategy(Game game)
              +
              Method belonging to classes which extend this class to define the specific strategy of the player
              +
              +
              Returns:
              +
              the chosen action between all available
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/HumanPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/HumanPlayer.html new file mode 100644 index 0000000..29aaa97 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/HumanPlayer.html @@ -0,0 +1,178 @@ + + + + +HumanPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class HumanPlayer

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.player.AbstractPlayer +
          fr.lnl.game.server.games.player.HumanPlayer
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Player
          +
          +
          +
          public class HumanPlayer +extends AbstractPlayer
          +
          Instance of Human Player.
          + A human player choose an action to execute by using mouse or keyboard.
          + Human Player don't implement choseAction cause this method is executed on client part
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            + +
            +
          • + +
          • +
            +

            Method Details

            + +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/Player.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/Player.html new file mode 100644 index 0000000..3ce4783 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/Player.html @@ -0,0 +1,281 @@ + + + + +Player (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface Player

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          AbstractPlayer, ComputerPlayer, HumanPlayer, RandomComputerPlayer, StrategyComputerPlayer
          +
          +
          +
          public interface Player
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              generateAvailableActions

              +
              List<ReunionSameAction> generateAvailableActions()
              +
              +
            • +
            • +
              +

              getPosition

              +
              Point getPosition()
              +
              +
            • +
            • +
              +

              isAlive

              +
              boolean isAlive()
              +
              +
              Returns:
              +
              true if this player is Alive, false otherwise
              +
              +
              +
            • +
            • +
              +

              getId

              +
              int getId()
              +
              +
            • +
            • +
              +

              getEnergy

              +
              int getEnergy()
              +
              +
            • +
            • +
              +

              getWeapon

              +
              Weapon getWeapon()
              +
              +
            • +
            • +
              +

              isShieldDeploy

              +
              boolean isShieldDeploy()
              +
              +
              Returns:
              +
              true if this player has his shield activated, false otherwise
              +
              +
              +
            • +
            • +
              +

              setEnergy

              +
              void setEnergy(int energy)
              +
              +
            • +
            • +
              +

              setShieldDeploy

              +
              void setShieldDeploy(boolean shieldDeploy)
              +
              +
            • +
            • +
              +

              setWeapon

              +
              void setWeapon(Weapon weapon)
              +
              +
            • +
            • +
              +

              getActions

              +
              List<Action> getActions()
              +
              +
            • +
            • +
              +

              setActions

              +
              void setActions(List<Action> actions)
              +
              +
            • +
            • +
              +

              getClassPlayer

              +
              ClassPlayer getClassPlayer()
              +
              +
            • +
            • +
              +

              setPosition

              +
              void setPosition(Point position)
              +
              +
            • +
            • +
              +

              decrementEnergy

              +
              void decrementEnergy(int energy)
              +
              Call by the implementing classes Action to withdraw + a certain number of energy from a player
              +
              +
            • +
            • +
              +

              incrementEnergy

              +
              void incrementEnergy(int energy)
              +
              Call by the implementing classes Action to add + a certain number of energy from a player
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/RandomComputerPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/RandomComputerPlayer.html new file mode 100644 index 0000000..b413ed8 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/RandomComputerPlayer.html @@ -0,0 +1,198 @@ + + + + +RandomComputerPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class RandomComputerPlayer

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Player
          +
          +
          +
          public class RandomComputerPlayer +extends ComputerPlayer
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              RandomComputerPlayer

              +
              public RandomComputerPlayer(Integer id, + Point point, + ClassPlayer classPlayer)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              strategy

              +
              public Action strategy(Game game)
              +
              Choose an action fully randomly
              +
              +
              Specified by:
              +
              strategy in class ComputerPlayer
              +
              Returns:
              +
              an action between all available
              +
              +
              +
            • +
            • +
              +

              toString

              +
              public String toString()
              +
              +
              Overrides:
              +
              toString in class Object
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/StrategyComputerPlayer.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/StrategyComputerPlayer.html new file mode 100644 index 0000000..309f378 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/StrategyComputerPlayer.html @@ -0,0 +1,260 @@ + + + + +StrategyComputerPlayer (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class StrategyComputerPlayer

          +
          + +
          +
          +
          All Implemented Interfaces:
          +
          Player
          +
          +
          +
          public class StrategyComputerPlayer +extends ComputerPlayer
          +
          +
          + +
          +
          + +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/package-summary.html new file mode 100644 index 0000000..009acd8 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/package-summary.html @@ -0,0 +1,136 @@ + + + + +fr.lnl.game.server.games.player (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.player

          +
          +
          +
          package fr.lnl.game.server.games.player
          +
          +
          Package storing all players classes and as well AI behavior
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/player/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/player/package-tree.html new file mode 100644 index 0000000..1f5ced4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/player/package-tree.html @@ -0,0 +1,100 @@ + + + + +fr.lnl.game.server.games.player Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.player

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +

          Interface Hierarchy

          +
            +
          • fr.lnl.game.server.games.player.Player
          • +
          +
          +
          +

          Enum Class Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Firearm.html b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Firearm.html new file mode 100644 index 0000000..11e5c02 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Firearm.html @@ -0,0 +1,244 @@ + + + + +Firearm (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Firearm

          +
          +
          java.lang.Object +
          fr.lnl.game.server.games.weapon.Firearm
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Weapon
          +
          +
          +
          public class Firearm +extends Object +implements Weapon
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              bullet

              +
              int bullet
              +
              +
            • +
            • +
              +

              horizontalDistance

              +
              int horizontalDistance
              +
              +
            • +
            • +
              +

              verticalDistance

              +
              int verticalDistance
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Firearm

              +
              public Firearm()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              getBullet

              +
              public int getBullet()
              +
              +
              Specified by:
              +
              getBullet in interface Weapon
              +
              +
              +
            • +
            • +
              +

              getHorizontalDistance

              +
              public int getHorizontalDistance()
              +
              +
              Specified by:
              +
              getHorizontalDistance in interface Weapon
              +
              Returns:
              +
              distance a bullet can go horizontally
              +
              +
              +
            • +
            • +
              +

              getVerticalDistance

              +
              public int getVerticalDistance()
              +
              +
              Specified by:
              +
              getVerticalDistance in interface Weapon
              +
              Returns:
              +
              distance a bullet can go vertically
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Weapon.html b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Weapon.html new file mode 100644 index 0000000..decc57f --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/Weapon.html @@ -0,0 +1,154 @@ + + + + +Weapon (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface Weapon

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          Firearm
          +
          +
          +
          public interface Weapon
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              getBullet

              +
              int getBullet()
              +
              +
            • +
            • +
              +

              getHorizontalDistance

              +
              int getHorizontalDistance()
              +
              +
              Returns:
              +
              distance a bullet can go horizontally
              +
              +
              +
            • +
            • +
              +

              getVerticalDistance

              +
              int getVerticalDistance()
              +
              +
              Returns:
              +
              distance a bullet can go vertically
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-summary.html new file mode 100644 index 0000000..06be303 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-summary.html @@ -0,0 +1,118 @@ + + + + +fr.lnl.game.server.games.weapon (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.games.weapon

          +
          +
          +
          package fr.lnl.game.server.games.weapon
          +
          +
          Package containing all bout player's weapons
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-tree.html new file mode 100644 index 0000000..8f334ce --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/games/weapon/package-tree.html @@ -0,0 +1,76 @@ + + + + +fr.lnl.game.server.games.weapon Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.games.weapon

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          +
            +
          • java.lang.Object +
              +
            • fr.lnl.game.server.games.weapon.Firearm (implements fr.lnl.game.server.games.weapon.Weapon)
            • +
            +
          • +
          +
          +
          +

          Interface Hierarchy

          +
            +
          • fr.lnl.game.server.games.weapon.Weapon
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/listener/AbstractModelListening.html b/livraison/doc/server/server/fr/lnl/game/server/listener/AbstractModelListening.html new file mode 100644 index 0000000..0c62c9c --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/listener/AbstractModelListening.html @@ -0,0 +1,213 @@ + + + + +AbstractModelListening (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class AbstractModelListening

          +
          +
          java.lang.Object +
          fr.lnl.game.server.listener.AbstractModelListening
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          ModelListener
          +
          +
          +
          public abstract class AbstractModelListening +extends Object +implements ModelListener
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            + +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              AbstractModelListening

              +
              public AbstractModelListening()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              addListener

              +
              public void addListener(ModelListener e)
              +
              +
            • +
            • +
              +

              removalListener

              +
              public void removalListener(ModelListener e)
              +
              +
            • +
            • +
              +

              fireChange

              +
              public void fireChange()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/listener/ModelListener.html b/livraison/doc/server/server/fr/lnl/game/server/listener/ModelListener.html new file mode 100644 index 0000000..10a44a4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/listener/ModelListener.html @@ -0,0 +1,136 @@ + + + + +ModelListener (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Interface ModelListener

          +
          +
          +
          +
          All Known Implementing Classes:
          +
          AbstractModelListening
          +
          +
          +
          public interface ModelListener
          +
          Model implemented by AbstractModelListening
          +
          +
          +
            + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            void
            + +
            +
            this method is call everytime, an action on the view forces a controller to sens an update to model
            +
            +
            +
            +
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              updateModel

              +
              void updateModel(Object obj)
              +
              this method is call everytime, an action on the view forces a controller to sens an update to model
              +
              +
              Parameters:
              +
              obj - can be used to send data to model
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/listener/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/listener/package-summary.html new file mode 100644 index 0000000..e97ff9a --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/listener/package-summary.html @@ -0,0 +1,117 @@ + + + + +fr.lnl.game.server.listener (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.listener

          +
          +
          +
          package fr.lnl.game.server.listener
          +
          +
          Package containing model of listener to implement + Used by listeners in client module
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/listener/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/listener/package-tree.html new file mode 100644 index 0000000..aa01660 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/listener/package-tree.html @@ -0,0 +1,76 @@ + + + + +fr.lnl.game.server.listener Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.listener

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +

          Interface Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/package-summary.html new file mode 100644 index 0000000..d72a8e5 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/package-summary.html @@ -0,0 +1,107 @@ + + + + +fr.lnl.game.server (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server

          +
          +
          +
          package fr.lnl.game.server
          +
          +
          Server package
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/package-tree.html new file mode 100644 index 0000000..7f12a5a --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/package-tree.html @@ -0,0 +1,70 @@ + + + + +fr.lnl.game.server Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/CrashException.html b/livraison/doc/server/server/fr/lnl/game/server/utils/CrashException.html new file mode 100644 index 0000000..8ce53c4 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/CrashException.html @@ -0,0 +1,151 @@ + + + + +CrashException (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class CrashException

          +
          +
          java.lang.Object +
          java.lang.Throwable +
          java.lang.Exception +
          java.lang.RuntimeException +
          fr.lnl.game.server.utils.CrashException
          +
          +
          +
          +
          +
          +
          +
          All Implemented Interfaces:
          +
          Serializable
          +
          +
          +
          public class CrashException +extends RuntimeException
          +
          Represent an unrecoverable error in the program, force program to stop
          +
          +
          See Also:
          +
          + +
          +
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              CrashException

              +
              public CrashException(String message, + Throwable cause)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/ErrorMessage.html b/livraison/doc/server/server/fr/lnl/game/server/utils/ErrorMessage.html new file mode 100644 index 0000000..7503a4f --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/ErrorMessage.html @@ -0,0 +1,170 @@ + + + + +ErrorMessage (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class ErrorMessage

          +
          +
          java.lang.Object +
          fr.lnl.game.server.utils.ErrorMessage
          +
          +
          +
          +
          public class ErrorMessage +extends Object
          +
          Contain everything related to error messages, theirs errors are the fault of the end-user (like we demand an integer + and user give us a floating point number + Theirs error doesn't cause the program to stop, it'll demand a correct value
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              Entry_Error_Message

              +
              public static final String Entry_Error_Message
              +
              Error given to end-user when it give us a non integer or float value
              +
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              ErrorMessage

              +
              public ErrorMessage()
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/Maths.html b/livraison/doc/server/server/fr/lnl/game/server/utils/Maths.html new file mode 100644 index 0000000..08de152 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/Maths.html @@ -0,0 +1,233 @@ + + + + +Maths (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Maths

          +
          +
          java.lang.Object +
          fr.lnl.game.server.utils.Maths
          +
          +
          +
          +
          public class Maths +extends Object
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Maths

              +
              public Maths()
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              testInteger

              +
              public static int testInteger(String entry, + Scanner scanner, + String error)
              +
              Convert entry to an integer
              +
              +
              Parameters:
              +
              entry - given parameter
              +
              scanner - standard input, used if entry isn't correct
              +
              error - error message to display if entry isn't an Integer
              +
              Returns:
              +
              an Integer if entry is valid or when it'll valid
              +
              +
              +
            • +
            • +
              +

              testFloat

              +
              public static float testFloat(String entry, + Scanner scanner, + String error)
              +
              Convert entry to a float
              +
              +
              Parameters:
              +
              entry - given parameter
              +
              scanner - standard input, used if entry isn't correct
              +
              error - error message to display if entry isn't a float
              +
              Returns:
              +
              a float if entry is a valid or when it'll valid
              +
              +
              +
            • +
            • +
              +

              isFloat

              +
              public static boolean isFloat(String strNum)
              +
              +
              Parameters:
              +
              strNum - entry
              +
              Returns:
              +
              true if strNum is a float, false otherwise
              +
              See Also:
              +
              + +
              +
              +
              +
            • +
            • +
              +

              isInteger

              +
              public static boolean isInteger(String strNum)
              +
              +
              Parameters:
              +
              strNum - entry
              +
              Returns:
              +
              true if strNum is an Integer, false otherwise
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/Pair.html b/livraison/doc/server/server/fr/lnl/game/server/utils/Pair.html new file mode 100644 index 0000000..7d7cb93 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/Pair.html @@ -0,0 +1,280 @@ + + + + +Pair (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Pair<A,B>

          +
          +
          java.lang.Object +
          fr.lnl.game.server.utils.Pair<A,B>
          +
          +
          +
          +
          Type Parameters:
          +
          A - first element of the tuple
          +
          B - second element of the tuple
          +
          +
          +
          Direct Known Subclasses:
          +
          Point
          +
          +
          +
          public class Pair<A,B> +extends Object
          +
          Tuple associating storing two value of undefined type.
          + Unlike Python, value in this Tuple can be modified (but the type of its new value need to be the same)
          +
          +
          +
            + +
          • +
            +

            Field Summary

            +
            Fields
            +
            +
            Modifier and Type
            +
            Field
            +
            Description
            +
            private A
            + +
             
            +
            private B
            + +
             
            +
            +
            +
          • + +
          • +
            +

            Constructor Summary

            +
            Constructors
            +
            +
            Constructor
            +
            Description
            +
            Pair(A a, + B b)
            +
             
            +
            +
            +
          • + +
          • +
            +

            Method Summary

            +
            +
            +
            +
            +
            Modifier and Type
            +
            Method
            +
            Description
            +
            boolean
            + +
             
            + + +
             
            + + +
             
            +
            int
            + +
            +
            Absolut useful when using HashMap or HashSet (or everything using hashCode to compare Objects
            +
            +
            void
            +
            setA(A a)
            +
             
            +
            void
            +
            setB(B b)
            +
             
            + + +
             
            +
            +
            +
            +
            +

            Methods inherited from class java.lang.Object

            +clone, finalize, getClass, notify, notifyAll, wait, wait, wait
            +
            +
          • +
          +
          +
          +
            + +
          • +
            +

            Field Details

            +
              +
            • +
              +

              a

              +
              private A a
              +
              +
            • +
            • +
              +

              b

              +
              private B b
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Pair

              +
              public Pair(A a, + B b)
              +
              +
            • +
            +
            +
          • + +
          • +
            +

            Method Details

            +
              +
            • +
              +

              getA

              +
              public A getA()
              +
              +
            • +
            • +
              +

              getB

              +
              public B getB()
              +
              +
            • +
            • +
              +

              setA

              +
              public void setA(A a)
              +
              +
            • +
            • +
              +

              setB

              +
              public void setB(B b)
              +
              +
            • +
            • +
              +

              equals

              +
              public boolean equals(Object o)
              +
              +
              Overrides:
              +
              equals in class Object
              +
              +
              +
            • +
            • +
              +

              hashCode

              +
              public int hashCode()
              +
              Absolut useful when using HashMap or HashSet (or everything using hashCode to compare Objects
              +
              +
              Overrides:
              +
              hashCode in class Object
              +
              Returns:
              +
              object hash
              +
              +
              +
            • +
            • +
              +

              toString

              +
              public String toString()
              +
              +
              Overrides:
              +
              toString in class Object
              +
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/Point.html b/livraison/doc/server/server/fr/lnl/game/server/utils/Point.html new file mode 100644 index 0000000..927c501 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/Point.html @@ -0,0 +1,135 @@ + + + + +Point (server API) + + + + + + + + + + + + + + +
          + +
          +
          + +
          +
          Module server
          + +

          Class Point

          +
          +
          java.lang.Object +
          fr.lnl.game.server.utils.Pair<Integer,Integer> +
          fr.lnl.game.server.utils.Point
          +
          +
          +
          +
          +
          public class Point +extends Pair<Integer,Integer>
          +
          Point extends from Pair, basically a simpler ways to use Pair when using grid position
          +
          +
          + +
          +
          +
            + +
          • +
            +

            Constructor Details

            +
              +
            • +
              +

              Point

              +
              public Point(int a, + int b)
              +
              +
            • +
            +
            +
          • +
          +
          + +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/package-summary.html b/livraison/doc/server/server/fr/lnl/game/server/utils/package-summary.html new file mode 100644 index 0000000..586c033 --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/package-summary.html @@ -0,0 +1,132 @@ + + + + +fr.lnl.game.server.utils (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +
          Module server
          +

          Package fr.lnl.game.server.utils

          +
          +
          +
          package fr.lnl.game.server.utils
          +
          +
          Package containing all utility classes
          +
          +
          +
            +
          • + +
          • +
          • +
            +
            +
            +
            +
            Class
            +
            Description
            + +
            +
            Represent an unrecoverable error in the program, force program to stop
            +
            + +
            +
            Contain everything related to error messages, theirs errors are the fault of the end-user (like we demand an integer + and user give us a floating point number + Theirs error doesn't cause the program to stop, it'll demand a correct value
            +
            + +
             
            +
            Pair<A,B>
            +
            +
            Tuple associating storing two value of undefined type.
            + Unlike Python, value in this Tuple can be modified (but the type of its new value need to be the same)
            +
            + +
            +
            Point extends from Pair, basically a simpler ways to use Pair when using grid position
            +
            +
            +
            +
            +
          • +
          +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/fr/lnl/game/server/utils/package-tree.html b/livraison/doc/server/server/fr/lnl/game/server/utils/package-tree.html new file mode 100644 index 0000000..939386a --- /dev/null +++ b/livraison/doc/server/server/fr/lnl/game/server/utils/package-tree.html @@ -0,0 +1,89 @@ + + + + +fr.lnl.game.server.utils Class Hierarchy (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Hierarchy For Package fr.lnl.game.server.utils

          +Package Hierarchies: + +
          +
          +

          Class Hierarchy

          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/server/module-summary.html b/livraison/doc/server/server/module-summary.html new file mode 100644 index 0000000..160dd14 --- /dev/null +++ b/livraison/doc/server/server/module-summary.html @@ -0,0 +1,151 @@ + + + + +server (server API) + + + + + + + + + + + + + + +
          + +
          +
          +
          +

          Module server

          +
          +
          +
          module server
          +
          + +
          Server module, include every model classes
          +
          +
          + +
          +
          +
          +
          + + diff --git a/livraison/doc/server/stylesheet.css b/livraison/doc/server/stylesheet.css new file mode 100644 index 0000000..836c62d --- /dev/null +++ b/livraison/doc/server/stylesheet.css @@ -0,0 +1,865 @@ +/* + * Javadoc style sheet + */ + +@import url('resources/fonts/dejavu.css'); + +/* + * Styles for individual HTML elements. + * + * These are styles that are specific to individual HTML elements. Changing them affects the style of a particular + * HTML element throughout the page. + */ + +body { + background-color:#ffffff; + color:#353833; + font-family:'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:14px; + margin:0; + padding:0; + height:100%; + width:100%; +} +iframe { + margin:0; + padding:0; + height:100%; + width:100%; + overflow-y:scroll; + border:none; +} +a:link, a:visited { + text-decoration:none; + color:#4A6782; +} +a[href]:hover, a[href]:focus { + text-decoration:none; + color:#bb7a2a; +} +a[name] { + color:#353833; +} +pre { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; +} +h1 { + font-size:20px; +} +h2 { + font-size:18px; +} +h3 { + font-size:16px; +} +h4 { + font-size:15px; +} +h5 { + font-size:14px; +} +h6 { + font-size:13px; +} +ul { + list-style-type:disc; +} +code, tt { + font-family:'DejaVu Sans Mono', monospace; +} +:not(h1, h2, h3, h4, h5, h6) > code, +:not(h1, h2, h3, h4, h5, h6) > tt { + font-size:14px; + padding-top:4px; + margin-top:8px; + line-height:1.4em; +} +dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + padding-top:4px; +} +.summary-table dt code { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + vertical-align:top; + padding-top:4px; +} +sup { + font-size:8px; +} +button { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size: 14px; +} +/* + * Styles for HTML generated by javadoc. + * + * These are style classes that are used by the standard doclet to generate HTML documentation. + */ + +/* + * Styles for document title and copyright. + */ +.clear { + clear:both; + height:0; + overflow:hidden; +} +.about-language { + float:right; + padding:0 21px 8px 8px; + font-size:11px; + margin-top:-9px; + height:2.9em; +} +.legal-copy { + margin-left:.5em; +} +.tab { + background-color:#0066FF; + color:#ffffff; + padding:8px; + width:5em; + font-weight:bold; +} +/* + * Styles for navigation bar. + */ +@media screen { + .flex-box { + position:fixed; + display:flex; + flex-direction:column; + height: 100%; + width: 100%; + } + .flex-header { + flex: 0 0 auto; + } + .flex-content { + flex: 1 1 auto; + overflow-y: auto; + } +} +.top-nav { + background-color:#4D7A97; + color:#FFFFFF; + float:left; + padding:0; + width:100%; + clear:right; + min-height:2.8em; + padding-top:10px; + overflow:hidden; + font-size:12px; +} +.sub-nav { + background-color:#dee3e9; + float:left; + width:100%; + overflow:hidden; + font-size:12px; +} +.sub-nav div { + clear:left; + float:left; + padding:0 0 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list { + padding-top:5px; +} +ul.nav-list { + display:block; + margin:0 25px 0 0; + padding:0; +} +ul.sub-nav-list { + float:left; + margin:0 25px 0 0; + padding:0; +} +ul.nav-list li { + list-style:none; + float:left; + padding: 5px 6px; + text-transform:uppercase; +} +.sub-nav .nav-list-search { + float:right; + margin:0 0 0 0; + padding:5px 6px; + clear:none; +} +.nav-list-search label { + position:relative; + right:-16px; +} +ul.sub-nav-list li { + list-style:none; + float:left; + padding-top:10px; +} +.top-nav a:link, .top-nav a:active, .top-nav a:visited { + color:#FFFFFF; + text-decoration:none; + text-transform:uppercase; +} +.top-nav a:hover { + text-decoration:none; + color:#bb7a2a; + text-transform:uppercase; +} +.nav-bar-cell1-rev { + background-color:#F8981D; + color:#253441; + margin: auto 5px; +} +.skip-nav { + position:absolute; + top:auto; + left:-9999px; + overflow:hidden; +} +/* + * Hide navigation links and search box in print layout + */ +@media print { + ul.nav-list, div.sub-nav { + display:none; + } +} +/* + * Styles for page header and footer. + */ +.title { + color:#2c4557; + margin:10px 0; +} +.sub-title { + margin:5px 0 0 0; +} +.header ul { + margin:0 0 15px 0; + padding:0; +} +.header ul li, .footer ul li { + list-style:none; + font-size:13px; +} +/* + * Styles for headings. + */ +body.class-declaration-page .summary h2, +body.class-declaration-page .details h2, +body.class-use-page h2, +body.module-declaration-page .block-list h2 { + font-style: italic; + padding:0; + margin:15px 0; +} +body.class-declaration-page .summary h3, +body.class-declaration-page .details h3, +body.class-declaration-page .summary .inherited-list h2 { + background-color:#dee3e9; + border:1px solid #d0d9e0; + margin:0 0 6px -8px; + padding:7px 5px; +} +/* + * Styles for page layout containers. + */ +main { + clear:both; + padding:10px 20px; + position:relative; +} +dl.notes > dt { + font-family: 'DejaVu Sans', Arial, Helvetica, sans-serif; + font-size:12px; + font-weight:bold; + margin:10px 0 0 0; + color:#4E4E4E; +} +dl.notes > dd { + margin:5px 10px 10px 0; + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +dl.name-value > dt { + margin-left:1px; + font-size:1.1em; + display:inline; + font-weight:bold; +} +dl.name-value > dd { + margin:0 0 0 1px; + font-size:1.1em; + display:inline; +} +/* + * Styles for lists. + */ +li.circle { + list-style:circle; +} +ul.horizontal li { + display:inline; + font-size:0.9em; +} +div.inheritance { + margin:0; + padding:0; +} +div.inheritance div.inheritance { + margin-left:2em; +} +ul.block-list, +ul.details-list, +ul.member-list, +ul.summary-list { + margin:10px 0 10px 0; + padding:0; +} +ul.block-list > li, +ul.details-list > li, +ul.member-list > li, +ul.summary-list > li { + list-style:none; + margin-bottom:15px; + line-height:1.4; +} +.summary-table dl, .summary-table dl dt, .summary-table dl dd { + margin-top:0; + margin-bottom:1px; +} +ul.see-list, ul.see-list-long { + padding-left: 0; + list-style: none; +} +ul.see-list li { + display: inline; +} +ul.see-list li:not(:last-child):after, +ul.see-list-long li:not(:last-child):after { + content: ", "; + white-space: pre-wrap; +} +/* + * Styles for tables. + */ +.summary-table, .details-table { + width:100%; + border-spacing:0; + border-left:1px solid #EEE; + border-right:1px solid #EEE; + border-bottom:1px solid #EEE; + padding:0; +} +.caption { + position:relative; + text-align:left; + background-repeat:no-repeat; + color:#253441; + font-weight:bold; + clear:none; + overflow:hidden; + padding:0; + padding-top:10px; + padding-left:1px; + margin:0; + white-space:pre; +} +.caption a:link, .caption a:visited { + color:#1f389c; +} +.caption a:hover, +.caption a:active { + color:#FFFFFF; +} +.caption span { + white-space:nowrap; + padding-top:5px; + padding-left:12px; + padding-right:12px; + padding-bottom:7px; + display:inline-block; + float:left; + background-color:#F8981D; + border: none; + height:16px; +} +div.table-tabs { + padding:10px 0 0 1px; + margin:0; +} +div.table-tabs > button { + border: none; + cursor: pointer; + padding: 5px 12px 7px 12px; + font-weight: bold; + margin-right: 3px; +} +div.table-tabs > button.active-table-tab { + background: #F8981D; + color: #253441; +} +div.table-tabs > button.table-tab { + background: #4D7A97; + color: #FFFFFF; +} +.two-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); +} +.three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(15%, max-content) minmax(15%, auto); +} +.four-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(10%, max-content) minmax(10%, max-content) minmax(10%, auto); +} +@media screen and (max-width: 600px) { + .two-column-summary { + display: grid; + grid-template-columns: 1fr; + } +} +@media screen and (max-width: 800px) { + .three-column-summary { + display: grid; + grid-template-columns: minmax(10%, max-content) minmax(25%, auto); + } + .three-column-summary .col-last { + grid-column-end: span 2; + } +} +@media screen and (max-width: 1000px) { + .four-column-summary { + display: grid; + grid-template-columns: minmax(15%, max-content) minmax(15%, auto); + } +} +.summary-table > div, .details-table > div { + text-align:left; + padding: 8px 3px 3px 7px; +} +.col-first, .col-second, .col-last, .col-constructor-name, .col-summary-item-name { + vertical-align:top; + padding-right:0; + padding-top:8px; + padding-bottom:3px; +} +.table-header { + background:#dee3e9; + font-weight: bold; +} +.col-first, .col-first { + font-size:13px; +} +.col-second, .col-second, .col-last, .col-constructor-name, .col-summary-item-name, .col-last { + font-size:13px; +} +.col-first, .col-second, .col-constructor-name { + vertical-align:top; + overflow: auto; +} +.col-last { + white-space:normal; +} +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-first a:link, .col-first a:visited, +.col-second a:link, .col-second a:visited, +.col-constructor-name a:link, .col-constructor-name a:visited, +.col-summary-item-name a:link, .col-summary-item-name a:visited, +.constant-values-container a:link, .constant-values-container a:visited, +.all-classes-container a:link, .all-classes-container a:visited, +.all-packages-container a:link, .all-packages-container a:visited { + font-weight:bold; +} +.table-sub-heading-color { + background-color:#EEEEFF; +} +.even-row-color, .even-row-color .table-header { + background-color:#FFFFFF; +} +.odd-row-color, .odd-row-color .table-header { + background-color:#EEEEEF; +} +/* + * Styles for contents. + */ +.deprecated-content { + margin:0; + padding:10px 0; +} +div.block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; +} +.col-last div { + padding-top:0; +} +.col-last a { + padding-bottom:3px; +} +.module-signature, +.package-signature, +.type-signature, +.member-signature { + font-family:'DejaVu Sans Mono', monospace; + font-size:14px; + margin:14px 0; + white-space: pre-wrap; +} +.module-signature, +.package-signature, +.type-signature { + margin-top: 0; +} +.member-signature .type-parameters-long, +.member-signature .parameters, +.member-signature .exceptions { + display: inline-block; + vertical-align: top; + white-space: pre; +} +.member-signature .type-parameters { + white-space: normal; +} +/* + * Styles for formatting effect. + */ +.source-line-no { + color:green; + padding:0 30px 0 0; +} +h1.hidden { + visibility:hidden; + overflow:hidden; + font-size:10px; +} +.block { + display:block; + margin:0 10px 5px 0; + color:#474747; +} +.deprecated-label, .descfrm-type-label, .implementation-label, .member-name-label, .member-name-link, +.module-label-in-package, .module-label-in-type, .override-specify-label, .package-label-in-type, +.package-hierarchy-label, .type-name-label, .type-name-link, .search-tag-link, .preview-label { + font-weight:bold; +} +.deprecation-comment, .help-footnote, .preview-comment { + font-style:italic; +} +.deprecation-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +.preview-block { + font-size:14px; + font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif; + border-style:solid; + border-width:thin; + border-radius:10px; + padding:10px; + margin-bottom:10px; + margin-right:10px; + display:inline-block; +} +div.block div.deprecation-comment { + font-style:normal; +} +/* + * Styles specific to HTML5 elements. + */ +main, nav, header, footer, section { + display:block; +} +/* + * Styles for javadoc search. + */ +.ui-autocomplete-category { + font-weight:bold; + font-size:15px; + padding:7px 0 7px 3px; + background-color:#4D7A97; + color:#FFFFFF; +} +.result-item { + font-size:13px; +} +.ui-autocomplete { + max-height:85%; + max-width:65%; + overflow-y:scroll; + overflow-x:scroll; + white-space:nowrap; + box-shadow: 0 3px 6px rgba(0,0,0,0.16), 0 3px 6px rgba(0,0,0,0.23); +} +ul.ui-autocomplete { + position:fixed; + z-index:999999; +} +ul.ui-autocomplete li { + float:left; + clear:both; + width:100%; +} +.result-highlight { + font-weight:bold; +} +#search-input { + background-image:url('resources/glass.png'); + background-size:13px; + background-repeat:no-repeat; + background-position:2px 3px; + padding-left:20px; + position:relative; + right:-18px; + width:400px; +} +#reset-button { + background-color: rgb(255,255,255); + background-image:url('resources/x.png'); + background-position:center; + background-repeat:no-repeat; + background-size:12px; + border:0 none; + width:16px; + height:16px; + position:relative; + left:-4px; + top:-4px; + font-size:0px; +} +.watermark { + color:#545454; +} +.search-tag-desc-result { + font-style:italic; + font-size:11px; +} +.search-tag-holder-result { + font-style:italic; + font-size:12px; +} +.search-tag-result:target { + background-color:yellow; +} +.module-graph span { + display:none; + position:absolute; +} +.module-graph:hover span { + display:block; + margin: -100px 0 0 100px; + z-index: 1; +} +.inherited-list { + margin: 10px 0 10px 0; +} +section.class-description { + line-height: 1.4; +} +.summary section[class$="-summary"], .details section[class$="-details"], +.class-uses .detail, .serialized-class-details { + padding: 0px 20px 5px 10px; + border: 1px solid #ededed; + background-color: #f8f8f8; +} +.inherited-list, section[class$="-details"] .detail { + padding:0 0 5px 8px; + background-color:#ffffff; + border:none; +} +.vertical-separator { + padding: 0 5px; +} +ul.help-section-list { + margin: 0; +} +ul.help-subtoc > li { + display: inline-block; + padding-right: 5px; + font-size: smaller; +} +ul.help-subtoc > li::before { + content: "\2022" ; + padding-right:2px; +} +span.help-note { + font-style: italic; +} +/* + * Indicator icon for external links. + */ +main a[href*="://"]::after { + content:""; + display:inline-block; + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); + background-size:100% 100%; + width:7px; + height:7px; + margin-left:2px; + margin-bottom:4px; +} +main a[href*="://"]:hover::after, +main a[href*="://"]:focus::after { + background-image:url('data:image/svg+xml; utf8, \ + \ + \ + '); +} + +/* + * Styles for user-provided tables. + * + * borderless: + * No borders, vertical margins, styled caption. + * This style is provided for use with existing doc comments. + * In general, borderless tables should not be used for layout purposes. + * + * plain: + * Plain borders around table and cells, vertical margins, styled caption. + * Best for small tables or for complex tables for tables with cells that span + * rows and columns, when the "striped" style does not work well. + * + * striped: + * Borders around the table and vertical borders between cells, striped rows, + * vertical margins, styled caption. + * Best for tables that have a header row, and a body containing a series of simple rows. + */ + +table.borderless, +table.plain, +table.striped { + margin-top: 10px; + margin-bottom: 10px; +} +table.borderless > caption, +table.plain > caption, +table.striped > caption { + font-weight: bold; + font-size: smaller; +} +table.borderless th, table.borderless td, +table.plain th, table.plain td, +table.striped th, table.striped td { + padding: 2px 5px; +} +table.borderless, +table.borderless > thead > tr > th, table.borderless > tbody > tr > th, table.borderless > tr > th, +table.borderless > thead > tr > td, table.borderless > tbody > tr > td, table.borderless > tr > td { + border: none; +} +table.borderless > thead > tr, table.borderless > tbody > tr, table.borderless > tr { + background-color: transparent; +} +table.plain { + border-collapse: collapse; + border: 1px solid black; +} +table.plain > thead > tr, table.plain > tbody tr, table.plain > tr { + background-color: transparent; +} +table.plain > thead > tr > th, table.plain > tbody > tr > th, table.plain > tr > th, +table.plain > thead > tr > td, table.plain > tbody > tr > td, table.plain > tr > td { + border: 1px solid black; +} +table.striped { + border-collapse: collapse; + border: 1px solid black; +} +table.striped > thead { + background-color: #E3E3E3; +} +table.striped > thead > tr > th, table.striped > thead > tr > td { + border: 1px solid black; +} +table.striped > tbody > tr:nth-child(even) { + background-color: #EEE +} +table.striped > tbody > tr:nth-child(odd) { + background-color: #FFF +} +table.striped > tbody > tr > th, table.striped > tbody > tr > td { + border-left: 1px solid black; + border-right: 1px solid black; +} +table.striped > tbody > tr > th { + font-weight: normal; +} +/** + * Tweak font sizes and paddings for small screens. + */ +@media screen and (max-width: 1050px) { + #search-input { + width: 300px; + } +} +@media screen and (max-width: 800px) { + #search-input { + width: 200px; + } + .top-nav, + .bottom-nav { + font-size: 11px; + padding-top: 6px; + } + .sub-nav { + font-size: 11px; + } + .about-language { + padding-right: 16px; + } + ul.nav-list li, + .sub-nav .nav-list-search { + padding: 6px; + } + ul.sub-nav-list li { + padding-top: 5px; + } + main { + padding: 10px; + } + .summary section[class$="-summary"], .details section[class$="-details"], + .class-uses .detail, .serialized-class-details { + padding: 0 8px 5px 8px; + } + body { + -webkit-text-size-adjust: none; + } +} +@media screen and (max-width: 500px) { + #search-input { + width: 150px; + } + .top-nav, + .bottom-nav { + font-size: 10px; + } + .sub-nav { + font-size: 10px; + } + .about-language { + font-size: 10px; + padding-right: 12px; + } +} diff --git a/livraison/doc/server/tag-search-index.js b/livraison/doc/server/tag-search-index.js new file mode 100644 index 0000000..bf10aaf --- /dev/null +++ b/livraison/doc/server/tag-search-index.js @@ -0,0 +1 @@ +tagSearchIndex = [{"l":"Constant Field Values","h":"","u":"constant-values.html"},{"l":"Serialized Form","h":"","u":"serialized-form.html"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/doc/server/type-search-index.js b/livraison/doc/server/type-search-index.js new file mode 100644 index 0000000..dc70b67 --- /dev/null +++ b/livraison/doc/server/type-search-index.js @@ -0,0 +1 @@ +typeSearchIndex = [{"p":"fr.lnl.game.server.games.action","l":"AbstractAction"},{"p":"fr.lnl.game.server.games.grid.elements","l":"AbstractBox"},{"p":"fr.lnl.game.server.games.grid.build","l":"AbstractGridFactoryBuilder"},{"p":"fr.lnl.game.server.listener","l":"AbstractModelListening"},{"p":"fr.lnl.game.server.games.player","l":"AbstractPlayer"},{"p":"fr.lnl.game.server.games.action","l":"Action"},{"l":"All Classes and Interfaces","u":"allclasses-index.html"},{"p":"fr.lnl.game.server.games.grid.elements","l":"Bomb"},{"p":"fr.lnl.game.server.games.grid.elements","l":"Box"},{"p":"fr.lnl.game.server.games.player","l":"ClassPlayer"},{"p":"fr.lnl.game.server.games.player","l":"ComputerPlayer"},{"p":"fr.lnl.game.server.games.grid.elements","l":"CountdownBox"},{"p":"fr.lnl.game.server.utils","l":"CrashException"},{"p":"fr.lnl.game.server.games.action","l":"DeployShield"},{"p":"fr.lnl.game.server.games.action","l":"Direction"},{"p":"fr.lnl.game.server.games.action","l":"Direction4Axis"},{"p":"fr.lnl.game.server.games.action","l":"Direction8Axis"},{"p":"fr.lnl.game.server.games.action","l":"DropBomb"},{"p":"fr.lnl.game.server.games.action","l":"DropMine"},{"p":"fr.lnl.game.server.games.action","l":"DropObject"},{"p":"fr.lnl.game.server.games.grid.elements","l":"EnergyBall"},{"p":"fr.lnl.game.server.utils","l":"ErrorMessage"},{"p":"fr.lnl.game.server.games.grid.elements","l":"Explosive"},{"p":"fr.lnl.game.server.games.weapon","l":"Firearm"},{"p":"fr.lnl.game.server.games","l":"Game"},{"p":"fr.lnl.game.server.games.grid","l":"Grid"},{"p":"fr.lnl.game.server.games.grid.build","l":"GridFactoryBuilder"},{"p":"fr.lnl.game.server.games.player","l":"HumanPlayer"},{"p":"fr.lnl.game.server.games.grid.elements","l":"InteractiveBox"},{"p":"fr.lnl.game.server.games.grid.build","l":"LockGridFactoryBuilder"},{"p":"fr.lnl.game.server.utils","l":"Maths"},{"p":"fr.lnl.game.server.games.grid.elements","l":"Mine"},{"p":"fr.lnl.game.server.listener","l":"ModelListener"},{"p":"fr.lnl.game.server.games.action","l":"Move"},{"p":"fr.lnl.game.server.games.action","l":"NoMoreBulletInWeaponException"},{"p":"fr.lnl.game.server.games.action","l":"Nothing"},{"p":"fr.lnl.game.server.games.action","l":"NotValidDirectionException"},{"p":"fr.lnl.game.server.utils","l":"Pair"},{"p":"fr.lnl.game.server.games.player","l":"Player"},{"p":"fr.lnl.game.server.utils","l":"Point"},{"p":"fr.lnl.game.server.games.player","l":"RandomComputerPlayer"},{"p":"fr.lnl.game.server.games.action","l":"ReunionSameAction"},{"p":"fr.lnl.game.server","l":"ServerMain"},{"p":"fr.lnl.game.server.games.action","l":"Shot"},{"p":"fr.lnl.game.server.games.player","l":"StrategyComputerPlayer"},{"p":"fr.lnl.game.server.games.grid.elements","l":"Wall"},{"p":"fr.lnl.game.server.games.weapon","l":"Weapon"}];updateSearchResults(); \ No newline at end of file diff --git a/livraison/gradlew b/livraison/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/livraison/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/livraison/gradlew.bat b/livraison/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/livraison/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/livraison/server/build.gradle b/livraison/server/build.gradle new file mode 100644 index 0000000..fcdcfb0 --- /dev/null +++ b/livraison/server/build.gradle @@ -0,0 +1,26 @@ +/* + * This file was generated by the Gradle 'init' task. + */ + +plugins { + id 'application' + id 'fr.lnl.game.java-library-conventions' +} + +dependencies { + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' +} + +compileJava { + options.encoding = 'UTF-8' +} + +application { + mainClassName = 'fr.lnl.game.server.ServerMain' +} + +test { + useJUnitPlatform() +} + diff --git a/livraison/server/src/main/java/fr/lnl/game/server/ServerMain.java b/livraison/server/src/main/java/fr/lnl/game/server/ServerMain.java new file mode 100644 index 0000000..aa21823 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/ServerMain.java @@ -0,0 +1,9 @@ +package fr.lnl.game.server; + +public class ServerMain { + + public static void main(String[] args) { + throw new UnsupportedOperationException("Server standalone launch not supported, please use tests or launch the" + + " game from the client"); + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/Game.java b/livraison/server/src/main/java/fr/lnl/game/server/games/Game.java new file mode 100644 index 0000000..8e9c242 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/Game.java @@ -0,0 +1,212 @@ +package fr.lnl.game.server.games; + +import fr.lnl.game.server.games.action.*; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.build.GridFactoryBuilder; +import fr.lnl.game.server.games.grid.elements.CountdownBox; +import fr.lnl.game.server.games.player.ComputerPlayer; +import fr.lnl.game.server.games.player.Player; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Stream; + +import static java.util.function.Predicate.not; + +public class Game { + + private final Grid grid; + private final List players; + private Player currentPlayer; + private Action selectedAction = null; + private int nbrTurn; + private Player previousPlayer; + + /** + * @param buildStrategy used to build a grid + * @param players a list players in the game + * @throws IllegalArgumentException if number of players given in parameters is too many or inferior to 2 + */ + public Game(GridFactoryBuilder buildStrategy, List players) throws IllegalArgumentException { + this.grid = buildStrategy.playersList(players).build(); + if(players.size() < 2) + throw new IllegalArgumentException("The game need 2 or more player to start"); + if(players.size() > grid.getNumberNeutralBox()){ + throw new IllegalArgumentException("There are too many players for the number of box available"); + } + this.players = players; + this.currentPlayer = players.get(0); + this.nbrTurn = 1; + this.previousPlayer = null; + initGame(buildStrategy); + } + + /** + * Initialize a game by placing players on the grid and by generating current player available actions + * @param buildStrategy builder used to create a grid + */ + public void initGame(GridFactoryBuilder buildStrategy){ + buildStrategy.initPlacePlayers(); + currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); + } + + /** + * Game "main" method, call by a controller after human chose an action or when a computer player play an action + * Method is call everytime an action has been chosen by a human or when aa computer player need to play + * @return true if game is over, false otherwise + */ + public boolean play() { + if(currentPlayer instanceof ComputerPlayer computer) + // si le joueur est humain alors le choix se fait avant l'appel de play() + selectedAction = computer.choseAction(this); + selectedAction.doAction(); + countdownGridElementsUpdate(); + gridPlayersUpdate(); + previousPlayer = currentPlayer; + nextCurrentPlayer(); + currentPlayer.setActions(generateAndGetPlayerActions(currentPlayer)); + nbrTurn++; + return isOver(); + } + + /** + * Remove dead players from the grid + */ + private void gridPlayersUpdate(){ + for (Player player: getPlayersNotAlive().toList()) { + getGrid().getBoard().get(player.getPosition()).setA(null); + } + } + + /** + * play grid's elements that use a timer like {@link fr.lnl.game.server.games.grid.elements.Bomb} at each game tick + */ + private void countdownGridElementsUpdate() { + List countdownBoxes = this.getGrid().getAllCountdownElements(); + countdownBoxes.forEach(CountdownBox::update); + } + + /** + * Used to list all actions a player can execute at current time + * @param player the player to generate actions + * @return a list of available actions + */ + public List generateAndGetPlayerActions(Player player) { + List actions = new ArrayList<>(); + for(Direction4Axis direction : Direction4Axis.values()) { + try { + actions.add(new Move(this, player, direction)); + } catch (NotValidDirectionException ignored){} + try { + actions.add(new Shot(this, player, direction)); + } catch (NotValidDirectionException | NoMoreBulletInWeaponException ignored) {} + + } + for(Direction8Axis direction : Direction8Axis.values()) { + try { + actions.add(new DropBomb(this, player, direction)); + } catch (NotValidDirectionException ignored) {} + try { + actions.add(new DropMine(this, player, direction)); + } catch (NotValidDirectionException ignored) {} + } + actions.addAll(Arrays.asList(new Nothing(), new DeployShield(player))); + return actions; + } + + /** + * + * @return a list of alive players + */ + public Stream getPlayersAlive() { + return players.parallelStream().filter(Player::isAlive); + } + + /** + * Opposite of {@link Game#getPlayersAlive()} + * @return a list of dead players + */ + public Stream getPlayersNotAlive() { + return players.parallelStream().filter(not(Player::isAlive)); + } + + /** + * A game is over if the number of alive players is inferior to 2 + * @return true if game is over, false otherwise + */ + public boolean isOver() { + return getPlayersAlive().count() <= 1; + } + + /** + * + * @return the winner of the game if exists, null otherwise.
          + * return the only remaining alive player when it exists, or null if everyone is dead, per example when a bomb kill + * the 2 remaining players + */ + public Player getWinner() { + // On part du principe que isOver est forcément appelé avant d'appeler getWinner + return getPlayersAlive().findFirst().orElse(null); + } + + /** + * + * @return the player who is currently playing + */ + public Player getCurrentPlayer() { + return currentPlayer; + } + + /** + * Change player to the next available in the list.
          + * We set its shield deploy state to false. + */ + public void nextCurrentPlayer() { + do { + int index = players.indexOf(currentPlayer) + 1; + if(index == players.size()) + index = 0; + setCurrentPlayer(players.get(index)); + } while(!currentPlayer.isAlive()); // On arrête la boucle dès qu'on trouve un joueur en vie + currentPlayer.setShieldDeploy(false); // on reset son état + } + + /** + * @param current_player the new current player + */ + public void setCurrentPlayer(Player current_player) { + this.currentPlayer = current_player; + } + + public Grid getGrid() { + return grid; + } + + public List getPlayers() { + return players; + } + + /** + * + * @return action selected by current player if not already executed or last player if already executed + */ + public Action getSelectedAction() { + return selectedAction; + } + + /** + * @param selectedAction set the action selected by current player before doing it + */ + public void setSelectedAction(Action selectedAction) { + this.selectedAction = selectedAction; + } + + public int getNbrTurn() { + return nbrTurn; + } + + public Player getPreviousPlayer() { + return previousPlayer; + } +} \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/AbstractAction.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/AbstractAction.java new file mode 100644 index 0000000..e4a51ac --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/AbstractAction.java @@ -0,0 +1,16 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.player.Player; + +public abstract class AbstractAction implements Action { + + protected final Game game; + protected final Player player; + + public AbstractAction(Game game, Player player){ + this.game = game; + this.player = player; + } + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Action.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Action.java new file mode 100644 index 0000000..f8f3524 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Action.java @@ -0,0 +1,28 @@ +package fr.lnl.game.server.games.action; + + +import fr.lnl.game.server.utils.Point; + +import java.util.List; + +public interface Action { + + /** + * Call by {@link fr.lnl.game.server.games.Game} when player do this action + */ + void doAction(); + + /** + * + * @return true if this action is possible, false otherwise + */ + boolean isPossible(); + + /** + * Used by {@link Move}, {@link Shot} and {@link DropObject} to list all direction where the action is possible + * @return a list a point where the action is possible (not block by a wall per example) + */ + Point getPoint(); + List getValidPoint(); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/DeployShield.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DeployShield.java new file mode 100644 index 0000000..ffc67df --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DeployShield.java @@ -0,0 +1,47 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +import java.util.List; + +/** + * Used when a player want to protect himself from taking damage (shield state is reset to false at next player turn) + */ +public class DeployShield extends AbstractAction { + + public DeployShield(Player player){ + super(null, player); + } + + /** + * Deploy player shield and decrement its energy + */ + @Override + public void doAction(){ + player.decrementEnergy(player.getClassPlayer().getShieldCost()); + player.setShieldDeploy(true); + } + + /** + * This action is always possible + * @return always true + */ + @Override + public boolean isPossible() { + return true; + } + + @Override + public Point getPoint() { + return null; + } + + @Override + public List getValidPoint() { + return null; + } + + +} + diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction.java new file mode 100644 index 0000000..55976c4 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction.java @@ -0,0 +1,8 @@ +package fr.lnl.game.server.games.action; + +public interface Direction { + + int getDeltaX(); + + int getDeltaY(); +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction4Axis.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction4Axis.java new file mode 100644 index 0000000..4c3edea --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction4Axis.java @@ -0,0 +1,41 @@ +package fr.lnl.game.server.games.action; + +/** + * Enum used to chose where to move, shot, etc. + */ +public enum Direction4Axis implements Direction { + + UP(-1, 0, true), + DOWN(1, 0, true), + LEFT(0, -1, false), + RIGHT(0, 1, false); + + private final int deltaX; + private final int deltaY; + private final boolean isVertical; + + Direction4Axis(int i, int i1, boolean isVertical) { + this.deltaX = i; + this.deltaY = i1; + this.isVertical = isVertical; + } + + @Override + public int getDeltaX() { + return deltaX; + } + + @Override + public int getDeltaY() { + return deltaY; + } + + /** + * Used by {@link Shot} to know if the direction is in vertical direction cause shot action can have a different + * distance depending on the direction + * @return true if the direction is vertical + */ + public boolean isVertical() { + return isVertical; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction8Axis.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction8Axis.java new file mode 100644 index 0000000..fe3cf48 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Direction8Axis.java @@ -0,0 +1,33 @@ +package fr.lnl.game.server.games.action; + +public enum Direction8Axis implements Direction { + + UP(-1, 0), + DOWN(1, 0), + LEFT(0, -1), + RIGHT(0, 1), + UP_LEFT(-1, -1), + UP_RIGHT(-1, 1), + DOWN_RIGHT(1, 1), + DOWN_LEFT(1, -1); + + private final int deltaX; + private final int deltaY; + + Direction8Axis(int i, int i1) { + this.deltaX = i; + this.deltaY = i1; + } + + @Override + public int getDeltaX() { + return deltaX; + } + + @Override + public int getDeltaY() { + return deltaY; + } + + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropBomb.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropBomb.java new file mode 100644 index 0000000..b078633 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropBomb.java @@ -0,0 +1,26 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.elements.Bomb; +import fr.lnl.game.server.games.player.Player; + +/** + * Used when player want to drop a {@link Bomb}, bomb explode when someone walks on it and after 3 turns + */ +public class DropBomb extends DropObject { + + public DropBomb(Game game, Player player, Direction8Axis direction) throws NotValidDirectionException { + super(game, player, direction); + } + + /** + * Drop a bomb in player's selected direction and decrement its energy + */ + @Override + public void doAction() { + game.getGrid().getBoard().get(point).setB(new Bomb(point, game)); + player.decrementEnergy(player.getClassPlayer().getBombCost()); + } + +} + diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropMine.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropMine.java new file mode 100644 index 0000000..d70ffec --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropMine.java @@ -0,0 +1,26 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.elements.Mine; +import fr.lnl.game.server.games.player.Player; + +/** + * Used when player want to drop a {@link Mine}, Mine only explode when someone walks on it + */ +public class DropMine extends DropObject { + + public DropMine(Game game, Player player, Direction8Axis direction) throws NotValidDirectionException { + super(game, player, direction); + + } + + /** + * Drop a mine in player's selected direction and decrement its energy + */ + @Override + public void doAction() { + game.getGrid().getBoard().get(point).setB(new Mine(player, point)); + game.getCurrentPlayer().decrementEnergy(player.getClassPlayer().getMineCost()); + } + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropObject.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropObject.java new file mode 100644 index 0000000..d146b25 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/DropObject.java @@ -0,0 +1,78 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Super class used by {@link DropMine} and {@link DropBomb} + */ +public abstract class DropObject extends AbstractAction { + + protected final Point point; + private final Direction8Axis direction; + + /** + * @param player basically current player + * @param direction chosen direction + * @throws NotValidDirectionException throw when the chosen direction is invalid + */ + public DropObject(Game game, Player player, Direction8Axis direction) throws NotValidDirectionException { + super(game, player); + List points = getValidPoint(); + Point playerPosition = player.getPosition(); + Point dropDirection = new Point(playerPosition.getA() + direction.getDeltaX(), playerPosition.getB() + direction.getDeltaY()); + if(!points.contains(dropDirection)) { + throw new NotValidDirectionException(direction + " isn't a valid position"); + } + this.point = dropDirection; + this.direction = direction; + } + + /** + * + * @return true if player can play this action in current context, false otherwise + */ + @Override + public boolean isPossible() { + return !getValidPoint().isEmpty(); + } + + /** + * @return a list of point where it's possible to place a bomb of a mine. + * We add a point where there is nothing on the board. + * @see Action#getValidPoint() + */ + public List getValidPoint() { + List listMoves = new ArrayList<>(); + HashMap> board = game.getGrid().getBoard(); + Point position = player.getPosition(); + for (int row = -1; row <= 1; row++) { + for (int column = -1; column <= 1; column++) { + if(game.getGrid().boardPositionIsValid(position.getA(),row,position.getB(),column)){ + Point neighbour = new Point(position.getA() + row, position.getB() + column); + Pair state = board.get(neighbour); + if(state.getA() == null && state.getB() == null){ + listMoves.add(neighbour); + } + } + } + } + return listMoves; + } + + public Direction8Axis getDirection() { + return direction; + } + + @Override + public Point getPoint() { + return point; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Move.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Move.java new file mode 100644 index 0000000..ed51fae --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Move.java @@ -0,0 +1,95 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.grid.elements.InteractiveBox; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Used when the player want to move in a direction, it can move in a direction when there is another player or a wall + */ +public class Move extends AbstractAction { + + private final Point point; + private final Direction4Axis direction; + + public Move(Game game, Player player, Direction4Axis direction) throws NotValidDirectionException { + super(game, player); + List points = getValidPoint(); + Point playerPosition = player.getPosition(); + Point newPosition = new Point(playerPosition.getA() + direction.getDeltaX(), playerPosition.getB() + direction.getDeltaY()); + if(!points.contains(newPosition)) { + throw new NotValidDirectionException(direction + " isn't a valid position"); + } + this.point = newPosition; + this.direction = direction; + } + + /** + * Move player to its new position and decrement its point + */ + @Override + public void doAction() { + game.getGrid().getBoard().get(player.getPosition()).setA(null); + game.getGrid().getBoard().get(this.point).setA(player); + player.setPosition(this.point); + player.decrementEnergy(player.getClassPlayer().getMoveCost()); + Box box = game.getGrid().getBoard().get(this.point).getB(); + if(box instanceof InteractiveBox interactiveBox) { + interactiveBox.interact(game.getGrid(), player, this.point); + } + } + + /** + * @return true if player can play this action in current context, false otherwise + */ + @Override + public boolean isPossible() { + return !getValidPoint().isEmpty(); + } + + /** + * @return a list of point where it's possible to move. + * We add a point to the list where there is nothing on the board. + * @see Action#getValidPoint() + */ + + @Override + public List getValidPoint() { + List listMoves = new ArrayList<>(); + HashMap> board = game.getGrid().getBoard(); + Point position = player.getPosition(); + for (int deltarow = -1; deltarow <= 1; deltarow++) { + for (int deltacolumn = -1; deltacolumn <= 1; deltacolumn++) { + if(deltarow == 0 || deltacolumn == 0){ + if(game.getGrid().boardPositionIsValid(position.getA(),deltarow,position.getB(),deltacolumn)){ + Point neighbour = new Point(position.getA() + deltarow, position.getB() + deltacolumn); + Pair state = board.get(neighbour); + if(state.getA() == null && !(state.getB() instanceof Wall)){ + listMoves.add(neighbour); + } + } + } + } + } + return listMoves; + } + + @Override + public Point getPoint() { + return point; + } + + public Direction4Axis getDirection() { + return direction; + } + + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.java new file mode 100644 index 0000000..06ecde2 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/NoMoreBulletInWeaponException.java @@ -0,0 +1,12 @@ +package fr.lnl.game.server.games.action; + +/** + * This exception is throw when player has no remaining bullet + */ +public class NoMoreBulletInWeaponException extends Exception { + + public NoMoreBulletInWeaponException() { + super(); + } + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/NotValidDirectionException.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/NotValidDirectionException.java new file mode 100644 index 0000000..f360c89 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/NotValidDirectionException.java @@ -0,0 +1,12 @@ +package fr.lnl.game.server.games.action; + +/** + * throw when action instantiated and the chosen direction in constructor isn't valid + */ +public class NotValidDirectionException extends Exception { + + public NotValidDirectionException(String message) { + super(message); + } + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Nothing.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Nothing.java new file mode 100644 index 0000000..1157815 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Nothing.java @@ -0,0 +1,41 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.utils.Point; + +import java.util.List; + +/** + * This action is used when player doesn't want to move and/or loose energy + */ +public class Nothing extends AbstractAction { + + public Nothing() { + super(null, null); + } + + /** + * doAction in this context don't execute any operation + */ + @Override + public void doAction(){ + } + + /** + * This action is always possible + * @return always true + */ + @Override + public boolean isPossible() { + return true; + } + + @Override + public Point getPoint() { + return null; + } + + @Override + public List getValidPoint() { + return null; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/ReunionSameAction.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/ReunionSameAction.java new file mode 100644 index 0000000..dbd3f1c --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/ReunionSameAction.java @@ -0,0 +1,41 @@ +package fr.lnl.game.server.games.action; + +import java.util.ArrayList; +import java.util.List; + +/** + * When we generate action, we generate one per available direction (like in {@link Move}) but to improve human + * readability, we list every same Action here + */ +public class ReunionSameAction { + + private final String actionName; + private List actions; + + public ReunionSameAction(String actionName){ + this.actionName = actionName; + this.actions = new ArrayList<>(); + } + + public ReunionSameAction(String actionName, Action action){ + this(actionName); + this.actions = new ArrayList<>(List.of(action)); + } + + public List getActions() { + return actions; + } + + + public String getActionName() { + return actionName; + } + + public Action getAction(int value) { + return getActions().get(value); + } + + public void addAction(Action action) { + this.actions.add(action); + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/Shot.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Shot.java new file mode 100644 index 0000000..4640941 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/Shot.java @@ -0,0 +1,115 @@ +package fr.lnl.game.server.games.action; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.games.weapon.Weapon; +import fr.lnl.game.server.utils.Point; + +import java.util.ArrayList; +import java.util.List; + +public class Shot extends AbstractAction { + + private final Point point; + private final Direction4Axis direction; + + public Shot(Game game, Player player, Direction4Axis direction) throws NoMoreBulletInWeaponException, NotValidDirectionException { + super(game, player); + if(player.getWeapon().getBullet() == 0) { + throw new NoMoreBulletInWeaponException(); + } + List points = getValidPoint(); + Point playerPosition = player.getPosition(); + Point shotDirection = new Point(playerPosition.getA() + direction.getDeltaX(), playerPosition.getB() + direction.getDeltaY()); + if(!points.contains(shotDirection)) { + throw new NotValidDirectionException(direction + " isn't a valid position"); + } + this.point = shotDirection; + this.direction = direction; + } + + public Shot(Game game, Player player) { + super(game, player); + point = null; + direction = null; + } + + /** + * We decrement player's energy and shot on every of its opponents on the chosen direction by decrementing its + * energy too + */ + @Override + public void doAction() { + player.decrementEnergy(player.getClassPlayer().getShootCost()); + int range = direction.isVertical() ? player.getWeapon().getVerticalDistance() : player.getWeapon().getHorizontalDistance(); + for(int i=0; i < range; i++) { + Point point = new Point(this.point.getA() + (i * direction.getDeltaX()), + this.point.getB() + (i * direction.getDeltaY())); + if(game.getGrid().boardPositionIsValid(point)) { + Player player = game.getGrid().getBoard().get(point).getA(); + if(player != null) { + player.decrementEnergy(player.getClassPlayer().getPenaltyShoot()); + } + } + + } + } + + /** + * @return true if player can play this action in current context, false otherwise + */ + @Override + public boolean isPossible() { + return !getValidPoint().isEmpty(); + } + + /** + * @return a list of point where it's possible to shot. + * We add a point to the list where there is a player depending on the direction and the distance the weapon can + * shoot. + * @see Action#getValidPoint() + */ + @Override + public List getValidPoint() { + List listMoves = new ArrayList<>(); + Point position = game.getCurrentPlayer().getPosition(); + Weapon weapon = game.getCurrentPlayer().getWeapon(); + for(Direction4Axis direction : Direction4Axis.values()) { + Point neighbour = seeNeighbour(position, direction.getDeltaX(), direction.getDeltaY(), + direction.isVertical() ? weapon.getVerticalDistance() : weapon.getHorizontalDistance()); + if(neighbour != null) + listMoves.add(neighbour); + } + return listMoves; + } + + /** + * + * @param point player current position + * @param deltaX given by {@link Direction4Axis} + * @param deltaY given by {@link Direction4Axis} + * @param range given by {@link Weapon#getHorizontalDistance()} or {@link Weapon#getVerticalDistance()} + * @return true if there is a player in the chosen direction, false otherwise + */ + public Point seeNeighbour(Point point, int deltaX, int deltaY, int range) { + if(range == 0) + return null; + for(int i = 0; i < range; i++) { + Point neighbour = new Point(point.getA() + deltaX + (i * deltaX), point.getB() + deltaY + (i * deltaY)); + if(game.getGrid().boardPositionIsValid(neighbour)) { + if(game.getGrid().getBoard().get(neighbour).getB() instanceof Wall) { + return null; + } + if(game.getGrid().getBoard().get(neighbour).getA() instanceof Player) { + return neighbour; + } + } + } + return null; + } + + public Point getPoint() { + return point; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/action/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/action/package-info.java new file mode 100644 index 0000000..0ac3993 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/action/package-info.java @@ -0,0 +1,4 @@ +/** + * Package storing all actions a player can do + */ +package fr.lnl.game.server.games.action; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/Grid.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/Grid.java new file mode 100644 index 0000000..a3378d3 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/Grid.java @@ -0,0 +1,181 @@ +package fr.lnl.game.server.games.grid; + +import fr.lnl.game.server.games.grid.elements.*; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * Class managing the board + */ +public class Grid { + private final HashMap> board; + private final int row; + private final int column; + private final List players; + + public Grid(int row, int column, List players) { + this.row = row; + this.column = column; + this.players = players; + board = new HashMap<>(); + } + + /** + * @see Grid#boardPositionIsValid(int, int) + */ + public boolean boardPositionIsValid(int row, int deltaRow, int column, int deltaColumn){ + return boardPositionIsValid(row + deltaRow, column + deltaColumn); + } + + /** + * Check if given position is in grid area + * @return true if position is valid, false otehrwise + */ + public boolean boardPositionIsValid(int row, int column) { + return row >= 0 && column >= 0 && row < this.row && column < this.column; + } + + /** + * @see Grid#boardPositionIsValid(int, int) + */ + public boolean boardPositionIsValid(Point point) { + return boardPositionIsValid(point.getA(), point.getB()); + } + + /** + * @return the number of neutral box + * @see Grid#isNeutralBox(Box) + */ + public int getNumberNeutralBox(){ + int countBox = 0; + for (int i = 1; i < row - 1; i++) { + for (int j = 1; j < column - 1; j++) { + Box box = board.get(new Point(i,j)).getB(); + if(isNeutralBox(box)){ + countBox++; + } + } + } + return countBox; + } + + /** + * + * @param box the box we'll look state + * @return true if {@code box} isn't a {@link Wall} or a {@link EnergyBall} + */ + public boolean isNeutralBox(Box box){ + return !(box instanceof Wall) && !(box instanceof EnergyBall); + } + + /** + * Given a string representation of the board.
          + * Some characters in given string are in UTF-8 and can be poorly displayed if using an incompatible encoding, like + * on Windows where french regional encoding is {@code windows-1252} + * @return a string view of a board + */ + @Override + public String toString() { + StringBuilder str = new StringBuilder(); + for (int i = 0; i < row; i++) { + str.append("\n"); + for (int j = 0; j < column; j++) { + Pair value = board.get(new Point(i, j)); + if(value.getA() != null){ + str.append(" \033[0;34m").append(value.getA().getId()).append("\033[0m"); + } + else if (value.getB() instanceof Wall) { + str.append(" \033[0;32m#\033[0m"); + } + else if(value.getB() instanceof EnergyBall){ + str.append(" \033[0;31mE\033[0m"); + } + else if(value.getB() instanceof Mine){ + str.append(" \033[0;35mM\033[0m"); + } + else if(value.getB() instanceof Bomb){ + str.append(" \033[0;36mB\033[0m"); + } + else { + str.append(" \033[0;37m.\033[0m"); + } + } + } + return str.toString(); + } + + public String privateView(Player player) { + StringBuilder str = new StringBuilder(); + for (int i = 0; i < row; i++) { + str.append("\n"); + for (int j = 0; j < column; j++) { + Pair value = board.get(new Point(i, j)); + if(value.getA() != null){ + str.append(" \033[0;34m").append(value.getA().getId()).append("\033[0m"); + } + else if (value.getB() instanceof Wall) { + str.append(" \033[0;32m#\033[0m"); + } + else if(value.getB() instanceof EnergyBall){ + str.append(" \033[0;31mE\033[0m"); + } + else if(value.getB() instanceof Explosive){ + if(((Explosive) value.getB()).getPlayer().equals(player)){ + if(value.getB() instanceof Mine){ + str.append(" \033[0;35mM\033[0m"); + } + else if(value.getB() instanceof Bomb){ + str.append(" \033[0;36mB\033[0m"); + } + } + else{ + str.append(" \033[0;37m.\033[0m"); + } + } + else { + str.append(" \033[0;37m.\033[0m"); + } + } + } + return str.toString(); + } + + public HashMap> getBoard() { + return board; + } + + public Player getGridPlayer(Point point){ + return getBoard().get(point).getA(); + } + + public Box getGridBox(Point point){ + return getBoard().get(point).getB(); + } + + public List getPlayers() { + return players; + } + + public int getRow() { + return row; + } + + public int getColumn() { + return column; + } + + public List getAllCountdownElements() { + List list = new ArrayList<>(); + for(Pair element : getBoard().values()) { + if(element.getB() instanceof CountdownBox box) { + list.add(box); + } + } + return list; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.java new file mode 100644 index 0000000..b25d9e8 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/AbstractGridFactoryBuilder.java @@ -0,0 +1,107 @@ +package fr.lnl.game.server.games.grid.build; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; + +import java.util.List; + +public abstract class AbstractGridFactoryBuilder implements GridFactoryBuilder { + + protected float wallProbability, energyProbability; + protected Grid grid; + private int row; + private int columns; + private List players; + + protected AbstractGridFactoryBuilder() { + + } + + /** + * @param probability wall probability, which will be used by + * {@link AbstractGridFactoryBuilder#initPlaceInternWall()} when calling {@link GridFactoryBuilder#build()} + * @return {@code this} + * @see GridFactoryBuilder#wallProbability(float) + */ + public GridFactoryBuilder wallProbability(float probability) { + this.wallProbability = probability; + return this; + } + + /** + * @param probability energy probability, which will be used by + * {@link AbstractGridFactoryBuilder#initPlaceEnergyBall()} when calling {@link GridFactoryBuilder#build()} + * @return {@code this} + * @see GridFactoryBuilder#energyProbability(float) + */ + public GridFactoryBuilder energyProbability(float probability) { + this.energyProbability = probability; + return this; + } + + /** + * + * @param row row grid's size + * @param columns columns grid's size + * @return {@code this} + * @see GridFactoryBuilder#gridDimensions(int, int) + */ + public GridFactoryBuilder gridDimensions(int row, int columns) { + this.row = row; + this.columns = columns; + return this; + } + + /** + * @param players list a players + * @return {@code this} + * @see GridFactoryBuilder#playersList(List) + */ + public GridFactoryBuilder playersList(List players) { + this.players = players; + return this; + } + + /** + * Call this method after you call {{@link GridFactoryBuilder#energyProbability(float)}}, + * {@link GridFactoryBuilder#wallProbability(float)}, {@link GridFactoryBuilder#gridDimensions(int, int)} and + * {@link GridFactoryBuilder#playersList(List)}. It'll instantiate a new {@link Grid} and initialize his components + * like border walls, intern walls, and energy using parameters given previously + * @return an instance of {@link Grid} + */ + @Override + public Grid build() { + this.grid = new Grid(row, columns, players); + initGrid(); + initPlaceInternWall(); + initPlaceEnergyBall(); + return grid; + } + + protected Grid getGrid() { + return grid; + } + + /** + * abstract method used to initialize grid
          + * We let implementation of this class the way to initialize the grid + */ + protected abstract void initGrid(); + + /** + * abstract method used to place energy ball
          + * We let implementation of this class the way to initialize the grid
          + * Implementation need to use {@link AbstractGridFactoryBuilder#energyProbability} to place energy balls + */ + protected abstract void initPlaceEnergyBall(); + + /** + * abstract method used to place intern walls(namely not border walls)
          + * We let implementation of this class the way to initialize the grid.
          + * Implementation need to use {@link AbstractGridFactoryBuilder#wallProbability} to place energy balls + */ + protected abstract void initPlaceInternWall(); + + + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.java new file mode 100644 index 0000000..f320411 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/GridFactoryBuilder.java @@ -0,0 +1,61 @@ +package fr.lnl.game.server.games.grid.build; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; + +import java.util.List; + +/** + * Factory pattern + */ +public interface GridFactoryBuilder { + + /** + * Set energy probability
          + * @param probability energy probability, which will be used by + * {@link AbstractGridFactoryBuilder#initPlaceEnergyBall()} when calling {@link GridFactoryBuilder#build()} + * @return {@code this} + */ + GridFactoryBuilder energyProbability(float probability); + + /** + * Set wall probability
          + * @param probability wall probability, which will be used by + * {@link AbstractGridFactoryBuilder#initPlaceInternWall()} when calling {@link GridFactoryBuilder#build()} + * @return {@code this} + */ + GridFactoryBuilder wallProbability(float probability); + + /** + * set grid dimensions. + * Arguments are given when instancing {@link Grid} when using {@link GridFactoryBuilder#build()} + * @param row row grid's size + * @param columns columns grid's size + * @return {@code this} + */ + GridFactoryBuilder gridDimensions(int row, int columns); + + /** + * set players list. + * Argument given to {@link Grid} when calling {@link GridFactoryBuilder#build()} + * @param players list a players + * @return {@code this} + */ + GridFactoryBuilder playersList(List players); + + /** + * Call this method after you call {{@link GridFactoryBuilder#energyProbability(float)}}, + * {@link GridFactoryBuilder#wallProbability(float)}, {@link GridFactoryBuilder#gridDimensions(int, int)} and + * {@link GridFactoryBuilder#playersList(List)}, It'll instantiate a new {@link Grid} and initialize his components + * like border walls, intern walls, and energy using parameters given previously + * @return an instance of {@link Grid} + */ + Grid build(); + + /** + * call when initializing the game, it'll place player depending on the strategy used by its implementation, + * need to be call after build, call an NullPointerException otherwise + */ + void initPlacePlayers(); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.java new file mode 100644 index 0000000..6fd1cc8 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/LockGridFactoryBuilder.java @@ -0,0 +1,152 @@ +package fr.lnl.game.server.games.grid.build; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.elements.AbstractBox; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; + +import java.util.Random; + +public class LockGridFactoryBuilder extends AbstractGridFactoryBuilder { + + /** + * this method is protected to avoid new instance outside of {@link GridFactoryBuilder} context + */ + protected LockGridFactoryBuilder() { + + } + + /** + * @return a new instance of {@link LockGridFactoryBuilder} used to construct a {@link Grid} + */ + public static GridFactoryBuilder create() { + return new LockGridFactoryBuilder(); + } + + /** + * Method used to initialize grid
          + * We place walls on every border, and we initialize board value as null where there is no need o border walls + * @see AbstractGridFactoryBuilder#initGrid() + */ + @Override + protected void initGrid() { + for (int i = 0; i < getGrid().getRow(); i++) { + for (int j = 0; j < getGrid().getColumn(); j++) { + Box box; + if (i == 0 && j == 0) { + box = new Wall(); + } else if (i == 0 && j == getGrid().getColumn()-1) { + box = new Wall(); + } else if (i == getGrid().getRow()-1 && j == 0) { + box = new Wall(); + } else if (i == getGrid().getRow()-1 && j == getGrid().getColumn()-1) { + box = new Wall(); + } else if (i == 0) { + box = new Wall(); + } else if (i == getGrid().getRow()-1) { + box = new Wall(); + } else if (j == 0) { + box = new Wall(); + } else if (j == getGrid().getColumn()-1) { + box = new Wall(); + } else { + box = null; + } + getGrid().getBoard().put(new Point(i,j), new Pair<>(null,box)); + } + } + } + + /** + * Method used to initialize energy balls, we place energy balls using a random value and a probability and where + * there is no walls + * @see AbstractGridFactoryBuilder#initPlaceEnergyBall() + */ + @Override + protected void initPlaceEnergyBall() { + for (int i = 1; i < getGrid().getRow() - 1; i++) { + for (int j = 1; j < getGrid().getColumn() - 1; j++) { + if(Math.random() >= energyProbability){ + Point point = new Point(i,j); + if(!(getGrid().getBoard().get(point).getB() instanceof Wall)){ + getGrid().getBoard().get(point).setB(new EnergyBall()); + } + } + } + } + } + + /** + * Method used to place intern walls (opposite of border walls), we place walls using a random value and a + * probability and where there is no walls or where the position haven't a lock + * @see LockGridFactoryBuilder#getIllusionNumberWallNeighbour(Point) + */ + @Override + protected void initPlaceInternWall() { + for (int i = 1; i < getGrid().getRow() - 1; i++) { + for (int j = 1; j < getGrid().getColumn() - 1; j++) { + if(Math.random() >= wallProbability){ + Point point = new Point(i,j); + if(getIllusionNumberWallNeighbour(point) <= 3){ + getGrid().getBoard().get(point).setB(new Wall()); + } + else{ + getGrid().getBoard().get(point).setB(new AbstractBox()); + getGrid().getBoard().get(point).getB().setLock(true); + } + } + } + } + } + + /** + * Simply place player randomly where it's possible + */ + @Override + public void initPlacePlayers() { + Random random = new Random(); + Box boxTargeted; + Player playerTargeted; + Point point; + for (Player player: getGrid().getPlayers()) { + do{ + int i = random.nextInt(1,getGrid().getRow() - 1); + int j = random.nextInt(1,getGrid().getColumn() - 1); + point = new Point(i,j); + Pair pairTargeted = getGrid().getBoard().get(point); + boxTargeted = pairTargeted.getB(); + playerTargeted = pairTargeted.getA(); + }while(playerTargeted != null || !getGrid().isNeutralBox(boxTargeted)); + getGrid().getBoard().get(point).setA(player); + player.setPosition(point); + } + } + + /** + * A locked place is used to try to avoid player to be blocked when playing, + * A locked place can't have a wall on it + * @param point the position where we want to place a new wall + * @return number of walls and locked place around {@code position} + */ + private int getIllusionNumberWallNeighbour(Point point){ + int countWall = 0; + for (int deltaRow = -1; deltaRow <= 1; deltaRow++){ + for (int deltaColomn = -1; deltaColomn <= 1; deltaColomn++) { + Point neighbour = new Point(point.getA() + deltaRow, point.getB() + deltaColomn); + if (getGrid().boardPositionIsValid(neighbour)) { + Box box = getGrid().getBoard().get(neighbour).getB(); + if (box != null) { + if (box instanceof Wall || box.isLock()) { + countWall++; + } + } + } + } + } + return countWall; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/package-info.java new file mode 100644 index 0000000..ec24a12 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/build/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing all about Grid construction + */ +package fr.lnl.game.server.games.grid.build; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/AbstractBox.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/AbstractBox.java new file mode 100644 index 0000000..44c3f94 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/AbstractBox.java @@ -0,0 +1,25 @@ +package fr.lnl.game.server.games.grid.elements; + +/** + * AbstractBox is instantiable (not an abstract class), but when it's the case, instance doesn't represent anything, + * it's only to see if there is a lock on this position or not + */ +public class AbstractBox implements Box { + + boolean lock; + + public AbstractBox(){ + lock = false; + } + + @Override + public void setLock(boolean lock) { + this.lock = lock; + } + + @Override + public boolean isLock() { + return lock; + } +} + diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Bomb.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Bomb.java new file mode 100644 index 0000000..ca72f0e --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Bomb.java @@ -0,0 +1,65 @@ +package fr.lnl.game.server.games.grid.elements; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +/** + * Bomb are elements which explode when someone walks on it or after a countdown, the explosion area is on multiple cases + */ +public class Bomb extends Explosive implements CountdownBox { + + private final Game game; + /** + * Timer before explosion + */ + private int counter = 5; + /** + * Explosion size, size is circle, not square + */ + private static final int EXPLOSION_SIZE = 2; + + public Bomb(Point point, Game game) { + super(game.getCurrentPlayer(), point); + this.game = game; + counter = counter * game.getPlayers().size(); + } + + protected void explode(Grid grid) { + for(int i = -EXPLOSION_SIZE; i < EXPLOSION_SIZE; i++) { + for(int j = -EXPLOSION_SIZE; j < EXPLOSION_SIZE; j++) { + if(pythagoras(i, j) <= EXPLOSION_SIZE) { // recherche en cercle, pas en carré + Point position = new Point(point.getA() + i, point.getB() + j); + if(grid.boardPositionIsValid(position)) { + Player player = grid.getBoard().get(position).getA(); + if(player != null) + player.decrementEnergy(player.getClassPlayer().getPenaltyBomb()); + } + } + } + } + super.explode(grid); + } + + /** + * When the timer (counter) goes down to 0, the bomb explode + * @see CountdownBox#update() + */ + @Override + public void update() { + counter--; + if(counter == 0) { + explode(game.getGrid()); + } + } + + /** + * @param a adjacent side of a triangle + * @param b opposite side of a triangle + * @return Pythagoras' theorem value + */ + public double pythagoras(double a, double b) { + return Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2)); + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Box.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Box.java new file mode 100644 index 0000000..3e7b5f4 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Box.java @@ -0,0 +1,12 @@ +package fr.lnl.game.server.games.grid.elements; + +public interface Box { + + /** + * @return true if this box is locked (can't place wall on this position) + * @see fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder + */ + boolean isLock(); + + void setLock(boolean lock); +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/CountdownBox.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/CountdownBox.java new file mode 100644 index 0000000..0fbdbe2 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/CountdownBox.java @@ -0,0 +1,13 @@ +package fr.lnl.game.server.games.grid.elements; + +/** + * A box implemented by CountdownBox is a box which do an action a certain time after being placed + */ +public interface CountdownBox { + + /** + * Call at each game tick (After a player do an action) + */ + void update(); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/EnergyBall.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/EnergyBall.java new file mode 100644 index 0000000..5d7e41f --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/EnergyBall.java @@ -0,0 +1,34 @@ +package fr.lnl.game.server.games.grid.elements; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +/** + * An EnergyBall is a box which give back a bit of player energy after it walks on the ball + */ +public class EnergyBall extends AbstractBox implements InteractiveBox{ + + /** + * Increment energy of player who walks on this element + * @param grid Game's grid + * @param player the player who walks on this element + * @param position position of this element on the grid + * @see InteractiveBox#interact(Grid, Player, Point) + */ + @Override + public void interact(Grid grid, Player player, Point position) { + player.incrementEnergy(player.getClassPlayer().getGainEnergy()); + grid.getBoard().get(position).setB(null); + } + + /** + * Used by tests + * @param obj the object to compare + * @return true if obj is an instance of EnergyBall, false otherwise + */ + @Override + public boolean equals(Object obj) { + return obj instanceof EnergyBall; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Explosive.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Explosive.java new file mode 100644 index 0000000..fad2c94 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Explosive.java @@ -0,0 +1,50 @@ +package fr.lnl.game.server.games.grid.elements; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +/** + * Super class of {@link Bomb} and {@link Mine} + */ +public abstract class Explosive extends AbstractBox implements InteractiveBox { + + /** + * Position of the explosive + */ + protected final Point point; + /** + * Owner of the explosive + */ + protected final Player player; + + public Explosive(Player player, Point point){ + this.player = player; + this.point = point; + } + + /** + * Decrement energy of the player who walks on this element + * @param grid Game's grid + * @param player the player who walks on this element + * @param position position of this element on the grid + * @see InteractiveBox#interact(Grid, Player, Point) + * @see Explosive#interact(Grid, Player, Point) + */ + @Override + public void interact(Grid grid, Player player, Point position) { + explode(grid); + } + + /** + * Apply damage to players and delete this object + * @param grid game's grid + */ + protected void explode(Grid grid) { + grid.getBoard().get(point).setB(null); + } + + public Player getPlayer() { + return player; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/InteractiveBox.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/InteractiveBox.java new file mode 100644 index 0000000..4c08e31 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/InteractiveBox.java @@ -0,0 +1,20 @@ +package fr.lnl.game.server.games.grid.elements; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +/** + * A box implemented by InteractiveBox is a box which do an action when someone walks on it + */ +public interface InteractiveBox { + + /** + * Call when a player walk on it + * @param grid Game's grid + * @param player the player who walks on this element + * @param position position of this element on the grid + */ + void interact(Grid grid, Player player, Point position); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Mine.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Mine.java new file mode 100644 index 0000000..bfe8f8b --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Mine.java @@ -0,0 +1,23 @@ +package fr.lnl.game.server.games.grid.elements; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.utils.Point; + +/** + * A mine is an element which explose when someone walks on it, the explosion area is on 1 case only + */ +public class Mine extends Explosive{ + + public Mine(Player player, Point point) { + super(player, point); + } + + @Override + protected void explode(Grid grid) { + Player player = grid.getBoard().get(point).getA(); + if(player != null) + player.decrementEnergy(player.getClassPlayer().getPenaltyMine()); + super.explode(grid); + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Wall.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Wall.java new file mode 100644 index 0000000..7747ce2 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/Wall.java @@ -0,0 +1,17 @@ +package fr.lnl.game.server.games.grid.elements; + +/** + * A wall is an intraversable object + */ +public class Wall extends AbstractBox { + + /** + * Used by tests + * @param obj the object to compare + * @return true if obj is an instance of wall, false otherwise + */ + @Override + public boolean equals(Object obj) { + return obj instanceof Wall; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/package-info.java new file mode 100644 index 0000000..12e41c9 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/elements/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing all the elements that can be arranged in a grid + */ +package fr.lnl.game.server.games.grid.elements; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/grid/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/package-info.java new file mode 100644 index 0000000..bcadaf0 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/grid/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing all about Grid components + */ +package fr.lnl.game.server.games.grid; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/package-info.java new file mode 100644 index 0000000..1cd178d --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/package-info.java @@ -0,0 +1,4 @@ +/** + * Game package, contains all classes and sub-packages mainly related game works + */ +package fr.lnl.game.server.games; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/AbstractPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/AbstractPlayer.java new file mode 100644 index 0000000..43cdad1 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/AbstractPlayer.java @@ -0,0 +1,134 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.action.Action; +import fr.lnl.game.server.games.action.ReunionSameAction; +import fr.lnl.game.server.games.weapon.Weapon; +import fr.lnl.game.server.utils.Point; + +import java.util.ArrayList; +import java.util.List; + +public abstract class AbstractPlayer implements Player { + + private final int id; + private Point position; + private int energy; + private Weapon weapon; + private boolean shieldDeploy; + private List actions; + private final ClassPlayer classPlayer; + + public AbstractPlayer(Integer id, Point position, boolean shieldDeploy, ClassPlayer classPlayer) { + this.id = id; + this.classPlayer = classPlayer; + this.energy = classPlayer.getEnergy(); + this.weapon = classPlayer.getWeapon(); + this.shieldDeploy = shieldDeploy; + this.position = position; + } + + /** + * + * @return a list of {@link ReunionSameAction} which groups the same types of actions together. + * It is used by the player action choice strategy + */ + @Override + public List generateAvailableActions() { + List actions = new ArrayList<>(); + for (Action a : getActions()) { + ReunionSameAction reunionFilter = actions.stream() + .filter(r -> r.getActionName().equals(a.getClass().getSimpleName())) + .findFirst() + .orElse(null); + if(reunionFilter != null){ + reunionFilter.addAction(a); + } + else{ + actions.add(new ReunionSameAction(a.getClass().getSimpleName(),a)); + } + } + return actions; + } + + @Override + public boolean isAlive(){ + return energy > 0; + } + + @Override + public int getId() { + return id; + } + + @Override + public int getEnergy() { + return energy; + } + + @Override + public Weapon getWeapon() { + return weapon; + } + + @Override + public boolean isShieldDeploy() { + return shieldDeploy; + } + + @Override + public void setEnergy(int energy) { + this.energy = energy; + } + + @Override + public void setShieldDeploy(boolean shieldDeploy) { + this.shieldDeploy = shieldDeploy; + } + + @Override + public void setWeapon(Weapon weapon) { + this.weapon = weapon; + } + + @Override + public List getActions() { + return actions; + } + + @Override + public void setActions(List actions){ + this.actions = actions; + } + + @Override + public ClassPlayer getClassPlayer() { + return classPlayer; + } + + @Override + public Point getPosition() { + return position; + } + + + @Override + public void setPosition(/* NotNull */ Point position){ + if(position == null){ + throw new IllegalArgumentException("Position is null"); + } + this.position = position; + } + + @Override + public void decrementEnergy(int energy){ + if(!isShieldDeploy()){ + this.energy -= energy; + } + shieldDeploy = false; + } + + @Override + public void incrementEnergy(int energy){ + this.energy += energy; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/ClassPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/ClassPlayer.java new file mode 100644 index 0000000..669aae9 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/ClassPlayer.java @@ -0,0 +1,86 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.weapon.Firearm; +import fr.lnl.game.server.games.weapon.Weapon; + +/** + * ClassPlayer contains all data about the cost of an action or the cost of a damage + */ +public enum ClassPlayer { + + DEFAULT(800, 25, 20, 30, 40, 10, 80, 40, 20, 15, new Firearm()), + TANK(1000, 20, 20, 17, 23, 13, 80, 27, 30, 22, new Firearm()), + DPS(800, 25, 16, 15, 20, 10, 80, 40, 40, 30, new Firearm()), + SUPPORT(600, 25, 20, 11, 15, 7, 80, 45, 45, 35, new Firearm()); + private final int energy; + private final int shieldCost; + private final int shootCost; + private final int mineCost; + private final int bombCost; + private final int moveCost; + private final int gainEnergy; + private final int penaltyShoot; + private final int penaltyBomb; + private final int penaltyMine; + private final Weapon weapon; + + + ClassPlayer(int energy, int shieldCost, int shootCost, int mineCost, int bombCost, int moveCost, + int gainEnergy, int penaltyShoot, int penaltyBomb, int penaltyMine, Weapon weapon){ + this.energy = energy; + this.shieldCost = shieldCost; + this.shootCost = shootCost; + this.mineCost = mineCost; + this.bombCost = bombCost; + this.moveCost = moveCost; + this.gainEnergy = gainEnergy; + this.penaltyShoot = penaltyShoot; + this.penaltyBomb = penaltyBomb; + this.penaltyMine = penaltyMine; + this.weapon = weapon; + } + + public int getEnergy() { + return energy; + } + + public int getShieldCost() { + return shieldCost; + } + + public int getShootCost() { + return shootCost; + } + + public int getMineCost() { + return mineCost; + } + + public int getBombCost() { + return bombCost; + } + + public int getMoveCost() { + return moveCost; + } + + public int getGainEnergy() { + return gainEnergy; + } + + public int getPenaltyShoot() { + return penaltyShoot; + } + + public int getPenaltyBomb() { + return penaltyBomb; + } + + public int getPenaltyMine() { + return penaltyMine; + } + + public Weapon getWeapon() { + return weapon; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/ComputerPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/ComputerPlayer.java new file mode 100644 index 0000000..8c525bf --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/ComputerPlayer.java @@ -0,0 +1,39 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.Action; +import fr.lnl.game.server.games.action.Nothing; +import fr.lnl.game.server.utils.Point; + +/** + * Super class of all Computer players + */ +public abstract class ComputerPlayer extends AbstractPlayer { + + public ComputerPlayer(Integer id, Point point, ClassPlayer classPlayer) { + super(id, point, false, classPlayer); + } + + /** + * Call when an AI need to choose an action to execute + * @return the chosen action + */ + public Action choseAction(Game game){ + Action action; + switch (getActions().size()){ + case 0 -> action = new Nothing(); + case 1 -> action = getActions().get(0); + default -> { + return strategy(game); + } + } + return action; + } + + /** + * + * Method belonging to classes which extend this class to define the specific strategy of the player + * @return the chosen action between all available + */ + public abstract Action strategy(Game game); +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/HumanPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/HumanPlayer.java new file mode 100644 index 0000000..f27e31e --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/HumanPlayer.java @@ -0,0 +1,21 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.utils.Point; + +/** + * Instance of Human Player.
          + * A human player choose an action to execute by using mouse or keyboard.
          + * Human Player don't implement choseAction cause this method is executed on client part + */ +public class HumanPlayer extends AbstractPlayer { + + public HumanPlayer(Integer id, Point point, ClassPlayer classPlayer) { + super(id, point,false, classPlayer); + } + + + @Override + public String toString() { + return "Human"; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/Player.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/Player.java new file mode 100644 index 0000000..c53b44a --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/Player.java @@ -0,0 +1,62 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.action.Action; +import fr.lnl.game.server.games.action.ReunionSameAction; +import fr.lnl.game.server.games.weapon.Weapon; +import fr.lnl.game.server.utils.Point; + +import java.util.List; + +public interface Player { + + List generateAvailableActions(); + + Point getPosition(); + + /** + * + * @return true if this player is Alive, false otherwise + */ + boolean isAlive(); + + int getId(); + + int getEnergy(); + + Weapon getWeapon(); + + /** + * + * @return true if this player has his shield activated, false otherwise + */ + boolean isShieldDeploy(); + + void setEnergy(int energy); + + void setShieldDeploy(boolean shieldDeploy); + + void setWeapon(Weapon weapon); + + List getActions(); + + void setActions(List actions); + + ClassPlayer getClassPlayer(); + + void setPosition(Point position); + + /** + * + * Call by the implementing classes {@link fr.lnl.game.server.games.action.Action} to withdraw + * a certain number of energy from a player + */ + void decrementEnergy(int energy); + + /** + * + * Call by the implementing classes {@link fr.lnl.game.server.games.action.Action} to add + * a certain number of energy from a player + */ + void incrementEnergy(int energy); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/RandomComputerPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/RandomComputerPlayer.java new file mode 100644 index 0000000..d0be3d7 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/RandomComputerPlayer.java @@ -0,0 +1,33 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.Action; +import fr.lnl.game.server.utils.Point; + +import java.util.Random; + +public class RandomComputerPlayer extends ComputerPlayer { + + public RandomComputerPlayer(Integer id, Point point, ClassPlayer classPlayer) { + super(id,point, classPlayer); + } + + /** + * Choose an action fully randomly + * @return an action between all available + */ + @Override + public Action strategy(Game game) { + Action action = null; + Random random = new Random(); + while (action == null || !action.isPossible()) { + action = getActions().get(random.nextInt(0, getActions().size())); + } + return action; + } + + @Override + public String toString() { + return "Random"; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/StrategyComputerPlayer.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/StrategyComputerPlayer.java new file mode 100644 index 0000000..ce20ca7 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/StrategyComputerPlayer.java @@ -0,0 +1,138 @@ +package fr.lnl.game.server.games.player; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.*; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Explosive; +import fr.lnl.game.server.utils.Point; + +import java.util.List; +import java.util.Random; + +public class StrategyComputerPlayer extends ComputerPlayer { + + public StrategyComputerPlayer(Integer id, Point point, ClassPlayer classPlayer) { + super(id,point, classPlayer); + } + + /** + * Choose an action following the strategy + * @return an action between all available + */ + @Override + public Action strategy(Game game) { + Action deployShield = choseDeployShield(game); + if(deployShield != null){ + return deployShield; + } + + List actions = generateAvailableActions(); + Action shot = choseShot(actions,game); + if(shot != null){ + return shot; + } + Action move = choseMove(actions,game); + if(move != null){ + return move; + } + return choseExplosive(actions); + } + + + private Action choseExplosive(List actions){ + Random random = new Random(); + if(isInReunion(actions, DropBomb.class) || isInReunion(actions, DropMine.class)){ + List explosiveActions = extractReunionSameAction(actions, DropMine.class).getActions(); + explosiveActions.addAll(extractReunionSameAction(actions, DropBomb.class).getActions()); + return explosiveActions.get(random.nextInt(0, explosiveActions.size())); + } + else{ + return new Nothing(); + } + } + + private Action choseDeployShield(Game game){ + for (Player player : game.getPlayers()) { + List shot = new Shot(game,player).getValidPoint(); + boolean danger = shot.stream().anyMatch(p -> p.equals(getPosition())); + if(danger && (getEnergy() - getClassPlayer().getPenaltyShoot() <= 0)){ + return new DeployShield(this); + } + } + return null; + } + + private Action choseShot(List actions, Game game){ + if(isInReunion(actions, Shot.class)) { + ReunionSameAction reunion = extractReunionSameAction(actions, Shot.class); + List actionList = reunion.getActions(); + Action action = actionList.get(0); + if (actionList.size() > 1) { + for (int i = 1; i < actionList.size(); i++) { + Point point = actionList.get(i).getPoint(); + if (game.getGrid().getGridPlayer(point).getEnergy() < game.getGrid().getGridPlayer(action.getPoint()).getEnergy()) { + action = actionList.get(i); + } + } + } + return action; + } + return null; + } + + private Action choseMove(List actions, Game game){ + if(isInReunion(actions, Move.class)) { + ReunionSameAction reunion = extractReunionSameAction(actions, Move.class); + List actionList = reunion.getActions(); + for (Action value : actionList) { + Point point = value.getPoint(); + Box box = game.getGrid().getGridBox(point); + if (box instanceof EnergyBall) { + return value; + } + } + Random random = new Random(); + int value = random.nextInt(0, 2); + if (value == 0) { + Action action = null; + do { + Action move = actionList.get(random.nextInt(0, actionList.size())); + Box box = game.getGrid().getGridBox(move.getPoint()); + if (box instanceof Explosive) { + if (!(((Explosive) box).getPlayer().equals(this))) { + action = move; + } + else{ + if(actionList.stream().filter(a -> game.getGrid().getGridBox(a.getPoint()) instanceof Explosive).toList().size() == + actionList.size()){ + action = move; + } + } + } + else{ + action = move; + } + } while (action == null); + return action; + } + else{ + return choseExplosive(actions); + } + } + return null; + } + + public boolean isInReunion(List actions, Class clazz){ + return actions.stream().anyMatch(r -> r.getActionName().equals(clazz.getSimpleName())); + } + + public ReunionSameAction extractReunionSameAction(List actions, Class clazz){ + return actions.stream().filter(r -> r.getActionName().equals(clazz.getSimpleName())).findFirst().get(); + } + + @Override + public String toString() { + return "AI"; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/player/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/player/package-info.java new file mode 100644 index 0000000..c8ab6a4 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/player/package-info.java @@ -0,0 +1,4 @@ +/** + * Package storing all players classes and as well AI behavior + */ +package fr.lnl.game.server.games.player; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Firearm.java b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Firearm.java new file mode 100644 index 0000000..4c054a5 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Firearm.java @@ -0,0 +1,30 @@ +package fr.lnl.game.server.games.weapon; + +public class Firearm implements Weapon{ + + int bullet; + int horizontalDistance; + int verticalDistance; + + public Firearm(){ + this.bullet = 10; + this.horizontalDistance = 3; + this.verticalDistance = 3; + } + + + @Override + public int getBullet() { + return this.bullet; + } + + @Override + public int getHorizontalDistance() { + return this.horizontalDistance; + } + + @Override + public int getVerticalDistance() { + return this.verticalDistance; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Weapon.java b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Weapon.java new file mode 100644 index 0000000..fe9098b --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/Weapon.java @@ -0,0 +1,17 @@ +package fr.lnl.game.server.games.weapon; + +public interface Weapon { + + int getBullet(); + + /** + * @return distance a bullet can go horizontally + */ + int getHorizontalDistance(); + + /** + * @return distance a bullet can go vertically + */ + int getVerticalDistance(); + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/package-info.java new file mode 100644 index 0000000..3e78ae3 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/games/weapon/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing all bout player's weapons + */ +package fr.lnl.game.server.games.weapon; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/listener/AbstractModelListening.java b/livraison/server/src/main/java/fr/lnl/game/server/listener/AbstractModelListening.java new file mode 100644 index 0000000..3e71f58 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/listener/AbstractModelListening.java @@ -0,0 +1,22 @@ +package fr.lnl.game.server.listener; +import java.util.List; + +public abstract class AbstractModelListening implements ModelListener { + + protected List listeners; + + public void addListener(ModelListener e) { + this.listeners.add(e); + } + + public void removalListener(ModelListener e) { + this.listeners.remove(e); + } + + public void fireChange(){ + for(ModelListener e : listeners){ + e.updateModel(this); + } + } + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/listener/ModelListener.java b/livraison/server/src/main/java/fr/lnl/game/server/listener/ModelListener.java new file mode 100644 index 0000000..2f98645 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/listener/ModelListener.java @@ -0,0 +1,13 @@ +package fr.lnl.game.server.listener; + +/** + * Model implemented by {@link AbstractModelListening} + */ +public interface ModelListener { + + /** + * this method is call everytime, an action on the view forces a controller to sens an update to model + * @param obj can be used to send data to model + */ + void updateModel(Object obj); +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/listener/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/listener/package-info.java new file mode 100644 index 0000000..3da2992 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/listener/package-info.java @@ -0,0 +1,5 @@ +/** + * Package containing model of listener to implement + * Used by listeners in client module + */ +package fr.lnl.game.server.listener; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/package-info.java new file mode 100644 index 0000000..2a0d095 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/package-info.java @@ -0,0 +1,4 @@ +/** + * Server package + */ +package fr.lnl.game.server; \ No newline at end of file diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/CrashException.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/CrashException.java new file mode 100644 index 0000000..90aec38 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/CrashException.java @@ -0,0 +1,14 @@ +package fr.lnl.game.server.utils; + +/** + * Represent an unrecoverable error in the program, force program to stop + */ +public class CrashException extends RuntimeException { + + public CrashException(String message, Throwable cause) { + super(message, cause); + } + + + +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/ErrorMessage.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/ErrorMessage.java new file mode 100644 index 0000000..88c7668 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/ErrorMessage.java @@ -0,0 +1,14 @@ +package fr.lnl.game.server.utils; + +/** + * Contain everything related to error messages, theirs errors are the fault of the end-user (like we demand an integer + * and user give us a floating point number + * Theirs error doesn't cause the program to stop, it'll demand a correct value + */ +public class ErrorMessage { + + /** + * Error given to end-user when it give us a non integer or float value + */ + public static final String Entry_Error_Message = "\033[0;31mErreur de saisie\033[0m : "; +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/Maths.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/Maths.java new file mode 100644 index 0000000..78f1f0d --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/Maths.java @@ -0,0 +1,63 @@ +package fr.lnl.game.server.utils; + +import java.util.Scanner; + +public class Maths { + + /** + * Convert entry to an integer + * @param entry given parameter + * @param scanner standard input, used if entry isn't correct + * @param error error message to display if entry isn't an Integer + * @return an Integer if entry is valid or when it'll valid + */ + public static int testInteger(String entry, Scanner scanner, String error) { + while (!isInteger(entry)) { + System.out.println(ErrorMessage.Entry_Error_Message + error); + entry = scanner.next(); + } + return Integer.parseInt(entry); + } + + /** + * Convert entry to a float + * @param entry given parameter + * @param scanner standard input, used if entry isn't correct + * @param error error message to display if entry isn't a float + * @return a float if entry is a valid or when it'll valid + */ + public static float testFloat(String entry, Scanner scanner, String error) { + while (!isFloat(entry)) { + System.out.println(ErrorMessage.Entry_Error_Message + error); + entry = scanner.next(); + } + return Integer.parseInt(entry); + } + + /** + * @param strNum entry + * @return true if {@code strNum} is a float, false otherwise + * @see Maths#testFloat(String, Scanner, String) + */ + public static boolean isFloat(String strNum) { + try { + float d = Float.parseFloat(strNum); + } catch (NumberFormatException | NullPointerException nfe) { + return false; + } + return true; + } + + /** + * @param strNum entry + * @return true if {@code strNum} is an Integer, false otherwise + */ + public static boolean isInteger(String strNum) { + try { + int d = Integer.parseInt(strNum); + } catch (NumberFormatException | NullPointerException nfe) { + return false; + } + return true; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/Pair.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/Pair.java new file mode 100644 index 0000000..b575217 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/Pair.java @@ -0,0 +1,59 @@ +package fr.lnl.game.server.utils; + +import java.util.Objects; + +/** + * Tuple associating storing two value of undefined type.
          + * Unlike Python, value in this Tuple can be modified (but the type of its new value need to be the same) + * @param first element of the tuple + * @param second element of the tuple + */ +public class Pair { + + private A a; + private B b; + + public Pair(A a, B b){ + this.a = a; + this.b = b; + } + + public A getA() { + return this.a; + } + + public B getB() { + return this.b; + } + + + public void setA(A a) { + this.a = a; + } + + public void setB(B b) { + this.b = b; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Pair point = (Pair) o; + return Objects.equals(a, point.a) && Objects.equals(b, point.b); + } + + /** + * Absolut useful when using HashMap or HashSet (or everything using hashCode to compare Objects + * @return object hash + */ + @Override + public int hashCode() { + return Objects.hash(a, b); + } + + @Override + public String toString() { + return "Pair[" + a + "," + b + ']'; + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/Point.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/Point.java new file mode 100644 index 0000000..cb567e7 --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/Point.java @@ -0,0 +1,11 @@ +package fr.lnl.game.server.utils; + +/** + * Point extends from Pair, basically a simpler ways to use Pair when using grid position + */ +public class Point extends Pair { + + public Point(int a, int b) { + super(a, b); + } +} diff --git a/livraison/server/src/main/java/fr/lnl/game/server/utils/package-info.java b/livraison/server/src/main/java/fr/lnl/game/server/utils/package-info.java new file mode 100644 index 0000000..867df9b --- /dev/null +++ b/livraison/server/src/main/java/fr/lnl/game/server/utils/package-info.java @@ -0,0 +1,4 @@ +/** + * Package containing all utility classes + */ +package fr.lnl.game.server.utils; \ No newline at end of file diff --git a/livraison/server/src/main/java/module-info.java b/livraison/server/src/main/java/module-info.java new file mode 100644 index 0000000..5164c9c --- /dev/null +++ b/livraison/server/src/main/java/module-info.java @@ -0,0 +1,15 @@ +/** + * Server module, include every model classes + */ +module server { + exports fr.lnl.game.server; + exports fr.lnl.game.server.games; + exports fr.lnl.game.server.games.player; + exports fr.lnl.game.server.games.grid; + exports fr.lnl.game.server.games.weapon; + exports fr.lnl.game.server.games.action; + exports fr.lnl.game.server.utils; + exports fr.lnl.game.server.listener; + exports fr.lnl.game.server.games.grid.elements; + exports fr.lnl.game.server.games.grid.build; +} \ No newline at end of file diff --git a/livraison/server/src/test/java/fr/lnl/game/server/ActionPlayerTest.java b/livraison/server/src/test/java/fr/lnl/game/server/ActionPlayerTest.java new file mode 100644 index 0000000..1e2b7b9 --- /dev/null +++ b/livraison/server/src/test/java/fr/lnl/game/server/ActionPlayerTest.java @@ -0,0 +1,101 @@ +package fr.lnl.game.server; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.action.*; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.elements.Bomb; +import fr.lnl.game.server.games.player.ClassPlayer; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.games.player.RandomComputerPlayer; +import fr.lnl.game.server.mock.Mock; +import fr.lnl.game.server.utils.Point; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +public class ActionPlayerTest { + + private Grid grid; + private Game game; + + @BeforeEach + public void mock() { + List players = Arrays.asList(new RandomComputerPlayer(1,null, ClassPlayer.DEFAULT), + new RandomComputerPlayer(2,null, ClassPlayer.DEFAULT)); + Mock mock = new Mock(players); + this.grid = mock.grid; + this.game = mock.game; + Assertions.assertEquals(game.getPlayers().get(0), game.getCurrentPlayer()); + } + + @Test + public void moveActionTest() { + Action move = null; + Point oldPoint = game.getCurrentPlayer().getPosition(); + Direction4Axis savedDirection = null; + for(Direction4Axis direction : Direction4Axis.values()) { + try { + move = new Move(game, game.getCurrentPlayer(), direction); + savedDirection = direction; + break; + } catch (NotValidDirectionException ignored) {} + } + Assertions.assertNotNull(move); + move.doAction(); + Point newPoint = game.getCurrentPlayer().getPosition(); + Assertions.assertEquals(newPoint, + new Point(oldPoint.getA() + savedDirection.getDeltaX(), + oldPoint.getB() + savedDirection.getDeltaY() + ) + ); + } + + @Test + public void DeployShieldTest() { + Player player = game.getCurrentPlayer(); + Assertions.assertFalse(player.isShieldDeploy()); + Action action = new DeployShield(player); + action.doAction(); + Assertions.assertTrue(player.isShieldDeploy()); + } + + @Test + public void shotActionTest(){ + Action shot = null; + for(Direction4Axis direction : Direction4Axis.values()) { + try { + shot = new Shot(game, game.getCurrentPlayer(), direction); + break; + } catch (NoMoreBulletInWeaponException | NotValidDirectionException ignored) {} + } + Assertions.assertNotNull(shot); + Player otherPlayer = game.getPlayers().get(1); + int currentEnergyOtherPlayer = otherPlayer.getEnergy(); + int currentEnergyCurrentPlayer = game.getCurrentPlayer().getEnergy(); + shot.doAction(); + Assertions.assertEquals(currentEnergyCurrentPlayer - game.getCurrentPlayer().getClassPlayer().getShootCost(), game.getCurrentPlayer().getEnergy()); + Assertions.assertEquals(currentEnergyOtherPlayer - otherPlayer.getClassPlayer().getPenaltyShoot(), otherPlayer.getEnergy()); + } + + @Test + public void dropBombActionTest() { + Player player = game.getCurrentPlayer(); + Action action = null; + Direction8Axis savedDirection = null; + for(Direction8Axis direction : Direction8Axis.values()) { + try { + action = new DropBomb(game, game.getCurrentPlayer(), direction); + savedDirection = direction; + break; + } catch (NotValidDirectionException ignored) {} + } + Assertions.assertNotNull(action); + action.doAction(); + Point bombPosition = new Point(player.getPosition().getA() + savedDirection.getDeltaX(), player.getPosition().getB() + savedDirection.getDeltaY()); + Assertions.assertTrue(game.getGrid().getBoard().get(bombPosition).getB() instanceof Bomb); + } + +} diff --git a/livraison/server/src/test/java/fr/lnl/game/server/GridTest.java b/livraison/server/src/test/java/fr/lnl/game/server/GridTest.java new file mode 100644 index 0000000..14604d6 --- /dev/null +++ b/livraison/server/src/test/java/fr/lnl/game/server/GridTest.java @@ -0,0 +1,83 @@ +package fr.lnl.game.server; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.elements.Box; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.games.player.ClassPlayer; +import fr.lnl.game.server.games.player.Player; +import fr.lnl.game.server.games.player.RandomComputerPlayer; +import fr.lnl.game.server.mock.Mock; +import fr.lnl.game.server.utils.Pair; +import fr.lnl.game.server.utils.Point; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class GridTest { + + private Grid grid; + private Game game; + + @BeforeEach + public void mock() { + List players = Arrays.asList(new RandomComputerPlayer(1,null, ClassPlayer.DEFAULT), + new RandomComputerPlayer(2,null, ClassPlayer.DEFAULT)); + Mock mock = new Mock(players); + grid = mock.grid; + game = mock.game; + } + + @Test + public void testGrid() { + // test Grid#initGrid() + assertEquals(new Wall(), grid.getBoard().get(new Point(0,0)).getB()); + assertEquals(new Wall(), grid.getBoard().get(new Point(0, grid.getColumn() - 1)).getB()); + assertEquals(new Wall(), grid.getBoard().get(new Point(grid.getRow() - 1, 0)).getB()); + assertEquals(new Wall(), grid.getBoard().get(new Point(grid.getRow() - 1, grid.getColumn() - 1)).getB()); + // test placePlayersBRUT (mocked) + grid.getPlayers().forEach(p -> System.out.println(p.getId() + ": " + p.getPosition())); + assertEquals(grid.getPlayers().get(0), grid.getBoard().get(new Point(7, 7)).getA()); + assertEquals(grid.getPlayers().get(1), grid.getBoard().get(new Point(7, 8)).getA()); + // test placeEnergyBallBRUT (mocked) + assertEquals(new EnergyBall(), grid.getBoard().get(new Point(2, 3)).getB()); + assertEquals(new EnergyBall(), grid.getBoard().get(new Point(8, 10)).getB()); + } + + @Test + public void testLock() { + System.out.println("=================== GRID COMPLETE ===================="); + System.out.println(grid.toString()); + System.out.println("=================== GRID AVEC LOCK ==================="); + StringBuilder str = new StringBuilder(); + for (int i = 0; i < grid.getRow(); i++) { + str.append("\n"); + for (int j = 0; j < grid.getColumn(); j++) { + Pair value = grid.getBoard().get(new Point(i, j)); + if(value.getB() != null){ + if(value.getB().isLock()){ + str.append(" \033[0;35mL\033[0m"); + } + if(value.getB() instanceof Wall){ + str.append(" \033[0;32m□\033[0m"); + } + if(value.getB() instanceof EnergyBall){ + str.append(" \033[0;31mE\033[0m"); + } + } + else if(value.getA() != null){ + str.append(" \033[0;34mP\033[0m"); + } + else { + str.append(" \033[0;37m.\033[0m"); + } + } + } + System.out.println(str); + } +} diff --git a/livraison/server/src/test/java/fr/lnl/game/server/mock/Mock.java b/livraison/server/src/test/java/fr/lnl/game/server/mock/Mock.java new file mode 100644 index 0000000..e5fba08 --- /dev/null +++ b/livraison/server/src/test/java/fr/lnl/game/server/mock/Mock.java @@ -0,0 +1,22 @@ +package fr.lnl.game.server.mock; + +import fr.lnl.game.server.games.Game; +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.build.GridFactoryBuilder; +import fr.lnl.game.server.games.player.Player; + +import java.util.List; + +public class Mock { + + public GridFactoryBuilder buildStrategy; + public Game game; + public Grid grid; + + public Mock(List players) { + this.buildStrategy = MockGridFactoryBuilder.create().gridDimensions(16, 16).wallProbability(0.80F).energyProbability(0.95F); + game = new Game(buildStrategy, players); + this.grid = game.getGrid(); + } + +} diff --git a/livraison/server/src/test/java/fr/lnl/game/server/mock/MockDisplayWinner.java b/livraison/server/src/test/java/fr/lnl/game/server/mock/MockDisplayWinner.java new file mode 100644 index 0000000..9ca73e8 --- /dev/null +++ b/livraison/server/src/test/java/fr/lnl/game/server/mock/MockDisplayWinner.java @@ -0,0 +1,10 @@ +package fr.lnl.game.server.mock; + +import fr.lnl.game.server.listener.AbstractModelListening; + +public class MockDisplayWinner extends AbstractModelListening { + @Override + public void updateModel(Object obj) { + + } +} diff --git a/livraison/server/src/test/java/fr/lnl/game/server/mock/MockGridFactoryBuilder.java b/livraison/server/src/test/java/fr/lnl/game/server/mock/MockGridFactoryBuilder.java new file mode 100644 index 0000000..e4517ed --- /dev/null +++ b/livraison/server/src/test/java/fr/lnl/game/server/mock/MockGridFactoryBuilder.java @@ -0,0 +1,41 @@ +package fr.lnl.game.server.mock; + +import fr.lnl.game.server.games.grid.Grid; +import fr.lnl.game.server.games.grid.build.GridFactoryBuilder; +import fr.lnl.game.server.games.grid.build.LockGridFactoryBuilder; +import fr.lnl.game.server.games.grid.elements.EnergyBall; +import fr.lnl.game.server.games.grid.elements.Wall; +import fr.lnl.game.server.utils.Point; + +public class MockGridFactoryBuilder extends LockGridFactoryBuilder { + + private MockGridFactoryBuilder() { + + } + + public static GridFactoryBuilder create() { + return new MockGridFactoryBuilder(); + } + + @Override + protected void initPlaceEnergyBall() { + grid.getBoard().get(new Point(2,3)).setB(new EnergyBall()); + grid.getBoard().get(new Point(8,10)).setB(new EnergyBall()); + } + + @Override + protected void initPlaceInternWall() { + grid.getBoard().get(new Point(3,6)).setB(new Wall()); + grid.getBoard().get(new Point(7,14)).setB(new Wall()); + grid.getBoard().get(new Point(10,7)).setB(new Wall()); + grid.getBoard().get(new Point(14,2)).setB(new Wall()); + } + + @Override + public void initPlacePlayers() { + grid.getBoard().get(new Point(7,7)).setA(grid.getPlayers().get(0)); + grid.getPlayers().get(0).setPosition(new Point(7, 7)); + grid.getBoard().get(new Point(7,8)).setA(grid.getPlayers().get(1)); + grid.getPlayers().get(1).setPosition(new Point(7, 8)); + } +} diff --git a/livraison/settings.gradle b/livraison/settings.gradle new file mode 100644 index 0000000..886ec9f --- /dev/null +++ b/livraison/settings.gradle @@ -0,0 +1,11 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/7.0.1/userguide/multi_project_builds.html + */ + +rootProject.name = 'legot-neveu-lucas' +include(':client', ':server') diff --git a/livraison/startTerminal.bat b/livraison/startTerminal.bat new file mode 100644 index 0000000..f4ab07b --- /dev/null +++ b/livraison/startTerminal.bat @@ -0,0 +1,3 @@ +@echo off + +gradle :client:run --args="terminal human dps computerS tank" --console="plain" diff --git a/livraison/startTerminal.sh b/livraison/startTerminal.sh new file mode 100644 index 0000000..b5fc8e5 --- /dev/null +++ b/livraison/startTerminal.sh @@ -0,0 +1,3 @@ +#!/bin/sh +gradle --version +gradle :client:run --args="terminal human dps computerS tank" diff --git a/livraison/startWindow.bat b/livraison/startWindow.bat new file mode 100644 index 0000000..4e5f904 --- /dev/null +++ b/livraison/startWindow.bat @@ -0,0 +1,2 @@ +@echo off +gradle :client:run --args="window human dps computerS tank" --console="plain" diff --git a/livraison/startWindow.sh b/livraison/startWindow.sh new file mode 100644 index 0000000..67b83b6 --- /dev/null +++ b/livraison/startWindow.sh @@ -0,0 +1,3 @@ +#!/bin/sh +gradle --version +gradle :client:run --args="window human dps computerS tank"